"Em que idioma C é escrito em si?"
De outra perspectiva, é: antes que a linguagem C rode, ela deve ser compilada, então de onde vem o compilador da linguagem C? Em qual idioma está escrito? Se estiver escrito em C, há um ovo ou uma galinha primeiro?
1
Vamos supor que não existam compiladores no mundo, vamos começar pela linguagem de máquina e ver como.
A linguagem de máquina pode ser executada diretamente pela CPU sem a necessidade de um compilador.
Depois, existe a linguagem assembly, embora a linguagem assembly seja apenas um mnemônico para linguagem de máquina, mas também precisa ser compilada para ser executada, então não há escolha a não ser usar linguagem máquina para escrever esse primeiro compilador (que não será usado no futuro).
O problema da linguagem assembly está resolvido, e é um grande avanço; neste momento, é possível usar linguagem assembly para escrever o compilador da linguagem C, que dizemos ser o ancestral do compilador C.
Com esse ancestral, você pode compilar qualquer programa em linguagem C, então é possível escrever um compilador em linguagem C em si? Basta compilar com os ancestrais.
Ok, depois de uma camada assim, finalmente consegui um compilador escrito em C, o que é realmente problemático.
Neste ponto, o compilador C escrito pelo pacote anterior pode ser abandonado.
Claro, se existissem outras linguagens de alto nível antes do C, como o Pascal, então o Pascal poderia ser usado para escrever um compilador em C.
Diz-se que o compilador do primeiro Pascal foi escrito em Fortran. Como a primeira linguagem de alto nível, o compilador de Fortran deve ser escrito em linguagem assembly.
2
Aqui está uma lenda interessante sobre o compilador:
Diz a lenda que Ken Thompson, um dos inventores do Unix, se apegava a qualquer máquina Unix do Bell Labs, digitava seu nome de usuário e senha, e podia fazer login pela raiz!
O Bell Labs é cheio de talento, e outros grandes alvos prometeram encontrar essa vulnerabilidade, eles leram o código-fonte C do Unix e finalmente encontraram a backdoor de login, e depois de limpar a backdoor, compilaram o Unix e rodaram o Unix, mas Thompson ainda conseguiu fazer login.
Algumas pessoas acham que pode haver um problema com o compilador, e que uma backdoor foi implantada ao compilar Unix, então reescreveram um compilador em C e compilaram o Unix novamente com um novo compilador.
Mas ainda assim não funciona, o Thompson ainda consegue fazer login com o root, o que é realmente devastador!
Mais tarde, o próprio Thompson desbloqueou o segredo, foi o primeiro compilador C a ter um problema, esse compilador obviamente será implantado na backdoor ao compilar código-fonte Unix, isso não é suficiente, melhor ainda, se você escrever um novo compilador em linguagem C, definitivamente precisa compilar em código binário, o que compilar, use apenas o primeiro compilador escrito por Thompson para compilar, ok, o compilador que você escreveu será poluído, seu compilador compilará Unix novamente, Também vou implantar uma backdoor :-)
Falando nisso, lembro do incidente do XcodeGhost há alguns anos, que simplesmente significa que um cavalo de Troia foi implantado no Xcode (baixado de canais não oficiais), de modo que os apps iOS compilados pelo XCode foram contaminados, e esses apps poderiam ser usados por hackers para fazer coisas ilegais.
Embora este XCodeGhost esteja longe do da Thompson, ele nos lembra que, ao baixar softwares, você deve usar canais formais, baixar do site oficial, procurar o padrão HTTPS do site e até verificar a soma de verificação.
3
Algumas pessoas podem perguntar: eu uso o Hui para escrever um parágrafo de Hello World, mas alguém pode usá-lo para escrever um compilador complexo? Isso é possível?
Claro, quando a primeira geração do Unix foi desenvolvida, não havia linguagem C, e Ken Thompson e Dennis Ritchie digitavam Unix com linhas de montagem. A primeira versão do WPS foi escrita por Qiu Bojun em Hui, e o compilador de Turbo Pascal também foi escrito por Anders em Hui, e as habilidades dos deuses são inimagináveis para pessoas comuns.
Para compiladores, também é possível desenvolver de forma "bola de neve":
Ainda tomando a linguagem C como exemplo, a primeira versão pode escolher um subconjunto da linguagem C, como suportar apenas tipos básicos de dados, instruções de controle de processo e chamadas de função...... Chamamos esse subconjunto C0.
Depois, escreva um compilador em linguagem assembly e obtenha apenas um subconjunto dessa linguagem C0, para que seja muito mais fácil de escrever.
A linguagem C0 funciona, e então estendemos esse subconjunto adicionando structs, ponteiros ...... e chamando a nova linguagem de C1.
Quem escreve o compilador para a linguagem C1? Naturalmente, é C0.
Quando o C1 estiver funcionando, expanda novamente os recursos da linguagem, escreva o compilador com o C1 e obtenha o C2.
Depois tem C3, C4...... Finalmente, você tem a linguagem completa em C.
Esse processo é chamado de bootstrapping, e em chinês é chamado de bootstrapping.
|