Red de conocimiento informático - Computadora portátil - El lenguaje C es tan poderoso, ¿en qué idioma está escrito? El proceso de escritura se llama bootstrapping.

El lenguaje C es tan poderoso, ¿en qué idioma está escrito? El proceso de escritura se llama bootstrapping.

Pregunta de un novato: "¿En qué idioma está escrito el lenguaje C?"

Desde otro ángulo, la pregunta real es: antes de que se pueda ejecutar el lenguaje C, debe compilarse, ¿de dónde viene el compilador del lenguaje C? ¿En qué idioma está escrito? Si está escrito en el propio lenguaje C, ¿qué viene primero, el huevo o la gallina?

Supongamos que no existe ningún compilador en el mundo. Comencemos con el lenguaje de máquina y veamos qué podemos hacer.

El lenguaje de máquina puede ser ejecutado directamente por la CPU sin un compilador.

Luego está el lenguaje ensamblador. Aunque el lenguaje ensamblador es solo un mnemotécnico para el lenguaje de máquina, también necesita compilarse en lenguaje de máquina antes de poder ejecutarse. No hay otra forma que escribir este primer compilador. en lenguaje de máquina (no será necesario en el futuro).

Una vez resuelto el problema del lenguaje ensamblador, hemos dado un gran paso adelante. En este momento, podemos usar el lenguaje ensamblador para escribir un compilador en lenguaje C. Decimos que este es el antepasado del compilador de C.

Con este antepasado, puedes compilar cualquier programa en lenguaje C. ¿Es posible escribir un compilador en lenguaje C? Simplemente usa Laozu para compilarlo.

Bien, después de pasar por tantas capas, finalmente obtuve un compilador escrito en lenguaje C, lo cual es realmente problemático.

En este momento, se puede abandonar el compilador de lenguaje C anterior escrito en ensamblador.

Por supuesto, si han aparecido otros lenguajes de alto nivel antes del lenguaje C, como Pascal, entonces puede usar Pascal para escribir un compilador de lenguaje C.

Se dice que el primer compilador de Pascal está escrito en Fortran. Como primer lenguaje de alto nivel, el compilador de Fortran debe escribirse en lenguaje ensamblador.

En cuanto a los compiladores, aquí hay una leyenda interesante:

Se dice que Ken Thompson, uno de los inventores de Unix, se pavoneaba hasta cualquier máquina Unix en los Laboratorios Bell, entre. su nombre de usuario y contraseña, ¡y podrá iniciar sesión como root!

Bell Labs está lleno de talentos y algunos otros expertos se comprometieron a encontrar esta vulnerabilidad. Leyeron el código fuente C de Unix y finalmente encontraron la puerta trasera de inicio de sesión. Después de limpiar la puerta trasera, compilaron Unix y lo ejecutaron. Pero Thompson aún puedes iniciar sesión.

Algunas personas pensaron que podría haber un problema en el compilador y se implantó una puerta trasera al compilar Unix, por lo que reescribieron un compilador en lenguaje C y compilaron Unix nuevamente con el nuevo compilador. Ahora el mundo está. finalmente en paz.

Pero todavía no funciona. Thompson aún puede iniciar sesión como root. ¡Es realmente frustrante!

Más tarde, el propio Thompson reveló el secreto. Hubo un problema con el primer compilador de lenguaje C. Cuando este compilador compiló el código fuente de Unix, por supuesto, esto no fue suficiente. Lo más sorprendente es que si escribes un nuevo compilador en lenguaje C, definitivamente necesitarás compilarlo en código binario. ¿Qué deberías usar para compilar? Solo puedes usar el primer compilador escrito por Thompson para compilar. escribiste Estará contaminado. Si tu compilador compila Unix, también implantará una puerta trasera :-)

Hablando de esto, pienso en el incidente de XcodeGhost hace unos años. está en Xcode (descargado de canales no oficiales), por lo que las aplicaciones de iOS compiladas por XCode están contaminadas y los piratas informáticos pueden utilizar estas aplicaciones para hacer cosas ilegales.

Aunque este XCodeGhost está muy por detrás de Thompson, se nos recuerda que al descargar software, debemos pasar por canales formales, descargar desde el sitio web oficial, buscar el estándar HTTPS del sitio web e incluso verificar la suma de verificación. .

Alguien puede preguntar: Es muy problemático para mí escribir un Hola mundo usando ensamblador, pero ¿alguien puede usarlo para escribir un compilador complejo? ¿Es esto posible?

Por supuesto que es posible. Cuando se desarrolló la primera generación de Unix, ni siquiera existía un lenguaje C. Ken Thompson y Dennis Ritchie escribieron Unix línea por línea mediante ensamblaje. La primera versión de WPS fue escrita en ensamblaje por Qiu Bojun, y el compilador de Turbo Pascal también fue escrito en ensamblaje por Anders. Las habilidades de los grandes maestros están más allá de la imaginación de la gente común.

Para el compilador, también puede utilizar el método "bola de nieve" para desarrollar:

Tomemos el lenguaje C como ejemplo. Para la primera versión, primero puede elegir una subclase. del lenguaje C, por ejemplo, solo admite tipos de datos básicos, declaraciones de control de flujo, llamadas a funciones... A este subconjunto lo llamamos C0.

Luego escriba un compilador en lenguaje ensamblador y solo trate con el subconjunto C0 de este lenguaje. Esto hará que sea mucho más fácil de escribir.

El lenguaje C0 puede funcionar, y luego ampliamos este subconjunto, como agregar estructuras, punteros..., y llamamos al nuevo lenguaje C1.

¿Quién escribirá el compilador para el lenguaje C1? Naturalmente es C0.

Espere hasta que C1 pueda funcionar, expanda las funciones del lenguaje nuevamente, use C1 para escribir el compilador y obtenga C2.

Luego C3, C4... y finalmente obtener el lenguaje C completo.

Este proceso se llama bootstrapping, que en chino se llama bootstrapping.

Para los amantes de la programación, ¡es importante tener un grupo de amigos que puedan aprender y resolver problemas juntos!

Aquí hay un club (grupo) de intercambio de aprendizaje de programación C/C, ¡envíame un mensaje privado 01 para ingresar!

También hay archivos de aprendizaje de programación (código fuente, tutoriales de base cero, videos prácticos de enseñanza de proyectos), ¡los amigos principiantes y avanzados son bienvenidos!