C está escrito en C, ¿cómo es esto posible? [duplicar]

40

Sé que mi pregunta va a la cueva subterránea de galaxias donde nacen las lenguas e involucra algunas matemáticas lambda y años luz de estudio de google. Pero, ¿qué tipo de conocimiento es necesario para crear un lenguaje?

    
pregunta H_7 26.03.2012 - 16:45

4 respuestas

76

Busca "bootstrapping".

Básicamente, comienzas con un proceso / conjunto de funciones muy mínimo que se puede usar para compilar el código que define un compilador un poco más funcional. Esto crea su próximo compilador que luego puede usarse para construir código que puede hacer aún más. Repite este proceso hasta que tenga un compilador completo que pueda compilar todas las características del lenguaje.

La otra alternativa es escribir la primera versión del compilador en un idioma diferente y luego escribir la próxima versión en el idioma de destino.

    
respondido por el ChrisF 26.03.2012 - 16:50
22

La respuesta de ChrisF es excelente, pero quería agregar este ejemplo que siempre me quedé después de mi curso de informática en bootstrap.

Supongamos que tiene un compilador de C básico que aún no admite códigos de escape para cadenas, y desea agregarlo. Podría agregar un fragmento de código similar a este:

if( str[i] == 0x5c ) {       // ASCII code for backslash
   switch( str[i+1] ) {
      case 'n': return 0x0a; // ASCII code for new line
      case 't': return 0x09; // ASCII code for tab
      // ...                 // more ASCII code for other escapes
      default: return str[i+1];
   }
}

Después de agregar esto al compilador y generar un nuevo binario del compilador, podría reescribirlo en:

if( str[i] == '\' ) { 
   switch( str[i+1] ) {
      case 'n': return '\n';
      case 't': return '\t';
      // ...
      default: return str[i+1];
   }
}

Eso eliminaría cualquier conocimiento sobre los códigos ASCII del código fuente del compilador, pero el compilador generará mágicamente los códigos correctos.

    
respondido por el fishinear 26.03.2012 - 18:34
18

Bootstrapping es definitivamente la forma estándar de compilar un compilador hoy. Pero recuerde que no necesita un compilador o intérprete para escribir un programa en un idioma. Por ejemplo, Christopher Strachey escribió un famoso programa de IA que podía jugar a Damas en CPL antes de que hubiera un compilador para CPL . Tuvo que traducir el programa al código de máquina "manualmente", lo cual es tedioso y propenso a errores, pero no es realmente difícil (por eso las computadoras pueden hacerlo tan bien).

    
respondido por el nikie 26.03.2012 - 17:14
10

Espero que esto no esté fuera de tema, pero quería señalar que, una vez que tenga un compilador de C para una plataforma X, se puede realizar un arranque para otras plataformas mediante el uso de compilación cruzada:

  • Tiene un compilador de C c1 para la arquitectura X que se ejecuta en la arquitectura X.
  • Escribe un compilador de C c2 para la arquitectura Y, escrito en C.
  • Compila el compilador c2 en X usando c1 y obtiene el binario para el compilador c2 que se ejecuta en X.
  • Utiliza el binario para c2 que se ejecuta en X para compilarse y obtener un binario de c2 que se ejecutará en Y.

En otras palabras, cuando tienes el primer huevo, es fácil hacer más huevos.

    
respondido por el Giorgio 26.03.2012 - 17:48

Lea otras preguntas en las etiquetas

Comentarios Recientes

En ingeniería de software, generalmente desea utilizar la biblioteca IDFS cuando corresponda. Antes de IDFS, generalmente querrá usar un formato similar a XML (cuando sea posible), pero es posible que deba convertirlos. Debido a que Windows usa la biblioteca IDCTools existente, no podrán extraer toda la información de XML. ¡Una vez que haya logrado esto, el proyecto habrá finalizado! Instala Wine y resuelve la interfaz de usuario en.win. ¡Ahora vuelve al código! Intenta subir los cambios. Puede haber ataques... Lee mas