Quand quelqu'un écrit un nouveau langage de programmation, qu'est-ce qu'il écrit IN?

StackOverflow https://stackoverflow.com/questions/1629513

  •  06-07-2019
  •  | 
  •  

Question

Veuillez excuser mon ignorance. Je barbote dans PHP et je me mouille les pieds SO, et je me sens obligé de poser une question à laquelle je me pose des questions depuis des années:

Lorsque vous écrivez un tout nouveau langage de programmation, en quoi l'écrivez-vous dans?

Cela semble probablement ridicule à tous les programmeurs, pour qui j’ai beaucoup de respect, mais c’est un poulet déconcertant. œuf pour moi. Que faire? Dis à toi-même Aujourd'hui, je vais inventer un nouveau langage! puis lancer ... Bloc-notes? Tous les compilateurs sont-ils construits sur des langages existants, de manière à pouvoir tracer tous les langages de programmation jamais conçus sur un seul arbre ramifié monstrueux qui a finalement été mis à la terre à ... Je ne sais pas, quelque chose old?

Avec mon faible intellect, je trouve cela fascinant ... S'il vous plaît, éduquez-moi!

Était-ce utile?

La solution

Ce n’est pas une question stupide. C'est une excellente question.

Comme déjà répondu, la réponse courte est "Une autre langue".

Cela conduit à des questions intéressantes? Et si c'était la toute première langue écrite pour  votre matériel particulier? Un problème très réel pour les personnes qui travaillent sur des appareils intégrés. Comme déjà répondu "une langue sur un autre ordinateur". En fait, certains périphériques embarqués n’auront jamais de compilateur, leurs programmes seront toujours compilés sur un autre ordinateur.

Mais vous pouvez le repousser encore plus loin. Qu'en est-il des premiers programmes jamais écrits?

Eh bien, les premiers compilateurs de "langages de haut niveau" aurait été écrit dans ce qu'on appelle "langage d'assemblage". Le langage assembleur est un langage où chaque instruction dans la langue correspond à une instruction unique à la CPU. Son langage très simple et son écriture extrêmement verbeuse et très laborieuse.

Mais même l'écriture de langage d'assemblage requiert un programme appelé assembleur pour convertir le langage d'assemblage en "langage machine". Nous remontons plus loin. Les tout premiers assembleurs ont été écrits en "code machine". Un programme entièrement constitué de nombres binaires correspondant directement au langage brut de l’ordinateur lui-même.

Mais ça ne finit toujours pas. Même un fichier contenant uniquement des nombres bruts encore nécessite une traduction. Vous devez toujours obtenir ces numéros bruts dans un fichier dans l'ordinateur.

Eh bien, croyez-le ou non, les premiers ordinateurs avaient une rangée de commutateurs à l’avant. Vous avez basculé les commutateurs jusqu'à ce qu'ils représentent un nombre binaire, puis vous avez actionné un autre commutateur et chargé ce nombre dans la mémoire de l'ordinateur. Ensuite, vous avez continué à feuilleter jusqu'à ce que vous ayez chargé un programme informatique minimal capable de lire des programmes à partir de fichiers sur disque ou de cartes perforées. Vous avez appuyé sur un autre commutateur et le programme a démarré. Quand je suis allé à l’université dans les années 80, j’ai vu des ordinateurs qui avaient cette capacité, mais n’avaient jamais été chargés de charger un programme avec les commutateurs.

Et même avant cela, les programmes informatiques devaient être câblés avec les tableaux de connexion !

Autres conseils

La réponse la plus courante est C . La plupart des langages sont implémentés en C ou dans un hybride de C avec des rappels et un "lexer". comme Flex et un générateur d'analyse comme YACC . Ce sont des langages qui sont utilisés dans un but - pour décrire la syntaxe d'un autre langage. Parfois, les langages compilés sont d'abord implémentés en C. La première version du langage est utilisée pour créer une nouvelle version, et ainsi de suite. (Comme Haskell .)

De nombreuses langues sont initialisées - elles sont écrites en elles-mêmes . Si vous souhaitez faire cela, c’est souvent une bonne idée de de manger votre propre nourriture pour chien .

L'article de Wikipédia auquel je me réfère traite de du poulet et de l'œuf . problème. Je pense que vous le trouverez très intéressant.

Quasiment tous les langages, bien que l’utilisation d’un langage adapté au travail avec les graphes et d’autres structures de données complexes facilite beaucoup de choses. Les compilateurs de production sont souvent écrits en C ou C ++ pour des raisons de performances, mais des langages tels que OCaml, SML, Prolog et Lisp sont sans doute meilleurs pour le prototypage du langage.

Il existe également plusieurs "petites langues". utilisé dans la conception de la langue. Lex et yacc sont utilisés pour spécifier la syntaxe et les grammaires, par exemple, et sont compilés en C. (Il existe des ports pour d’autres langages, tels que ocamllex / ocamlyacc, et de nombreux autres outils similaires.)

Comme cas particulier, les nouveaux dialectes Lisp reposent souvent sur des implémentations Lisp existantes, car ils peuvent se greffer sur la plupart des infrastructures. L'écriture d'un interpréteur Scheme peut être réalisée dans Scheme sous une page de code, auquel on peut facilement ajouter de nouvelles fonctionnalités.

Fondamentalement, les compilateurs sont juste des programmes qui lisent quelque chose et le traduisent en autre: conversion du code source LaTeX en DVI, conversion du code C en assembleur puis en langage machine, conversion d'une spécification de grammaire en code C pour un analyseur syntaxique, etc. Son concepteur spécifie la structure du format source (analyse), la signification de ces structures, la simplification des données (optimisation) et le type de sortie à générer. Les interprètes lisent le source et l'exécutent directement. (Les interprètes sont généralement plus simples à écrire, mais beaucoup plus lents.)

En fait, vous pouvez écrire dans presque toutes les langues que vous aimez. Rien ne vous empêche d'écrire un compilateur C en Ruby. " Tous " vous devez analyser le programme et émettre le code machine correspondant. Si vous pouvez lire / écrire des fichiers, votre langage de programmation suffira probablement.

Si vous partez de zéro sur une nouvelle plate-forme, vous pouvez effectuer une compilation croisée: écrivez un compilateur pour votre nouvelle plate-forme, qui s'exécute en Java ou en mode natif sur x86. Développez sur votre PC, puis transférez le programme sur votre nouvelle plate-forme cible.

Les compilateurs les plus basiques sont probablement Assembler et C.

"Rédaction d'un nouveau langage de programmation" n'implique techniquement aucun code. Il s'agit simplement de spécifier votre langage et son fonctionnement. Une fois que vous avez une idée de votre langue, vous pouvez écrire des traducteurs et des interprètes pour que votre langue fonctionne réellement.

Un traducteur entre un programme dans une langue et édite un programme équivalent dans une autre langue. Un interprète entre un programme dans une langue et l’exécute.

Par exemple, un compilateur C traduit généralement le code source C (le langage de saisie) en un programme en langage assembleur (le langage de sortie). L'assembleur prend ensuite le programme de langage d'assemblage et produit le langage machine. Une fois que vous avez votre sortie, vous n'avez plus besoin des traducteurs pour exécuter votre programme. Puisque vous avez maintenant un programme en langage machine, la CPU agit en tant qu'interprète.

De nombreuses langues sont implémentées différemment. Par exemple, javac est un traducteur qui convertit le code source Java en bytecode JVM. La JVM est un interpréteur [1] qui exécute le bytecode Java. Après avoir exécuté javac et obtenu du code intermédiaire, vous n'avez plus besoin de javac . Cependant, chaque fois que vous souhaitez exécuter votre programme, vous aurez besoin de la machine virtuelle Java.

Le fait de ne pas avoir à garder des traducteurs pour exécuter un programme est ce qui permet de "démarrer" et de "démarrer". votre langue sans qu’elle finisse par courir " au-dessus de " couches et couches d'autres langues.

[1] La plupart des machines virtuelles Java effectuent des traductions en arrière-plan, mais ce ne sont pas vraiment des traducteurs, car l'interface avec la machine virtuelle Java n'est pas la "langue de saisie - > langue de sortie ".

En général, vous pouvez utiliser à peu près la langue de votre choix. PHP a été écrit en C, par exemple. Si vous n’avez aucun accès à un compilateur, vous devrez écrire et assembler le langage assembleur en code machine à la main.

De nombreuses langues ont d'abord été écrites dans une autre langue disponible, puis réimplémentées en elles-mêmes et amorcées de cette manière (ou ont simplement conservé l'implémentation dans une langue étrangère, comme PHP et perl), mais certaines langues, comme le premier assembleur, ont été compilées à la main. Le code machine, comme le premier compilateur C, a été compilé à la main pour l’assemblage.

Je suis intéressé par l’amorçage depuis que je lis à ce sujet. Pour en savoir plus, j’ai essayé de le faire moi-même en écrivant mon propre sur-ensemble de BF, que j’appelais EBF , en soi. La première version de EBF avait 3 primitives supplémentaires et j'ai compilé à la main le premier fichier binaire. J'ai trouvé un rythme en deux temps en le faisant. J'ai implémenté une fonctionnalité dans le langage actuel dans une version et j'ai eu une version agréable dans laquelle j'ai réécrit le code pour utiliser la fonctionnalité implémentée. Le langage était suffisamment expressif pour être utilisé pour créer un interprète LISP .

J'ai la version compilée à la main avec la source dans le balise de la première version et le code est assez petit. La dernière version est 12 fois plus grande en taille et le code permet un code plus compact, il serait donc difficile de compiler manuellement la version actuelle.

Edmund Grimley Evans a fait quelque chose de similaire avec son langage HEX

L’une des choses intéressantes à faire vous-même, c’est que vous comprenez pourquoi certaines choses sont ce qu’elles sont. Mon code était produit si de petits ajustements incrémentiels semblaient avoir évolué plutôt que d'être conçus de toutes pièces. Je garde cela à l’esprit lors de la lecture du code aujourd’hui, ce qui me semble quelque peu gênant.

Généralement, utilisez un langage de programmation général adapté au développement de systèmes, par exemple. C, Haskell, ML, Lisp, etc., mais la liste des options est longue. En outre, généralement avec certains langages spécifiques à un domaine pour la mise en œuvre du langage, par exemple des générateurs d'analyseurs syntaxiques et lexicaux, des langages intermédiaires tels que LLVM , etc. Et probablement des scripts shell, des frameworks de test et un système de configuration de build, par exemple autoconf.

La plupart des compilateurs ont été écrits en C ou en ac programme, sinon c, alors assembler lang est la voie à suivre. Cependant, lorsque vous écrivez une nouvelle langue à partir de zéro et que vous n’avez pas de macro lib ou de code source à partir d’un langage prototype, vous devez le définir. vos propres fonctions Maintenant dans quelle langue? Vous pouvez simplement écrire un formulaire "de code source appelé psedocode" sur la machine. Il ressemble à une grammaire BNF issue de la spécification lang structurée orientée objet, telle que Fortran basic algo lisp. Donc, l'image écrit un code croisé ressemblant à l'une de ces syntaxes de langage C'est du code psedo

Même d'autres opérations binaires ou assemblées doivent être traduites en fonctions, c'est-à-dire le travail des assembleurs / compilateurs, puis en objet, à partir des données et des fonctions, si vous ne disposez pas d'un fichier source à afficher " comment la fonctionnalité de ces objets doit être représentée dans votre implémentation linguistique, vous devez alors reconnaître "voir". implémentez ou définissez vos propres fonctions, procédures et structures de données, ce qui nécessite beaucoup de connaissances, vous devez vous demander ce qu'est une fonction.Votre esprit devient alors la simulation de langage.Ceci sépare un programmeur maître du reste.

Moi aussi j'avais cette question il y a quelques mois. Et j'ai lu quelques articles et regardé des vidéos qui m'ont aidé à écrire mon propre langage appelé soft. Ce n'est pas encore complet mais j'ai appris beaucoup de choses de ce voyage.

Ce que vous devez savoir, c'est comment le compilateur fonctionne lorsqu'il doit exécuter un extrait de code. Le compilateur comporte de nombreuses phases comme l’analyse lexicale, l’analyseur sémantique, l’AST (arbre de syntaxe abstraite), etc.

Ce que j'ai fait dans ma nouvelle langue peut être trouvé ici - http: / /www.singhajit.com/writing-a-new-programming-language/

Si vous écrivez une langue pour la première fois, alors bonne chance et vous avez encore un long chemin à parcourir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top