Salutations à tous pour la nouvelle année 2020.
Depuis la publication du premier
Au cours de cette année, la langue a été grandement améliorée, plusieurs de ses aspects ont été réfléchis et le vecteur de développement a été déterminé.
Je suis heureux de partager tout cela avec la communauté.
Clause de non-responsabilité
Ce projet est développé uniquement sur l'enthousiasme et ne prétend pas à la domination mondiale dans le domaine des langages de programmation dynamiques !
Cette évolution ne doit pas être considérée comme une norme à atteindre, le projet n'est pas idéal, mais il évolue néanmoins.
Nouveau compilateur
Dans la branche /mashc du référentiel du projet, vous pouvez voir une nouvelle version du compilateur, écrite en Mash (la première version du langage).
Le compilateur dispose d'un générateur de code dans le listing asm (pour l'assembleur d'une VM basée sur une pile).
Actuellement je développe une version du générateur pour Java (JDK 1.8).
La nouvelle version du compilateur prend entièrement en charge les fonctionnalités de la première version du langage et la complète.
Nouvelle POO
Dans la nouvelle version du langage, le travail avec les classes a été partiellement repensé.
Les méthodes de classe peuvent être déclarées à la fois dans le corps de la classe et en dehors de celui-ci.
La classe possède désormais un constructeur explicite : init.
Exemple de code:
...
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 un héritage se produit, nous avons alors la possibilité de passer facilement des appels hérités (super).
Exemple de code:
...
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
Remplacement dynamique des méthodes sur les instances de classe :
...
func Polymorph::NewFoo(c):
return $a + $b + c
end
...
x -> Foo ?= Polymorph -> NewFoo
x -> Foo(30) // 60
Packages/espaces de noms
L'espace de noms doit rester propre !
En conséquence, la langue doit offrir cette opportunité.
Dans Mash, si une méthode de classe est statique, elle peut être appelée en toute sécurité depuis n’importe quelle partie du code.
Exemple:
...
class MyPackage:
func MyFunc(a, b):
return a + b
end
end
...
println( MyPackage -> MyFunc(10, 20) ) // 30
À propos, le super opérateur fonctionnera correctement lorsqu'il sera appelé de cette manière.
exceptions
Dans la nouvelle version du langage, ils sont traités comme des classes :
...
try:
raise new Exception(
"My raised exception!"
)
catch E:
if E is Exception:
println(E)
else:
println("Unknown exception class!")
end
end
...
Nouvelle énumération
Désormais, les éléments d'énumération peuvent se voir attribuer des valeurs constantes :
enum MyEnum [
meFirst = "First",
meSecond = 2,
meThird
]
...
k ?= meSecond
...
if k in MyEnum:
...
end
Langage intégré
Potentiellement, Mash peut trouver sa place en tant que langage de programmation embarqué, similaire à Lua.
Pour commencer à utiliser Mash à ces fins, vous n'avez même pas besoin d'assembler le projet vous-même.
Mash dispose d'un environnement d'exécution - une VM basée sur une pile compilée en tant que bibliothèque dynamique avec une API complète.
Tout ce que vous avez à faire est de l'ajouter à la dépendance du projet et de passer quelques appels.
Le langage lui-même fournit des fonctionnalités permettant de fonctionner comme un langage intégré.
Dans le même temps, les performances associées au langage et aux bibliothèques tierces ne sont pas affectées.
Nous obtenons un langage intégré qui peut utiliser toute la puissance des différents frameworks qui y sont écrits.
Purée + JVM
J'ai commencé à développer une version du traducteur pour la JVM.
Peut-être qu’après N laps de temps, un article sur ce sujet apparaîtra sur Habré.
Les résultats de
Il n'y a pas de résultats particuliers. Il s'agit d'une représentation intermédiaire des résultats.
Bonne chance à tous en 2020.
Source: habr.com