A Mash egy programozási nyelv, amely önmagát fordítja

A Mash egy programozási nyelv, amely önmagát fordítja

Üdvözlök mindenkit a 2020-as új évben.

Az első megjelenése óta böjtölés Majdnem pontosan 1 év telt el Mashról.

Az idei év során a nyelvet nagymértékben fejlesztették, számos szempontját átgondolták és meghatározták a fejlődés vektorát.

Örömmel osztom meg mindezt a közösséggel.

A felelősség megtagadása

Ezt a projektet kizárólag lelkesedésből fejlesztjük, és nem akar világuralomra hivatkozni a dinamikus programozási nyelvek területén!

Ezt a fejlesztést nem kell követendő mércének tekinteni, a projekt nem ideális, de azért fejlődik.

GitHub
Telek
fórum

Új fordító

A projekttár /mashc ágában a fordító új verziója látható, amely Mash-ban (a nyelv első változata) van írva.

A fordító rendelkezik egy kódgenerátorral az asm listában (a verem alapú virtuális gépek összeállítójához).
Jelenleg a generátor Java (JDK 1.8) verzióját fejlesztem.

A fordító új verziója teljes mértékben támogatja a nyelv első verziójának funkcionalitását és kiegészíti azt.

Új OOP

A nyelv új verziójában az osztályokkal végzett munka részben át lett alakítva.
Az osztálymetódusok deklarálhatók az osztálytörzsben és azon kívül is.
Az osztálynak most van egy explicit konstruktora: init.

Minta kód:

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

Ha öröklődés következik be, akkor lehetőségünk van az örökölt hívások egyszerű lebonyolítására (szuper).

Minta kód:

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

Metódusok dinamikus felülbírálása osztálypéldányokon:

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

Csomagok/névterek

A névtérnek tisztának kell maradnia!
Ennek megfelelően a nyelvnek biztosítania kell ezt a lehetőséget.
A Mash-ban, ha egy osztálymetódus statikus, biztonságosan meghívható a kód bármely részéből.

Példa:

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

Egyébként a szuper operátor megfelelően fog működni, ha így hívják.

kivételek

A nyelv új verziójában ezeket osztályokként kezelik:

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

Új enum

Mostantól a felsorolási elemekhez állandó értékek rendelhetők:

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

Beágyazott nyelv

Lehetséges, hogy a Mash a Luához hasonlóan beágyazott programozási nyelvként is megtalálhatja a rést.

Ahhoz, hogy elkezdje használni a Mash-t ezekre a célokra, még saját maga sem kell összeállítania a projektet.

A Mash futásidejű környezettel rendelkezik – egy veremalapú virtuális gép, amely dinamikus könyvtárként van lefordítva teljes API-val.

Mindössze annyit kell tennie, hogy hozzáadja a projektfüggőséghez, és néhány hívást kezdeményez.

A nyelv maga biztosítja a beágyazott nyelvként való működést.
Ugyanakkor a nyelvi és harmadik féltől származó könyvtárak teljesítménye nincs hatással.
Kapunk egy beágyazott nyelvet, amely képes kihasználni a benne írt különféle keretrendszerek teljes erejét.

Mash + JVM

Elkezdtem fejleszteni a fordító verzióját a JVM-hez.
Talán N idő múlva megjelenik egy bejegyzés ebben a témában a Habrén.

Eredményei

Nincsenek különösebb eredmények. Ez az eredmények köztes ábrázolása.
Sok sikert mindenkinek 2020-ban.

Forrás: will.com

Hozzászólás