Mash er et programmeringsspråk som kompilerer seg selv

Mash er et programmeringsspråk som kompilerer seg selv

Hilsen alle i det nye året 2020.

Siden utgivelsen av den første post Nesten nøyaktig 1 år har gått om Mash.

I løpet av dette året ble språket kraftig forbedret, mange av dets aspekter ble gjennomtenkt og utviklingsvektoren ble bestemt.

Jeg er glad for å dele alt dette med fellesskapet.

Ansvarsfraskrivelse

Dette prosjektet utvikles utelukkende på entusiasme og later ikke som verdensherredømme innen dynamiske programmeringsspråk!

Denne utviklingen skal ikke betraktes som en standard å strebe etter, prosjektet er ikke ideelt, men det utvikler seg likevel.

GitHub
Området
forum

Ny kompilator

I /mashc-grenen til prosjektlageret kan du se en ny versjon av kompilatoren, som er skrevet i Mash (den første versjonen av språket).

Kompilatoren har en kodegenerator i asm-oppføring (for assembler for en stackbasert VM).
For tiden utvikler jeg en versjon av generatoren for Java (JDK 1.8).

Den nye versjonen av kompilatoren støtter fullt ut funksjonaliteten til den første versjonen av språket og utfyller den.

Ny OOP

I den nye versjonen av språket er arbeidet med klasser delvis redesignet.
Klassemetoder kan deklareres både i klassekroppen og utenfor den.
Klassen har nå en eksplisitt konstruktør: init.

Kodeeksempel:

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

Dersom det oppstår arv, så har vi mulighet til enkelt å foreta arvede samtaler (super).

Kodeeksempel:

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

Dynamisk overstyring av metoder på klasseforekomster:

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

Pakker/navnerom

Navneområdet må forbli rent!
Språket må derfor gi denne muligheten.
I Mash, hvis en klassemetode er statisk, kan den trygt kalles fra hvilken som helst del av koden.

Eksempel:

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

Superoperatøren vil forresten fungere korrekt når den blir tilkalt på denne måten.

unntakene

I den nye versjonen av språket blir de behandlet som klasser:

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

Ny enum

Nå kan oppregningselementer tildeles konstante verdier:

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

Innebygd språk

Potensielt kan Mash finne sin nisje som et innebygd programmeringsspråk, som ligner på Lua.

For å begynne å bruke Mash til disse formålene, trenger du ikke engang å sette sammen prosjektet selv.

Mash har et Runtime Environment - en stabelbasert VM kompilert som et dynamisk bibliotek med en full API.

Alt du trenger å gjøre er å legge det til prosjektavhengigheten og foreta et par samtaler.

Språket i seg selv gir funksjonalitet for å fungere som et innebygd språk.
Samtidig påvirkes ikke ytelsen i forbindelse med språk- og tredjepartsbiblioteker.
Vi får et innebygd språk som kan bruke den fulle kraften til ulike rammer skrevet i det.

Mash + JVM

Jeg begynte å utvikle en versjon av oversetteren for JVM.
Kanskje, etter N tid, vil et innlegg om dette emnet dukke opp på Habré.

Resultater av

Det er ingen spesielle resultater. Dette er en mellomrepresentasjon av resultatene.
Lykke til alle sammen i 2020.

Kilde: www.habr.com

Legg til en kommentar