
Hilsen til alle i det nye år 2020.
Siden udgivelsen af den første Der er gået næsten præcis 1 år siden Mash.
I løbet af dette år er sproget blevet forbedret betydeligt, mange af dets aspekter er blevet gennemtænkt, og udviklingsvektoren er blevet fastlagt.
Jeg er glad for at dele alt dette med fællesskabet.
Ansvarsfraskrivelse
Dette projekt udvikles udelukkende på entusiasme og gør ikke krav på verdensherredømme inden for dynamiske programmeringssprog!
Denne udvikling bør ikke betragtes som en standard, man skal stræbe efter; projektet er ikke ideelt, men det er ikke desto mindre under udvikling.
Ny compiler
I /mashc-grenen af projektarkivet kan du se en ny version af compileren, som er skrevet i Mash (den første version af sproget).
Compileren har en kodegenerator i asm-listen (til assembler til stak-VM).
Jeg er i øjeblikket ved at udvikle en version af generatoren til Java (JDK 1.8).
Den nye version af compileren understøtter fuldt ud funktionaliteten i den første version af sproget og supplerer den.
Ny OOP
I den nye version af sproget er arbejdet med klasser delvist blevet omarbejdet.
Klassemetoder kan deklareres både inden for klassens brødtekst og uden for den.
Klassen har nu en eksplicit konstruktør: init.
Eksempelkode:
...
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
...
Hvis der forekommer arv, har vi muligheden for nemt at foretage arvede (super)kald.
Eksempelkode:
...
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
Dynamisk overstyring af metoder på klasseinstanser:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Pakker / Navnerum
Navnerummet skal forblive rent!
Derfor skal sproget give denne mulighed.
I Mash, hvis en klassemetode er statisk, kan den sikkert kaldes fra enhver del af koden.
Eksempel:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Forresten vil superoperatoren fungere korrekt, når den kaldes på denne måde.
undtagelser
I den nye version af sproget behandles de som klasser:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Ny enum
Nu kan optællingselementer tildeles konstante værdier:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Indlejret PL
Potentielt kunne Mash finde sin niche som et indlejret programmeringssprog, svarende til Lua.
For at begynde at bruge Mash til disse formål behøver du ikke engang at bygge projektet selv.
Mash har et runtime-miljø - en stack-VM bygget som et dynamisk bibliotek med et fuldt udviklet API.
Alt du skal gøre er at tilføje det til dine projektafhængigheder og foretage et par opkald.
Selve sproget tilbyder funktionalitet til at fungere som et indlejret sprog.
Samtidig forringes funktionaliteten i forbindelse med sprog og tredjepartsbiblioteker ikke.
Vi får et indlejret sprog, der kan udnytte den fulde kraft af forskellige frameworks, der er skrevet i det.
Mash + JVM
Begyndte at udvikle en version af oversætteren til JVM.
Måske, efter N tid, vil der dukke et indlæg om dette emne op på Habr.
Resultaterne af
Der er ingen specifikke resultater. Dette er en foreløbig præsentation af resultaterne.
Held og lykke til alle i 2020.
Kilde: www.habr.com
