Mash bere burua konpilatzen duen programazio-lengoaia da

Mash bere burua konpilatzen duen programazio-lengoaia da

Zorionak guztioi 2020 urte berrian.

Lehenengoa argitaratu zenetik mezua Ia zehazki urtebete igaro da Mash-i buruz.

Urte honetan zehar, hizkuntza asko hobetu zen, bere alderdi asko pentsatu eta garapenaren bektorea zehaztu zen.

Pozik nago hori guztia komunitatearekin partekatzeaz.

Lege-oharra

Proiektu hau ilusioz bakarrik garatzen ari da eta ez du programazio-lengoaia dinamikoen alorrean munduko dominaziorik nahi!

Garapen hori ez da hartu behar ahalegintzeko estandar gisa; proiektua ez da ideala, baina garatzen ari da, hala ere.

GitHub
Web
Foroa

Konpilatzaile berria

Proiektuaren biltegiko /mashc adarrean, konpilatzailearen bertsio berri bat ikus dezakezu, Mash-en idatzita dagoena (hizkuntzaren lehen bertsioa).

Konpilatzaileak kode-sorgailu bat du asm zerrendan (pilean oinarritutako VM baterako mihiztatzailearentzat).
Une honetan Javarako sorgailuaren bertsio bat garatzen ari naiz (JDK 1.8).

Konpilatzailearen bertsio berriak hizkuntzaren lehen bertsioaren funtzionaltasuna guztiz onartzen du eta hura osatzen du.

OOP berria

Hizkuntzaren bertsio berrian, klaseekin egindako lana partzialki birmoldatu da.
Klase-metodoak klasearen gorputzean zein kanpoan deklara daitezke.
Klaseak eraikitzaile esplizitu bat du orain: init.

Adibidea kodea:

...
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
...

Herentzia gertatzen bada, herentziazko deiak erraz egiteko aukera dugu (super).

Adibidea kodea:

...
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

Metodoen gainidazketa dinamikoa klase-instantzietan:

...
func Polymorph::NewFoo(c):
  return $a + $b + c  
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30)    // 60

Paketeak/izen-espazioak

Izen-guneak garbi egon behar du!
Horren arabera, hizkuntzak eman behar du aukera hori.
Mash-en, klase-metodo bat estatikoa bada, segurtasunez dei daiteke kodearen edozein zatitatik.

Adibidea:

...
class MyPackage:
  func MyFunc(a, b):
    return a + b  
  end
end
...
println( MyPackage -> MyFunc(10, 20) )    // 30

Bide batez, super-operadoreak behar bezala funtzionatuko du horrela deitzen denean.

salbuespenak

Hizkuntzaren bertsio berrian klaseak bezala tratatzen dira:

...
try:
  raise new Exception(
    "My raised exception!"
  )
catch E:
  if E is Exception:
    println(E)
  else:
    println("Unknown exception class!")
  end
end
...

Enumerazio berria

Orain enumerazio-elementuei balio konstanteak esleitu dakizkieke:

enum MyEnum [
  meFirst = "First",
  meSecond = 2,
  meThird
]
...
k ?= meSecond
...
if k in MyEnum:
  ...
end

Hizkuntza txertatua

Potentzialki, Mash-ek bere nitxoa aurki dezake txertatutako programazio-lengoaia gisa, Lua-ren antzera.

Helburu horietarako Mash erabiltzen hasteko, ez duzu proiektua zuk zeuk muntatu beharrik ere.

Mash-ek Runtime Environment bat du: pila batean oinarritutako VM liburutegi dinamiko gisa konpilatuta API osoarekin.

Proiektuaren menpekotasunari gehitu eta dei pare bat egitea besterik ez duzu behar.

Hizkuntzak berak funtzionalitateak eskaintzen ditu hizkuntza txertatu gisa lan egiteko.
Aldi berean, hizkuntzaren eta hirugarrenen liburutegiekin batera errendimendua ez da eragiten.
Bertan idatzitako hainbat esparruren botere osoa erabil dezakeen txertatutako hizkuntza bat lortzen dugu.

Mash + JVM

JVMrako itzultzailearen bertsio bat garatzen hasi nintzen.
Agian, N denboraren buruan, gai honi buruzko argitalpen bat agertuko da HabrΓ©-n.

Emaitzak

Ez dago emaitza berezirik. Hau emaitzen tarteko irudikapena da.
Zorte on guztioi 2020an.

Iturria: www.habr.com

Gehitu iruzkin berria