Salam tahun baru 2020 kepada semua.
Sejak penerbitan yang pertama
Pada tahun ini, bahasa telah bertambah baik, banyak aspeknya telah difikirkan dengan teliti dan vektor pembangunan ditentukan.
Saya gembira untuk berkongsi semua ini dengan masyarakat.
Penafian
Projek ini sedang dibangunkan semata-mata atas semangat dan tidak berpura-pura menguasai dunia dalam bidang bahasa pengaturcaraan dinamik!
Pembangunan ini tidak boleh dianggap sebagai satu piawaian yang perlu diperjuangkan; projek ini tidak ideal, tetapi ia sedang berkembang.
Penyusun baharu
Dalam /mashc cawangan repositori projek, anda boleh melihat versi baharu pengkompil, yang ditulis dalam Mash (versi pertama bahasa).
Pengkompil mempunyai penjana kod dalam penyenaraian asm (untuk pemasang untuk VM berasaskan tindanan).
Pada masa ini saya sedang membangunkan versi penjana untuk Java (JDK 1.8).
Versi baharu pengkompil menyokong sepenuhnya kefungsian versi pertama bahasa dan melengkapkannya.
OOP baharu
Dalam versi baharu bahasa, kerja dengan kelas telah direka bentuk semula sebahagiannya.
Kaedah kelas boleh diisytiharkan dalam badan kelas dan di luarnya.
Kelas kini mempunyai pembina eksplisit: init.
Contoh kod:
...
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
...
Sekiranya pewarisan berlaku, maka kita mempunyai peluang untuk membuat panggilan warisan (super) dengan mudah.
Contoh kod:
...
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
Penggantian dinamik kaedah pada contoh kelas:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Pakej/ruang nama
Ruang nama mesti kekal bersih!
Sehubungan itu, bahasa mesti menyediakan peluang ini.
Dalam Mash, jika kaedah kelas adalah statik, ia boleh dipanggil dengan selamat dari mana-mana bahagian kod.
Contoh:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Dengan cara ini, pengendali super akan berfungsi dengan betul apabila dipanggil dengan cara ini.
Pengecualian
Dalam versi baharu bahasa mereka dilayan seperti kelas:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
enum baru
Kini elemen penghitungan boleh diberikan nilai tetap:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Bahasa terbenam
Berkemungkinan, Mash boleh mencari nichenya sebagai bahasa pengaturcaraan terbenam, serupa dengan Lua.
Untuk mula menggunakan Mash untuk tujuan ini, anda tidak perlu memasang sendiri projek itu.
Mash mempunyai Persekitaran Runtime - VM berasaskan tindanan yang disusun sebagai perpustakaan dinamik dengan API penuh.
Apa yang anda perlu lakukan ialah menambahnya pada kebergantungan projek dan membuat beberapa panggilan.
Bahasa itu sendiri menyediakan kefungsian untuk berfungsi sebagai bahasa terbenam.
Pada masa yang sama, prestasi bersama-sama dengan bahasa dan perpustakaan pihak ketiga tidak terjejas.
Kami mendapat bahasa terbenam yang boleh menggunakan kuasa penuh pelbagai rangka kerja yang ditulis di dalamnya.
Mash + JVM
Saya mula membangunkan versi penterjemah untuk JVM.
Mungkin, selepas N tempoh masa, siaran mengenai topik ini akan muncul di HabrΓ©.
Keputusan
Tiada keputusan tertentu. Ini adalah perwakilan pertengahan keputusan.
Semoga berjaya untuk semua pada tahun 2020.
Sumber: www.habr.com