Я поставил перед собой задачу: написать самостоятельный компилятор 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, Сэм Ниппс
Настоящим бесплатно любому лицу, получившему копию этого программного обеспечения и связанных с ним файлов документации («Программное обеспечение»), предоставляется разрешение на работу с Программным обеспечением без ограничений, включая, помимо прочего, права на использование, копирование, изменение, объединение. публиковать, распространять, сублицензировать и/или продавать копии Программного обеспечения, а также разрешать лицам, которым предоставлено Программное обеспечение, делать это при соблюдении следующих условий:
Вышеупомянутое уведомление об авторских правах и данное уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения.
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЯМИ ТОВАРНОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ ПРАВ. АВТОРЫ ИЛИ ОБЛАДАТЕЛИ АВТОРСКИХ ПРАВ НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГУЮ ОТВЕТСТВЕННОСТЬ, БУДЬ В ДЕЙСТВИЯХ ПО КОНТРАКТУ, ПРАВОНАРУШЕНИЮ ИЛИ ДРУГИМ ОБРАЗОМ, ВОЗНИКАЮЩИЕ ОТ, ИЗ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ СДЕЛКАМИ, ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.