¿En qué idioma está escrito el compilador de C #?


148

Miré el código fuente en http://referencesource.microsoft.com/ , y parece que todo el código fuente está en C #.

También miré el código fuente de la nueva plataforma del compilador de C # ( Roslyn ), y también está en C #. ¿Cómo es eso posible? ¿Está el compilador de lenguaje C # escrito en C #? ¿O me estoy perdiendo algo obvio? Si el compilador de C # está escrito en C #, ¿cómo funciona?


12
Muchos compiladores están escritos en el idioma que compilan: Google bootstrapping para obtener más información.
Paul Roub

19
Creo que el compilador original fue escrito en C ++.
PoweredByOrange

44
Bueno, un martillo se puede forjar usando otro martillo. Versión anterior de la misma ...
Eugene Sh.

10
El enlace que publicó es el enlace al código fuente de la biblioteca de Framework, no al compilador.
Steve

Respuestas:


229

El compilador original de C # no estaba escrito en C #, estaba en C y C ++. El nuevo compilador de Roslyn se escribió en C #, pero inicialmente se compiló con el compilador anterior. Una vez que se realizó el nuevo compilador, pudo compilar su propio código fuente: esto se denomina bootstrapping .


2
Entonces, cuando se debe hacer un cambio en el "compilador original", ¿tiene que compilarse con el compilador anterior (escrito en C, C ++) ?
CriketerOnSO

10
No habría necesidad de cambiar el "compilador original", las versiones más nuevas se modificarían
Seudónimo

1
@CriketerOnSO, el nuevo compilador reemplazará al anterior, por lo que no será necesario modificar el anterior. Pero si MS quisiera hacer eso, recompilarían el compilador anterior con un compilador de C ++, como lo hicieron antes.
Thomas Levesque

3
@ThomasLevesque El autohospedaje es el resultado final del fleje de arranque.
arx

2
@SriramSakthivel, el código del compilador no puede usar las nuevas palabras clave, al menos hasta que haya un compilador que las entienda. Siempre usa una versión anterior del compilador para compilar la nueva.
Thomas Levesque

32

Los compiladores son programas de utilidad: convierten el texto del lenguaje de programación en código de máquina. Si el lenguaje de programación describe software que resulta ser un compilador .....

Los compiladores también pueden producir código de máquina para otras arquitecturas. Por ejemplo, Apple compila iOS usando bastidores de servidores basados ​​en Intel. El compilador no tiene que ejecutar el código ARM que genera, solo escríbalo en el disco.

El compilador 2.0 debe estar escrito en un lenguaje que el compilador 1.0 pueda procesar, pero ciertamente puede crear el compilador 2.0 con nuevas características como la optimización. Luego puede volver a compilar el código fuente usando el compilador 2.0 y hacer una mejor versión de sí mismo. Nuevamente, el compilador no sabe que está haciendo otra versión de sí mismo.

Si retrocedemos lo suficiente en las brumas del tiempo, llegamos a un punto en el que no tenemos compilador: la primera iteración de un lenguaje de alto nivel. Luego tenemos que sacar los lápices y los libros de códigos de operación y escribir el primero en conjunto. ¿Cómo escribimos el primer ensamblador? Entrada directa de código de máquina, probablemente en cinta de papel perforada, o interruptores en el panel frontal.


9
Y la cinta de papel solo está moviendo interruptores a través de agujeros en el papel. :-)
Zan Lynx

2
La cinta de papel como tecnología de almacenamiento nunca despegará. Es demasiado complejo y propenso a errores, además se quema fácilmente si hay un cortocircuito en el lector y eso destruirá completamente su programa.
un CVn

16

Un compilador es solo un programa como cualquier otro programa. No hay nada mágico o especial al respecto. Toma algo de entrada y produce algo de salida. En este caso particular, la entrada es C # y la salida es CIL, pero eso no es diferente de que la entrada sea una serie de declaraciones de impuestos y la salida sea un informe.


10
Es diferente, es mucho más fácil, -).
Peter - Restablece a Mónica el

3
@PeterSchneider: A la gente le gusta lanzar compiladores como criaturas mágicas míticas, pero al final, son solo programas que convierten la entrada en salida. Casi todos los programas en el planeta analizan alguna entrada, intenta darle sentido y la convierte en alguna salida. En cierto sentido, cada entrada es un programa escrito en algún lenguaje, cada programa es un compilador.
Jörg W Mittag

3
No podría estar mas de acuerdo. Todo lo que quería decir es que las leyes fiscales son un desastre terrible. Por el contrario, los lenguajes formales suelen estar bien definidos de una manera adecuada para la automatización. Lo que hace que un compilador simple sea más fácil de escribir que un programa que se ocupa de impuestos. Aunque Eric Lippert puede pedir no estar de acuerdo con los compiladores de wrt C #, cf. blogs.msdn.com/b/ericlippert/archive/2010/02/04/… . Llegó lejos de los compiladores C de un solo paso.
Peter - Restablece a Mónica el

1
@PeterSchneider: Ah, lo siento, interpreté mal su comentario en 180 ° :-D
Jörg W Mittag

Me gusta más esta respuesta, ya que aborda el pensamiento del OP más directamente. Despeja la niebla que rodea al compilador "todopoderoso".
Assaf Levy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.