web-dev-qa-db-fra.com

Comment les gens créent-ils de nouveaux langages de programmation?

Comment les gens créent-ils de nouveaux langages de programmation? Plus précisément:

  1. Dans quelle langue l'écrivent-ils?
  2. Le langage doit-il être un langage entre un langage de haut niveau et un code machine?
  3. Quelles sont les étapes/éléments de la création d'un langage de programmation? Par exemple - C ou C++ (d'après mes recherches fondamentales, tous les langages de programmation ont besoin d'un compilateur ou d'un interprète mais je ne comprends pas vraiment la différence entre les deux)
19
Yogesh Tripathi
I will give you a good idea of where computers started and how they've progressed.

If you want to get into the history of computers I'd look at things such as the Jacquard loom and Babbage's difference engine. These two inventions probably had the greatest early influence on early modern computing. Usage of punch cards (Jacquard) and the mechanical 'calculation' (Babbage) provided a great foundation.

Commençons donc avec le fonctionnement de l'ordinateur. Au cœur de chaque ordinateur se trouve un transistor (et avant cela, des tubes à vide). L’important derrière un transistor est qu’il peut envoyer de l’électricité de deux manières différentes, en fonction de son état *. Cela permet la création de flux logiques d'électricité. Avec cela, nous pouvons créer toutes sortes de choses merveilleuses **: portes nand et portes, demi additionneurs, multiplexes, etc.

Maintenant que nous avons mis en place ces modules électroniques, il y a essentiellement deux types de signaux qui entrent dans ceux-ci. Signaux indiquant à l'électronique quoi faire, et données réelles avec lesquelles l'électronique est calculée. Donc, la commande à ajouter, par exemple, prend les données du registre 1 et les ajoute aux données du registre 2, puis stocke ces informations dans le registre 3. En activant cette commande, l'ordinateur est mis dans un état tel que les registres 1 et 2 se comportent comme des entrées dans l'additionneur, et le registre 3 stocke le résultat. La même chose serait vraie pour la multiplication de soustraction, etc. Il y a aussi des commandes pour dire sauter à une certaine ligne, lire des informations dans la mémoire, etc. 

Ces commandes binaires sont le code machine nécessaire pour "paramétrer" la CPU.

Jusqu'à présent, je n'ai pas vraiment répondu à vos questions, mais j'ai mis en place certains cadres pour comprendre ce qui se passe. (Vous avez dit que vous vouliez tout apprendre = P)

Nous avons maintenant un ordinateur qui fonctionne avec du code machine. Ni plus ni moins. Maintenant, c'est une machine très difficile à utiliser. Ainsi, l’Assemblée est presque toujours l’une des premières langues créées. Pour utiliser Assembly, nous devons créer un assembleur. Un assembleur est essentiellement un compilateur, qui transforme le langage Assembly en code machine. Par conséquent, les langues d'assemblage sont 1 à 1 avec les commandes de code machine. L'idée étant que nous codons cela en binaire, c'est une bonne idée de garder les choses simples. Nous avons donc maintenant quelque chose qui peut transformer le langage Assembly en code machine.

Nous avons donc maintenant deux niveaux de 'langages': 0 - Code machine: C’est un code que le CPU comprend, c’est en binaire et pas très convivial . 1 - Langage d’assemblage: Ceci en utilise Termes anglais, mais est encore relativement maladroit, et 1 à 1 en termes de commande avec le code machine.

Ajoutons donc un troisième,

2- Langage de haut niveau.

Un langage de haut niveau ressemble plus étroitement à l'anglais, par exemple à C. Nous avons des boucles et des structures de données, entre autres choses utiles. Pour utiliser C, nous devons écrire un compilateur. Un compilateur prend un code écrit en langage C et crée un code objet (similaire au langage Assembly). Ensuite, un autre programme transforme ce code objet en langage machine. De nos jours, ces deux étapes sont généralement combinées en une seule pour des raisons d'efficacité. Nous avons maintenant votre première définition. Un compilateur transforme un langage de haut niveau en un code objet (ou machine) ***.

Maintenant que nous avons notre premier langage de haut niveau (C), il semble probablement insensé et pénible de travailler à nouveau avec le langage de l'Assemblée à moins que nous ne soyons obligés de le faire. Nous pouvons maintenant écrire de nouveaux langages et compilateurs en C, ou dans n’importe quel autre langage que nous avons maintenant créé ****. 

Alors maintenant, déchirons un interprète. Un interprète est un programme qui lit et exécute un programme tout seul. Au lieu de transformer un programme qui transforme un code de haut niveau en code machine, ceci lit le code de haut niveau (généralement une ligne à la fois) et l'exécute.

Prenons Java par exemple. Java est un langage interprété, fondamentalement, cela signifie que quelqu'un a créé un programme (en C). Ce programme C lit le code Java et l’exécute. Donc, il y a une autre couche entre l'ordinateur et le code.

Il y a beaucoup de choses que ce type de réponse recouvre, comment construire un processeur, les considérations pour créer un langage, comment un même langage peut s'exécuter sur différents processeurs. Les avantages des interprètes par rapport aux compilateurs, etc. Mais, espérons-le, cela vous donnera une bonne base d'informations et d'informations que vous pourrez lire et rechercher davantage par vous-même.

25
user239887

1) Dans quelle langue l’écrivent-ils? 

Cela dépend complètement du programmeur. Plusieurs langages sont implémentés en C, C++. Plusieurs autres sont démarrés. ( C est écrit en C ). Un extrait du lien:

Bootstrapping:
Basically you start with a very minimal process/set of functions that can be used to 
compile the code that defines a slightly more functional compiler. 
This creates your next compiler which then can then be used to build code that can do even 
more. 
You repeat this process until you have a full blown compiler that can 
compile all the language features. 

En fait, c’est la compiler ou la interpreter qui est écrite dans une langue. Par exemple, Go est un langage et a deux compilateurs, gc et gccgo. gc est écrit en C et gccgo est une interface gcc écrite principalement en C++.

2) La langue doit-elle être une langue intermédiaire entre une langue de haut niveau et un code machine? 

Pas nécessairement. Comme déjà expliqué, un compilateur ou un interprète peut également être écrit dans un langage de haut niveau. Écrire une langue signifie essentiellement définir un ensemble de règles pour votre langue ou décrire les spécifications de votre langue.

3) Quels sont les étapes/éléments de la création d’un langage de programmation? Par exemple - C ou C++ (D’après mes recherches fondamentales, j’ai réalisé que tous les langages de programmation ont besoin d’un compilateur ou d’un interprète mais je ne comprends pas vraiment la différence entre deux) 

En termes simples:

  1. Préparez la sémantique pour votre langue. Dessinez une grammaire pour votre langue.
  2. Décidez si votre langue utilisera un compilateur ou un interprète. 
    Différence entre les deux (Plus sur la partie différences ici. ):

Dans le monde interprété, votre utilisateur modifiera généralement votre programme dans un éditeur et l'exécutera directement sur l'interpréteur. tandis que dans le monde de la compilation, votre utilisateur éditera votre programme, le compilera, sauvegardera l'exécutable résultant quelque part et l'exécutera.

Le compilateur prend tout le programme en entrée. L'interprète prend une seule instruction en entrée.

Les erreurs sont affichées après que le programme entier ait été vérifié dans un compilateur, tandis que les erreurs sont affichées pour chaque instruction interprétée (le cas échéant).

  1. Écrivez le frontal: comment les utilisateurs verront les erreurs, les avertissements, etc.

  2. Utilisez les informations de l'analyseur pour écrire le code de l'objet ou une représentation intermédiaire.

  3. Écrivez l'exécuteur ou le générateur de code qui liera le tout.

  4. Essais et documentation.

5
Ayushi Jha

C'est un excellent livre pour vous aider à démarrer http://www.Amazon.com/Language-Implementation-Patterns-Domain-Specific-Programming/dp/193435645X/

Les étapes de la construction d’une langue sont

  1. Lexing. Lexer signifie pouvoir lire certaines catégories de jetons. Un jeton peut être constitué d'une série de chiffres 12376 ou de chaînes de texte du type "Bonjour". Le lexing se penche sur le premier caractère (et peut également regarder en avant sur le second) pour déterminer ce que c'est. Dans le cas d'un nombre, il voit un chiffre, puis lit la suite de chiffres (en appelant un sous-programme), ou, dans le cas d'une chaîne, voit un guillemet puis lit une chaîne. Le résultat du lexer est un jeton qui est un type (un nombre ou une chaîne dans cet exemple) et le texte du jeton. Ceci est normalement stocké dans une structure sous la forme Kind int et Text string avec des constantes déclarées pour représenter les types.

  2. Le bloc de construction suivant est l'analyseur. L'analyseur voit la série de jetons, il peut donc voir qu'identificateur puis regarder à l'avenir verra un =. Ensuite, il va créer une mission. L'analyseur construit un arbre. Dans le cas d'une affectation, il construira un "noeud" de type "assign", puis stockera l'identifiant dans le premier enfant et l'expression dans le second. Tous les nœuds d'arborescence sont des "opérations", ce qui signifie qu'ils font quelque chose. Vous ne ferez pas simplement une chaîne ou un entier en tant que nœud, vous aurez "Ajouter" ou "Ajout", etc. en tant que nœuds (à moins qu'il s'agisse d'une expression, mais les expressions sont contenues dans des opérations).

  3. La dernière partie est l'exécution. Cela se fait en parcourant l'arbre et en exécutant les nœuds.

Beaucoup d'autres machines sont impliquées, telles que la mémoire, Scope et les machines d'anticipation. Ceci est expliqué dans le lien ci-dessus.

1
William Egge

En ce qui concerne votre première question. Toutes les langues ont besoin d’un compilateur, c’est vrai, mais chaque langue a sa propre manière de se compiler. Par exemple, Java utilise JDK pour être compilé et JVM pour être exécuté. Quelle que soit la langue que vous avez programmée (comme toujours comme langage de haut niveau), vous aurez des couches intermédiaires qui convertissent votre code en code machine (code binaire). Ces couches intermédiaires sont créées dans des langues de niveau intermédiaire (il y en a beaucoup, vous pouvez les lire ici http://en.wikipedia.org/wiki/Timeline_of_programming_languages ​​ ) et plus largement utilisées à ce jour. pour la programmation de bas niveau (pas encore le code machine) est C.

Tout comme la première réponse, il y avait différents niveaux de langage de programmation, mais la chose la plus importante à retenir est que les ordinateurs comprennent le code binaire, qui est 1 ou 0, et que les séries de chaînes 1 et 0 définissent ensemble le rôle d'un programme. . Tout ce que fait un ordinateur peut être réduit à cela.

Jusqu'à présent, j'espère avoir répondu à deux de vos questions.

Dans le troisième cas, le truc est toujours dans le compilateur. Si vous voulez un nouveau langage de programmation, vous avez besoin d’un compilateur pour pouvoir traduire votre code en code machine. Tout ce que vous pouvez voir maintenant, comme certains mots clés avec une couleur et des validations d’erreurs avant même de compiler votre code, ce sont des IDES (vous pouvez en savoir plus ici http://en.wikipedia.org/wiki/Integrated_development_environment ).

Par exemple, si vous voulez que "lapin" soit votre mot clé dans votre code et que vous vouliez aussi que lapin soit utilisé après une virgule, le compilateur devrait être un programme de la couche intermédiaire qui détermine s'il a été utilisé correctement ou non en lisant votre code. .

Un compilateur comporte différentes étapes: Vous devez être capable de lire votre code et de déterminer si toutes les dépendances (qui sont d’autres fichiers écrits dans votre code) et les lignes de code actuelles sont correctes. Après cela, vous devez convertir votre "lapin" en quelque chose que vous voudriez que votre programme fasse chaque fois que vous l'utilisez. En fin de compte, vous générerez un fichier pouvant être lu directement par la machine ou une autre application de votre choix, car Java utilise JVM.

J'espère que cela vous donne un peu de lumière.