web-dev-qa-db-fra.com

Chaque langue est-elle écrite en C?

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

  • Chaque langage est-il écrit dans le langage de programmation C?
  • La langue C est-elle la mère/le père de toutes les langues?
  • Chaque concept ( OOP , etc.) est-il tous implémentés en C?

Suis-je dans la bonne direction?

185
FaizanRabbani

Non.

OCaml, Haskell, les dialectes LISP comme Scheme, et plusieurs autres langues sont souvent utilisés dans le développement des langues de loisir.

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

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

Indépendamment, les paradigmes linguistiques comme OOP sont généralement indépendants du langage. 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 ait jamais existé. Les paradigmes de programmation procédurale et structurée sont issus du travail mathématique de théoriciens comme John von Neumann. L'orientation objet a été développée par plusieurs efforts différents et non liés , certains issus du calcul lambda (le paradigme fonctionnel) et d'autres issus de la programmation dynamique des systèmes comme Smalltalk au Xerox PARC par Alan Kay.

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

211
greyfade

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, ça arrive"). Ce n'est vraiment écrit dans rien.

Il est spécifié, généralement dans un mélange d'un sous-ensemble formalisé d'anglais, de notation mathématique et peut-être d'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'expression for de la spécification de langue ISO Ruby:

§11.5.2.3.4 L'expression for

Syntaxe

  • for-expression for  pour variable [pas de terminaison de ligne ici]  in  expression do-clause end
  • pour variable côté gauche| plusieurs à gauche

Sémantique

A for-expression est évalué comme suit:

  1. Évaluez l'expression -. Si l'évaluation de l'expression se termine par un break-expression, next-expression, ou redo-expression, le comportement n'est pas spécifié. Sinon, laissez O être la valeur résultante.
  2. Soit E la invocation de méthode primaire de la forme expression-primaire [pas de ligne -terminateur ici] .each do |  liste des paramètres de bloc |  bloc-corps end, où la valeur de expression-primaire est O, bloc-liste-de-paramètres est le pour-variable , le block-body est le compound-statement du do-clause.

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

  3. La valeur de for-expression 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 [a1 >: L1 <: U1 , … , unen >: Ln <: Un] T est conforme au type polymorphe [a1>: L ′1 <: U ′1 , … , unen >: L ′n <: U ′n] T ′ si, en supposant L ′1 <: a1 <: U ′1 ,…, L ′n <: an <: U′n on a T <: T ′ et Lje <: L ′je et U ′je <: Uje pour i ∈ {1,…, n} .


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

Non, ça ne l'est pas. C est assez jeune. Il y a beaucoup d'anciennes langues. Le voyage dans le temps étant physiquement impossible, il est tout simplement impossible que C ait eu une quelconque influence sur ces anciennes langues.

  • Plankalkül (1943)
  • Speedcoding (1953)
  • Fortran (1954)
  • IPL (1956)
  • LISP (1958)
  • ALGOL (1958)
  • COBOL (1959)
  • JOVIAL (1960)
  • APL (1962)
  • SIMULA (1962)
  • SNOBOL (1962)
  • CPL (1963)
  • BASIQUE (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)

Tout cela existait avant même que C ne soit inventé. Et beaucoup d'autres n'ont aucune influence de C en eux, même après son existence. La famille de langages Pascal (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, Pascal, Modula-2, Oberon, Oberon-2, Active Oberon, Component Pascal) est une lignée complètement distincte. Toute la famille LISP (LISP, Franz LISP, InterLisp, MacLisp, Scheme, Flavors, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket, etc.) est également indépendante. Les langages fonctionnels (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) et toute la famille typée de manière dépendante (Agda, Coq, GURU, Idris) sont à peu près aussi éloignés de C que possible. 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 (POO, etc.) est-il entièrement implémenté en langage C?

Les premières langues avec les concepts OO étaient Simula (1960) et Smalltalk (1972), mais des systèmes orientés objet avaient été construits dès 1953 (sans les appeler ainsi). Encore une fois, c'est long avant C existait, donc OO ne peut pas avoir de relation avec C.

91
Jörg W Mittag

La plupart du cœur de nombreux langages importants est écrit en C, mais les choses changent:

  • l'implémentation de référence de Python ( CPython ) est écrite en C (mais il existe d'autres implémentations é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 maintenant les bibliothèques de classes sont toujours écrites en Java (car elles sont destinées à être exécutées à l'aide du Java VM lui-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 EN DEHORS de la JVM.

    Le Sun/Oracle VM est écrit en C++. Le BEA/Weblogic/Oracle VM est écrit en C. Mais il existe des JVM écrites en Java, LISP, Smalltalk (IBM) ...

  • Perl est implémenté comme un interpréteur de base, écrit en C, avec une grande collection de modules, écrit en Perl et C (mais Pugs , un compilateur et un interprète pour Perl 6 langage de programmation, est écrit en Haskell)
  • l'interprète officiel Ruby, souvent appelé interprète ou IRM de Matz Ruby, est écrit en C et utilise sa propre machine virtuelle spécifique à Ruby (mais il y a JRuby, une implémentation de Java qui s'exécute sur la machine virtuelle Java; Rubinius, une machine virtuelle de bytecode C++ qui utilise LLVM pour compiler pour coder à la machine à 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).

Il y a plusieurs raisons pour lesquelles C a été souvent choisi: 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 vient d'être publié et le C++ n'est pas encore bien standardisé.


Assez lié:

50
manlio

Non, certains langages sont antérieurs à C. Et beaucoup sont implémentés indépendamment de C, par ex. voir http://en.wikipedia.org/wiki/LISP_%28programming_language%29

10
Ofir

Je voudrais faire un commentaire si je le pouvais, mais je ne peux pas, alors voici:

L'une des raisons pour lesquelles C semble si omniprésent est parce que c'est l'un des premiers langages développés, et une énorme quantité de langages modernes sont basés sur sa structure (Java, Go, PHP, Perl, etc.) - ce qui donne l'impression qu'il est plus d'endroits que c'est.

Une autre raison souvent oubliée est qu'en 1973, Unix a été réécrit en C et beaucoup des appels système d'Unix sont également disponibles en tant que programmes/fonctions C, ce qui rend les deux fortement liés. Étant donné qu'Unix était un élément puissant du développement de la programmation moderne dans son ensemble, C a été entraîné dans l'infamie avec lui.

Cela dit, la réponse à votre question est "non". C est basé sur un langage appelé ALGOL, et il y avait de nombreux concurrents avec ALGOL (FORTRAN, LISP, COBOL) et C (aucun ne me vient à l'esprit). La programmation orientée objet, sans doute le plus grand changement de paradigme dans la conception de la programmation, n'est pas originaire de C - bien que C++ soit un langage très populaire OOP langage (il est apparu en premier dans LISP ou Simula 67, selon sur qui vous demandez.) Au moment où OOP est apparu, C était un langage si populaire qu'il n'avait pas besoin d'être le premier - il était si populaire que l '"expansion" C++, donc pour parler, est devenu l'une des principales langues OOP aussi. Il reste dans l'utilisation 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 pour créer des programmes sur des budgets de mémoire serrés (pensez aux jeux vidéo) et son compilateur hautement optimisé (évidemment selon le compilateur). Certes, même ces fonctionnalités perdent du terrain comme Java compilation JIT et en langage) les gestionnaires de mémoire deviennent plus avancés.

4
WannabeCoder

É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 du poulet et des œufs.

Il existe de nombreuses façons d'écrire le premier compilateur d'un langage appelé bootstrapping

De plus la plupart des compilateurs essaient de réaliser auto-hébergement , ou de se compiler lui-même son langage, principalement pour promouvoir le langage et le compilateur lui-même

3
phuclv

Voici une liste de quelques 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 - Rust (initialement OCaml)
  • Aller aller
  • Crystal - Crystal
  • 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 loin de C. Les langages fonctionnels vous donnent des choses comme des schémas de récursivité 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, pour répondre à votre question de savoir si C est la "mère/père de tous les langages de programmation" - pas vraiment. C était un langage bien conçu au moment de son apparition, et il a sans aucun doute influencé les concepteurs de langage qui ont ensuite fait des choses très différentes. Mais à la fin de la journée, Haskell s'écarte 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 d'implémenter certains des concepts avancés de la programmation fonctionnelle (comme les métamorphismes ou, Dieu nous en préserve, les synchromorphismes) en C serait monstrueusement difficile. Je ne suis pas particulièrement familier avec la programmation orientée objet, mais je sais pertinemment que certains langages orientés objet ont des types de somme.

2
user275647

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

Par exemple, C11 est défini par n157 (que vous devez lire). Un dialecte de Scheme est défini par R5RS (que vous devriez également lire, 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 compilateurs d'amorçage .

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 qui implique d'é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 pouvez jeter ce compilateur temporaire ou 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 en partie écrit en C (en particulier le garbage collector ).

Notez que bones est un compilateur Scheme et un runtime 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 logiciels libres ou open source . N'hésitez pas à étudier (et peut-être à y contribuer) leur code source!

1