Sveikinu visus su naujais 2020 metais.
Nuo pat pirmojo paskelbimo
Per šiuos metus kalba buvo labai patobulinta, apgalvota daugelis jos aspektų, nustatytas raidos vektorius.
Džiaugiuosi galėdamas visu tuo pasidalinti su bendruomene.
Atsakomybės neigimas
Šis projektas kuriamas tik entuziastingai ir nepretenduoja į pasaulinį dominavimą dinaminių programavimo kalbų srityje!
Ši plėtra neturėtų būti laikoma standartu, kurio reikia siekti, projektas nėra idealus, bet vis dėlto vystosi.
Naujas kompiliatorius
Projekto saugyklos šakoje /mashc galite pamatyti naują kompiliatoriaus versiją, kuri parašyta Mash (pirmoji kalbos versija).
Kompiliatorius turi kodų generatorių asm sąraše (skirtas rinkiniui pagrįsto VM surinkėjui).
Šiuo metu kuriu generatoriaus versiją, skirtą Java (JDK 1.8).
Naujoji kompiliatoriaus versija visiškai palaiko pirmosios kalbos versijos funkcionalumą ir ją papildo.
Naujas OOP
Naujoje kalbos versijoje darbas su klasėmis buvo iš dalies pakeistas.
Klasės metodai gali būti deklaruojami tiek klasės korpuse, tiek už jo ribų.
Dabar klasėje yra aiškus konstruktorius: init.
Kodo pavyzdys:
...
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
...
Jei įvyksta paveldėjimas, tuomet turime galimybę nesunkiai atlikti paveldėtus skambučius (super).
Kodo pavyzdys:
...
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
Dinaminis metodų nepaisymas klasės egzemplioriuose:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Paketai / vardų erdvės
Vardų erdvė turi likti švari!
Atitinkamai, kalba turi suteikti tokią galimybę.
Mash, jei klasės metodas yra statinis, jį galima saugiai iškviesti iš bet kurios kodo dalies.
Pavyzdys:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Beje, super operatorius taip iškviestas veiks teisingai.
Išimtys
Naujoje kalbos versijoje jie traktuojami kaip klasės:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Naujas enum
Dabar surašymo elementams galima priskirti pastovias reikšmes:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Įterpta kalba
Potencialiai Mash gali rasti savo nišą kaip įterptoji programavimo kalba, panaši į Lua.
Norėdami pradėti naudoti Mash šiems tikslams, jums net nereikia patiems surinkti projekto.
„Mash“ turi vykdymo aplinką – kamino pagrindu sukurtą VM, sukompiliuotą kaip dinaminę biblioteką su visa API.
Viskas, ką jums reikia padaryti, tai pridėti jį prie projekto priklausomybės ir paskambinti porą kartų.
Pati kalba suteikia funkcionalumą veikti kaip įterptoji kalba.
Tuo pačiu metu našumas kartu su kalbos ir trečiųjų šalių bibliotekomis neturi įtakos.
Gauname įterptąją kalbą, kuri gali išnaudoti visą įvairių joje parašytų karkasų galią.
Mash + JVM
Pradėjau kurti JVM vertėjo versiją.
Galbūt po N laiko Habré pasirodys įrašas šia tema.
rezultatai
Konkrečių rezultatų nėra. Tai yra tarpinis rezultatų vaizdas.
Sėkmės visiems 2020 metais.
Šaltinis: www.habr.com