Mash est un langage de programmation qui se compile

Mash est un langage de programmation qui se compile

Salutations à tous pour la nouvelle année 2020.

Depuis la publication du premier le jeûne Presque exactement 1 an s'est écoulé à propos de Mash.

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.

GitHub
site Web
Forum

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

Ajouter un commentaire