Mash özünü tərtib edən bir proqramlaşdırma dilidir

Mash özünü tərtib edən bir proqramlaşdırma dilidir

Hər kəsi yeni 2020-ci ildə salamlayıram.

Birinci nəşr olunandan bəri oruc tutmaq Maş haqqında demək olar ki, düz 1 il keçdi.

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.

Github
Sayt
Forum

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

Добавить комментарий