Я поставил перед собой задачу: написать самостоятельный компилятор C за 10 часов. Вот результат, плюс много доработок (проверьте «релизы» 10-часовой версии).
Выполнение:
Язык:
if , while , do``while , return .= , ?: (тройной), || , && , == , != , < , >= , + , - , * , ++ , -- (послеоперационные операции), ! , - (унарный), [] , ()true и false литералы. Строковые литералы с автоматической конкатенацией. Общая философия заключалась в следующем: включать функцию только в том случае, если она уменьшает общий размер кода. В insane ветке это доведено до крайности.
git clone http://github.com/Fedjmike/mini-c
cd mini-c
make selftest
Сначала будет создан cc путем компиляции mini-c с GCC. Затем он создает ccself путем компиляции mini-c с помощью cc . Наконец, он выполняет test/triangular с помощью ccself и проверяет результат. У вас должно получиться что-то вроде этого:
$ 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 ]
Если вы используете Windows, вам нужно будет проверить ветку windows . В 64-битной версии Linux вам может потребоваться sudo apt-get install gcc-multilib чтобы иметь возможность скомпилировать и запустить 32-битный код.
Еще один микроскопический компилятор C — c4 от rswier . Он реализовал больше C, но я бы сказал, что мой проще :). Кроме того, c4 генерирует код для своей собственной виртуальной машины, тогда как у меня есть значительные трудности с работой со сборкой x86 и cdecl.
Я написал другой, гораздо более продвинутый компилятор C. Проверьте это. Он также является автономным, но с гораздо более полным набором функций и даже с некоторыми экспериментальными дополнениями, такими как лямбды.
Авторские права (c) 2015, Сэм Ниппс
Настоящим бесплатно любому лицу, получившему копию этого программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), предоставляется разрешение на работу с Программным обеспечением без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение. публиковать, распространять, сублицензировать и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставлено Программное обеспечение, делать это при соблюдении следующих условий:
Вышеупомянутое уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. АВТОРЫ ИЛИ ОБЛАДАТЕЛИ АВТОРСКИХ ПРАВ НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ В ДЕЙСТВИЯХ ПО КОНТРАКТУ, ПРАВОНАРУШЕНИЮ ИЛИ ДРУГИМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ОТ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.