Eu me propus um desafio: escrever um compilador C auto-hospedado em 10 horas. Este é o resultado, além de muita limpeza (verifique "releases" para a versão de 10 horas).
Implementação:
Linguagem:
if
, while
, do``while
, return
.=
, ?:
(ternário), ||
, &&
, ==
, !=
, <
, >=
, +
, -
, *
, ++
, --
(pós-operações), !
, -
(unário), []
, ()
true
e false
. Literais de string, com concatenação automática. A filosofia geral era: incluir um recurso apenas se ele reduzir o tamanho total do código. Isso é levado ao extremo no ramo insane
.
git clone http://github.com/Fedjmike/mini-c
cd mini-c
make selftest
Isso primeiro produzirá cc
compilando o mini-c com o GCC. Então ele faz ccself
compilando mini-c com cc
. Finalmente ele faz test/triangular
usando ccself
e verifica o resultado. Você deve obter algo assim:
$ make selftest
gcc -std=c11 -Werror -Wall cc.c -o cc
cc cc.c
gcc -m32 a.s -o ccself
ccself tests/triangular.c
gcc -m32 a.s -o triangular; triangular 5; [ $? -eq 15 ]
Se você estiver no Windows, precisará verificar o branch windows
. No Linux de 64 bits, pode ser necessário sudo apt-get install gcc-multilib
para poder compilar e executar o código de 32 bits.
Outro compilador C microscópico é c4 de rswier
. Ele implementou mais C, mas eu diria que o meu é mais simples :). Além disso, o c4 gera código para sua própria VM, enquanto o meu tem a dificuldade significativa de trabalhar com assembly x86 e cdecl.
Eu escrevi outro compilador C muito mais avançado. Confira. Também é auto-hospedado, mas com um conjunto de recursos muito mais completo e até algumas adições experimentais como lambdas.
Direitos autorais (c) 2015 Sam Nipps
É concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e dos arquivos de documentação associados (o "Software"), para negociar o Software sem restrições, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar , publicar, distribuir, sublicenciar e/ou vender cópias do Software e permitir que as pessoas a quem o Software seja fornecido o façam, sujeito às seguintes condições:
O aviso de direitos autorais acima e este aviso de permissão serão incluídos em todas as cópias ou partes substanciais do Software.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM HIPÓTESE ALGUMA OS AUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTRA RESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.