Pagbati sa lahat sa bagong taon 2020.
Mula nang mailathala ang una
Sa taong ito, ang wika ay lubos na napabuti, marami sa mga aspeto nito ang pinag-isipang mabuti at ang vector ng pag-unlad ay natukoy.
Ikinagagalak kong ibahagi ang lahat ng ito sa komunidad.
Pagtanggi sa pananagutan
Ang proyektong ito ay binuo lamang sa sigasig at hindi nagpapanggap na dominasyon sa mundo sa larangan ng mga dynamic na programming language!
Ang pag-unlad na ito ay hindi dapat ituring bilang isang pamantayan na dapat pagsikapan; ang proyekto ay hindi perpekto, ngunit ito ay umuunlad gayunpaman.
Bagong compiler
Sa sangay ng /mashc ng repositoryo ng proyekto, makakakita ka ng bagong bersyon ng compiler, na nakasulat sa Mash (ang unang bersyon ng wika).
Ang compiler ay may code generator sa asm listing (para sa assembler para sa stack-based VM).
Sa kasalukuyan ay gumagawa ako ng bersyon ng generator para sa Java (JDK 1.8).
Ang bagong bersyon ng compiler ay ganap na sumusuporta sa functionality ng unang bersyon ng wika at pinupunan ito.
Bagong OOP
Sa bagong bersyon ng wika, ang gawain sa mga klase ay bahagyang muling idinisenyo.
Ang mga pamamaraan ng klase ay maaaring ideklara kapwa sa katawan ng klase at sa labas nito.
Ang klase ay mayroon na ngayong tahasang constructor: init.
Halimbawang code:
...
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
...
Kung nangyari ang mana, magkakaroon tayo ng pagkakataon na madaling gumawa ng mga minanang tawag (super).
Halimbawang code:
...
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
Dynamic na pag-override ng mga pamamaraan sa mga instance ng klase:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Mga package/namespace
Dapat manatiling malinis ang namespace!
Alinsunod dito, ang wika ay dapat magbigay ng pagkakataong ito.
Sa Mash, kung ang isang paraan ng klase ay static, maaari itong ligtas na tawagan mula sa anumang bahagi ng code.
Halimbawa:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Sa pamamagitan ng paraan, ang super operator ay gagana nang tama kapag tinawag sa ganitong paraan.
Mga pagbubukod
Sa bagong bersyon ng wika, itinuturing silang mga klase:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Bagong enum
Ngayon ang mga elemento ng enumeration ay maaaring italaga ng mga pare-parehong halaga:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Naka-embed na wika
Posible, mahahanap ng Mash ang angkop na lugar nito bilang isang naka-embed na programming language, katulad ng Lua.
Upang simulan ang paggamit ng Mash para sa mga layuning ito, hindi mo na kailangang i-assemble ang proyekto nang mag-isa.
Ang Mash ay may Runtime Environment - isang stack-based na VM na pinagsama-sama bilang isang dynamic na library na may buong API.
Ang kailangan mo lang gawin ay idagdag ito sa dependency ng proyekto at gumawa ng ilang tawag.
Ang wika mismo ay nagbibigay ng functionality upang gumana bilang isang naka-embed na wika.
Kasabay nito, ang pagganap kasabay ng wika at mga aklatan ng third-party ay hindi apektado.
Nakakakuha kami ng naka-embed na wika na maaaring gumamit ng buong kapangyarihan ng iba't ibang mga framework na nakasulat dito.
Mash + JVM
Nagsimula akong bumuo ng isang bersyon ng tagasalin para sa JVM.
Marahil, pagkatapos ng N tagal ng oras, isang post sa paksang ito ay lalabas sa HabrΓ©.
Mga resulta ng
Walang partikular na resulta. Ito ay isang intermediate na representasyon ng mga resulta.
Good luck sa lahat sa 2020.
Pinagmulan: www.habr.com