Mash ist eine Programmiersprache, die sich selbst kompiliert

Bild

Grüße an alle im neuen Jahr 2020.

Seit der Veröffentlichung des ersten Posts über Mash ist fast genau ein Jahr vergangen.

In diesem Jahr wurde die Sprache stark verbessert, viele Aspekte wurden durchdacht und ein Entwicklungsvektor definiert.

Gerne teile ich dies mit der Community.
Haftungsausschluss

Dieses Projekt wurde ausschließlich mit Begeisterung entwickelt und erhebt keinen Anspruch auf Weltherrschaft im Bereich der dynamischen Programmiersprachen!

Sie sollten diese Entwicklung nicht als einen Standard betrachten, nach dem Sie streben müssen, das Projekt ist nicht ideal, entwickelt sich aber dennoch.

Github
Site
Forum

Neuer Compiler


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

Der Compiler verfügt über einen Codegenerator in der ASM-Liste (für Assembler unter der Stack-VM).
Momentan entwickle ich die 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.

New OOP


Die neue Version der Sprache hat die Arbeit mit Klassen teilweise überarbeitet.
Klassenmethoden können sowohl im Klassenhauptteil als auch außerhalb deklariert werden.
Die Klasse hat jetzt einen expliziten Konstruktor: init.

Codebeispiel:

... 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 Vererbung auftritt, haben wir die Möglichkeit, einfach vererbte Anrufe zu tätigen (super).

Codebeispiel:

 ... 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 für Klasseninstanzen:

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

Pakete / Namespaces


Der Namespace muss sauber bleiben!
Dementsprechend sollte die Sprache diese Möglichkeit bieten.
Wenn die Klassenmethode in Mash statisch ist, kann sie sicher von einer beliebigen Stelle im Code aufgerufen werden.

Ein Beispiel:

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

Übrigens wird der Super-Operator bei einem solchen Anruf korrekt arbeiten.

Ausnahmen


In der neuen Version der Sprache werden sie als 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 Aufzählung


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

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

Eingebettet


Potenziell - Mash kann seine Nische als eingebettete Programmiersprache annehmen, ähnlich wie Lua.

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

Mash verfügt über eine Laufzeitumgebung - eine gestapelte VM, die als dynamische Bibliothek mit einer vollständigen API erstellt wurde.

Es ist nur erforderlich, es je nach Projekt hinzuzufügen und ein paar Anrufe zu tätigen.

Die Sprache selbst bietet Funktionen zum Arbeiten als eingebettete Sprache.
Gleichzeitig wird die Funktionsfähigkeit in Verbindung mit Sprach- und Fremdbibliotheken nicht beeinträchtigt.
Wir erhalten eine eingebettete Sprache, die die volle Leistung verschiedener darin geschriebener Frameworks nutzen kann.

Brei + JVM


Beginn der Entwicklung einer Übersetzerversion für die JVM.
Möglicherweise wird nach dem N-ten Mal ein Beitrag zu diesem Thema auf dem Hub angezeigt.

Zusammenfassung


Es gibt keine besonderen Ergebnisse. Dies ist eine Zwischenpräsentation der Ergebnisse.
Viel Glück für alle im Jahr 2020.

Source: https://habr.com/ru/post/de482842/


All Articles