Mash ื”ื™ื ืฉืคืช ืชื›ื ื•ืช ืฉืžืจื›ื™ื‘ื” ืืช ืขืฆืžื”

Mash ื”ื™ื ืฉืคืช ืชื›ื ื•ืช ืฉืžืจื›ื™ื‘ื” ืืช ืขืฆืžื”

ืฉืœื•ื ืœื›ื•ืœื ื‘ืฉื ื” ื”ื—ื“ืฉื” 2020.

ืžืื– ืคืจืกื•ื ื”ืจืืฉื•ืŸ ื”ื•ื“ืขื” ื›ืžืขื˜ ื‘ื“ื™ื•ืง ืฉื ื” ื—ืœืคื” ืœื’ื‘ื™ ืžืืฉ.

ื‘ืžื”ืœืš ืฉื ื” ื–ื•, ื”ืฉืคื” ืฉื•ืคืจื” ืžืื•ื“, ืจื‘ื™ื ืžื”ื™ื‘ื˜ื™ื” ืขื‘ืจื• ืžื—ืฉื‘ื” ื•ื ืงื‘ืข ื•ืงื˜ื•ืจ ื”ื”ืชืคืชื—ื•ืช.

ืื ื™ ืฉืžื— ืœื—ืœื•ืง ืืช ื›ืœ ื–ื” ืขื ื”ืงื”ื™ืœื”.

ื›ืชื‘ ื•ื™ืชื•ืจ

ืคืจื•ื™ืงื˜ ื–ื” ืžืคื•ืชื— ืืš ื•ืจืง ืžืชื•ืš ื”ืชืœื”ื‘ื•ืช ื•ืื™ื ื• ืžืชื™ื™ืžืจ ืœืฉืœื™ื˜ื” ืขื•ืœืžื™ืช ื‘ืชื—ื•ื ืฉืคื•ืช ื”ืชื›ื ื•ืช ื”ื“ื™ื ืžื™ื•ืช!

ืื™ืŸ ืœืจืื•ืช ื‘ืคื™ืชื•ื— ื–ื” ื›ืกื˜ื ื“ืจื˜ ืฉื™ืฉ ืœืฉืื•ืฃ ืืœื™ื•, ื”ืคืจื•ื™ืงื˜ ืื™ื ื• ืื™ื“ื™ืืœื™, ืืš ื‘ื›ืœ ื–ืืช ืžืชืคืชื—.

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 ื™ืฉ Runtime Environment - VM ืžื‘ื•ืกืก ืžื—ืกื ื™ืช ื”ื™ื“ื•ืจ ื›ืกืคืจื™ื™ื” ื“ื™ื ืžื™ืช ืขื API ืžืœื.

ื›ืœ ืžื” ืฉืืชื” ืฆืจื™ืš ืœืขืฉื•ืช ื”ื•ื ืœื”ื•ืกื™ืฃ ืื•ืชื• ืœืชืœื•ืช ื‘ืคืจื•ื™ืงื˜ ื•ืœื‘ืฆืข ื›ืžื” ืฉื™ื—ื•ืช.

ื”ืฉืคื” ืขืฆืžื” ืžืกืคืงืช ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืœืขื‘ื•ื“ื” ื›ืฉืคื” ืžืฉื•ื‘ืฆืช.
ื™ื—ื“ ืขื ื–ืืช, ื”ื‘ื™ืฆื•ืขื™ื ื‘ืฉื™ืœื•ื‘ ืขื ืกืคืจื™ื•ืช ืฉืคื” ื•ืฆื“ ืฉืœื™ืฉื™ ืื™ื ื ืžื•ืฉืคืขื™ื.
ืื ื• ืžืงื‘ืœื™ื ืฉืคื” ืžืฉื•ื‘ืฆืช ืฉื™ื›ื•ืœื” ืœื”ืฉืชืžืฉ ื‘ืžืœื•ื ื”ืขื•ืฆืžื” ืฉืœ ืžืกื’ืจื•ืช ืฉื•ื ื•ืช ื”ื›ืชื•ื‘ื•ืช ื‘ื”.

ืžืืฉ + JVM

ื”ืชื—ืœืชื™ ืœืคืชื— ื’ืจืกื” ืฉืœ ื”ืžืชืจื’ื ืขื‘ื•ืจ ื”-JVM.
ืื•ืœื™, ืœืื—ืจ N ืคืจืง ื–ืžืŸ, ืคื•ืกื˜ ื‘ื ื•ืฉื ื–ื” ื™ื•ืคื™ืข ื‘-Habrรฉ.

ืชื•ืฆืื•ืช ืฉืœ

ืื™ืŸ ืชื•ืฆืื•ืช ืžื™ื•ื—ื“ื•ืช. ื–ื”ื• ื™ื™ืฆื•ื’ ื‘ื™ื ื™ื™ื ืฉืœ ื”ืชื•ืฆืื•ืช.
ื‘ื”ืฆืœื—ื” ืœื›ื•ืœื ื‘ืฉื ืช 2020.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”