Mash ass eng Programméierungssprooch déi sech selwer kompiléiert

Mash ass eng Programméierungssprooch déi sech selwer kompiléiert

Gréiss un jiddereen am neie Joer 2020.

Zënter der Verëffentlechung vun der éischter posten Bal genee 1 Joer ass iwwer Mash vergaangen.

Wärend dësem Joer gouf d'Sprooch staark verbessert, vill vun hiren Aspekter goufe geduecht an de Vektor vun der Entwécklung gouf festgeluecht.

Ech si frou dëst alles mat der Gemeinschaft ze deelen.

Verzichterklärung

Dëse Projet gëtt eleng op Begeeschterung entwéckelt a mécht net wéi eng Weltherrschaft am Beräich vun dynamesche Programméierungssproochen!

Dës Entwécklung sollt net als Standard ugesi ginn fir no ze streiden; de Projet ass net ideal, awer et entwéckelt sech trotzdem.

GitHub
Websäit
Forum

Neie Compiler

An der /mashc Branche vum Projet Repository kënnt Dir eng nei Versioun vum Compiler gesinn, deen am Mash geschriwwe gëtt (déi éischt Versioun vun der Sprooch).

De Compiler huet e Code Generator an asm Oplëschtung (fir Assembler fir e Stack-baséiert VM).
Momentan entwéckelen ech eng Versioun vum Generator fir Java (JDK 1.8).

Déi nei Versioun vum Compiler ënnerstëtzt voll d'Funktionalitéit vun der éischter Versioun vun der Sprooch an ergänzt se.

Nei OOP

An der neier Versioun vun der Sprooch ass d'Aarbecht mat de Klassen deelweis nei entworf ginn.
Klassemethoden kënne souwuel am Klassekierper an ausserhalb deklaréiert ginn.
D'Klass huet elo en explizit Konstruktor: init.

Beispill Code:

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

Wann d'Ierfschaft geschitt, da hu mir d'Méiglechkeet einfach ierflech Uriff ze maachen (super).

Beispill Code:

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

Dynamesch Iwwerschreiden vu Methoden op Klassinstanzen:

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

Packagen / Nummraim

Den Nummraum muss propper bleiwen!
Deementspriechend muss d'Sprooch dës Méiglechkeet bidden.
Am Mash, wann eng Klassmethod statesch ass, kann se sécher aus all Deel vum Code genannt ginn.

Beispill:

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

Iwwregens, wäert de Super Bedreiwer richteg schaffen wann op dës Manéier genannt.

Ausnahmen

An der neier Versioun vun der Sprooch gi se wéi Klassen behandelt:

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

Nei Enum

Elo kënnen Opzielungselementer konstant Wäerter zougewisen ginn:

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

Embedded Sprooch

Potenziell kann Mash seng Nisch als embedded Programméiersprooch fannen, ähnlech wéi Lua.

Fir Mash fir dës Zwecker ze benotzen, musst Dir net emol de Projet selwer zesummestellen.

Mash huet e Runtime Environment - e Stack-baséiert VM kompiléiert als dynamesch Bibliothéik mat enger voller API.

Alles wat Dir maache musst ass et an d'Projetofhängegkeet ze addéieren an e puer Uruff ze maachen.

D'Sprooch selwer bitt Funktionalitéit fir als embedded Sprooch ze schaffen.
Zur selwechter Zäit ass d'Leeschtung a Verbindung mat Sprooch- an Drëttbibliothéiken net beaflosst.
Mir kréien eng embedded Sprooch déi déi voll Kraaft vu verschiddene Kaderen benotze kann, déi dra geschriwwe sinn.

Mash + JVM

Ech hunn ugefaang eng Versioun vum Iwwersetzer fir de JVM z'entwéckelen.
Vläicht, no N Zäit, e Post zu dësem Thema erschéngt op Habré.

Resultater

Et gi keng speziell Resultater. Dëst ass eng Zwëschenvertriedung vun de Resultater.
Vill Gléck fir jiddereen am Joer 2020.

Source: will.com

Setzt e Commentaire