Mash๋Š” ์Šค์Šค๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

Mash๋Š” ์Šค์Šค๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

2020๋…„ ์ƒˆํ•ด์—๋„ ๋ชจ๋‘ ์ธ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ถœ๊ฐ„ ์ดํ›„ ๊ธˆ์‹ Mash์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ 1๋…„์ด ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค.

์˜ฌํ•ด ๋™์•ˆ ์–ธ์–ด๋Š” ํฌ๊ฒŒ ๊ฐœ์„ ๋˜์—ˆ๊ณ  ๋งŽ์€ ์ธก๋ฉด์ด ๊ณ ๋ ค๋˜์—ˆ์œผ๋ฉฐ ๊ฐœ๋ฐœ ๋ฒกํ„ฐ๊ฐ€ ๊ฒฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์„ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๊ณต์œ ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ฑ…์ž„ ๋ถ€์ธ

์ด ํ”„๋กœ์ ํŠธ๋Š” ์˜ค๋กœ์ง€ ์—ด์ •์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ถ„์•ผ์—์„œ ์„ธ๊ณ„๋ฅผ ์ง€๋ฐฐํ•˜๋ ค๋Š” ์ฒ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!

์ด ๊ฐœ๋ฐœ์€ ์ถ”๊ตฌํ•ด์•ผ ํ•  ํ‘œ์ค€์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋Š” ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub์˜
์›น ์‚ฌ์ดํŠธ
ํฌ๋Ÿผ

์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ๋Ÿฌ

ํ”„๋กœ์ ํŠธ ์ €์žฅ์†Œ์˜ /mashc ๋ถ„๊ธฐ์—์„œ Mash(์–ธ์–ด์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „)๋กœ ์ž‘์„ฑ๋œ ์ƒˆ ๋ฒ„์ „์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ์—๋Š” asm ๋ชฉ๋ก(์Šคํƒ ๊ธฐ๋ฐ˜ VM์šฉ ์–ด์…ˆ๋ธ”๋Ÿฌ์šฉ)์— ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ €๋Š” Java์šฉ ์ƒ์„ฑ๊ธฐ ๋ฒ„์ „(JDK 1.8)์„ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค.

์ƒˆ ๋ฒ„์ „์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ฒซ ๋ฒˆ์งธ ์–ธ์–ด ๋ฒ„์ „์˜ ๊ธฐ๋Šฅ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๊ณ  ์ด๋ฅผ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด OOP

์ƒˆ ๋ฒ„์ „์˜ ์–ธ์–ด์—์„œ๋Š” ํด๋ž˜์Šค ์ž‘์—…์ด ๋ถ€๋ถ„์ ์œผ๋กœ ์žฌ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๋Š” ํด๋ž˜์Šค ๋ณธ๋ฌธ ๋‚ด๋ถ€์™€ ์™ธ๋ถ€ ๋ชจ๋‘์—์„œ ์„ ์–ธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ ํด๋ž˜์Šค์—๋Š” init๋ผ๋Š” ๋ช…์‹œ์ ์ธ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ฝ”๋“œ:

...
class MyClass:
  private:
    var a, b

  public:
    init(a, b):
      $a ?= a
      $b ?= b
    end

    func Foo():
      return $a + $b   
    end
end

func MyClass::Bar(c):
  return $a + $b + c
end
...

์ƒ์†์ด ๋ฐœ์ƒํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ƒ์†๋œ ํ˜ธ์ถœ(์Šˆํผ)์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ฝ”๋“œ:

...
class MySecondClass(MyClass):
  public:
    var c

    init(a, b, c):
      super(a, b)
      $c ?= c
    end

    func Bar():
      super($c)  
    end
end
...

x ?= new MySecondClass(10, 20, 30)
println( x -> Bar() )     // 60

ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ์˜ ๋™์  ์žฌ์ •์˜:

...
func Polymorph::NewFoo(c):
  return $a + $b + c  
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30)    // 60

ํŒจํ‚ค์ง€/๋„ค์ž„์ŠคํŽ˜์ด์Šค

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!
๋”ฐ๋ผ์„œ ์–ธ์–ด๋Š” ์ด๋Ÿฌํ•œ ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Mash์—์„œ ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์ ์ด๋ฉด ์ฝ”๋“œ์˜ ์–ด๋Š ๋ถ€๋ถ„์—์„œ๋“  ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ :

...
class MyPackage:
  func MyFunc(a, b):
    return a + b  
  end
end
...
println( MyPackage -> MyFunc(10, 20) )    // 30

๊ทธ๋Ÿฐ๋ฐ ์Šˆํผ ์—ฐ์‚ฐ์ž๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ๋˜๋ฉด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์™ธ

์ƒˆ ๋ฒ„์ „์˜ ์–ธ์–ด์—์„œ๋Š” ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.

...
try:
  raise new Exception(
    "My raised exception!"
  )
catch E:
  if E is Exception:
    println(E)
  else:
    println("Unknown exception class!")
  end
end
...

์ƒˆ ์—ด๊ฑฐํ˜•

์ด์ œ ์—ด๊ฑฐํ˜• ์š”์†Œ์— ์ƒ์ˆ˜ ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

enum MyEnum [
  meFirst = "First",
  meSecond = 2,
  meThird
]
...
k ?= meSecond
...
if k in MyEnum:
  ...
end

๋‚ด์žฅ๋œ ์–ธ์–ด

์ž ์žฌ์ ์œผ๋กœ Mash๋Š” Lua์™€ ์œ ์‚ฌํ•œ ์ž„๋ฒ ๋””๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ํ‹ˆ์ƒˆ ์‹œ์žฅ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ชฉ์ ์œผ๋กœ Mash๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง์ ‘ ์กฐ๋ฆฝํ•  ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค.

Mash์—๋Š” ์ „์ฒด API๋ฅผ ๊ฐ–์ถ˜ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ปดํŒŒ์ผ๋œ ์Šคํƒ ๊ธฐ๋ฐ˜ VM์ธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ํ•ด์•ผ ํ•  ์ผ์€ ์ด๋ฅผ ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋ช‡ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

์–ธ์–ด ์ž์ฒด๋Š” ์ž„๋ฒ ๋””๋“œ ์–ธ์–ด๋กœ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๋™์‹œ์— ์–ธ์–ด ๋ฐ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ด€๋ จ๋œ ์„ฑ๋Šฅ์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๋Š” ๊ทธ ์•ˆ์— ์ž‘์„ฑ๋œ ๋‹ค์–‘ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž„๋ฒ ๋””๋“œ ์–ธ์–ด๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

๋งค์‹œ + JVM

๋‚˜๋Š” JVM์šฉ ๋ฒˆ์—ญ๊ธฐ ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
์•„๋งˆ๋„ N์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๊ฒŒ์‹œ๋ฌผ์ด Habrรฉ์— ๋‚˜ํƒ€๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ

ํŠน๋ณ„ํ•œ ๊ฒฐ๊ณผ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฒฐ๊ณผ์˜ ์ค‘๊ฐ„ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค.
2020๋…„์—๋Š” ๋ชจ๋‘๋“ค ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€