7
votes

Langage de programmation et compilateur

J'avais cette discussion avec mon ami et j'ai réalisé que cela pourrait être le meilleur endroit pour poser cette question?

Comment est une nouvelle langue née? Cette nouvelle langue nouvelle doit être écrite dans un ancien langage ancien (par exemple, C ++ a été écrit en C en étapes initiales), ou comment cela est-il créé ?? Et comment cette langue nouvelle peut-elle fonctionner s'il n'y a pas de compilateur pour cela? Donc, il doit y avoir un compilateur pour cela? Qui écrit compiler pour cela?

Alors, comment tout cela fonctionne-t-il ensemble, nouvelle langue et son compilateur, relation de la nouvelle langue avec son ancienne langue de base?


4 commentaires

Merci à tous pour de telles réponses rapides. Un cours de la conception du compilateur est ce dont j'ai besoin, je suppose. Mais, je me demandais / curieux de savoir comment vous pouvez tous répondre si vite, je veux dire dans les 1-2 minutes, ce qui est très incroyable?


Nous sommes tous en train de mourir pour des points de réputation. Upvote nous, s'il vous plaît! :-)


@Norman: Je suis nouveau à cela et je ne sais pas beaucoup sur les réputations. Avoir à vérifier tout cela quand je suis libre. Je suppose que tu es heureux maintenant. :)


Dupliqué possible de Comment le premier compilateur a été écrit? , Que-Someone-wites-a-new-language -Qu'est-ce que-faire-ils-write-it-in


6 Réponses :


5
votes

Vous écrivez le compilateur dans une langue de mise en œuvre jusqu'à ce que le compilateur puisse commencer à compiler suffisamment de la nouvelle langue à utiliser pour mettre en œuvre le reste de la nouvelle langue.

C'est comme ça que ça marche.

Edit: Juste pour clarifier, les commentateurs de cette réponse sont également corrects. Le compilateur ne doit pas être écrit dans la nouvelle langue que si vous le souhaitez. Comme dit, certains ne vont pas cette route et restent avec la langue de mise en œuvre d'origine.


3 commentaires

Yup c'est tout en un mot. Il y a ceux qui ne croient pas que c'est une vraie langue sauf si elle peut être utilisée pour écrire son propre compilateur :)


Pour ajouter à la réponse de Scyllinice: toutes les langues ne peuvent pas aller dans cette voie, bien sûr - de nombreuses variations LISP sont des interprètes purs sans la capacité de créer un exécutable en soi, et un compilateur LISP peut être écrit à peu près n'importe quelle langue. Les anciennes et les nouvelles langues n'ont pas vraiment besoin d'avoir un lien réel l'un à l'autre.


Cependant, vous n'avez pas nécessairement de migrer de la langue de mise en œuvre d'origine. Par exemple, TCL et beaucoup (la plupart?) Les langages de script utilisent une langue de mise en œuvre C ou C ++ après la nouvelle langue devenue mature et stable.



2
votes

bootstrapping est un terme utilisé dans l'ordinateur Science pour décrire les techniques impliquées dans la rédaction d'un compilateur (ou assembleur) dans le langage de programmation cible qu'elle est destinée à compiler. Cette technique s'appelle également auto-hébergement.


0 commentaires

1
votes

Vous voudrez peut-être lire sur la conception de la langue de programmation et la conception du compilateur:

http://dragonbook.stanford.edu/
bootstrapping (compilateurs)
http://fr.wikipedia.org/wiki/programming_language
http://www.paulgraham.com/langdes.html

ou, prenez un cours ou trois à votre université locale.


0 commentaires

1
votes

Le cœur de toute langue est la lieur et le compilateur, le compilateur qui convertit le code source en intermédiaire, très proche du code de la machine, du code. À partir de ce point, les liens sont utilisés pour la fixer à d'autres fichiers binaires tels que des bibliothèques, etc. Une fois les fichiers binaires liés à toutes les pièces logiques, ils deviennent un fichier exécutable dans le code de la machine (ou un code intermédiaire traduisant tel qu'il est avec .NET / Java ).

La plus grande traduction de l'anglais "humain" arrive dans le compilateur et il y a de grands articles sur la manière dont cela se fait ... mais pour la plupart de cela, c'est dans le domaine du surnaturel, comme les compétences organisationnelles nécessaires à l'écriture de Un compilateur de travail est immense.

Vous pouvez voir les sortes de traductions de niveau de surface et examiner de plus près la façon dont les compilateurs fonctionnent en regardant les définitions de langue ("Le langage de programmation C ++" de Bjarne Stroustrup, "Le langage de programmation C #" de Microsoft Press), où les deux annexes et poivré tout au long des pièces lexicales ou des règles que le compilateur utilisera pour traduire vos mots en code de machine de manière très logique.

Je recommande vivement de lire la définition de la langue de votre langage de programmation préféré si vous souhaitez comprendre plus, l'article Wikipedia sur les compilateurs vous donnera une compréhension plus large.


2 commentaires

Je ne suis pas d'accord avec la déclaration "Les compétences organisationnelles requises pour écrire un compilateur de travail sont immenses". De retour Quand j'étais juste une poignée d'années à partir de l'université et je n'ai jamais eu de classe de compilateur, j'ai pu créer une langue spéciale à l'aide de Lex et du YACC. Bien que difficile, c'était loin d'être immensément difficile. C'était vraiment enrichissant.


@Bryan: Cela dépend. Avec des outils modernes de génération de compilation, il peut être raisonnablement facile de créer une petite langue (comme de nombreuses langues spécifiques de domaine), mais @sprague assume quelque chose de viande. Une fois que vous avez ajouté toute l'optimisation, la génération de code, etc. nécessaire pour un langage de programmation majeur comme Python, Java ou C # Le travail peut devenir très exigeant. Ensuite, il existe des tâches auxiliaires telles que la conception VM, les algorithmes de GC, les bibliothèques standard, ...



0
votes

Une langue est (généralement) rien qu'une spécification. Un compilateur ou un interprète d'une langue peut être écrit dans n'importe quelle langue de votre choix. Le premier était en code de machine depuis que c'est tout ce que nous avions. Ensuite, a été assemblé, puis d'autres langues comme C. Étant donné que la période C (et C ++) est restée des choix populaires pour la mise en œuvre d'une langue. C et C ++ notent cependant les seuls choix.

Il convient également de souligner que souvent une langue peut être mise en œuvre avec une langue (ou des langues spécialisée) telles que YACC et Lex. Ce sont des langues spécifiques de domaine spécifiquement conçues pour faciliter la création de compilateurs basés sur une spécification. Cela prend la corvée hors de la main à la main de nombreuses choses qui peuvent facilement être générées par un ordinateur. Vous prenez la spécification, passez à travers ces outils et vous enfoncez le code pour implémenter votre langue. YACC représente encore un autre compilateur-compilateur. Il compile les spécifications d'un compilateur et génère un compilateur.

D'autres affiches suggèrent qu'une fois qu'une langue est suffisamment robuste, le compilateur peut être porté à lui-même mais cela n'est pas nécessaire. De nombreuses langues ont été écrites une décennie ou plus il y a plus de C et continuer à être mises en œuvre dans C aujourd'hui.


0 commentaires

1
votes

Grande question!

  • Parfois, le compilateur de la nouvelle langue est écrit dans une ancienne langue.

  • Si le compilateur pour la nouvelle langue n est écrit dans n , il y a beaucoup de stratégies, qui impliquent toutes de trouver un moyen d'exécuter un programme dans la langue n quand vous n'avez pas encore de compilateur.

    1. Écrivez un interpréter pour la langue n , disons en C (vraiment la langue de votre choix), utilisez l'interprète pour interpréter le compilateur de la compilation.

      • Écrivez un compilateur vraiment horrible pour n , dites en C, puis utilisez-le pour compiler la première version du compilateur.

      • compilez la première version du compilateur dans le code de montage ou le code C, généralement à la main.

        Mon préféré est la stratégie n ° 1, mais elles travaillent tous.

        Si vous souhaitez voir une solution à ce problème expliqué en profondeur, regardez le court papier d'Andrew Appel Bootstrappe Axiomatic: un guide pour les pirates de compilateur , qui est libre d'un site Web de Princeton. Ce papier est très mathématique, mais dans la section de travail connexe, vous trouverez des références à des papiers plus âgés, y compris ceux qui montrent le processus de bootstress à l'aide de diagrammes T, que de nombreuses personnes trouvent très intuitives.


0 commentaires