Que signifie «la langue A est écrite dans la langue B»?


31

J'entends souvent le terme que le langage A est écrit en langage B. Par exemple, PHP a été écrit C , C # est écrit en C ++ .

Quelqu'un peut-il expliquer ce que cela signifie et s'il est même exact? Est-ce que cela a quelque chose à voir avec le compilateur d'interprète utilisé par la langue?

De plus, quels sont les facteurs sur lesquels repose le choix du langage d'implémentation?


19
À strictement parler, "PHP a été écrit en C" est faux. Un langage est en soi une définition formelle, il n'est donc pas écrit dans un autre langage de programmation (mais plutôt en anglais); seuls le compilateur, l'interpréteur et / ou la bibliothèque peuvent être écrits en C, C ++ ou autre. En pratique, pour de nombreuses langues, il existe un seul compilateur ou interprète dominant, et la distinction entre la définition et l'implémentation de la langue n'est pas faite.
user281377

Fait intéressant, BCPL a été principalement écrit en BCPL
OldCurmudgeon

7
PHP "en soi", n'est pas une définition formelle. Il s'agit d'un programme C.
Kaz

8
s/written/implemented/et c'est beaucoup plus clair.
TMN

2
@ugoren Il y avait beaucoup de compilateurs C écrits en assembleur. Pas tellement ce siècle, cependant.
Ross Patterson

Réponses:


30

La plupart des langages de programmation se répartissent en deux catégories: les langages interprétés et compilés.

Un langage compilé est traduit par un compilateur en code machine , le langage que le CPU exécute directement étape par étape. Un langage interprété, en revanche, utilise un intermédiaire, un interprète , pour exécuter le code du langage. L'interpréteur est lui-même un autre programme, généralement lui-même compilé en code machine.

PHP est un langage interprété. Vous avez besoin d'un programme distinct pour exécuter le code PHP, l'ordinateur n'exécute pas le programme directement. Ce programme distinct, l'interpréteur PHP, est lui-même écrit en C.

C # est un langage compilé, mais il n'est pas compilé en code machine. Au lieu de cela, il est compilé dans un langage spécialisé, le code d'octet, pour être exécuté sur une machine virtuelle. Java est un autre exemple d'une telle configuration. Vous pouvez le voir comme un hybride entre compilation et interprétation, où la machine virtuelle est un interprète. La machine virtuelle pour C # (CLI ou Common Language Infrastructure ) est écrite en C ++.

D'autres exemples sont:

  • Python: l'interpréteur Python compile le code Python en bytecode Python, puis interprète le bytecode. L'interprète lui-même est écrit en C. De nouvelles implémentations ont depuis été ajoutées, dont une qui compile python pour s'exécuter sur la même CLI utilisée pour C #, appelée IronPython , et une qui s'exécute sur la machine virtuelle Java, Jython . Pour compléter le cercle, il existe une version Python écrite en (un sous-ensemble de) Python, PyPy .
  • Ruby: Ruby a commencé comme un langage purement interprété, mais la version la plus récente est passée à l'utilisation du bytecode. Pour Ruby, il existe également un projet qui se compile vers l'interface CLI, nommé IronRuby , et un pour la machine virtuelle Java, JRuby .

Je suis désolé, en quoi une machine virtuelle est-elle différente d'un interprète? Je ne vois pas comment en utiliser un est à mi-chemin de la compilation. Voulez-vous dire que le bytecode est à moitié compilé?
Philip

1
@Philip: le code d'octet n'est pas le code machine; Ainsi, au lieu de fournir au CPU des instructions directes, vous avez toujours besoin d'un interprète pour prendre le code d'octet et l'interpréter, le traduire en instructions machine. L'avantage est que la machine virtuelle est plus simple à porter sur d'autres architectures, et vous pouvez appliquer des astuces telles que la compilation JIT .
Martijn Pieters

Quelqu'un a-t-il l'impression que le terme «compilé» a été dilué à des fins de marketing?
Philip

2
Whoa! Je reprends ça. Je me suis trompé de route là-bas pendant un petit moment. J'ai supposé que «compilé» signifiait se transformer en code machine et uniquement en code machine, ce qui n'est pas vrai. C'est juste un terme pour traduire du code dans un autre code. Soyez le code machine, le bytecode ou la langue que vous souhaitez. En outre, il s'avère qu'il existe des compilateurs PHP, vous ne pouvez donc dire que son interprétation est "typique".
Philip

Aussi une bonne source: youtube.com/watch?v=e4ax90XmUBc
Adam

34

Vous avez fondamentalement raison. S'il est dit que Ruby est écrit en C, cela signifie que l'interpréteur de langage et des parties de la bibliothèque principale sont écrits en C.

L'interpréteur Ruby est donc un programme C qui prend un fichier texte en entrée, le traite et appelle ensuite des fonctions qui se trouvent dans un autre fichier texte (s'il est écrit en Ruby) ou qui sont du code C compilé, autant de fonctionnalités de base qui ont besoin pour accéder directement aux ressources système comme la mémoire, le système de fichiers et plus encore. Et certaines fonctions qui nécessitent de très hautes performances.

Vous avez donc différentes parties d'une langue qui peuvent ou doivent être écrites dans d'autres langues. Rien ne vous empêcherait d'écrire l'interpréteur en C et les bibliothèques en C ++ (bien que cela puisse rendre certaines choses plus difficiles). Vous pouvez même avoir plusieurs étapes et utiliser un langage très bon pour le traitement de texte pour générer des données intermédiaires qui sont ensuite traitées par un code C.

Les facteurs de la décision peuvent être les mêmes que pour d'autres applications complexes. La performance est une. La possibilité d'écrire du code qui peut accéder directement aux ressources système. Donc, dans la plupart des cas, il doit s'agir d'un langage compilé (bien qu'en théorie, vous pourriez écrire un interpréteur Ruby en Python). La disponibilité sur différents systèmes est importante si vous souhaitez que votre langue s'exécute sur Linux, Win, OS X et autres.


Est-ce que quelqu'un sait pourquoi je vois trois votes positifs pour ma réponse au moment où je l'ai publiée?
thorsten müller

1
J'en vois quatre maintenant, mais je ne suis pas vraiment sûr de ce que vous demandez? Les votes positifs sont-ils apparus trop rapidement? Si oui, eh bien, beaucoup de yeux sur la question (trois réponses presque simultanées), et votre réponse est bonne.
yannis

Hmm, oui. Peut-être que je l'avais sauvegardé puis édité, sauvegardé à nouveau et oublié la première sauvegarde (je vieillis). Pour moi, il est apparu que j'avais obtenu les trois premiers votes positifs au moment où j'ai posté.
thorsten müller

@ thorstenmüller +1 pour "Rien ne vous empêcherait d'écrire l'interpréteur en C et les bibliothèques en C ++" J'étais sur le point de vous poser des questions à ce sujet. Y a-t-il des implémentations célèbres pour cela où l'interpréteur / compilateur est dans une langue alors que les bibliothèques de base sont dans une autre langue?
Songo

@ thorstenmüller J'ai eu cela à plusieurs reprises. Si plusieurs personnes consultaient la question lorsque vous avez posté, il y aurait un petit message disant "Une nouvelle réponse a été postée" dans une seconde ou deux d'entre vous en appuyant sur soumettre, de sorte qu'ils auraient pu parcourir la réponse entière et voter de manière positive dans les 10 secondes. de votre affichage. De plus, les modifications apportées dans les 5 minutes suivant la publication de la réponse n'apparaissent pas dans l'historique des modifications, ce qui pourrait avoir causé une confusion mineure de votre part.
Izkata

10

Cela signifie simplement que la majeure partie du noyau de la langue A est écrite dans la langue B. Ce que le «noyau de la langue A» peut différer d'une langue à l'autre, mais en termes généraux vous devinez juste, cela signifie que c'est un compilateur ou un interprète. Le facteur décisif pour choisir une langue dans laquelle écrire une autre langue est, comme pour presque tous les projets, les langues que les développeurs connaissent le mieux.

Cela dit, "la langue A est écrite dans la langue B" est une simplification excessive pour la plupart des langues modernes. Si nous prenons Python comme exemple, alors que l'implémentation de référence, CPython , a bien été écrite en C, il existe des implémentations écrites dans d'autres langages, comme Jython (écrit en Java), IronPython (écrit en C #), PyPy (écrit en Python), CLPython (écrit en Common Lisp), Stackless Python (écrit en C et Python) et Unladen Swallow (écrit en C ++).

Un langage de programmation est une définition, et comme le montre l'exemple Python, il n'y a pas vraiment de restrictions sur les langues dans lesquelles son compilateur, son interprète et ses bibliothèques peuvent être écrits. Et bien sûr, il est également possible qu'un langage soit écrit en lui-même, grâce à un processus appelé bootstrapping .


2
Je n'appellerais pas Psyco une autre implémentation, car elle fonctionne comme une extension de CPython.
Martijn Pieters

@MartijnPieters C'est aussi un projet mort, selon son site. Supprimé.
yannis

@YannisRizos Est-ce que Hirondelle à vide n'est pas morte aussi ?
Andres F.20

1
@Songo: À part cela, il string.lower(s)y a une fonction python qui la délègue return s.lower(), c'est correct. Les opérations de cas de chaîne CPython 3.3 sont implémentées en C.
Martijn Pieters


3

Du point de vue de l'utilisation d'un langage de programmation, un langage de programmation n'est qu'un programme. Il peut s'agir d'un compilateur, d'un interprète ou d'une sorte de machine virtuelle. Toutes ces choses ne sont que des programmes informatiques et peuvent donc être écrites dans n'importe quelle langue.

Donc, si vous vouliez créer votre propre version de PHP, vous pourriez commencer avec la langue dans laquelle vous parlez le plus couramment. Vous écririez alors un programme qui peut lire le code au format PHP et faire tout ce que la spécification PHP dit que votre programme devrait faire. . Vous créez ainsi le langage PHP en langage X.


Point intéressant. Donc, fondamentalement, si j'ai une fonction intégrée en PHP explodequi prend un Stringet retourne un Array, son implémentation (c'est-à-dire le code qui fonctionnera sur la chaîne pour produire le tableau) est écrite en C , non?
Songo

@Songo: correct. Encore une fois, PHP n'est qu'un programme, pas différent de Word ou Apache ou Notepad ou vi ou emacs. Il lit les données et les analyse selon une spécification de langue, puis fait tout ce que la spécification de langage dit qu'il devrait faire.
Bryan Oakley

Cette réponse confond mal le langage avec l'implémentation.
Russell Borogove

Je pense que c'est la réponse la plus simple et la plus directe et je ne vois pas comment cela confond quoi que ce soit. Il suggère même qu'il pourrait y avoir plus d'une implémentation de PHP. Il existe en fait plusieurs, le PHP d'origine et le truc Facebook, et il pourrait y en avoir d'autres.
Warren P

@RussellBorogove: ne pensez-vous pas que "du point de vue de l'utilisation d'un langage de programmation" aide à clarifier la réponse? Rappelez-vous, nous avons affaire à un débutant absolu avec cette question, donc sacrifier un peu de précision pour illustrer le point est juste, OMI.
Bryan Oakley

3

Une formulation très similaire avec une signification complètement différente est «écrire le langage A dans le langage B», par exemple «écrire C en Java».

Ceci décrit du code syntaxiquement correct dans une langue, mais utilise des structures, des idiomes et des conventions d'une autre langue. Dans l'exemple "écriture de C en Java", les signes de ceci seraient de déclarer toutes les variables locales au-dessus de chaque méthode, en utilisant des constantes entières au lieu d'énumérations, en utilisant identifiers_with_underscores, etc.

En général cela se produit lorsque quelqu'un a travaillé avec une langue depuis longtemps (surtout quand ils ont travaillé seulement avec cette langue) et est très nouveau dans le langage courant (ou pas intéressé par l' écriture de code propre).


"CPython est écrit en C" ne signifie certainement pas "cet utilisateur écrit en Python comme s'il s'agissait de C". Cela signifie que CPython (Python.exe sous Windows, / usr / bin / python sous Unix) est écrit en C.
Warren P

@Warren P: bien sûr, mais les phrases sont très similaires, donc les gens qui ne connaissent pas l'un ou l'autre pourraient facilement se retrouver ici à la recherche d'une explication.
Michael Borgwardt

3

La technologie est un processus intrinsèquement itératif. Nous commençons avec des outils simples, puis utilisons ces outils pour en créer de meilleurs. Les premiers langages d'assemblage étaient à peu près des traductions 1: 1 des sous-codes d'instructions normalisés pour la puce; l'architecture 8086 et son assembleur sont devenus dominants sur d'autres architectures comme Z80, RISC, etc., et nous avons donc commencé à développer des langages pouvant être digérés dans l'assemblage 8086, comme FORTRAN, COBOL, Pascal et C. ces langues doivent être écrites dans quelque chose de plus primitif, sinon vous vous retrouvez dans un argument poulet et œuf; si le code source du premier compilateur C a été écrit en C, alors qu'est-ce qui a compilé ce code source C, et ne serait-ce pas, par définition, le premier compilateur C?

Fondamentalement, "C # est écrit en C ++" doit être considéré comme signifiant que le premier et / ou le plus populaire compilateur et les bibliothèques d'exécution / de base qui obéissent à la spécification du langage C # (ceux étant Microsoft .NET Framework et le compilateur en ligne de commande) CSC.exe) sont écrits en C ++.


0

«La langue A est écrite dans la langue B» signifie que la seule implémentation de la langue A (ou la seule qui est largement utilisée) est celle qui est en fait un projet développé en langue B, et la seule complète et à jour la spécification de A est le code source B qui l'implémente de telle sorte que si la documentation et le programme B sont en désaccord, le programme B est généralement considéré comme correct.


Il n'y a pas une implémentation faisant autorité de C ++. Dans le cas de C ++, la spécification est correcte et un comportement non défini dans la spécification peut faire quoi que ce soit dans votre implémentation. Donc non, ce n'est pas correct.
Warren P

Je ne vois pas ce que le commentaire précédent a à voir avec ma réponse. Je n'ai fait aucune déclaration quantifiée universellement sur tous les langages, et donc le contre-exemple C ++ n'est pas applicable. Une déclaration de la forme «A est écrit en B», où A est «C ++», n'a pas de sens, sauf lorsque B est «anglais».
Kaz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.