http://en.wikipedia.org/wiki/List_of_compilers выбрали те, у которых тип лицензии «открытый исходный код»
{{1} } gas
может преобразовать язык ассемблера в объектный код, который ld
может затем связать с соответствующими средами выполнения для создания программы.
Если ваша цель - узнать, как работают компиляторы и / или как кодировать, тогда вам действительно следует прочитать книгу по этой теме . Однако при поиске примеров исходного кода попробуйте примеры компиляторов Паскаля, такие как этот .
Паскаль имеет довольно простую грамматику и реализован во многих книгах.
Я бы посоветовал взять в руки учебник для составителей. Они объясняют все необходимые компоненты компилятора и обычно разрабатывают компилятор от начала до конца.
У меня есть копия Современная реализация компилятора на Java из моего курса компиляторов, и я очень доволен этим.
Вы пытаетесь понять, как создать компилятор, или вы пытаетесь узнать, как исполняемый файл Win32 выглядит внутренне?
Если первое, то прочтите книга о том, как создать компилятор, будет намного эффективнее, чем попытки реконструировать исходный код. Компиляторы не похожи ни на что из того, что вы когда-либо видели, и это действительно помогает, если автор познакомит вас с принципами, общими приемами и инструментами. Также стоит отметить, что компиляторы создаются поэтапно, и только ближе к концу реализации вам нужно иметь какие-либо знания о ЦП и операционной системе, на которые вы нацеливаетесь. Если вы новичок в создании компиляторов, вам есть о чем узнать, прежде чем вы дойдете до этого этапа.
Однако, если вы хотите понять формат исполняемых файлов Win32, вам необходимо понимать ассемблерный код x86 (или x64) и формат файла Portable Execution (PE) (который используется Windows для исполняемых файлов). Для введения в ассемблерный код x86 я бы порекомендовал отличную бесплатную электронную книгу доктора Пола Картера "PC Assembly Language" http://www.drpaulcarter.com/pcasm/ , а для PE я бы начал здесь ] http://msdn.microsoft.com/en-us/magazine/cc301805.aspx и http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
Самый простой язык программирования - это ассемблер, точнее, x86-ассемблер. Самый известный ассемблер, NASM, с открытым исходным кодом; вы можете ознакомиться с его исходным кодом по адресу:
В NASM есть макросы, которые действительно "компилируются" в ассемблерные выражения. Хотя это не полноценный язык, он сфокусирован на основах.
Я бы посоветовал поискать исходный код компилятора Pascal, C или SmallC для MS-DOS (16-бит). В частности, если они ограничиваются 16-битным плоским реальным режимом (<= 64 КБ режима памяти), они должны быть довольно простыми.
Поддержка сегментированного реального режима добавляет большую сложность, которой лучше всего избегать, и не имеет отношения к 32-битной программе с плоским защищенным режимом (32-битное программирование, отличное от ОС).
Для процессора, отличного от x86, пример программы для серии статей Джека Креншоу « Let's Build a Compiler », который представляет собой компилятор синтаксиса, подобный Паскалю, предназначенный для 16/32-разрядного процессора Motorola MC68000. Также существует версия Марселя Хендрикса, написанная на Forth на win32 версии серии .
Существует также TCC - Tiny C Compiler, который поддерживает вывод PE-i386 (то есть Win32).
Хотя, если вы не удосужились прочитать всю ссылку SO, которую Фирас Ассаад дал в комментариях, которая содержит все эти ссылки, кроме одной, я думаю, вы найдете исходный код компилятора ужасно длинным.