Mash je programovací jazyk, ktorý sa kompiluje sám

Mash je programovací jazyk, ktorý sa kompiluje sám

Zdravím všetkých v novom roku 2020.

Od zverejnenia prvého pôst O Mashovi uplynul takmer presne 1 rok.

Počas tohto roka sa jazyk výrazne zlepšil, premysleli sa mnohé jeho aspekty a určil sa vektor vývoja.

O toto všetko sa rád podelím s komunitou.

Vylúčenie zodpovednosti

Tento projekt je vyvíjaný výhradne s nadšením a nepredstiera svetovládu v oblasti dynamických programovacích jazykov!

Tento vývoj by sa nemal považovať za štandard, o ktorý sa treba snažiť, projekt nie je ideálny, no napriek tomu sa rozvíja.

GitHub
webové stránky
forum

Nový kompilátor

Vo vetve /mashc repozitára projektu môžete vidieť novú verziu kompilátora, ktorý je napísaný v jazyku Mash (prvá verzia jazyka).

Kompilátor má generátor kódu vo výpise asm (pre assembler pre zásobníkový VM).
V súčasnosti vyvíjam verziu generátora pre Javu (JDK 1.8).

Nová verzia kompilátora plne podporuje funkčnosť prvej verzie jazyka a dopĺňa ju.

Nové OOP

V novej verzii jazyka je čiastočne prepracovaná práca s triedami.
Metódy triedy môžu byť deklarované v tele triedy aj mimo neho.
Trieda má teraz explicitný konštruktor: init.

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

Ak dôjde k dedeniu, potom máme možnosť jednoducho uskutočniť zdedené hovory (super).

Priklad 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

Dynamické prepisovanie metód na inštanciách triedy:

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

Balíky/priestor názvov

Menný priestor musí zostať čistý!
V súlade s tým musí jazyk poskytnúť túto príležitosť.
V Mash, ak je metóda triedy statická, môže byť bezpečne volaná z ktorejkoľvek časti kódu.

Príklad:

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

Mimochodom, super operátor bude pri takomto volaní fungovať správne.

výnimky

V novej verzii jazyka sa s nimi zaobchádza ako s triedami:

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

Nový enum

Teraz je možné prvkom enumerácie priradiť konštantné hodnoty:

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

Vložený jazyk

Potenciálne môže Mash nájsť svoje miesto ako vstavaný programovací jazyk, podobne ako Lua.

Ak chcete začať používať Mash na tieto účely, nemusíte ani zostavovať projekt sami.

Mash má Runtime Environment - zásobníkový virtuálny počítač skompilovaný ako dynamická knižnica s úplným API.

Všetko, čo musíte urobiť, je pridať ho do závislosti projektu a uskutočniť niekoľko hovorov.

Samotný jazyk poskytuje funkčnosť, aby fungoval ako vložený jazyk.
Zároveň nie je ovplyvnený výkon v spojení s jazykom a knižnicami tretích strán.
Získame vložený jazyk, ktorý dokáže využiť plnú silu rôznych rámcov napísaných v ňom.

Mash + JVM

Začal som vyvíjať verziu prekladača pre JVM.
Možno sa po N dobe objaví na Habré príspevok na túto tému.

Výsledky

Neexistujú žiadne konkrétne výsledky. Toto je prechodná reprezentácia výsledkov.
Veľa šťastia všetkým v roku 2020.

Zdroj: hab.com

Pridať komentár