Salutări tuturor în noul an 2020.
De la publicarea primei
Pe parcursul acestui an limbajul a fost mult îmbunătățit, multe dintre aspectele sale au fost gândite și s-a determinat vectorul dezvoltării.
Mă bucur să împărtășesc toate acestea cu comunitatea.
Declinare a responsabilităţii
Acest proiect este dezvoltat exclusiv din entuziasm și nu pretinde dominație mondială în domeniul limbajelor de programare dinamică!
Această dezvoltare nu ar trebui să fie considerată un standard pentru care trebuie depus eforturi; proiectul nu este ideal, dar se dezvoltă totuși.
Compilator nou
În ramura /mashc a depozitului de proiect, puteți vedea o nouă versiune a compilatorului, care este scrisă în Mash (prima versiune a limbajului).
Compilatorul are un generator de cod în listarea asm (pentru asamblare pentru o VM bazată pe stivă).
În prezent, dezvolt o versiune a generatorului pentru Java (JDK 1.8).
Noua versiune a compilatorului acceptă pe deplin funcționalitatea primei versiuni a limbajului și o completează.
OOP nou
În noua versiune a limbii, lucrul cu clasele a fost reproiectat parțial.
Metodele de clasă pot fi declarate atât în corpul clasei, cât și în afara acestuia.
Clasa are acum un constructor explicit: init.
Cod simplu:
...
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
...
Dacă apare moștenirea, atunci avem posibilitatea de a face cu ușurință apeluri moștenite (super).
Cod simplu:
...
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
Suprascrierea dinamică a metodelor pe instanțe de clasă:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Pachete/spații de nume
Spațiul de nume trebuie să rămână curat!
În consecință, limba trebuie să ofere această oportunitate.
În Mash, dacă o metodă de clasă este statică, poate fi apelată în siguranță din orice parte a codului.
Exemplu:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Apropo, super operatorul va funcționa corect atunci când este chemat în acest fel.
excepții
În noua versiune a limbii, acestea sunt tratate ca niște clase:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Enum nou
Acum elementelor de enumerare li se pot atribui valori constante:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Limbajul încorporat
Potențial, Mash își poate găsi nișa ca limbaj de programare încorporat, similar cu Lua.
Pentru a începe să utilizați Mash în aceste scopuri, nici măcar nu trebuie să asamblați singur proiectul.
Mash are un mediu de rulare - un VM bazat pe stivă, compilat ca o bibliotecă dinamică cu un API complet.
Tot ce trebuie să faceți este să îl adăugați la dependența de proiect și să efectuați câteva apeluri.
Limbajul în sine oferă funcționalitate pentru a funcționa ca un limbaj încorporat.
În același timp, performanța împreună cu bibliotecile de limbă și de la terți nu este afectată.
Obținem un limbaj încorporat care poate folosi întreaga putere a diferitelor cadre scrise în el.
Mash + JVM
Am început să dezvolt o versiune a traductorului pentru JVM.
Poate că, după N timp, o postare pe acest subiect va apărea pe Habré.
Rezultatele
Nu există rezultate deosebite. Aceasta este o reprezentare intermediară a rezultatelor.
Mult succes tuturor in 2020.
Sursa: www.habr.com