Créez votre propre langage de programmation (I)

L'évolution des langages de programmation

Après avoir écrit le premier article sur comment créer votre propre système d'exploitation, quelqu'un m'a dit que si je pouvais faire un article sur comment créer un langage de programmation. Au début, je n'y prêtais pas beaucoup d'attention, mais maintenant et par d'autres moyens, j'ai appris beaucoup plus sur la création de langages de programmation. Alors faisons un langage de programmation de base, facilement intégrable dans d'autres programmes et qui fonctionne avec une machine virtuelle que nous allons également concevoir. Aujourd'hui, nous devons créer la machine virtuelle la plus basique.

Vous vous demandez probablement: Une machine virtuelle? Mais n'est-ce pas très difficile et cela ralentit-il aussi les programmes? " En revanche, une machine virtuelle simple est très simple et relativement rapide. J'ai choisi Calme comme langage pour la machine virtuelle. Mais qu'est ce que c'est Calme?

Calme C'est un langage de programmation axé sur la sécurité d'exécution, donc en l'utilisant, il sera pratiquement impossible pour quelqu'un de fermer la machine virtuelle. C'est un langage compilé en développement créé par Mozilla. Servo, le substitut de Gecko, se développe en lui. Vous pouvez toujours changer votre syntaxe mais le code que je vais utiliser sera conservé jusqu'à la première version stable.

Calme s'installe dans Linux/Unix D'une manière simple. Cependant, il n'y a pas de colis officiel. Utilisateurs de Ubuntu peut ajouter ces deux PPA: ppa: hansjorg / rouille  y ppa: cmrx64 / cargaison, utilisateurs de voûte peut utiliser AUR (cargo-git est le package qui installe tout). Le reste peut utiliser:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

Comment fonctionne une machine virtuelle?

Si vous savez comment fonctionne le monde de l'assembleur, c'est exactement la même chose, avec la pile ou la pile. Sinon, je vais vous l'expliquer. Imaginons le code suivant:

imprimer 2 + 3

L'ordinateur ne comprend pas ce que signifie 2 + 3, ni quel ordre suivre. Les ordinateurs fonctionnent avec des piles ou des piles dans lesquelles les données sont accumulées et extraites en continu. Ce code dans notre machine virtuelle devrait ressembler à ceci:

PUSH 2 PUSH 3 AJOUTER UNE IMPRESSION

Fondamentalement, nous placerions le 2 sur la pile en haut, le 3 également. ADD tirerait (c'est-à-dire le retirer de la pile et obtenir sa valeur) les 2 derniers éléments de la pile et ajouter le résultat en haut de la pile. PRINT prendrait le dernier élément de la pile et l'utilisait pour nous l'afficher. Maintenant faisons ça en Calme.

Il faut d'abord définir un langage pour le bytecode, nous pourrions utiliser un existant comme celui de Java ou l' CLR de .NET / Mono, mais nous allons en créer un plus basique.

https://gist.github.com/a01de8904fd39a442c20

Nous utilisons la notation hexadécimale pour chaque instruction. En haut nous avons mis # [dérivant (FromPrimitive)], est une particularité de Calme et cela nous aidera plus tard à pouvoir comparer directement l'énumération avec les octets.

Nous devons maintenant créer une fonction qui exécute chacune de ces instructions. Pour cela, nous devons lire un octet et le comparer avec les instructions que nous avons dans l'énumération. Si vous en trouvez, vous devez exécuter votre action.

https://gist.github.com/8950ce212a2de2f397f9

Nous faisons cela pour lire chaque octet individuellement et pour les exécuter:

https://gist.github.com/12e24a1f0dd65e4cd65d

Comme vous pouvez le voir, nous différencions si nous avons reçu la commande PUSH (notre commande INTEGER) avant, l'octet suivant sera complètement pris dans la pile. Là, nous utilisons deux fonctions que je ne vous ai pas enseignées, self.pop () y self.push (), qui sont évidemment en charge de la manipulation de la pile.

https://gist.github.com/54147f853a8a2b8c01d9

Ils ne sont pas très complexes, mais la fonction pop dispose de mécanismes de détection d'erreur. En fait, dans Calme, si nous supprimons ces mécanismes, cela nous donnerait une erreur de compilation. Maintenant, nous devons simplement appeler un programme Périn (notre machine virtuelle) et exécutez un bytecode.

https://gist.github.com/99b1ab461318b3a644d0

Ce bytecode peut être lu à partir d'un fichier, mais ici pour simplifier, je l'ai stocké dans une variable. Si nous l'exécutons, cela nous donnera le résultat attendu:

Perin v0.1 La machine virtuelle Perin exécute le bytecode FlopFlip Démarrage de l'instance PerinVM PerinVM v0.1.0 Valeur entière 5

Tout le code est disponible à GitHub sous la Licence Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Pour compiler, ils doivent avoir Cargaison installé et mis:

charge build && ./target/main

Dans le prochain chapitre, nous en verrons plus sur notre langage de programmation.


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.

  1.   routier dit

    Curiosité intéressante, même si ce n'est pas très utile en réalité, cela ne fait pas de mal de savoir.

    C'est génial que vous annonciez Rust, c'est un langage qui promet beaucoup, non seulement il est plus sûr que le c ++, mais (pour l'instant) plus clair dans sa syntaxe.

    Quant à la photo, je ne considérerais pas java evolution XD.

    1.    routier dit

      Et de fortran, je ne l'ai jamais utilisé, mais je n'en ai pas beaucoup entendu parler ...

      1.    Phorieux dit

        Je le fais, et c'est particulièrement utile en ingénierie même si Python gagne du terrain.

      2.    Jean dit

        Fortran est peut-être l'autre grand langage avec C. Même aujourd'hui, les questions vraiment critiques seront l'une ou l'autre.

        Et il serait discutable que Fortran soit comme une «évolution» de C, alors que ce devrait peut-être être l'inverse, car C est plus récent, plus moderne et avec plus de possibilités; bien que l'un ne soit pas du tout détaché de l'autre.

        Bien que les positions finales soient toutes discutables d'un certain point de vue.

    2.    Francisco dit

      +1 à Java

  2.   porter dit

    Voyons voir si j'aime ça, je donne quelque chose à la programmation mais basique pour voir si je comprends plus.

  3.   utilisateurgnulinux dit

    Quel est le véritable but de la création d'un nouveau langage de programmation? Personnellement, il me semble que c'est un stratagème pour cacher le code source.

  4.   Yeilly dit

    Ami, qu'est-il arrivé à la poursuite de "votre propre système d'exploitation"? Ne le laissez pas là, continuez-le.

    En fait, tu es un maître et juste ces deux chansons ont complètement captivé mon attention, mais je ne voudrais pas qu'elles restent à mi-chemin.

    Je sais que nous sommes nombreux à penser la même chose et nous attendons les suites et les conclusions de ces sujets très intéressants.

  5.   Christian David dit

    Très intéressant, merci beaucoup. 🙂

  6.   franc dit

    Je ne considère pas java comme un langage de programmation, mais plutôt comme un interpréteur de commandes, car il n'est pas compilable

    1.    Mario dit

      [Un langage de programmation est un langage formel conçu pour exprimer des processus qui peuvent être exécutés par des machines telles que des ordinateurs.]

      Pour cette raison, Java est un langage de programmation. Même le langage Bash (langage shell Linux) est un langage de programmation en soi.

      Il existe deux types de langues:
      - Compilé
      - Interprété
      - Mixte (Machines virtuelles, les bibliothèques natives sont compilées et le code fonctionnel est interprété)

      Les interprètes sont très utiles lorsqu'il s'agit de multiplateforme et n'ont pas de performances désastreuses pour cela. Java, VB.NET, C ++ .NET, F #, C # sont tous des langages mixtes. Le langage bash, bat, PHP, Javascript et bien d'autres sont des langages interprétés.

      Si vous ne considérez pas Java comme un langage parce qu'il est interprété (ce qui n'est pas le cas), vous ne devriez pas considérer de nombreux autres langages utilisés pour créer des programmes. De plus, selon cette règle de trois, vous ne devez pas considérer qu'il existe un langage de programmation à l'exception du langage machine lui-même.

      Et pourquoi pas? Même le langage machine ne peut être considéré comme un langage puisqu'il ne s'agit en réalité que d'un ensemble de commandes "interprétées" par le processeur.

      Car effectivement, TOUS les langages ne sont rien de plus qu'un ensemble de commandes interprétées par un processeur.

      Vous pouvez aimer un langage plus ou moins (Java, dans ce cas), paraître plus ou moins utile et puissant mais dire que ce n'est pas un langage de programmation car il n'est pas compilé… cela va à l'encontre de toutes les définitions de langage de programmation.

    2.    Mario dit

      😐 J'espère que je n'ai pas semblé trop impoli

      1.    Maria Antonieta de Manuela Cardenas dit

        pas de calme tu as seulement détruit nos vies

      2.    Mario dit

        hahahahaha, perdoooon. ce n'était pas mon intention xD

    3.    carlos dit

      java est un langage de programmation. Parce que vous pouvez développer une application et lorsque vous compilez vous créez un .jar qui est interprété par la JVM. Ensuite, selon votre logique python, il n'est pas interprété non plus, mais il se compile en différents exécutables ...

  7.   Élie Mongelos dit

    Très bonne information

  8.   Carlos Arturo dit

    bonne information mais j'ai un doute, il sera possible de créer un nouveau langage de programmation à partir de zéro sans avoir à compter sur d'autres analogies ou logiciels. Je parle de la même manière que d'autres langages ont été créés comme Java ou HTML.
    J'apprécierais grandement votre aide sur cette question.