web-dev-qa-db-fra.com

Quand quelqu'un écrit un nouveau langage de programmation, dans quoi l'écrit-il?

Veuillez excuser mon ignorance. Je m'essaye à PHP et je mouille mes pieds SO, et je me sens obligé de poser une question que je me pose depuis des années:

Lorsque vous écrivez un tout nouveau langage de programmation, que l'écrivez-vous in?

Cela semble probablement très stupide pour vous tous les programmeurs, pour qui j'ai énormément de respect, mais c'est une chose déroutante pour moi. Que faire? Dites-vous Aujourd'hui, je vais inventer un nouveau langage! et puis allumer ... Bloc-notes? Tous les compilateurs sont-ils construits sur des langages déjà existants, de telle sorte que, si on les dérangeait, on pourrait représenter tous les langages de programmation jamais conçus sur un arbre de ramification monstrueux qui a finalement abouti à ... Je ne sais pas, quelque chose ancien?

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

150
Drew

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".

Eh bien, cela conduit à des questions intéressantes? Et si c'est 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 embarqués. Comme déjà répondu "une langue sur un autre ordinateur". En fait, certains appareils embarqués n'auront jamais de compilateur, leurs programmes seront toujours compilés sur un ordinateur différent.

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

Eh bien, les premiers compilateurs pour les "langages de haut niveau" auraient été écrits dans ce qui est appelé "langage d'assemblage". Le langage d'assemblage est un langage dans lequel chaque instruction dans la langue correspond à une instruction unique à la CPU. Son langage de très bas niveau et extrêmement verbeux et très laborieux à écrire.

Mais même l'écriture du langage d'assemblage nécessite 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 composé entièrement de nombres binaires qui sont une correspondance directe avec le langage brut de l'ordinateur lui-même.

Mais cela ne s'arrête toujours pas. Même un fichier contenant uniquement des nombres bruts doit encore être traduit. Vous devez toujours obtenir ces nombres bruts dans un fichier dans l'ordinateur.

Eh bien, croyez-le ou non, les premiers ordinateurs avaient une rangée de commutateurs sur le devant. Vous avez basculé les commutateurs jusqu'à ce qu'ils représentent un nombre binaire, puis vous avez actionné un autre commutateur et qui a chargé ce numéro unique 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 disque ou de cartes perforées. Vous avez actionné un autre commutateur et il a démarré le programme. Quand je suis allé à l'université dans les années 80, j'ai vu des ordinateurs qui avaient cette capacité mais qui n'ont jamais été chargés de charger un programme avec les commutateurs.

Et même plus tôt que cela, les programmes informatiques devaient être câblés avec cartes enfichables !

178
Matthew

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'analyseur comme YACC . Ce sont des langues qui sont utilisées dans un but - pour décrire la syntaxe d'une autre langue. Parfois, en ce qui concerne les langages compilés, ils sont d'abord implémentés en C. Ensuite, la première version du langage est utilisée pour créer une nouvelle version, et ainsi de suite. (Comme Haskell .)

22
Prof. Falken

De nombreuses langues sont bootstrapées, c'est-à-dire écrites en elles-mêmes . Quant à savoir pourquoi vous voudriez faire cela, c'est souvent une bonne idée de manger votre propre nourriture pour chien .

L'article wikipedia auquel je fais référence traite de la question le poulet et l'oeuf . Je pense que vous le trouverez très intéressant.

14
RichardOD

À peu près n'importe quel langage, bien que l'utilisation d'un langage adapté à l'utilisation de graphiques et d'autres structures de données complexes facilitera de nombreuses choses. Les compilateurs de production sont souvent écrits en C ou C++ pour des raisons de performances, mais les langages tels que OCaml, SML, Prolog et LISP sont sans doute meilleurs pour prototyper le langage.

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

Dans un cas particulier, les nouveaux dialectes LISP sont souvent construits sur des implémentations LISP existantes, car ils peuvent se superposer à la plupart des mêmes infrastructures. L'écriture d'un interpréteur Scheme peut se faire dans Scheme sous une page de code, auquel cas on peut facilement ajouter de nouvelles fonctionnalités.

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

10
silentbicycle

"Écrire un nouveau langage de programmation" n'implique techniquement aucun code. Il s'agit juste de proposer une spécification de l'apparence de votre langue et de son fonctionnement. Une fois que vous avez une idée de ce qu'est 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 sort 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 (la langue d'entrée) en un programme de langage d'assemblage (la langue 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 pas besoin des traducteurs pour exécuter votre programme. Puisque vous avez maintenant un programme en langage machine, le CPU agit comme interprète.

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

Le fait que les traducteurs n'aient pas besoin d'être gardés pour exécuter un programme est ce qui permet de "bootstrap" votre langue sans qu'il finisse par s'exécuter "par dessus" des couches et des couches d'autres langues.

[1] La plupart des JVM effectuent des traductions en arrière-plan, mais ce ne sont pas vraiment des traducteurs dans la mesure où l'interface avec la JVM n'est pas "langue d'entrée -> langue de sortie".

4
Kannan Goundan

En fait, vous pouvez écrire dans presque toutes les langues que vous aimez. Rien ne vous empêche d'écrire un compilateur C dans Ruby. "Tout" 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 nativement sur x86. Développez sur votre PC et puis transférez le programme sur votre nouvelle plateforme cible.

Les compilateurs les plus élémentaires sont probablement Assembler et C.

4
ziggystar

En général, vous pouvez utiliser à peu près la langue que vous aimez. PHP a été écrit en C, par exemple. Si vous n'avez accès à aucun compilateur, vous devrez recourir à l'écriture du langage d'assemblage et le compiler manuellement en code machine.

3
Kaivosukeltaja

De nombreuses langues ont d'abord été écrites dans une autre langue disponible, puis réimplémentées en elles-mêmes et démarrées de cette façon (ou simplement conservées l'implémentation dans la langue étrangère, comme PHP et Perl), mais certaines langues, comme le le premier assembleur a été compilé manuellement en code machine comme le premier compilateur C a été compilé manuellement en Assembly.

Je m'intéresse au bootstrap depuis que j'ai lu à 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'ai appelé EBF , en lui-même. la première version d'EBF avait 3 primitives supplémentaires et j'ai compilé à la main le premier binaire. J'ai trouvé un rythme en deux étapes en le faisant. J'ai implémenté une fonctionnalité dans la langue actuelle dans une version et j'ai eu une version douce où j'ai réécrit le code pour utiliser la fonctionnalité implémentée. Le langage était suffisamment expressif pour être utilisé pour faire un interpréteur LISP .

J'ai la version compilée à la main avec la source dans la première balise de sortie et le code est assez petit. La dernière version est 12 fois plus grande en taille et en code et permet un code plus compact, donc il serait 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 est que vous comprenez pourquoi certaines choses sont telles qu'elles sont. Mon code était un produit si de petits ajustements incrémentiels semblaient avoir évolué plutôt que d'être conçus à partir de zéro. Je garde cela à l'esprit lors de la lecture du code aujourd'hui qui, je pense, semble un peu différent.

2
Sylwester

La plupart des compilateurs étaient des programmes de type C ou ac, sinon c, alors Assembly lang est le chemin à parcourir. Cependant, lors de l'écriture d'un nouveau lang à partir de zéro et que vous n'avez pas de macro lib ou de code source à partir d'un langage prototype, vous devez définir vos propres fonctions Maintenant dans quelle langue? Vous pouvez simplement écrire une forme "de code source appelé psedocode sur la machine, cela ressemble à une grammaire bnf de la spécification lang structurée orientée objet comme Fortran basic algo LISP. Donc, l'image écrit un code croisé ressemblant à l'une de ces syntaxes de langage C'est du code psedo

1
chris anderson

Généralement avec un langage de programmation à usage général adapté au développement de systèmes, par ex. C, Haskell, ML, LISP, etc., mais la liste des options est longue. De plus, généralement avec certains langages spécifiques au domaine pour l'implémentation du langage, par exemple des générateurs d'analyseurs et d'analyseurs lexicaux, des langages intermédiaires comme LLVM , etc. Et probablement certains scripts Shell, tester des cadres et un système de configuration de construction, par exemple autoconf.

1
james woodyatt

J'ai moi aussi posé cette question il y a quelques mois. Et j'ai lu quelques articles et regardé quelques vidéos qui m'ont aidé à commencer à écrire ma propre langue appelée soft. Ce n'est pas encore terminé mais j'ai appris beaucoup de choses de ce voyage.

Les choses de base que vous devez savoir sont le fonctionnement du compilateur lorsqu'il doit exécuter un extrait de code. Le compilateur a beaucoup de phases comme l'analyse lexicale, l'analyseur sémantique, AST (arbre de syntaxe abstraite), etc.

Ce que j'ai fait dans ma nouvelle langue se trouve ici - http://www.singhajit.com/writing-a-new-programming-language/

Si vous écrivez une langue pour la première fois, alors tout le meilleur et vous avez un long chemin à parcourir.

0
Ajit Singh