
Saluto tutti in questo nuovo anno 2020.
Dalla pubblicazione del primo di Mash è trascorso praticamente un anno.
In quest'anno il linguaggio è stato notevolmente migliorato, molti dei suoi aspetti sono stati ponderati e è stata definita la direzione dello sviluppo.
Sono felice di condividere tutto ciò con la comunità.
Avvertenza
Questo progetto è sviluppato unicamente per passione e non aspira alla supremazia mondiale nel campo dei linguaggi di programmazione dinamici!
Non si dovrebbe considerare questo sviluppo come un modello a cui aspirare; il progetto non è perfetto, ma comunque si sta evolvendo.
Nuovo compilatore
Nella branch /mashc del repository del progetto, puoi vedere una nuova versione del compilatore, scritta in Mash (nella prima versione del linguaggio).
Il compilatore ha un generatore di codice in listing asm (per l'assembler su una VM a stack).
Attualmente sto sviluppando una versione del generatore per Java (JDK 1.8).
La nuova versione del compilatore supporta completamente le funzionalità della prima versione del linguaggio e le amplia.
Nuovo OOP
Nella nuova versione del linguaggio, la gestione delle classi è stata in parte riprogettata.
I metodi di una classe possono essere dichiarati sia all'interno che all'esterno della classe.
Ora la classe ha un costruttore esprimibile in modo esplicito: init.
Esempio di codice:
...
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
...
In caso di ereditarietà, abbiamo la possibilità di effettuare facilmente chiamate inherited (super).
Esempio di codice:
...
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
Ridefinizione dinamica dei metodi negli oggetti delle classi:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Pacchetti / spazi dei nomi
Lo spazio dei nomi deve rimanere pulito!
Di conseguenza, il linguaggio deve fornire questa possibilità.
In Mash’, se un metodo di classe è statico, può essere chiamato in modo sicuro da qualsiasi parte del codice.
Esempio:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
A proposito, l'operatore super funzionerà correttamente con questa chiamata.
Eccezioni
Nella nuova versione del linguaggio, vengono gestite come classi:
...
try:
raise new Exception(
"La mia eccezione sollevata!"
)
catch E:
if E is Exception:
println(E)
else:
println("Classe di eccezione sconosciuta!")
end
end
...
Nuovo enum
Ora agli elementi dell'enumerazione possono essere assegnati valori costanti:
enum MyEnum [
meFirst = "Primo",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Linguaggio di programmazione incorporato
Potenzialmente, Mash può occupare la sua nicchia come linguaggio di programmazione integrato, simile a Lua.
Per iniziare a utilizzare Mash a questi fini, non è nemmeno necessario costruire il progetto da soli.
Mash dispone di un Runtime Environment — una VM basata su stack, costruita come una libreria dinamica con un API completa.
È sufficiente aggiungerla alle dipendenze del progetto e fare un paio di chiamate.
Il linguaggio stesso prevede funzionalità per funzionare come linguaggio incorporato.
In questo modo, la funzionalità in combinazione con le biblioteche linguistiche e di terze parti non viene compromessa.
Otteniamo un linguaggio incorporato che può utilizzare tutta la potenza di vari framework scritti in esso.
Mash + JVM
Ho iniziato a sviluppare una versione del traduttore per JVM.
Forse, dopo un certo periodo di tempo, apparirà un post su questo argomento su Habr.
Risultati
Non ci sono risultati definitivi. Questa è una rappresentazione intermedia dei risultati.
Buona fortuna a tutti per il 2020.
Fonte: habr.com
