Saúdos a todos no novo ano 2020.
Dende a publicación do primeiro
Durante este ano mellorouse moito a lingua, pensáronse moitos dos seus aspectos e determinouse o vector de desenvolvemento.
Estou feliz de compartir todo isto coa comunidade.
retratação
Este proxecto desenvólvese unicamente con entusiasmo e non pretende dominar o mundo no campo das linguaxes de programación dinámica!
Este desenvolvemento non debe considerarse como un estándar polo que se pretende esforzarse; o proxecto non é o ideal, pero está a desenvolverse.
Novo compilador
Na rama /mashc do repositorio do proxecto, podes ver unha nova versión do compilador, que está escrita en Mash (a primeira versión da linguaxe).
O compilador ten un xerador de código na lista asm (para ensamblador para unha máquina virtual baseada en pilas).
Actualmente estou a desenvolver unha versión do xerador para Java (JDK 1.8).
A nova versión do compilador admite totalmente a funcionalidade da primeira versión da linguaxe e complétaa.
Novo OOP
Na nova versión do idioma, o traballo coas clases foi parcialmente redeseñado.
Os métodos de clase pódense declarar tanto no corpo da clase como fóra dela.
A clase agora ten un construtor explícito: init.
Código de exemplo:
...
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
...
Se se produce a herdanza, entón temos a oportunidade de facer chamadas herdadas facilmente (super).
Código de exemplo:
...
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
Anulación dinámica de métodos en instancias de clase:
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Paquetes/espazos de nomes
O espazo de nomes debe permanecer limpo!
En consecuencia, a lingua debe ofrecer esta oportunidade.
En Mash, se un método de clase é estático, pódese chamar con seguridade desde calquera parte do código.
Exemplo:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Por certo, o superoperador funcionará correctamente cando se chame deste xeito.
Excepcións
Na nova versión do idioma trátanse como clases:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Nova enumeración
Agora os elementos de enumeración pódense asignar valores constantes:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Linguaxe incorporada
Potencialmente, Mash pode atopar o seu nicho como linguaxe de programación integrada, similar a Lua.
Para comezar a usar Mash para estes fins, nin sequera necesitas montar o proxecto ti mesmo.
Mash ten un entorno de execución: unha máquina virtual baseada en pilas compilada como unha biblioteca dinámica cunha API completa.
Todo o que tes que facer é engadilo á dependencia do proxecto e facer un par de chamadas.
A linguaxe en si proporciona funcionalidades para funcionar como linguaxe incorporada.
Ao mesmo tempo, o rendemento en conxunto con bibliotecas de idiomas e de terceiros non se ve afectado.
Obtemos unha linguaxe integrada que pode utilizar todo o poder de varios marcos escritos nel.
Mash + JVM
Comecei a desenvolver unha versión do tradutor para a JVM.
Quizais, despois de N período de tempo, apareza unha publicación sobre este tema en Habré.
Resultados de
Non hai resultados particulares. Esta é unha representación intermedia dos resultados.
Moita sorte a todos no 2020.
Fonte: www.habr.com