Saludos a todos en el nuevo año 2020.
Desde la publicación del primer
Durante este año se mejoró mucho el lenguaje, se pensaron muchos de sus aspectos y se determinó el vector de desarrollo.
Estoy feliz de compartir todo esto con la comunidad.
Observación
¡Este proyecto se está desarrollando únicamente con entusiasmo y no pretende dominar el mundo en el campo de los lenguajes de programación dinámicos!
Este desarrollo no debe considerarse como un estándar por el que luchar; el proyecto no es ideal, pero de todos modos se está desarrollando.
Nuevo compilador
En la rama /mashc del repositorio del proyecto, puede ver una nueva versión del compilador, que está escrita en Mash (la primera versión del lenguaje).
El compilador tiene un generador de código en el listado asm (para ensamblador de una máquina virtual basada en pila).
Actualmente estoy desarrollando una versión del generador para Java (JDK 1.8).
La nueva versión del compilador es totalmente compatible con la funcionalidad de la primera versión del lenguaje y la complementa.
Nueva programación orientada a objetos
En la nueva versión del idioma, el trabajo con clases se ha rediseñado parcialmente.
Los métodos de clase se pueden declarar tanto en el cuerpo de la clase como fuera de él.
La clase ahora tiene un constructor explícito: init.
Ejemplo de código:
...
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
...
Si se produce herencia, entonces tenemos la oportunidad de realizar fácilmente llamadas heredadas (super).
Ejemplo de código:
...
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/espacios de nombres
¡El espacio de nombres debe permanecer limpio!
En consecuencia, el lenguaje debe brindar esta oportunidad.
En Mash, si un método de clase es estático, se puede llamar de forma segura desde cualquier parte del código.
Ejemplo:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
Por cierto, el superoperador funcionará correctamente cuando se llame de esta forma.
Excepciones
En la nueva versión del idioma se tratan como clases:
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Nueva enumeración
Ahora a los elementos de enumeración se les pueden asignar valores constantes:
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Idioma incorporado
Potencialmente, Mash puede encontrar su nicho como lenguaje de programación integrado, similar a Lua.
Para comenzar a utilizar Mash para estos fines, ni siquiera necesita armar el proyecto usted mismo.
Mash tiene un entorno de ejecución: una máquina virtual basada en pila compilada como una biblioteca dinámica con una API completa.
Todo lo que necesitas hacer es agregarlo a la dependencia del proyecto y realizar un par de llamadas.
El lenguaje en sí proporciona funcionalidad para funcionar como un lenguaje integrado.
Al mismo tiempo, el rendimiento junto con bibliotecas de idiomas y de terceros no se ve afectado.
Obtenemos un lenguaje integrado que puede utilizar todo el poder de varios marcos escritos en él.
Mezcla + JVM
Comencé a desarrollar una versión del traductor para JVM.
Quizás, después de N cantidad de tiempo, aparezca una publicación sobre este tema en Habré.
resultados
No hay resultados particulares. Esta es una representación intermedia de los resultados.
Buena suerte a todos en 2020.
Fuente: habr.com