¿Todos los idiomas están escritos en C?

180

A veces, mientras programo en diferentes lenguajes (C / C ++, C #), este pensamiento me viene a la mente:

  • ¿Todos y cada uno de los lenguajes están escritos en el lenguaje de programación C?
  • ¿Es el lenguaje C la madre / padre de todos los idiomas?
  • ¿Se implementa cada concepto ( POO , etc.) en C?

¿Estoy en la dirección correcta?

FaizanRabbani
fuente
58
@XLAnt: muchos (quizás incluso la mayoría) de los compiladores de C están escritos en C.
Jörg W Mittag
32
@Neil: C ++ no se compila para nada. C ++ es un lenguaje. Los idiomas no compilan, los compiladores sí.
Jörg W Mittag
12
@XLAnt: No lo creo. Pero el primer compilador de Oberon, por ejemplo, fue escrito en Oberon y luego traducido a mano (que es una forma de compilación, supongo) a Fortran. Este compilador se compiló con un compilador Fortran, el compilador Oberon resultante se usó para compilar el compilador Oberon y, a partir de ese momento, la versión anterior del compilador se usó para compilar el siguiente.
Jörg W Mittag
18
@Neil No es realmente tan pedante. Es exacto: un idioma es una especificación. Puede implementarse como un compilador, como un intérprete, un híbrido, etc. Puede escribir un compilador para un idioma, pero el compilador no es el idioma. Supongo que el problema se vuelve confuso porque hay idiomas para los que no hay especificaciones escritas en ninguna parte, excepto por su implementación de referencia. Pero incluso en esos casos, argumentaría que el lenguaje (es decir, el ideal que el autor tenía en mente) es diferente de la implementación / compilador / intérprete / etc.
Andres F.
21
Votantes: esta es una pregunta bastante razonable con una respuesta clara. Que la respuesta sea "no" no es motivo para rechazarlo. En cambio, considere responder y explicar.
Andres F.

Respuestas:

207

No.

Los dialectos OCaml, Haskell, Lisp, como Scheme, y muchos otros idiomas se utilizan a menudo en el desarrollo de lenguajes de hobby.

Muchos lenguajes se implementan en C porque es un lenguaje omnipresente, y las herramientas de escritura de compiladores como los generadores lexer-parser (como yacc y bison) son bien entendidas y casi tan ubicuas.

Pero C en sí no podía desarrollarse originalmente en C cuando se creó por primera vez. De hecho, se desarrolló originalmente usando el lenguaje B. Los lenguajes anteriores (como Fortran) generalmente se arrancaban usando un lenguaje ensamblador nativo o incluso código de máquina mucho antes de que C existiera.

Sin relación alguna, los paradigmas del lenguaje como OOP son generalmente independientes del lenguaje. El paradigma funcional, por ejemplo, fue desarrollado (por Alonzo Church) como base de las matemáticas mucho antes de que existiera algún lenguaje de programación. Los paradigmas de programación procesal y estructurada surgieron del trabajo matemático de teóricos como John von Neumann. La orientación a objetos fue desarrollada por varios esfuerzos diferentes y no relacionados , algunos del cálculo lambda (el paradigma funcional) y otros de sistemas de programación dinámicos como SmallTalk en Xerox PARC por Alan Kay.

C es simplemente una pequeña parte de la historia, décadas después de que surgieron estas ideas.

Greyfade
fuente
40
Si bien es cierto que los primeros compiladores de C obviamente no se pudieron escribir en C, ciertamente es posible ahora.
reirab
17
@reirab Posible Y cierto. GCC está escrito en C y usualmente compilado usando GCC .
Darkhogg
99
Por supuesto, GCC ahora se está reescribiendo en C ++, pero eso no es tan importante como el hecho de que el primer compilador de C no se pudo escribir en C.
greyfade
10
@greyfade gcc no ha sido C por algún tiempo. No está "reescribiéndose ahora", sino que "se ha escrito en C ++ durante más de dos años" (aunque es incluso más antiguo que eso, fue entonces cuando ocurrió la fusión que lo trasladó a C ++).
13
@greyfade no es "C pero con características de C ++", ¿un tipo de definición de C ++?
KutuluMike
91

¿Todos y cada uno de los idiomas están escritos en lenguaje C?

Un lenguaje es un conjunto de reglas y restricciones matemáticas abstractas ("si escribo esto , eso sucede"). No está escrito en nada, realmente.

Se especifica, generalmente en una mezcla de un subconjunto formalizado de inglés, notación matemática y quizás algún lenguaje de especificación especializado. La sintaxis a menudo se especifica en una variante de EBNF o ABNF .

Por ejemplo, aquí está la especificación de la forexpresión de la Especificación del lenguaje ISO Ruby:

§11.5.2.3.4 La forexpresión

Sintaxis

  • para-expresión for para-variable [sin terminador de línea aquí] in expresión do-cláusula end
  • para-variable lado izquierdo | múltiple-lado izquierdo

Semántica

Una expresión for se evalúa de la siguiente manera:

  1. Evalúa la expresión . Si la evaluación de la expresión termina con una expresión de ruptura , siguiente expresión o rehacer expresión , el comportamiento no se especifica. De lo contrario, Osea ​​el valor resultante.
  2. Deje que Esea el principal método de invocación de la forma primaria de expresión [ninguna línea-terminador aquí] .each do | -parámetro-lista de bloqueo | bloque de cuerpo end , donde el valor de la primaria-expresión es O, el parámetro-lista de bloqueo es la for- variable , el cuerpo de bloque es la declaración compuesta de la cláusula do .

    Evaluar E; sin embargo, si se llama a un bloque cuyo cuerpo de bloque es la declaración compuesta de la cláusula do de la expresión for durante esta evaluación, los pasos en §11.3.3 excepto el Paso c) y el Paso e) 4) ser tomado para la evaluación de esta convocatoria.

  3. El valor de la expresión for es el valor resultante de la invocación.

Aquí hay un ejemplo diferente de las reglas de conformidad de tipo de Scala:

El tipo polimórfico [a 1 >: L 1 <: U 1 , ..., a n >: L n <: U n ] T se ajusta al tipo polimórfico [a1>: L ′ 1 <: U ′ 1 , ..., a n >: L ′ n <: U ′ n ] T ′ si, suponiendo que L ′ 1 <: a 1 <: U ′ 1 ,…, L ′ n <: a n <: U′n uno tiene T <: T ′ Y L i <: L ′ i y U ′ i<: U i para i ∈ {1, ..., n} .


¿Es el lenguaje C madre / padre de todos los idiomas?

No, no es. C es bastante joven. Hay muchos idiomas antiguos. Como el viaje en el tiempo es físicamente imposible, es simplemente imposible que C haya tenido influencia alguna en esos viejos idiomas.

  • 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)
  • BÁSICO (1964)
  • PL / I (1964)
  • RPG (1964)
  • BCPL (1966)
  • ISWIM (1966)
  • MOMPS (1967)
  • Adelante (1968)
  • LOGOTIPO (1968)
  • REFALACIÓN (1968)
  • B (1969)
  • BLISS (1970)
  • Pascal (1971)
  • KRL (1971)
  • Smalltalk (1972)

Todo eso existió antes de que C fuera inventado. Y muchos otros no tienen influencia de C en ellos, incluso después de que existiera. La familia de idiomas PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Oberon Activo, Componente Pascal) es un linaje completamente separado. Toda la familia Lisp (LISP, Franz Lisp, InterLisp, MacLisp, Scheme, Flavors, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket, etc.) tampoco está relacionada. Los lenguajes funcionales (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) y toda la familia de tipo dependiente (Agda, Coq, GURU, Idris) están lo más lejos posible de C. Lo mismo es cierto para la familia Smalltalk (Smalltalk, Self, Newspeak, Us, Korz), la familia de programación lógica (PLANNER, Prolog, Mercury), SQL y muchos otros.

¿Cada concepto (OOP, etc.) está implementado en lenguaje C?

Los primeros lenguajes con conceptos OO fueron Simula (1960) y Smalltalk (1972), pero los sistemas orientados a objetos se habían construido ya en 1953 (sin llamarlos así). Nuevamente, eso es mucho antes de que C existiera, por lo que OO no puede tener ninguna relación con C.

Jörg W Mittag
fuente
2
@leftaroundabout: Esa es una gran publicación de blog, una de mis favoritas durante años.
Jörg W Mittag
1
@FrancisDavey: Gracias. Comencé compilando la lista de memoria, luego agregué fechas que no recordaba buscándolas en Wikipedia. Después de eso, encontré una línea de tiempo de idiomas en Wikipedia, y elegí algunos idiomas más desde allí. Como el artículo sobre BCPL cita 1966, pero la línea de tiempo cita 1967, no me di cuenta de que ya había agregado BCPL. Eliminaré el duplicado.
Jörg W Mittag
1
En su lista, ¿no está "htroF" deletreado al revés?
chux
2
"Viajar en el tiempo es físicamente imposible" - Esa es una afirmación altamente polémica. No resta valor al valor de esta respuesta, por supuesto.
Konrad Rudolph
50

La mayor parte del núcleo de muchos lenguajes importantes está escrita en C, pero las cosas están cambiando:

  • la implementación de referencia de Python ( CPython ) está escrita en C (pero hay otras implementaciones escritas en otros lenguajes, por ejemplo, Jython / Java, PyPy / Python, IronPython / C # ...)
  • PHP Zend Engine está escrito en C
  • El primer compilador de Java desarrollado por Sun Microsystems se escribió en C, pero ahora las bibliotecas de clases siempre se escriben en Java (ya que están destinadas a ejecutarse utilizando la máquina virtual Java). Ciertas bibliotecas que usan JNI (Java Native Interface) pueden estar parcialmente escritas en una variedad de otros idiomas, ya que están destinadas a usarse FUERA de la JVM.

    Sun / Oracle VM está escrito en C ++. BEA / Weblogic / Oracle VM está escrito en C. Pero hay JVM escritos en Java, Lisp, SmallTalk (IBM) ...

  • Perl se implementa como un intérprete central, escrito en C, junto con una gran colección de módulos, escritos en Perl y C (pero Pugs , un compilador e intérprete para el lenguaje de programación Perl 6, está escrito en Haskell)
  • el intérprete oficial de Ruby, a menudo conocido como el intérprete de Ruby o MRI de Matz, está escrito en C y utiliza su propia máquina virtual específica de Ruby (pero existe JRuby, una implementación de Java que se ejecuta en la máquina virtual de Java; Rubinius, un C ++ Bytecode máquina virtual que utiliza LLVM para compilar el código de la máquina en tiempo de ejecución ...)
  • alrededor del 50% de R está escrito en C
  • y, por supuesto, C está (fue) escrito en C ! (pero el primer compilador de C, dirigido al PDP-11, era una mezcla de B y ensamblador).

Hay muchas razones por las que a menudo se elige C: rendimiento, portabilidad, experiencia.

El último probablemente sea el más importante: Python se inició en 1991, PHP en 1994/1995, Perl en 1988, Ruby en 1995. En esos años, Java se acaba de lanzar y C ++ aún no está bien estandarizado.


Algo relacionado:

manlio
fuente
55
Desde la perspectiva de la implementación de compiladores / intérpretes, C ha sido / es un punto de referencia. Además, ha influido directa o indirectamente en muchos idiomas posteriores (al menos sintácticamente).
manlio
2
muy pronto, ¡podrás decir que C # se escribió en C #! (tipo de)
DLeh
1
La mayor parte de Mono (que incluye un compilador de C # y muchas / la mayoría de la biblioteca de clases base .NET) está escrita en C #.
Charlie Kilian el
3
La respuesta a la pregunta "¿C es la madre / padre de todos los idiomas?" es "no", por lo que no creo que sea útil proporcionar muchos ejemplos que están escritos en C. Los contraejemplos ayudarían, pero sus opciones siguen descendiendo de C. Por ejemplo, incluso si Java, Python, etc. ahora son autohospedables, todavía estaban arrancados de C, por lo que son como "nietos" de C. Idiomas como LISP, FORTRAN, ML y (por supuesto) el código de máquina son verdaderos contraejemplos, ya que C nunca estuvo involucrado en su creación
Warbo
2
La aspiración de muchos idiomas, por supuesto, se implementará en la medida de lo posible en sí misma. Sin embargo, parece que la mayoría de los lenguajes dependen de C porque la mayoría de los lenguajes deben poder llamar a C para ser útiles; La mayoría de las API modernas del sistema operativo y las bibliotecas útiles tienden a tener enlaces C. También debe tener cuidado con lo que quiere decir con "escrito". Una implementación de lenguaje generalmente tiene múltiples partes: al menos un compilador y un sistema de tiempo de ejecución. Los sistemas de tiempo de ejecución a menudo se escriben en C para una mejor interfaz con el sistema operativo.
Seudónimo
10

No, algunos lenguajes son anteriores a C. Y muchos se implementan independientemente de C, por ejemplo, consulte http://en.wikipedia.org/wiki/Lisp_%28programming_language%29

Ofir
fuente
2
Hay muchas implementaciones de Java, la mayoría están escritas en Java. La implementación de GNU de Objective-C está escrita en C (o C ++, creo que cambiaron recientemente), la implementación de LLVM está escrita en C ++, y solía haber un intérprete escrito en C #. Hay muchas implementaciones de Python, una está escrita en RPython, una en Java, una en C # y una en C. PHP tiene seis implementaciones principales, dos en Java, dos en C #, una en C y una en C ++.
Jörg W Mittag
1
No. Los diseñadores de idiomas ciertamente están influenciados por otros idiomas, pero pueden elegir ignorar esas influencias si así lo desean.
Jörg W Mittag
2
Los idiomas de @FaizanRabbani, en esencia, son conceptos y elecciones de paradigmas, patrones y compromisos; muy a menudo, un "lenguaje es creado / adaptado de otro (s) idioma (s)", pero eso no tiene relación alguna con el lenguaje de implementación de su compilador; el lenguaje X puede derivarse del lenguaje Y pero implementado en C o en algo completamente diferente, y ese suele ser el caso. Y en este caso, el "antepasado conceptual" es importante, pero el lenguaje del compilador es solo un matiz técnico apenas relevante que puede cambiar con el tiempo.
Peteris
3
Ese último enlace tiene un valor dudoso: demasiados errores en él como para tomarlo realmente en serio.
Codificador desconocido
44
@SebastianGodelet: HotSpot no es una implementación del lenguaje Java. Es una implementación del lenguaje de código de bytes JVM. Esos son dos idiomas completamente diferentes. Las implementaciones más utilizadas del lenguaje Java son javacdel Oracle JDK / OpenJDK escrito por Martin Odersky (de Scala fame) en 100% Java, el compilador Eclipse, escrito en 100% Java (derivado del compilador Jikes de IBM ), el compilador de J9 de IBM, también derivado de Jikes y 100% Java. AFAIK, el único compilador de Java en uso algo extendido que no está escrito en Java es GCJ
Jörg W Mittag
4

Haría un comentario si pudiera, pero no puedo, así que aquí va:

Una de las razones por las que C parece tan omnipresente es porque es uno de los primeros lenguajes desarrollados, y una enorme cantidad de lenguajes modernos se basan en su estructura (Java, Go, PHP, Perl, etc.), lo que hace que parezca que es más lugares de lo que es.

Otra razón olvidada con frecuencia es que en 1973 Unix se reescribió en C y muchas de las llamadas al sistema de Unix también están disponibles como programas / funciones en C, lo que hace que los dos estén altamente interconectados. Como Unix fue una parte poderosa del desarrollo de la programación moderna en su conjunto, C fue arrastrado a la infamia con él.

Habiendo dicho todo eso, la respuesta a su pregunta es "No". C se basa en un lenguaje llamado ALGOL, y había muchos competidores tanto con ALGOL (FORTRAN, Lisp, COBOL) como con C (ninguno viene a la mente). La programación orientada a objetos, posiblemente el mayor cambio de paradigma en el diseño de programación, no se originó con C, a pesar de que C ++ es un lenguaje OOP muy popular (apareció primero en Lisp o Simula 67, dependiendo de a quién le pregunte). Cuando surgió la OOP, el C era un lenguaje tan popular que no necesitaba ser el primero; era tan popular que la "expansión" de C ++, por así decirlo, se convirtió en uno de los principales lenguajes de la OOP también. Sigue siendo de uso moderno principalmente debido a sus potentes funciones de control de memoria (puede asignar y desasignar directamente la memoria que crean sus estructuras), lo que le permite crear programas con presupuestos ajustados de memoria (piense en los videojuegos) y su compilador altamente optimizado (obviamente, dependiendo del compilador). Es cierto que incluso estas características están perdiendo terreno a medida que la compilación JIT de Java y los administradores de memoria en lenguaje se vuelven más avanzados.

WannabeCoder
fuente
1
esto no parece ofrecer nada sustancial sobre cuestiones planteadas y se explica en las respuestas anteriores, sobre todo en la parte superior uno , a excepción de una declaración cuestionable que "C se basa apagado de un lenguaje llamado ALGOL"
mosquito
44
La base de C en ALGOL no es cuestionable ... Ver cm.bell-labs.com/who/dmr/chist.html , en.wikipedia.org/wiki/C_%28programming_language%29 )
WannabeCoder
la historia real es mucho más complicada e interesante que eso; Yo diría que las cosas se presentan aquí no es útil para los lectores
mosquito
3

Obviamente no. ¿Cómo podría escribirse el primer compilador de C en C si C no existía antes? Este no es el problema del huevo y la gallina.

Hay muchas formas de escribir el primer compilador de un lenguaje que se llama bootstrapping

Además, la mayoría de los compiladores intentan lograr el autohospedaje o compilarlo en su idioma, principalmente para promover el lenguaje y el compilador en sí.

phuclv
fuente
12
El primer compilador de Oberon fue escrito en Oberon. Eso está perfectamente bien, siempre que seas profesor y tengas muchos estudiantes que traducirán a mano el compilador por ti (que el profesor Wirth tenía).
Jörg W Mittag
@Jorg lo que se menciona en el artículo de bootstrapping vinculado anteriormente por lo que no se molestan por escrito que debido a esta pregunta es sobre C y ningún compilador de C fue escrito de esa manera
phuclv
14
@ JörgWMittag: el primer compilador automatizado de Oberon se escribió en Oberon. El primer compilador real de Oberon fue un grupo de estudiantes.
nnnnnn
44
@nnnnnn: Yo consideraría a este "grupo de estudiantes" un intérprete, no un compilador.
Paŭlo Ebermann
44
@ Paŭlo Ebermann Para agregar otro elemento humano: "computadora" era originalmente un título de trabajo .
chux
2

Aquí hay una lista de algunos lenguajes de programación que no están escritos en C, junto con los lenguajes en los que se implementan:

  • Haskell - Haskell
  • Idris - Haskell
  • Adga - Haskell
  • Choque - Haskell
  • PureScript - Haskell
  • Elm - Haskell
  • Mercurio - Mercurio
  • Rust - Rust (inicialmente OCaml)
  • Go - Go
  • Cristal - Cristal
  • OCaml - OCaml
  • Frege - Frege + Java
  • Haxe - OCaml + Haxe
  • Scala - Scala
  • Futhark - Haskell
  • ATS - ATS

Los mejores lenguajes para implementar un compilador probablemente estarán bastante lejos de C.Los lenguajes funcionales le ofrecen cosas como esquemas de recursión y combinadores de analizador monádico (siempre que tenga clases de tipos), lo que los hace especialmente adecuados para el trabajo del compilador.

En segundo lugar, para responder a su pregunta sobre si C es la "madre / padre de todos los lenguajes de programación", no realmente. C era un lenguaje bien diseñado en el momento en que apareció, y sin duda ha influido en los diseñadores de idiomas que luego hicieron cosas muy diferentes. Pero al final del día, Haskell se aparta de C en prácticamente todas las formas posibles. C tiene 45 años y no es sorprendente que hayamos aprendido a hacerlo mejor mientras tanto.

Finalmente, para responder a su tercera pregunta, simplemente no es el caso que C implemente "todos los conceptos". En particular, tratar de implementar algunos de los conceptos avanzados de la programación funcional (como metamorfismos, o, Dios no lo quiera, sincrromorfismos) en C sería monstruosamente difícil. No estoy particularmente familiarizado con la programación orientada a objetos, pero sí sé que algunos lenguajes orientados a objetos tienen tipos de suma.


fuente
C nunca fue "un lenguaje increíblemente bien diseñado". Se sabía que las verrugas que vemos hoy son verrugas desde el principio. Pero, era lo suficientemente bueno como para ser el idioma nativo del sistema operativo Unix amigable para los desarrolladores, y después de que Bell Labs empujó a Unix a las universidades, C / Unix se convirtió en un lenguaje / sistema operativo favorito para una generación de profesionales de la informática.
Solomon Slow
PS., No había muchas ideas originales en C. Si estaba buscando a la madre / padre de todos los lenguajes de programación procesal estructurados en bloques, es posible que desee echar un vistazo a ALGOL .
Solomon Slow
Las macros de Lisp eran mucho mejores que C, y ALGOL y Smalltalk tenían bloques, cierres y funciones anidadas para ayudar a organizar el código. De hecho, Lisp podría haber sido utilizado como un macroprocesador para ensamblador y crear código que era más corto y rápido (procesamiento personalizado de expresiones S) que el principio de C. Simula, que apareció antes de que C tuviera polimorfismo. Lisp, APL y Smalltalk tenían "shells" que eran completamente funcionales (el mismo código entre shell y programas) a diferencia de "sh" vs "C" de Unix, lo que permite que el código interpretado y compilado se entrelace. Los punteros fueron más fáciles en Lisp (rplaca / rplacd).
aoeu256
La mayor ventaja de C era que era más fácil construir "compiladores" para C, por lo que podría propagarse más fácilmente ... como un virus, y gracias a C los programadores modernos no tienen idea de cómo construir programas modulares. (la mutabilidad perjudica la modularidad), no tenemos noción de adverbios / combinadores / funciones de orden superior [escriba manualmente sus bucles cada vez], y nuestras CPU están limitadas por el cuello de botella "von neumann" porque nuestro sistema operativo está escrito en C, por lo que necesitamos nuestro CPU para ejecutar código C para compatibilidad con versiones anteriores.
aoeu256
1

Los lenguajes de programación son especificaciones (¡no software!) Generalmente escritas en algún documento en inglés (con cierta formalización, por ejemplo, EBNF para la mayoría de la sintaxis; a veces su semántica también está parcialmente formalizada).

Por ejemplo, C11 se define por n1570 (que debe leer). Algún dialecto del esquema está definido por R5RS (que también debe leer, está muy bien escrito).

Los lenguajes de programación pueden ser implementados por algún software. Algunas veces ese software es un compilador escrito en el lenguaje de programación en sí. Lea sobre compiladores de arranque .

Uno puede escribir un compilador en el lenguaje de programación compilado. Si ese lenguaje XX es nuevo, debe pasar por un paso temporal que implica escribir un intérprete o compilador mínimo de un subconjunto de ese idioma en algún otro lenguaje de implementación (tal vez C), y luego puede tirar ese compilador temporal o intérprete (que no necesita ser "bueno", solo para ser suficiente para compilar el otro compilador). Una vez que compiló su compilador XX escrito en XX, puede tirar su compilador temporal.

A menudo (pero no siempre) el sistema de tiempo de ejecución se escribe en parte en C (en particular el recolector de basura ).

Tenga en cuenta que bones es un compilador de Scheme y un tiempo de ejecución completamente escrito en sí mismo (y puede encontrar muchos otros ejemplos de implementaciones completamente cargadas).

Por cierto, es conveniente usar C como el lenguaje de destino de los compiladores .

Hoy en día, muchas implementaciones de lenguajes de programación son software libre o de código abierto . ¡Siéntase libre de estudiar (y quizás contribuir) su código fuente!

Basile Starynkevitch
fuente