Čestitke svima u novoj 2020.
Od objave prve
Tijekom ove godine jezik je uvelike poboljšan, promišljeni su mnogi njegovi aspekti i određen je vektor razvoja.
Sretan sam što sve to mogu podijeliti sa zajednicom.
Izjava o odricanju od odgovornosti
Ovaj projekt se razvija isključivo na entuzijazmu i ne pretendira na svjetsku dominaciju u području dinamičkih programskih jezika!
Ovaj razvoj ne treba smatrati standardom kojem treba težiti, projekt nije idealan, ali se svejedno razvija.
Novi prevodilac
U ogranku /mashc repozitorija projekta možete vidjeti novu verziju prevoditelja, koja je napisana u Mash-u (prva verzija jezika).
Kompajler ima generator koda u popisu asm (za asembler za VM koji se temelji na stogu).
Trenutno razvijam verziju generatora za Javu (JDK 1.8).
Nova verzija prevoditelja u potpunosti podržava funkcionalnost prve verzije jezika i nadopunjuje je.
Novi OOP
U novoj verziji jezika djelomično je redizajniran rad s razredima.
Metode klase mogu se deklarirati iu tijelu klase i izvan njega.
Klasa sada ima eksplicitni konstruktor: init.
Primjer koda:
...
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
...
Ako dođe do nasljeđivanja, onda imamo priliku lako obavljati naslijeđene pozive (super).
Primjer koda:
...
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
Dinamičko nadjačavanje metoda na instancama klase:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Paketi/imenski prostori
Imenski prostor mora ostati čist!
Sukladno tome, jezik mora pružiti tu mogućnost.
U Mashu, ako je metoda klase statična, može se sigurno pozvati iz bilo kojeg dijela koda.
Primjer:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Usput, super operater će raditi ispravno kada se pozove na ovaj način.
iznimke
U novoj verziji jezika oni se tretiraju kao klase:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Novi popis
Sada se elementima nabrajanja mogu dodijeliti konstantne vrijednosti:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Ugrađeni jezik
Potencijalno, Mash može pronaći svoju nišu kao ugrađeni programski jezik, sličan Lua.
Da biste počeli koristiti Mash u ove svrhe, ne morate čak ni sami sastaviti projekt.
Mash ima Runtime Environment - VM temeljen na hrpi kompajliran kao dinamička biblioteka s punim API-jem.
Sve što trebate učiniti je dodati ga u ovisnost o projektu i obaviti nekoliko poziva.
Sam jezik pruža funkcionalnost za rad kao ugrađeni jezik.
U isto vrijeme, izvedba u kombinaciji s jezikom i bibliotekama trećih strana nije pogođena.
Dobivamo ugrađeni jezik koji može koristiti punu snagu raznih okvira koji su u njemu napisani.
Mash + JVM
Počeo sam razvijati verziju prevoditelja za JVM.
Možda će se nakon N vremena na Habréu pojaviti post na ovu temu.
Rezultati
Nema posebnih rezultata. Ovo je srednji prikaz rezultata.
Sretno svima u 2020.
Izvor: www.habr.com