
Willkommen im neuen Jahr 2020.
Es ist fast ein Jahr vergangen, seit die erste Version von Mash veröffentlicht wurde.
In diesem Jahr wurde die Sprache erheblich verbessert, viele Aspekte wurden durchdacht und die Entwicklungsrichtung wurde festgelegt.
Ich freue mich, all dies mit der Community zu teilen.
Haftungsausschluss
Dieses Projekt wird ausschließlich aus Leidenschaft entwickelt und strebt nicht danach, die Dominanz im Bereich dynamischer Programmiersprachen zu erreichen.
Diese Entwicklung sollte nicht als Maßstab betrachtet werden, dem man nacheifern muss; das Projekt ist nicht perfekt, entwickelt sich jedoch weiter.
Neuer Compiler
Im Branch /mashc des Projekt-Repositorys können Sie die neue Version des Compilers sehen, die in Mash (der ersten Version der Sprache) geschrieben ist.
Der Compiler verfügt über einen Code-Generator für asm-Listings (für den Assembler der Stack-basierten VM).
Momentan arbeite ich an einer Generatorversion für Java (JDK 1.8).
Die neue Version des Compilers unterstützt vollumfänglich die Funktionalität der ersten Version der Sprache und ergänzt sie.
Neues OOP
In der neuen Version der Sprache wurde die Arbeit mit Klassen teilweise überarbeitet.
Methoden einer Klasse können sowohl im Klassenkörper als auch außerhalb dessen deklariert werden.
Die Klasse hat nun einen klar definierten Konstruktor: init.
Beispielcode:
...
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
...
Bei Vererbung haben wir die Möglichkeit, einfach Erben-Methoden (super) aufzurufen.
Beispielcode:
...
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 in Klasseninstanzen:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Pakete / Namensräume
Der Namensraum sollte sauber bleiben!
Der Sprache sollte daher diese Möglichkeit bieten.
In Mash kann eine statische Klassenmethode aus jedem Codeabschnitt sicher aufgerufen werden.
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 Aufruf korrekt arbeiten.
Ausnahmen
In der neuen Version der Sprache werden sie wie Klassen behandelt:
...
try:
raise new Exception(
"Meine ausgelöste Ausnahme!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unbekannte Ausnahme!")
end
end
...
Neues Enum
Jetzt können den Listenelementen konstante Werte zugewiesen werden:
enum MyEnum [
meFirst = "Erster",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Eingebettete Programmiersprache
Potenzialerweise könnte Mash eine Nische als eingebettete Programmiersprache einnehmen, ähnlich wie Lua.
Um Mash für diese Zwecke zu nutzen, ist es nicht einmal notwendig, das Projekt selbst zu kompilieren.
Mash verfügt über eine Laufzeitumgebung – eine stackbasierte VM, die als dynamische Bibliothek mit vollem API erstellt wurde.
Es reicht aus, sie zu den Projektabhängigkeiten hinzuzufügen und ein paar Aufrufe zu tätigen.
Die Sprache bietet Funktionalitäten, damit sie als eingebettete Sprache arbeiten kann.
Dabei wird die Funktionsfähigkeit in Kombination mit sprachlichen und externen Bibliotheken nicht beeinträchtigt.
Wir erhalten eine eingebettete Sprache, die die gesamte Leistungsfähigkeit verschiedener Frameworks nutzen kann, die damit erstellt wurden.
Mash + JVM
Die Entwicklung einer Übersetzer-Version für die JVM hat begonnen.
Vielleicht wird irgendwann in naher Zukunft ein Beitrag zu diesem Thema auf Habr erscheinen.
Ergebnisse
Es gibt keine besonderen Ergebnisse. Dies ist eine Zwischenpräsentation der Ergebnisse.
Viel Glück im Jahr 2020.
Quelle: habr.com
