Chaque langue est-elle écrite en C?

180

Parfois, lors de la programmation dans différents langages (C / C ++, C #), cette idée me vient à l’esprit:

  • Chaque langue est-elle écrite dans le langage de programmation C?
  • La langue C est-elle la mère / le père de toutes les langues?
  • Est-ce que chaque concept ( POO , etc.) est implémenté en C?

Suis-je dans la bonne direction?

FaizanRabbani
la source
58
@XLAnt: beaucoup (peut-être même la plupart) des compilateurs C sont écrits en c.
Jörg W Mittag
32
@ Neil: C ++ ne compile rien. C ++ est un langage. Les langues ne compilent pas, les compilateurs font.
Jörg W Mittag Le
12
@XLAnt: Je ne pense pas. Mais le premier compilateur Oberon, par exemple, a été écrit en Oberon puis traduit manuellement (ce qui est une forme de compilation, je suppose) en Fortran. Ce compilateur a ensuite été compilé avec un compilateur Fortran. Le compilateur Oberon ainsi obtenu a été utilisé pour compiler le compilateur Oberon et à partir de ce moment-là, la version précédente du compilateur a été utilisée pour compiler la suivante.
Jörg W Mittag
18
@ Neil Ce n'est pas vraiment si pédant. C'est exact: une langue est une spécification. Il peut être implémenté en tant que compilateur, interprète, hybride, etc. Vous pouvez écrire un compilateur pour un langage, mais le compilateur n'est pas le langage. Je suppose que la question est confuse car il existe des langages pour lesquels aucune spécification n’est écrite nulle part, sauf pour son implémentation de référence. Mais même dans ces cas, je dirais que le langage (c’est-à-dire l’idéal que l’auteur avait en tête) est différent de l’implémentation / compilateur / interprète / etc.
Andres F.
21
Downvoters: C'est une question assez raisonnable avec une réponse claire. Que la réponse soit "non" n'est pas une raison pour invoquer un vote négatif. Pensez plutôt à répondre et à expliquer.
Andres F.

Réponses:

207

Non.

Les dialectes OCaml, Haskell, Lisp tels que Scheme et plusieurs autres langues sont souvent utilisés dans le développement des langues de loisir.

Beaucoup de langages sont implémentés en C parce que c'est un langage omniprésent, et les outils d'écriture de compilateur tels que les générateurs lexer-parser (tels que yacc et bison) sont bien compris et presque aussi omniprésents.

Mais C lui-même ne pouvait pas être développé en C lors de sa création. En fait, il a été développé à l’origine en utilisant le langage B. Les langages précédents (comme le Fortran) étaient généralement initialisés à l' aide d'un langage d'assemblage natif ou même du code machine bien avant que C n'existe.

Sans aucun rapport, les paradigmes linguistiques tels que la programmation orientée objet sont généralement indépendants de la langue . Le paradigme fonctionnel, par exemple, a été développé (par Alonzo Church) en tant que fondement des mathématiques bien avant qu'un langage de programmation n'existe. Les paradigmes de programmation procédurale et structurée sont issus des travaux mathématiques de théoriciens comme John von Neumann. L'orientation objet a été développée par plusieurs efforts différents et sans lien , certains issus du calcul lambda (le paradigme fonctionnel) et d'autres de systèmes de programmation dynamiques tels que SmallTalk at Xerox PARC de Alan Kay.

C n’est qu’une infime partie de l’histoire, des décennies après la naissance de ces idées.

dégraissage
la source
40
S'il est vrai que les premiers compilateurs C ne pouvaient évidemment pas être écrits en C, c'est certainement possible maintenant.
Reirab
17
@reirab Posible ET vrai. GCC est écrit en C et généralement compilé avec GCC .
Darkhogg
9
Bien sûr, GCC est maintenant en train d'être réécrit en C ++, mais ce n'est pas aussi important que le fait que le premier compilateur C ne puisse pas être écrit en C.
greyfade
10
@ Greyfade gcc n'a pas été C depuis un certain temps. Ce n'est pas "maintenant en train d'être réécrit", c'est "a été écrit en C ++ depuis plus de deux ans" (c'est encore plus vieux que ça, c'est quand la fusion est arrivée qui l'a déplacée en C ++).
13
@ Grayfade n'est pas "C mais avec des fonctionnalités C ++" sorte de la définition de C ++?
KutuluMike
91

Chaque langue est-elle écrite en langage C?

Un langage est un ensemble de règles et de restrictions mathématiques abstraites ("si j'écris ceci , cela se produit"). Ce n'est écrit dans rien, vraiment.

Il est spécifié, généralement en mélangeant un sous-ensemble formalisé d'anglais, une notation mathématique et peut-être un langage de spécification spécialisé. La syntaxe est souvent spécifiée dans une variante de EBNF ou ABNF .

Par exemple, voici la spécification de l' forexpression à partir de la spécification du langage ISO Ruby:

§11.5.2.3.4 L' forexpression

Syntaxe

  • for-expression for for-variable [pas de fin de ligne ici] in expression do-clause end
  • pour variable gauche gauche | multiple gauche

Sémantique

Une expression for est évaluée comme suit:

  1. Évaluez l' expression . Si l'évaluation de l'expression se termine par une pause-expression , suivant l' expression , ou refaire l' expression , le comportement est non spécifiée. Sinon, laissez Oêtre la valeur résultante.
  2. Laissez - Eêtre la principale méthode invocation de la forme d'expression primaire [aucune ligne de terminaison ici] .each do | bloc paramètres liste | bloc-corps end , où la valeur de la première expression est O, le bloc paramètre liste est le lucratif variable , le bloc-corps est l' instruction composée de la clause do .

    Évaluer E; cependant, si un bloc dont le corps est block- statement de la clause do de l' expression for est appelé pendant cette évaluation, les étapes décrites au § 11.3.3, à l'exception de l'étape c) et de l'étape e) 4), doivent être pris pour l'évaluation de cet appel.

  3. La valeur de l' expression for est la valeur résultante de l'invocation.

Voici un exemple différent des règles de conformité de type de Scala:

Le type polymorphe [a 1 >: L 1 <: U 1 ,…, a n >: L n <: U n ] T est conforme au type polymorphe [a1>: L ' 1 <: U' 1 ,…, a n >: L ' n <: U' n ] T ' si, en supposant que L' 1 <: a 1 <: U ' 1 ,…, L' n <: a n <: U′n a T <: T ′ Et L i <: L ′ i et U ′ i<: U i pour i ∈ {1,…, n} .


La langue C est-elle mère / père de toutes les langues?

Non ce n'est pas. C est assez jeune. Il y a beaucoup de vieilles langues. Comme le voyage dans le temps est physiquement impossible, il est tout simplement impossible que C ait eu une quelconque influence sur ces anciennes langues.

  • Plankalkül (1943)
  • Code de vitesse (1953)
  • Fortran (1954)
  • IPL (1956)
  • Lisp (1958)
  • Algol (1958)
  • COBOL (1959)
  • JOVIAL (1960)
  • APL (1962)
  • SIMULA (1962)
  • SNOBOL (1962)
  • CPL (1963)
  • BASIC (1964)
  • PL / I (1964)
  • RPG (1964)
  • BCPL (1966)
  • ISWIM (1966)
  • MUMPS (1967)
  • Forth (1968)
  • LOGO (1968)
  • REFAL (1968)
  • B (1969)
  • BLISS (1970)
  • Pascal (1971)
  • KRL (1971)
  • Smalltalk (1972)

Tous ceux qui existaient avant même que C n'ait été inventé. Et beaucoup d'autres n'ont aucune influence de C en eux, même après son existence. La famille de langues PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Oberon actif, Component Pascal) est une lignée complètement séparée. Toute la famille Lisp (LISP, Franz Lisp, InterLisp, MacLisp, Scheme, Flavors, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket, etc.) n’a pas non plus de relation. Les langages fonctionnels (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, Fa #, Haskell, Gofer, Clean) et toute la famille dépendante (Agda, Coq, GURU, Idris) sont aussi éloignés que possible de C. Il en va de même pour la famille Smalltalk (Smalltalk, Self, Newspeak, Us, Korz), la famille de programmation logique (PLANNER, Prolog, Mercury), SQL et bien d’autres.

Chaque concept (OOP, etc.) est-il entièrement implémenté en langage C?

Simula (1960) et Smalltalk (1972) ont été les premières langues à utiliser des concepts orientés objet, mais des systèmes orientés objet avaient été construits dès 1953 (sans les appeler ainsi). Encore une fois, c’est bien avant que C n’existe, donc OO ne peut avoir aucune relation avec C.

Jörg W Mittag
la source
2
@leftaroundabout: C'est un excellent article de blog, l'un de mes favoris depuis des années.
Jörg W Mittag
1
@ FrancisDavey: Merci. J'ai commencé par compiler la liste de mémoire, puis j'ai ajouté des dates dont je ne me souvenais pas en les cherchant sur Wikipedia. Après cela, j’ai trouvé un tableau chronologique des langues sur Wikipedia et en ai choisi quelques autres. Depuis l'article sur BCPL citant 1966, mais la chronologie citant 1967, je n'avais pas remarqué que j'avais déjà ajouté BCPL. Je vais enlever le duplicata.
Jörg W Mittag
1
Dans votre liste, "htroF" n'est-il pas orthographié à l'envers?
Chux
2
«Les voyages dans le temps sont physiquement impossibles» - C’est une revendication très controversée. Cela n'enlève rien à la valeur de cette réponse, bien sûr.
Konrad Rudolph
50

La plupart des langues essentielles sont écrites en C, mais les choses changent:

  • l'implémentation de référence de Python ( CPython ) est écrite en C (mais d'autres implémentations sont écrites dans d'autres langages, par exemple Jython / Java, PyPy / Python, IronPython / C # ...)
  • PHP Zend Engine est écrit en C
  • Le tout premier compilateur Java développé par Sun Microsystems a été écrit en C, mais à présent, les bibliothèques de classes sont toujours écrites en Java (car elles sont destinées à être exécutées à l'aide de la machine virtuelle Java elle-même). Certaines bibliothèques utilisant JNI (Java Native Interface) peuvent être partiellement écrites dans une variété d'autres langages, car elles sont destinées à être utilisées HORS DE LA JVM.

    La machine virtuelle Sun / Oracle est écrite en C ++. La machine virtuelle BEA / Weblogic / Oracle est écrite en C. Mais il existe des machines virtuelles Java écrites en Java, Lisp, SmallTalk (IBM) ...

  • Perl est implémenté en tant qu'interpréteur principal, écrit en C, avec une vaste collection de modules, écrits en Perl et C (mais Pugs , un compilateur et interprète pour le langage de programmation Perl 6, est écrit en Haskell)
  • l'interprète officiel Ruby, souvent appelé interprète Ruby ou IRM de Matz, est écrit en C et utilise sa propre machine virtuelle spécifique à Ruby (mais il existe JRuby, une implémentation Java s'exécutant sur la machine virtuelle Java; Rubinius, une application C ++. bytecode machine virtuelle qui utilise LLVM pour compiler en code machine au moment de l'exécution ...)
  • environ 50% de R est écrit en C
  • et, bien sûr, C est (était) écrit en C ! (Mais le premier compilateur C, destiné au PDP-11, était un mélange de B et d’assembleur).

C a souvent été choisi pour plusieurs raisons: performances, portabilité, expérience.

Le dernier étant probablement le plus important: Python a été lancé en 1991, PHP en 1994/1995, Perl en 1988, Ruby en 1995. Au cours de ces années, Java venait de paraître et C ++ n'était pas encore bien normalisé.


Un peu lié:

manlio
la source
5
Du point de vue de la mise en œuvre des compilateurs / interprètes, C a été / est un point de référence. De plus, il a influencé directement ou indirectement de nombreux langages ultérieurs (du moins syntaxiquement).
Manlio
2
Bientôt, vous pourrez dire que C # a été écrit en C #! (genre de)
DLeh
1
La plupart de Mono (qui inclut un compilateur C # et beaucoup / la plupart de la bibliothèque de classes de base .NET) est écrit en C #.
Charlie Kilian
3
La réponse à la question "C est la mère / père de toutes les langues?" est "non", donc je ne pense pas qu'il soit utile de fournir beaucoup d'exemples qui sont écrits en C. Des contre-exemples vous aideraient, mais vos choix descendent toujours de C. Par exemple, même si Java, Python, etc. sont maintenant auto-hébergés, ils étaient encore amorcés depuis C, ils sont donc comme des "petits-enfants" de C. Des langages comme LISP, FORTRAN, ML et (bien sûr) le code machine sont de véritables contre-exemples, car C n’a jamais été impliqué dans leur création.
Warbo
2
Bien entendu, l’aspiration à de nombreuses langues doit être mise en œuvre autant que possible en soi. Cependant, il semble que la plupart des langues dépendent de C parce que la plupart des langues doivent pouvoir appeler C pour être utiles; la majorité des API de systèmes d'exploitation modernes et des bibliothèques utiles ont généralement des liaisons C. Vous devez également faire attention à ce que vous entendez par "écrit dans". Une implémentation de langage comporte généralement plusieurs parties: au moins un compilateur et un système d'exécution. Les systèmes d'exécution sont souvent écrits en C pour une meilleure interface avec le système d'exploitation.
Pseudonyme
10

Non, certaines langues sont antérieures à C. Et beaucoup sont implémentées indépendamment de C, par exemple, voir http://en.wikipedia.org/wiki/Lisp_%28programming_language%29

Ofir
la source
2
Il existe de nombreuses implémentations de Java, la plupart sont écrites en Java. L'implémentation GNU d'Objective-C est écrite en C (ou C ++, ils ont changé récemment, je crois), l'implémentation de LLVM est écrite en C ++ et il existait auparavant un interpréteur en C #. Il existe de nombreuses implémentations de Python, une en RPython, une en Java, une en C # et une en C. PHP comporte six implémentations principales, deux en Java, deux en C #, une en C et une en C ++.
Jörg W Mittag
1
Les concepteurs de langues sont certes influencés par d'autres langues, mais ils peuvent choisir d'ignorer ces influences s'ils le souhaitent.
Jörg W Mittag
2
Les langues @FaizanRabbani sont, en substance, des concepts et des choix de paradigmes, de schémas et de compromis - très souvent, un "langage est créé / adapté à partir d'un autre langage", mais cela n'a aucun rapport avec le langage d'implémentation de son compilateur; Le langage X peut être dérivé du langage Y mais implémenté en C ou quelque chose de complètement différent - et c'est souvent le cas. Et dans ce cas, «l'ancêtre conceptuel» est important, mais le langage du compilateur n'est qu'une nuance technique à peine pertinente qui peut changer avec le temps.
Peteris
3
Ce dernier lien a une valeur douteuse - trop d’erreurs pour vraiment le prendre au sérieux.
Codeur inconnu
4
@SebastianGodelet: HotSpot n'est pas une implémentation du langage Java. C'est une implémentation du langage de bytecode de la JVM. Ce sont deux langues complètement différentes. Les implémentations les plus utilisées du langage Java proviennent javacde Oracle JDK / OpenJDK écrit par Martin Odersky (de renommée Scala) en 100% Java, le compilateur Eclipse, écrit en 100% Java (dérivé du compilateur Jikes d'IBM ), le compilateur de IBM J9, également dérivé de Jikes et 100% Java. Autant que je sache, le seul compilateur Java utilisé un peu répandue qui n'est pas écrit en Java est GCJ
Jörg W Mittag
4

J'en ferais un commentaire si je pouvais, mais je ne peux pas, alors voici:

Une des raisons pour lesquelles C semble si omniprésente est qu’il s’agit de l’un des premiers langages développés, et qu’une énorme quantité de langages modernes sont basés sur sa structure (Java, Go, PHP, Perl, etc.). plus d'endroits que ce n'est.

Une autre raison souvent oubliée est qu’en 1973, Unix a été réécrit en C et que de nombreux appels système d’Unix sont également disponibles en tant que programmes / fonctions en C, ce qui rend les deux très liés. Comme Unix était un élément puissant du développement de la programmation moderne dans son ensemble, C s’est laissé entraîner dans l’infamie.

Cela dit, la réponse à votre question est "Non". C est basé sur un langage appelé ALGOL et de nombreux concurrents d’ALGOL (FORTRAN, Lisp, COBOL) et C (aucun ne me viennent à l’esprit). La programmation orientée objet, qui est sans doute le changement de paradigme le plus important dans la conception de la programmation, n'est pas née avec C, bien que C ++ soit un langage POO très populaire (il est apparu en premier dans Lisp ou Simula 67, selon la personne à qui vous le demandez). Au moment de l’application OOP, C était un langage si populaire qu’il n’avait pas besoin d’être le premier. Il était si populaire que «l’extension» C ++, pour ainsi dire, est devenue l’un des principaux langages OOP. Il reste d'usage moderne principalement en raison de ses puissantes fonctionnalités de contrôle de la mémoire (vous pouvez directement allouer et désallouer la mémoire créée par vos structures), ce qui lui permet de créer des programmes sur des budgets mémoire restreints (pensez aux jeux vidéo) et son compilateur hautement optimisé (évidemment en fonction du compilateur). Certes, même ces fonctionnalités perdent du terrain à mesure que la compilation Java JIT et les gestionnaires de mémoire en langage deviennent plus avancés.

WannabeCoder
la source
1
cela ne semble rien offrir de substantiel par rapport aux points soulevés et expliqués dans les réponses précédentes, en particulier dans la première , à l'exception d'une affirmation douteuse selon laquelle "C est basé sur un langage appelé ALGOL"
gnat
4
La base de C dans ALGOL est à peine discutable ... Voir cm.bell-labs.com/who/dmr/chist.html , en.wikipedia.org/wiki/C_%28programming_language%29 )
WannabeCoder
l' histoire réelle est beaucoup plus compliquée et intéressante que cela; Je dirais que la façon dont les choses sont présentées ici n'est guère utile pour les lecteurs
Gnat
3

Évidemment pas. Comment le premier compilateur C pourrait-il être écrit en C si C n'existait pas auparavant? Ce n'est pas le problème de la poule et de l'œuf.

Il existe de nombreuses façons d'écrire le premier compilateur d'un langage, appelées amorçage.

De plus, la plupart des compilateurs tentent de s'auto-héberger , ou se compilent eux-mêmes dans leur langage, principalement pour promouvoir le langage et le compilateur lui-même.

phuclv
la source
12
Le premier compilateur Oberon a été écrit à Oberon. Cela convient parfaitement, à condition que vous soyez professeur et que de nombreux étudiants traduisent manuellement le compilateur (ce que le professeur Wirth avait).
Jörg W Mittag
@Jorg qui a été mentionné dans l'article d'amorçage lié ci-dessus, donc je ne m'embête pas à écrire cela parce que cette question concerne C et qu'aucun compilateur C n'a été écrit de cette façon
phuclv
14
@ JörgWMittag - le premier compilateur automatisé Oberon a été écrit en Oberon. Le premier compilateur Oberon était un groupe d’étudiants.
nnnnnn
4
@nnnnnn: Je considérerais ce "groupe d'étudiants" comme un interprète, pas un compilateur.
Paŭlo Ebermann
4
@ Paŭlo Ebermann Pour ajouter un autre élément humain: "ordinateur" était à l'origine un titre d'emploi .
Chux
2

Voici une liste de certains langages de programmation qui ne sont pas écrits en C, à côté des langages dans lesquels ils sont implémentés:

  • Haskell - Haskell
  • Idris - Haskell
  • Adga - Haskell
  • Clash - Haskell
  • PureScript - Haskell
  • Orme - Haskell
  • Mercure - Mercure
  • Rouille - Rouille (initialement OCaml)
  • Aller aller
  • Cristal - Cristal
  • OCaml - OCaml
  • Frege - Frege + Java
  • Haxe - OCaml + Haxe
  • Scala - Scala
  • Futhark - Haskell
  • ATS - ATS

Les meilleurs langages pour implémenter un compilateur vont probablement être assez éloignés de C. Les langages fonctionnels vous donnent des choses comme des schémas de récursion et des combinateurs d’analyseurs monadiques (à condition que vous ayez des classes de types), ce qui les rend particulièrement adaptés au travail du compilateur.

Deuxièmement, répondez à votre question de savoir si C est la "mère / père de tous les langages de programmation" - pas vraiment. C était une langue bien conçue au moment de sa parution et elle a sans aucun doute influencé les concepteurs de langages, qui ont ensuite fait des choses très différentes. Mais au bout du compte, Haskell se démarque de C de toutes les manières possibles. C a 45 ans et il n’est pas surprenant que nous ayons appris à faire mieux entre temps.

Enfin, pour répondre à votre troisième question, il n’est tout simplement pas vrai que C implémente "tous les concepts". En particulier, essayer de mettre en œuvre certains des concepts avancés de la programmation fonctionnelle (tels que les métamorphismes ou, ce qui est sûr, les synchromorphismes) en C serait monstrueusement difficile. Je ne suis pas particulièrement familiarisé avec la programmation orientée objet, mais je sais pertinemment que certains langages orientés objet possèdent des types somme.


la source
C n'a jamais été "une langue incroyablement bien conçue". Les verrues que nous voyons aujourd'hui étaient connues pour être des verrues depuis le tout début. Mais il était assez bon d’être le langage natif du système d’exploitation Unix convivial pour les développeurs, et après que Bell Labs ait poussé Unix dans les universités, C / Unix est devenu le langage / système d’exploitation préféré de toute une génération de professionnels de l’informatique.
Solomon Slow
PS., Il n'y avait pas beaucoup d'idées originales en C. Si vous recherchez la mère / le père de tous les langages de programmation procéduraux structurés en blocs, vous voudrez peut-être jeter un coup d'œil à ALGOL .
Solomon Slow
Les macros Lisp étaient bien meilleures que C, et ALGOL et Smalltalk avaient des blocs, des fermetures et des fonctions imbriquées facilitant l’organisation du code. En effet, Lisp aurait pu être utilisé en tant que macro-processeur pour assembleur et créer un code plus court et plus rapide (traitement personnalisé des expressions S) que l'ancien C. Simula, publié avant que C ait un polymorphisme. Lisp, APL et Smalltalk avaient des "shells" entièrement fonctionnels (même code entre shell et programmes), contrairement à "sh" vs "C" de Unix, qui permettaient l’entrelacement du code interprété et compilé. Les pointeurs étaient plus faciles à Lisp (rplaca / rplacd).
aoeu256
Le plus gros avantage de C était qu’il était plus facile de construire des "compilateurs" pour C, et donc de se propager plus facilement ... comme un virus, et grâce à C, les programmeurs modernes n’ont pas la moindre idée sur la façon de construire des programmes modulaires (la mutabilité nuit à la modularité), n’a aucune notion des adverbes / combinateurs / fonctions d’ordre supérieur CPU pour exécuter le code C pour la compatibilité ascendante.
aoeu256
1

Les langages de programmation sont des spécifications (pas un logiciel!) Généralement écrites dans un document anglais (avec une formalisation, par exemple EBNF pour la plupart des syntaxes; parfois, leur sémantique est également partiellement formalisée).

Par exemple, C11 est défini par n1570 (à lire). Certains dialectes de Scheme sont définis par R5RS (à lire également, il est très bien écrit).

Les langages de programmation peuvent être implémentés par certains logiciels. Parfois, ce logiciel est un compilateur écrit dans le langage de programmation lui-même. Lisez à propos de l' initialisation des compilateurs .

On peut écrire un compilateur dans le langage de programmation compilé lui-même. Si ce langage XX est tout nouveau, vous devez passer par une étape temporaire consistant à écrire un interpréteur ou un compilateur minimal d'un sous-ensemble de ce langage dans un autre langage d'implémentation (peut-être C), et plus tard, vous pourrez jeter ce compilateur temporaire interpréteur (qui n'a pas besoin d'être "bon", juste pour être suffisant pour compiler l'autre compilateur). Une fois que vous avez compilé votre compilateur XX écrit en XX, vous pouvez jeter votre compilateur temporaire.

Souvent (mais pas toujours) le système d’exécution est partiellement écrit en C (en particulier le ramasse - miettes ).

Notez que bones est un compilateur et un moteur d'exécution Scheme entièrement écrit en lui-même (et vous pouvez trouver de nombreux autres exemples d'implémentations entièrement amorcées).

BTW, il est pratique d’utiliser C comme langage cible des compilateurs .

Aujourd'hui, de nombreuses implémentations de langages de programmation sont des logiciels libres ou open source . N'hésitez pas à étudier (et peut-être contribuer à) leur code source!

Basile Starynkevitch
la source