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?
programming-languages
c
FaizanRabbani
fuente
fuente
Respuestas:
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.
fuente
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
for
expresión de la Especificación del lenguaje ISO Ruby:Aquí hay un ejemplo diferente de las reglas de conformidad de tipo de Scala:
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.
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.
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.
fuente
x := x + y
la sintaxis en lugar de la más familiar C-comox = x + y
. Esta crítica ocurre a pesar del hecho de que C aún no se ha inventado ...La mayor parte del núcleo de muchos lenguajes importantes está escrita en C, pero las cosas están cambiando:
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) ...
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:
fuente
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
fuente
javac
del 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 GCJHarí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.
fuente
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í.
fuente
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:
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
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!
fuente