Mash je programski jezik, ki se prevaja sam

Mash je programski jezik, ki se prevaja sam

Lep pozdrav vsem v novem letu 2020.

Od objave prvega postenje O Mashu je minilo skoraj natanko 1 leto.

V tem letu je bil jezik močno izboljšan, premišljeni so bili mnogi njegovi vidiki in določen je bil vektor razvoja.

Z veseljem delim vse to s skupnostjo.

Zavrnitev odgovornosti

Ta projekt se razvija izključno na entuziazmu in ne pretendira na svetovno prevlado na področju dinamičnih programskih jezikov!

Tega razvoja ne bi smeli jemati kot standard, h kateremu je treba težiti, projekt ni idealen, a se kljub temu razvija.

GitHub
Stran
Forum

Nov prevajalnik

V veji /mashc repozitorija projekta si lahko ogledate novo različico prevajalnika, ki je napisana v Mash (prva različica jezika).

Prevajalnik ima generator kode v seznamu asm (za sestavljalnik za VM, ki temelji na skladu).
Trenutno razvijam različico generatorja za Javo (JDK 1.8).

Nova različica prevajalnika v celoti podpira funkcionalnost prve različice jezika in jo dopolnjuje.

Nov OOP

V novi različici jezika je delo z razredi delno preoblikovano.
Metode razreda je mogoče deklarirati tako v telesu razreda kot zunaj njega.
Razred ima zdaj eksplicitni konstruktor: init.

Vzorčna koda:

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

Če pride do dedovanja, potem imamo možnost enostavno opraviti podedovane klice (super).

Vzorčna koda:

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

Dinamično preglasitev metod na instancah razreda:

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

Paketi/imenski prostori

Imenski prostor mora ostati čist!
V skladu s tem mora jezik zagotoviti to možnost.
V Mashu, če je metoda razreda statična, jo je mogoče varno poklicati iz katerega koli dela kode.

Primer:

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

Mimogrede, super operater bo deloval pravilno, ko bo klican na ta način.

Izjeme

V novi različici jezika se obravnavajo kot razredi:

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

Novo naštevanje

Zdaj je elementom oštevilčenja mogoče dodeliti konstantne vrednosti:

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

Vdelan jezik

Potencialno lahko Mash najde svojo nišo kot vgrajeni programski jezik, podoben Lui.

Če želite začeti uporabljati Mash za te namene, vam projekta sploh ni treba sestaviti sami.

Mash ima Runtime Environment – ​​virtualni stroj, ki temelji na skladu, preveden kot dinamična knjižnica s polnim API-jem.

Vse kar morate storiti je, da ga dodate v odvisnost projekta in opravite nekaj klicev.

Jezik sam zagotavlja funkcionalnost za delo kot vdelan jezik.
Hkrati to ne vpliva na delovanje v povezavi z jezikom in knjižnicami tretjih oseb.
Dobimo vgrajen jezik, ki lahko uporablja vso moč različnih ogrodij, zapisanih v njem.

Mash + JVM

Začel sem razvijati različico prevajalnika za JVM.
Morda se bo čez N časa na Habréju pojavila objava na to temo.

Rezultati

Posebnih rezultatov ni. To je vmesna predstavitev rezultatov.
Srečno vsem v 2020.

Vir: www.habr.com

Dodaj komentar