Mash ist eine Programmiersprache, die sich selbst kompiliert

Mash ist eine Programmiersprache, die sich selbst kompiliert

Grüße an alle im neuen Jahr 2020.

Seit der Veröffentlichung des ersten Post Mit Mash ist fast genau 1 Jahr vergangen.

In diesem Jahr wurde die Sprache erheblich verbessert, viele ihrer Aspekte wurden durchdacht und der Entwicklungsvektor festgelegt.

Ich freue mich, all dies mit der Community zu teilen.

Haftungsausschluss

Dieses Projekt wird ausschließlich aus Begeisterung entwickelt und erhebt keinen Anspruch auf Weltherrschaft auf dem Gebiet der dynamischen Programmiersprachen!

Diese Entwicklung sollte nicht als anzustrebender Standard angesehen werden; das Projekt ist nicht ideal, aber es entwickelt sich dennoch.

GitHub
Webseite
Forum

Neuer Compiler

Im Zweig /mashc des Projekt-Repositorys können Sie eine neue Version des Compilers sehen, die in Mash (der ersten Version der Sprache) geschrieben ist.

Der Compiler verfügt über einen Codegenerator im ASM-Listing (für Assembler für eine Stack-basierte VM).
Derzeit entwickle ich eine Version des Generators für Java (JDK 1.8).

Die neue Version des Compilers unterstützt die Funktionalität der ersten Version der Sprache vollständig und ergänzt diese.

Neues OOP

In der neuen Version der Sprache wurde die Arbeit mit Klassen teilweise neu gestaltet.
Klassenmethoden können sowohl im Klassenrumpf als auch außerhalb deklariert werden.
Die Klasse hat jetzt einen expliziten Konstruktor: init.

ример кода:

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

Wenn eine Vererbung auftritt, haben wir die Möglichkeit, problemlos vererbte Aufrufe durchzuführen (super).

ример кода:

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

Dynamisches Überschreiben von Methoden auf Klasseninstanzen:

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

Pakete/Namespaces

Der Namensraum muss sauber bleiben!
Dementsprechend muss die Sprache diese Möglichkeit bieten.
Wenn in Mash eine Klassenmethode statisch ist, kann sie sicher von jedem Teil des Codes aus aufgerufen werden.

Beispiel:

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

Übrigens funktioniert der Super-Operator korrekt, wenn er auf diese Weise aufgerufen wird.

Ausnahmen

In der neuen Version der Sprache werden sie wie Klassen behandelt:

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

Neue Enumeration

Jetzt können Aufzählungselementen konstante Werte zugewiesen werden:

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

Eingebettete Sprache

Potenziell könnte Mash seine Nische als eingebettete Programmiersprache finden, ähnlich wie Lua.

Um Mash für diese Zwecke zu verwenden, müssen Sie das Projekt nicht einmal selbst zusammenstellen.

Mash verfügt über eine Laufzeitumgebung – eine stapelbasierte VM, die als dynamische Bibliothek mit einer vollständigen API kompiliert wurde.

Sie müssen es lediglich zur Projektabhängigkeit hinzufügen und ein paar Aufrufe tätigen.

Die Sprache selbst bietet Funktionalität, um als eingebettete Sprache zu arbeiten.
Gleichzeitig wird die Leistung in Verbindung mit Sprach- und Drittanbieterbibliotheken nicht beeinträchtigt.
Wir erhalten eine eingebettete Sprache, die die volle Leistungsfähigkeit verschiedener darin geschriebener Frameworks nutzen kann.

Mash + JVM

Ich begann mit der Entwicklung einer Version des Übersetzers für die JVM.
Vielleicht erscheint nach N Zeitspanne ein Beitrag zu diesem Thema auf Habré.

Ergebnisse

Es liegen keine besonderen Ergebnisse vor. Dies ist eine Zwischendarstellung der Ergebnisse.
Viel Glück für alle im Jahr 2020.

Source: habr.com

Kommentar hinzufügen