Em qual idioma o compilador C # está escrito?

148

Eu olhei para o código-fonte em http://referencesource.microsoft.com/ , e parece que todo o código-fonte está em c #.

Também examinei o código-fonte da nova plataforma do compilador C # ( Roslyn ), e também está em C #. Como isso é possível? O compilador de linguagem C # está escrito em C #? Ou estou perdendo algo óbvio? Se o compilador C # é escrito em C #, como ele funciona?

CriketerOnSO
fonte
12
Muitos compiladores são escritos no idioma que compilam - inicialização do Google para saber mais.
Paul Roub
19
Eu acho que o compilador original foi escrito em C ++.
PoweredByOrange
44
Bem, um martelo pode ser forjado usando outro martelo. Versão anterior dele ...
Eugene Sh.
10
O link que você postou é o link para o código-fonte da biblioteca Framework, não para o compilador.
21440 Steve Steve

Respostas:

229

O compilador C # original não foi escrito em C #, estava em C e C ++. O novo compilador Roslyn foi escrito em C #, mas foi inicialmente compilado com o compilador antigo. Depois que o novo compilador foi concluído, ele foi capaz de compilar seu próprio código-fonte: isso é chamado de inicialização .

Thomas Levesque
fonte
2
Portanto, quando é necessário fazer uma alteração no "compilador original", isso precisa ser compilado com o compilador antigo (escrito em C, C ++) ?
CriketerOnSO
10
Não haveria necessidade de alterar o "compilador original"; as versões mais recentes seriam modificadas
Pseudonym
1
@CriketerOnSO, o novo compilador substituirá o antigo, portanto não haverá necessidade de modificar o antigo. Mas se a MS quisesse fazer isso, eles recompilariam o compilador antigo com um compilador C ++, como fizeram antes.
Thomas Levesque
3
@ThomasLevesque A auto-hospedagem é o resultado final das correias de inicialização.
Arx #
2
@SriramSakthivel, o código do compilador não pode usar as novas palavras-chave, pelo menos até que exista um compilador que as entenda. Você sempre usa uma versão mais antiga do compilador para criar o novo.
Thomas Levesque
32

Compiladores são programas utilitários - eles transformam o texto da linguagem de programação em código de máquina. Se a linguagem de programação descreve um software que por acaso é um compilador ...

Os compiladores também podem produzir código de máquina para outras arquiteturas. Por exemplo, a Apple compila o iOS usando racks de servidores baseados em Intel. O compilador não precisa executar o código ARM gerado, basta gravá-lo no disco.

O compilador 2.0 deve ser escrito em um idioma que o compilador 1.0 possa processar, mas certamente pode criar o compilador 2.0 com recursos mais recentes, como otimização. Você pode recompilar o código-fonte usando o compilador 2.0 e criar uma versão melhor de si mesmo. Novamente, o compilador não sabe que está fazendo outra versão de si mesmo.

Se voltarmos o suficiente para as brumas do tempo, chegamos a um ponto em que não temos compilador - a primeira iteração de uma linguagem de alto nível. Então temos que pegar os lápis e opcode livros e escrever o primeiro na montagem. Como escrevemos o primeiro montador? Entrada direta do código da máquina, provavelmente em fita de papel perfurada ou interruptores no painel frontal.

Paulo
fonte
9
E a fita de papel está apenas alternando interruptores através de orifícios no papel. :-)
Zan Lynx
2
A fita de papel como tecnologia de armazenamento nunca decola. É muito complexo e propenso a erros, além de queimar facilmente se houver um curto-circuito no leitor e isso destruirá completamente o seu programa.
um CVn
16

Um compilador é apenas um programa como qualquer outro programa. Não há nada de mágico ou especial nisso. É preciso alguma entrada e produz alguma saída. Nesse caso específico, a entrada é C # e a saída é CIL, mas isso não é diferente da entrada de uma série de declarações fiscais e da saída de um relatório.

Jörg W Mittag
fonte
10
É diferente - é muito mais fácil, -).
Peter - Restabelece Monica
3
@ PeterSchneider: As pessoas gostam de escalar compiladores como criaturas mágicas míticas, mas no final, são apenas programas que convertem entrada em saída. Praticamente todo programa no planeta analisa alguma entrada, tenta entendê-la e a transforma em alguma saída. Em certo sentido, toda entrada é um programa escrito em alguma linguagem, todo programa é um compilador.
Jörg W Mittag
3
Eu não poderia concordar mais. Tudo o que eu queria dizer é que as leis tributárias são uma bagunça terrível. Por outro lado, as linguagens formais são tipicamente bem definidas de uma maneira adequada para automatização. O que torna um compilador simples sem dúvida mais fácil de escrever do que um programa que trata de impostos. Embora Eric Lippert possa implorar para discordar de compiladores C #, cf. blogs.msdn.com/b/ericlippert/archive/2010/02/04/… . Chegou longe dos compiladores C de uma passagem.
Peter - Restabelece Monica
1
@PeterSchneider: Ah, desculpe, eu mal interpretado seu comentário 180 ° :-D
Jörg W Mittag
Eu gosto mais dessa resposta, pois aborda o pensamento do OP mais diretamente. Ele limpa a névoa que cerca o compilador "todo poderoso".
Assaf Levy