Hər kəsi yeni 2020-ci ildə salamlayıram.
Birinci nəşr olunandan bəri
Bu il ərzində dil xeyli təkmilləşdi, onun bir çox cəhətləri düşünüldü, inkişaf vektoru müəyyən edildi.
Bütün bunları cəmiyyətlə bölüşməkdən məmnunam.
Məsuliyyətdən imtina
Bu layihə yalnız həvəslə hazırlanır və dinamik proqramlaşdırma dilləri sahəsində dünya hökmranlığına iddialı deyil!
Bu inkişaf cəhd edilməli bir standart kimi qəbul edilməməlidir; layihə ideal deyil, lakin buna baxmayaraq inkişaf edir.
Yeni kompilyator
Layihə deposunun /mashc filialında siz kompilyatorun Mash-da (dilin ilk versiyası) yazılmış yeni versiyasını görə bilərsiniz.
Kompilyatorun asm siyahısında kod generatoru var (stek əsaslı VM üçün assembler üçün).
Hazırda mən Java (JDK 1.8) üçün generatorun versiyasını hazırlayıram.
Kompilyatorun yeni versiyası dilin birinci versiyasının funksionallığını tam dəstəkləyir və onu tamamlayır.
Yeni OOP
Dilin yeni versiyasında siniflərlə iş qismən yenidən işlənib.
Sinif metodları həm sinif orqanında, həm də ondan kənarda elan edilə bilər.
Sinfin indi açıq konstruktoru var: init.
Nümunə kodu:
...
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
...
Əgər miras baş verərsə, o zaman asanlıqla irsi zənglər etmək imkanımız var (super).
Nümunə kodu:
...
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
Sinif nümunələrində metodların dinamik üstünlük təşkil etməsi:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Paketlər/ad boşluqları
Ad sahəsi təmiz qalmalıdır!
Buna uyğun olaraq dil bu imkanı təmin etməlidir.
Mash-da bir sinif metodu statikdirsə, kodun istənilən hissəsindən etibarlı şəkildə çağırıla bilər.
Misal:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Yeri gəlmişkən, bu şəkildə çağırılanda super operator düzgün işləyəcək.
İstisnalar
Dilin yeni versiyasında onlara siniflər kimi baxılır:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Yeni nömrə
İndi siyahı elementlərinə sabit dəyərlər təyin edilə bilər:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Daxili dil
Potensial olaraq, Mash Lua dilinə bənzər daxili proqramlaşdırma dili kimi öz yerini tapa bilər.
Mash-dan bu məqsədlər üçün istifadə etməyə başlamaq üçün hətta layihəni özünüz yığmağa ehtiyac yoxdur.
Mash-da Runtime Environment var - tam API ilə dinamik kitabxana kimi tərtib edilmiş yığın əsaslı VM.
Sizə lazım olan tək şey onu layihə asılılığına əlavə etmək və bir neçə zəng etməkdir.
Dilin özü daxili dil kimi işləmək üçün funksionallıq təmin edir.
Eyni zamanda, dil və üçüncü tərəf kitabxanaları ilə birlikdə performans təsirlənmir.
Biz orada yazılmış müxtəlif çərçivələrin tam gücündən istifadə edə bilən daxili dil əldə edirik.
Mash + JVM
Mən JVM üçün tərcüməçinin versiyasını hazırlamağa başladım.
Ola bilsin ki, N vaxtdan sonra Habré-də bu mövzuda yazı görünəcək.
Nəticələri
Xüsusi nəticələr yoxdur. Bu nəticələrin ara təmsilidir.
2020-ci ildə hər kəsə uğurlar.
Mənbə: www.habr.com