Mash — programmeerimiskeel, mis kompileerib ennast.

Mash — programmeerimiskeel, mis kompileerib ennast.

Tere kÔigile uuel 2020. aastal.

Esimese avaldamise hetkest postitusest möödus praktiliselt tÀpselt aasta.

Selle aasta jooksul on keel olnud oluliselt tÀiustatud, paljusid selle aspekte on lÀbi mÔeldud ja arengusuund on mÀÀratletud.

Olen sellest kÔigest rÔÔmus, et saan jagada kogukonnaga.

MĂ€rkus

See projekt areneb puhtalt entusiasmist ega pĂŒrgi maailmavalitsemisele dĂŒnaamiliste programmeerimiskeelte valdkonnas!

Ärge kĂ€sitlege seda arendust ideaalina, mille poole peaks pĂŒĂŒdlema, projekt ei ole ideaalne, kuid siiski areneb.

GitHub
Veebileht
Foorum

Uus kompilaator

Projektikaustas /mashc saate nÀha uut kompilaatori versiooni, mis on kirjutatud Mash'is (keele esimeses versioonis).

Kompilaatoril on koodigeneraator asm-listing (stak VM jaoks mÔeldud assembleri jaoks).
Praegu töötan Java (JDK 1.8) generaatorkomplekti versiooni kallal.

Uus kompilaatori versioon toetab tÀielikult esimeses versioonis oleva keele funktsionaalsust ja tÀiendab seda.

Uus OOP

Keele uues versioonis on osaliselt ĂŒmber töötatud klasside kĂ€sitlemine.
Klassi meetodeid saab deklareerida nii klassi kehas kui ka vÀljaspool seda.
Klassil on nĂŒĂŒd selgelt mÀÀratletud konstruktor: init.

KoodinÀide:

...
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
...

Kui toimub pÀrimine, saame hÔlpsasti teha lause inherited (super).

KoodinÀide:

...
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

DĂŒnaamiline meetodite ĂŒledefineerimine klasside eksemplaridel:

...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60

Paketid / nimeserverid

Nimeserver peab jÀÀma puhtaks!
Seega peab keel seda vÔimalust pakkuma.
Mash’s, kui klassi meetod on staatiline — seda saab ohutult kutsuda igast koodijuhist.

NĂ€ide:

...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println(MyPackage -> MyFunc(10, 20)) // 30

Muide, operaator super sellise vÀljakutse korral töötab Ôigesti.

Erandid

Keela uues versioonis töödeldakse nagu klasse:

...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...

Uus enum

NĂŒĂŒd saavad loendielemendid omada konstantseid vÀÀrtuseid:

enum MyEnum [
  meFirst = "Esimene",
  meSecond = 2,
  meThird
]
...
k ?= meSecond
...
if k in MyEnum:
  ...
end

Sisse embeditav programmeerimiskeel

Potentsiaalselt vÔib Mash vÔtta oma koha sisse embeditava programmeerimiskeelena, samasuguse nagu Lua.

Mash’i kasutamiseks nende eesmĂ€rkide saavutamiseks ei ole isegi vajalik projekti ise kokku panna.

Mash'il on Runtime Environment — virna VM, mis on koostatud dĂŒnaamilise raamatukoguna tĂ€ieĂ”igusliku API-iga.

On vajalik lisada see ainult projekti sÔltuvustesse ja teha paar vÀljakutset.

Keeles on ette nÀhtud funktsionaalsus, et toimida embeditava keele kujul.
Samas ei riku see koostalitlust keele- ja kolmandate osapoolte raamatukogudega.
Saame embeditava keele, mis suudab kasutada erinevate raamistikute kogu jÔudu, mis on sellel kirjutatud.

Mash + JVM

Alustasin JVM-i jaoks tÔlgi versiooni arendamist.
VÔib-olla ilmub N aja jooksul Habr's selle teema kohta postitus.

KokkuvÔte

Erilised tulemused puuduvad. See on vahekokkuvÔte tulemustest.
Kaua Ônne 2020. aastal.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster