Mash är ett programmeringsspråk som kompilerar sig själv

Mash är ett programmeringsspråk som kompilerar sig själv

Hälsningar till alla på det nya året 2020.

Sedan publiceringen av den första posta Nästan exakt 1 år har gått om Mash.

Under detta år förbättrades språket avsevärt, många av dess aspekter genomtänktes och utvecklingsvektorn bestämdes.

Jag delar gärna allt detta med samhället.

Villkor

Detta projekt utvecklas enbart på entusiasm och låtsas inte vara världsherravälde inom området dynamiska programmeringsspråk!

Denna utveckling ska inte ses som en standard att sträva efter, projektet är inte idealiskt, men det utvecklas ändå.

GitHub
webbplats
forum

Ny kompilator

I /mashc-grenen av projektförrådet kan du se en ny version av kompilatorn, som är skriven i Mash (den första versionen av språket).

Kompilatorn har en kodgenerator i asm-listning (för assembler för en stackbaserad virtuell dator).
För närvarande håller jag på att utveckla en version av generatorn för Java (JDK 1.8).

Den nya versionen av kompilatorn stöder fullt ut funktionaliteten för den första versionen av språket och kompletterar den.

Ny OOP

I den nya versionen av språket har arbetet med klasser delvis gjorts om.
Klassmetoder kan deklareras både i klasskroppen och utanför den.
Klassen har nu en explicit konstruktor: init.

Exempelkod:

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

Om arv förekommer, då har vi möjlighet att enkelt göra ärvda samtal (super).

Exempelkod:

...
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 åsidosättning av metoder på klassinstanser:

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

Paket/namnutrymmen

Namnutrymmet måste förbli rent!
Språket måste därför ge denna möjlighet.
I Mash, om en klassmetod är statisk, kan den säkert anropas från vilken del av koden som helst.

Exempel:

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

Förresten, superoperatören kommer att fungera korrekt när den anropas på detta sätt.

undantag

I den nya versionen av språket behandlas de 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

Nu kan uppräkningselement tilldelas konstanta värden:

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

Inbäddat språk

Mash kan potentiellt hitta sin nisch som ett inbäddat programmeringsspråk, liknande Lua.

För att börja använda Mash för dessa ändamål behöver du inte ens sätta ihop projektet själv.

Mash har en Runtime Environment - en stackbaserad virtuell dator kompilerad som ett dynamiskt bibliotek med ett fullständigt API.

Allt du behöver göra är att lägga till det i projektberoendet och ringa ett par samtal.

Språket i sig ger funktionalitet för att fungera som ett inbäddat språk.
Samtidigt påverkas inte prestanda i samband med språk- och tredjepartsbibliotek.
Vi får ett inbäddat språk som kan använda den fulla kraften av olika ramverk skrivna i det.

Mash + JVM

Jag började utveckla en version av översättaren för JVM.
Kanske, efter N tidsperiod, kommer ett inlägg om detta ämne att dyka upp på Habré.

Resultat av

Det finns inga särskilda resultat. Detta är en mellanrepresentation av resultaten.
Lycka till alla 2020.

Källa: will.com

Lägg en kommentar