Grüße an alle im neuen Jahr 2020.
Seit der Veröffentlichung des ersten
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.
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