ΠΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡ Π²ΡΠ΅Ρ
Π² Π½ΠΎΠ²ΠΎΠΌ 2020-ΠΌ Π³ΠΎΠ΄Ρ.
Π‘ ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ
ΠΠ° ΡΡΠΎΡ Π³ΠΎΠ΄ ΡΠ·ΡΠΊ Π±ΡΠ» ΡΠΈΠ»ΡΠ½ΠΎ Π΄ΠΎΡΠ°Π±ΠΎΡΠ°Π½, Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ΄ΡΠΌΠ°Π½Ρ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΅Π³ΠΎ Π°ΡΠΏΠ΅ΠΊΡΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π²Π΅ΠΊΡΠΎΡ ΡΠ°Π·Π²ΠΈΡΠΈΡ.
ΠΡΠΈΠΌ Π²ΡΠ΅ΠΌ Ρ ΡΠ°Π΄ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎΠΌ.
Disclaimer
ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π° ΡΠ½ΡΡΠ·ΠΈΠ°Π·ΠΌΠ΅ ΠΈ Π½Π΅ ΠΏΡΠ΅ΡΠ΅Π½Π΄ΡΠ΅Ρ Π½Π° ΠΌΠΈΡΠΎΠ²ΠΎΠ΅ Π³ΠΎΡΠΏΠΎΠ΄ΡΡΠ²ΠΎ Π² ΡΡΠ΅ΡΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ·ΡΠΊΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ!
ΠΠ΅ ΡΡΠΎΠΈΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ°Π»ΠΎΠ½Π°, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ΅ΠΌΠΈΡΡΡΡ, ΠΏΡΠΎΠ΅ΠΊΡ β Π½Π΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½, Π½ΠΎ ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΡΠ°Π·Π²ΠΈΠ²Π°Π΅ΡΡΡ.
ΠΠΎΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ
Π Π²Π΅ΡΠΊΠ΅ /mashc ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π½Π° Mash’Π΅ (Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ·ΡΠΊΠ°).
ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΈΠΌΠ΅Π΅Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠ΄Π° Π² asm Π»ΠΈΡΡΠΈΠ½Π³ (Π΄Π»Ρ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ° ΠΏΠΎΠ΄ ΡΡΠ΅ΠΊΠΎΠ²ΡΡ ΠΠ).
Π Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²Π΅Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ Π²Π΅ΡΡΠΈΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΠ° ΠΏΠΎΠ΄ Java (JDK 1.8).
ΠΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΠΏΠ΅ΡΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ·ΡΠΊΠ° ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΡΠ΅Ρ Π΅Π³ΠΎ.
ΠΠΎΠ²ΠΎΠ΅ ΠΠΠ
Π Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ·ΡΠΊΠ° ΠΎΡΡΠ°ΡΡΠΈ ΠΏΠ΅ΡΠ΅ΡΠ°Π±ΠΎΡΠ°Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ.
ΠΠ΅ΡΠΎΠ΄Ρ ΠΊΠ»Π°ΡΡΠ° ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ, ΠΊΠ°ΠΊ Π² ΡΠ΅Π»Π΅ ΠΊΠ»Π°ΡΡΠ°, ΡΠ°ΠΊ ΠΈ Π·Π° Π΅Π³ΠΎ ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ.
Π£ ΠΊΠ»Π°ΡΡΠ° ΡΠ΅ΠΏΠ΅ΡΡ Π΅ΡΡΡ ΡΠ²Π½ΠΎ Π²ΡΡΠ°ΠΆΠ°Π΅ΠΌΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ: 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
...
ΠΡΠ»ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅, ΡΠΎ Ρ Π½Π°Ρ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π»Π΅Π³ΠΊΠΎ Π΄Π΅Π»Π°ΡΡ inherited Π²ΡΠ·ΠΎΠ²Ρ (super).
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π°:
...
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
Π ΡΠ»ΠΎΠ²Ρ, ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ super ΠΏΡΠΈ ΡΠ°ΠΊΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ.
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
Π Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ·ΡΠΊΠ° ΠΎΠ½ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ, ΠΊΠ°ΠΊ ΠΊΠ»Π°ΡΡΡ:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
ΠΠΎΠ²ΡΠΉ enum
Π’Π΅ΠΏΠ΅ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
ΠΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ Π―Π
ΠΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ β Mash ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΡΡΡ ΡΠ²ΠΎΡ Π½ΠΈΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΏΠΎ ΡΠΈΠΏΡ Lua.
Π§ΡΠΎΠ±Ρ Π½Π°ΡΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Mash Π² Π΄Π°Π½Π½ΡΡ ΡΠ΅Π»ΡΡ , Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ΅ΠΊΡ.
Π£ Mash Π΅ΡΡΡ Runtime Environment β ΡΡΠ΅ΠΊΠΎΠ²Π°Ρ ΠΠ, ΡΠΎΠ±ΡΠ°Π½Π½Π°Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Ρ ΠΏΠΎΠ»Π½ΠΎΡΠ΅Π½Π½ΡΠΌ API.
Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ Π»ΠΈΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΅Ρ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΡΠΎΠ²Π΅ΡΡΠΈΡΡ ΠΏΠ°ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ².
Π ΡΠ°ΠΌΠΎΠΌ ΡΠ·ΡΠΊΠ΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ°.
ΠΡΠΈ ΡΡΠΎΠΌ, ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡ Π² ΡΠ²ΡΠ·ΠΊΠ΅ Ρ ΡΠ·ΡΠΊΠΎΠ²ΡΠΌΠΈ ΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ Π½Π΅ Π½Π°ΡΡΡΠ°Π΅ΡΡΡ.
ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠ·ΡΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΡ ΠΌΠΎΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠ², Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ
Π½Π° Π½Π΅ΠΌ.
Mash + JVM
ΠΠ°ΡΠ°Π» Π²Π΅ΡΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ Π²Π΅ΡΡΠΈΠΈ ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ° Π΄Π»Ρ JVM.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠΏΡΡΡΡ N-Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π½Π° Ρ
Π°Π±ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΏΠΎΡΡ Π½Π° ΡΡΡ ΡΠ΅ΠΌΡ.
ΠΡΠΎΠ³ΠΈ
ΠΡΠΎΠ³ΠΎΠ² ΠΎΡΠΎΠ±ΠΎ Π½Π΅Ρ. ΠΡΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ².
ΠΡΠ΅ΠΌ ΡΠ΄Π°ΡΠΈ Π² 2020-ΠΌ Π³ΠΎΠ΄Ρ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com