¿Qué significa que "el lenguaje A está escrito en el lenguaje B"?

31

A menudo escucho el término que el lenguaje A está escrito en el lenguaje B. Por ejemplo, PHP ha sido escrito C , C # está escrito en C ++ .

¿Alguien puede explicar qué significa eso y si es correcto? ¿Tiene eso algo que ver con el compilador de intérpretes utilizado por el lenguaje?

Además, ¿en qué factores se basa la elección del lenguaje de implementación?

Songo
fuente
19
Estrictamente hablando, "PHP ha sido escrito en C" está mal. Un idioma es per se una definición formal, por lo tanto, no está escrito en otro lenguaje de programador (sino más bien en inglés); solo el compilador, el intérprete y / o la biblioteca pueden escribirse en C, C ++ o lo que sea. En la práctica, para muchos idiomas hay un compilador o intérprete dominante, y no se hace la distinción entre la definición y la implementación del lenguaje.
usuario281377
Curiosamente, BCPL se escribió principalmente en BCPL
OldCurmudgeon el
77
PHP "per se", no es una definición formal. Es un programa de C.
Kaz
8
s/written/implemented/Y es mucho más claro.
TMN
2
@ugoren Hubo muchos compiladores de C escritos en ensamblador. Sin embargo, no tanto este siglo.
Ross Patterson

Respuestas:

30

La mayoría de los lenguajes de programación se dividen en dos categorías: lenguajes interpretados y compilados.

Un compilador traduce un lenguaje compilado al código de la máquina , el lenguaje que la CPU ejecuta directamente paso a paso. Un lenguaje interpretado, por otro lado, utiliza un intermediario, un intérprete , para ejecutar el código del idioma. El intérprete es en sí mismo otro programa, usualmente compilado en código máquina.

PHP es un lenguaje interpretado. Necesita un programa separado para ejecutar el código PHP, la computadora no ejecuta el programa directamente. Ese programa separado, el intérprete PHP, está escrito en C.

C # es un lenguaje compilado, pero no está compilado en código máquina. En cambio, se compila en un lenguaje especializado, código de bytes, para ejecutarse en una máquina virtual. Java es otro ejemplo de tal configuración. Podrías verlo como un híbrido entre compilación e interpretación, donde la máquina virtual es un intérprete. La máquina virtual para C # (CLI o Common Language Infrastructure ) está escrita en C ++.

Otros ejemplos son:

  • Python: el intérprete de Python compila el código de Python en el código de bytes de Python, luego interpreta el código de bytes. El intérprete en sí está escrito en C. Desde entonces se han agregado nuevas implementaciones, incluida una que compila Python para ejecutarse en la misma CLI utilizada para C #, llamada IronPython , y otra que se ejecuta en la máquina virtual Java, Jython . Para completar el círculo, hay una versión de Python escrita en (un subconjunto de) Python, PyPy .
  • Ruby: Ruby comenzó como un lenguaje puramente interpretado, pero la versión más reciente cambió al uso de bytecode. También para Ruby, hay un proyecto que se compila en la CLI, llamado IronRuby , y uno para Java VM, JRuby .
Martijn Pieters
fuente
Lo siento, ¿en qué se diferencia una máquina virtual de un intérprete? No veo cómo usar uno es un punto medio para la compilación. ¿Estás diciendo que el bytecode está medio compilado?
Philip
1
@Philip: el código de bytes no es código de máquina; así que en lugar de proporcionar instrucciones directas a la CPU, aún necesita un intérprete para tomar el código de bytes e interpretarlo, traducirlo a las instrucciones de la máquina. La ventaja es que la máquina virtual es más fácil de portar a otras arquitecturas, y puede aplicar trucos como la compilación JIT .
Martijn Pieters
¿Alguien siente que el término "compilado" se ha diluido con fines de marketing?
Philip
2
Whoa! Tomare eso de vuelta. Estuve yendo por el camino equivocado por un rato. Supuse que "compilado" significaba convertirse en código de máquina y solo en código de máquina, lo que en realidad no es cierto. Es solo un término para traducir código a otro código. Sea ese código de máquina, código de bytes o el idioma que desee. Además, resulta que hay compiladores PHP por ahí, por lo que solo puede decir que es "típicamente" interpretado.
Philip
También una buena fuente: youtube.com/watch?v=e4ax90XmUBc
Adam
34

Básicamente tienes razón. Si se dice que Ruby está escrito en C, esto significa que el intérprete de lenguaje y partes de la biblioteca central están escritos en C.

Entonces, el intérprete de Ruby es un programa en C que toma un archivo de texto como entrada, lo procesa y luego llama a funciones que están en otro archivo de texto (si está escrito en Ruby) o que son código C compilado, como la mayor parte de la funcionalidad básica que necesita para acceder directamente a recursos del sistema como la memoria, el sistema de archivos y más. Y algunas funciones que requieren un rendimiento muy alto.

Por lo tanto, tiene diferentes partes de un idioma que pueden o deben escribirse en otros idiomas. Nada le impedirá escribir el intérprete en C y las bibliotecas en C ++ (aunque quizás haga algunas cosas más difíciles). Incluso podría tener varios pasos y usar un lenguaje que sea muy bueno en el procesamiento de texto para generar algunos datos intermedios que luego se procesan con algún código C.

Los factores para la decisión pueden ser los mismos que para otras aplicaciones complejas. El rendimiento es uno. La capacidad de escribir código que puede acceder a los recursos del sistema directamente a otro. Por lo tanto, en la mayoría de los casos tiene que ser un lenguaje compilado (aunque en teoría podrías escribir un intérprete de Ruby en Python). La disponibilidad en diferentes sistemas es importante si desea que su idioma se ejecute en Linux, Win, OS X y otros.

Thorsten Müller
fuente
¿Alguien sabe por qué veo tres votos a favor para mi respuesta en el momento en que la publiqué?
thorsten müller el
1
Ahora veo cuatro, pero no estoy seguro de lo que estás preguntando. ¿Los votos a favor aparecieron demasiado rápido? Si es así, bueno, muchos ojos en la pregunta (tres respuestas casi simultáneas), y su respuesta es buena.
Yannis
Hmm si. Tal vez lo guardé y luego edité, guardé nuevamente y olvidé el primer guardado (me estoy haciendo viejo). Para mí, parecía que obtuve los primeros tres votos positivos en el momento en que publiqué.
thorsten müller
@ thorstenmüller +1 para "Nada le impedirá escribir el intérprete en C y las bibliotecas en C ++" Estaba a punto de preguntarle sobre esto. ¿Hay implementaciones famosas para esto donde el intérprete / compilador está en un idioma mientras que las bibliotecas principales están en otro idioma?
Songo
@ thorstenmüller He tenido que suceder algunas veces en ocasiones. Si varias personas estuvieran viendo la pregunta mientras la publicaba, habría un pequeño mensaje que decía "Se ha publicado una nueva respuesta" en un segundo o dos después de presionar enviar, por lo que podrían haber leído la respuesta completa y haber votado en 10 segundos de tu publicación Además, las ediciones realizadas dentro de los 5 minutos posteriores a la publicación de la respuesta no aparecen en el historial de edición, lo que podría haber causado una confusión menor por su parte.
Izkata
10

Simplemente significa que la mayor parte del núcleo del lenguaje A está escrito en el lenguaje B. Qué "núcleo del lenguaje A" puede diferir de un idioma a otro, pero en términos generales, adivina correctamente, significa que es compilador o intérprete. El factor decisivo para elegir un idioma para escribir otro idioma es, como en casi todos los proyectos, con qué idiomas están más familiarizados los desarrolladores.

Dicho esto, "el idioma A está escrito en el idioma B" es una simplificación excesiva para la mayoría de los idiomas modernos. Si tomamos Python como ejemplo, mientras que la implementación de referencia, CPython , fue escrita en C, hay implementaciones escritas en otros lenguajes, como Jython (escrito en Java), IronPython (escrito en C #), PyPy (escrito en Python), CLPython (escrito en Common Lisp), Stackless Python (escrito en C y Python) y Unladen Swallow (escrito en C ++).

Un lenguaje de programación es una definición, y como muestra el ejemplo de Python, en realidad no hay restricciones sobre en qué idiomas se pueden escribir su compilador, intérprete y bibliotecas. Y, por supuesto, también es posible que un lenguaje se escriba en sí mismo, a través de un proceso llamado bootstrapping .

Yannis
fuente
2
No llamaría a Psyco otra implementación, ya que se ejecuta como una extensión de CPython.
Martijn Pieters
@MartijnPieters También es un proyecto muerto, según su sitio. Remoto.
Yannis
@YannisRizos ¿No está muerto también Unladen Swallow ?
Andres F.
1
@Songo: Aparte de eso, string.lower(s)es una función de Python que delega eso return s.lower(), eso es correcto. Las operaciones de caso de cadena CPython 3.3 se implementan en C.
Martijn Pieters
3

Desde la perspectiva del uso de un lenguaje de programación, un lenguaje de programación es solo un programa. Puede ser un compilador, o un intérprete, o puede ser algún tipo de máquina virtual. Todas esas cosas son solo programas de computadora y, por lo tanto, se pueden escribir en cualquier idioma.

Por lo tanto, si desea crear su propia versión de PHP, puede comenzar con el lenguaje con el que tenga más fluidez. Luego, escribiría un programa que pueda leer código con formato PHP y haga lo que la especificación de PHP indique que debe hacer su programa. . Por lo tanto, está creando el lenguaje PHP en el lenguaje X.

Bryan Oakley
fuente
Punto interesante Básicamente, si tengo una función incorporada en PHP explodeque toma un Stringy devuelve un Array, su implementación (es decir, el código que operará en la cadena para producir la matriz) está escrita en C , ¿verdad?
Songo
@Songo: correcto. Nuevamente, PHP es solo un programa, no es diferente a Word o Apache o Notepad o vi o emacs. Lee los datos y los analiza según una especificación de idioma, luego hace lo que la especificación de idioma dice que debería hacer.
Bryan Oakley
Esta respuesta combina mal el lenguaje con la implementación.
Russell Borogove
Creo que esta es la respuesta más simple y directa y no veo cómo se combina. Incluso sugiere que podría haber más de una implementación de PHP. De hecho, hay varios, el PHP original y la cosita de Facebook, y puede haber otros.
Warren P
@RussellBorogove: ¿no crees que "desde la perspectiva del uso de un lenguaje de programación" ayuda a aclarar la respuesta? Recuerde, estamos tratando con un principiante absoluto con esta pregunta, por lo que sacrificar un poco de precisión para ilustrar el punto es justo, en mi opinión.
Bryan Oakley
3

Una frase muy similar con un significado completamente diferente es "escribir el lenguaje A en el lenguaje B", por ejemplo, "escribir C en Java".

Esto describe el código que es sintácticamente correcto en un idioma, pero utiliza estructuras, modismos y convenciones de otro idioma. En el ejemplo de "escribir C en Java", los signos de esto estarían declarando todas las variables locales en la parte superior de cada método, utilizando constantes enteras en lugar de enumeraciones, utilizando identificadores_con_colectores, etc.

Por lo general, esto sucede cuando alguien ha trabajado con un idioma durante mucho tiempo (especialmente cuando ha trabajado solo con ese idioma) y es muy nuevo en el idioma actual (o no está interesado en escribir código limpio).

Michael Borgwardt
fuente
"CPython está escrito en C" definitivamente no significa "este usuario escribe en Python como si fuera C". Significa que CPython (Python.exe en Windows, / usr / bin / python en Unix) está escrito en C.
Warren P
@Warren P: claro, pero las frases son muy similares, por lo que las personas que no están familiarizadas con ninguno de los dos podrían terminar buscando una explicación.
Michael Borgwardt
3

La tecnología es un proceso inherentemente iterativo. Comenzamos con herramientas simples y luego usamos esas herramientas para hacer mejores. Los primeros lenguajes de ensamblaje fueron más o menos 1: 1 traducciones de los códigos de byte de instrucción estandarizados para el chip; la arquitectura 8086 y su ensamblador se hicieron dominantes sobre otras arquitecturas como Z80, RISC, etc., y así comenzamos a desarrollar lenguajes que podrían ser digeridos en el ensamblaje 8086, como FORTRAN, COBOL, Pascal y C. El programa que interpreta el código fuente de estos idiomas tienen que estar escritos en algo más primitivo, de lo contrario terminas en un argumento de gallina y huevo; si el código fuente para el primer compilador de C fue escrito en C, entonces, ¿qué compiló ese código fuente de C, y no sería, por definición, el primer compilador de C?

Básicamente, "C # está escrito en C ++" debe entenderse que el primer compilador y / o las bibliotecas de tiempo de ejecución / núcleo más populares que obedecen la especificación del lenguaje C # (que son .NET Framework de Microsoft y el compilador de línea de comandos programa CSC.exe) están escritos en C ++.

KeithS
fuente
0

"El lenguaje A está escrito en el lenguaje B" significa que la única implementación del lenguaje A (o la única que se usa ampliamente) es la que en realidad es un proyecto desarrollado en el lenguaje B, y el único completo y actualizado la especificación de A es el código fuente B que lo implementa de tal manera que si la documentación y el programa B no están de acuerdo, el programa B generalmente se considera correcto.

Kaz
fuente
No hay una implementación autorizada de C ++. En el caso de C ++, la especificación es correcta, y el comportamiento indefinido en la especificación puede hacer algo en su implementación. Entonces no, esto no es correcto.
Warren P
No veo qué tiene que ver el comentario anterior con mi respuesta. No hice ninguna declaración universalmente cuantificada sobre todos los lenguajes, por lo que el contraejemplo de C ++ no es aplicable. Una declaración de la forma "A está escrita en B", donde A es "C ++", no tiene sentido, excepto cuando B es "inglés".
Kaz