Mash es un lenguaje de programación que se compila

imagen

Saludos a todos en el nuevo año 2020.

Desde la publicación de la primera publicación sobre Mash, ha pasado casi exactamente 1 año.

Durante este año, el lenguaje mejoró enormemente, se pensaron muchos de sus aspectos y se definió un vector de desarrollo.

Estoy feliz de compartir esto con la comunidad.
Descargo de responsabilidad

¡Este proyecto se desarrolla exclusivamente con entusiasmo y no pretende dominar el mundo en el campo de los lenguajes de programación dinámicos!

No debe considerar este desarrollo como un estándar al que debe esforzarse, el proyecto no es ideal, pero sin embargo se está desarrollando.

Github
Sitio
Foro

Nuevo compilador


En la rama / mashc del repositorio del proyecto, puede ver la nueva versión del compilador, que está escrita en Mash (en la primera versión del lenguaje).

El compilador tiene un generador de código en la lista de asm (para el ensamblador en la pila VM).
En este momento estoy desarrollando la 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 POO


La nueva versión del lenguaje ha reelaborado parcialmente el trabajo con clases.
Los métodos de clase se pueden declarar tanto en el cuerpo de la clase como en el exterior.
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 la herencia, entonces tenemos la oportunidad de hacer llamadas heredadas (super) fácilmente.

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 

Métodos de anulación dinámica 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 mantenerse limpio!
En consecuencia, el lenguaje debería brindar esta oportunidad.
En Mash, si el método de la clase es estático, se puede llamar de forma segura desde cualquier parte del código.

Un ejemplo:

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

Por cierto, el súper operador funcionará correctamente con dicha llamada.

Excepciones


En la nueva versión del lenguaje, 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 

Incrustado


Potencialmente: Mash puede ocupar su lugar como un lenguaje de programación integrado, similar a Lua.

Para comenzar a usar Mash para estos fines, ni siquiera necesita crear un proyecto usted mismo.

Mash tiene un entorno de tiempo de ejecución: una máquina virtual apilada construida como una biblioteca dinámica con una API completa.

Solo es necesario agregarlo según el proyecto y hacer un par de llamadas.

El lenguaje en sí proporciona funcionalidad para trabajar como un lenguaje incrustado.
Al mismo tiempo, no se viola la operatividad junto con el lenguaje y las bibliotecas de terceros.
Obtenemos un lenguaje incrustado que puede usar todo el poder de varios marcos escritos en él.

Mash + JVM


Comenzó a desarrollar una versión traductora para la JVM.
Quizás, después de la enésima cantidad de tiempo, aparecerá una publicación sobre este tema en el centro.

Resumen


No hay resultados particulares. Esta es una presentación provisional de los resultados.
Buena suerte a todos en 2020.

Source: https://habr.com/ru/post/482842/


All Articles