Подтвердить что ты не робот

Компилятор с открытым исходным кодом C в С#?

Я попал в создание компилятора. Я нашел потрясающий новичок и продвинутый материал, но ничего посередине. Я создал 3 разных простых компилятора для разработки игрушечных языков, но хочу показать себе что-то реальное.

Самый прямой прямолинейный язык с точки зрения синтаксиса, похоже, является C. Так как язык, который мне больше всего нравится сейчас, - это С#, я бы хотел изучить исходный код реального не-учебника C-компилятора, написанного в С#. Существует ли (с исходным кодом)?


В идеале мне нужен компилятор C, а не .NET или С# компилятор, но с исходным кодом, написанным на С#.
Я знаю, что С# → C чувствует себя немного назад, но это позволит мне глубже погрузиться в компиляторы, начиная со знакомого языка, прежде чем я тоже изменю это.

Хотя я не ищу компиляторы С#/. NET, вот некоторые, если кто-то видит этот вопрос, который ищет это:

4b9b3361

Ответ 1

Вам будет сложно найти пример кода. Авторы компилятора используют bootstrapping. Первый компилятор C был написан в B. Затем он использовался для записи первого компилятора С++. Что было использовано для написания компилятора С#. Что очень часто используется для написания компиляторов для управляемого кода.

Это не процесс, который когда-либо идет назад. Хотя побочные пути были распространены, компиляторы C часто использовались для перекрестного компиляции компилятора для другой операционной системы.

Я думаю, что использовал эту книгу, у нее есть потрясающий код компилятора C в приложениях. Написано в C. Я использовал его части при написании основного компилятора, который мне нужен в большом проекте. Парсер синтаксического анализа трудно получить правильно, он имеет элегантное решение для правил приоритета оператора.

Ориентация на управляемый язык - это более простой способ добиться этого. Язык не должен иметь большого значения, он заставляет его работать, что является реальной проблемой. Несмотря на то, что управление управляемым кодом намного проще. Если вы хотите настроить таргетинг на C, вам понадобится код машинного кода с черным поясом и глубокое понимание формата объектного файла и компоновщика.

Ответ 2

Самый простой реальный язык с точки зрения синтаксиса - это C.

Я не уверен, что вы подразумеваете под "реальным языком", но какой бы ни был "реальный язык", я не могу согласиться с тем, что C имеет "прямолинейную" лексическую или синтаксическую грамматику, а ее семантика не определена. Если вам нужен очень простой язык с довольно четко определенной семантикой, почему бы не пойти на Scheme? У схемы очень простая грамматика, но, конечно, нет тривиальной, чтобы правильно ее семантика.

Ответ 4

Я не знаю того, что существует, но нет причин, которых нельзя было бы или нет.

Написание компилятора для C-подобного языка - классический проект для одноклассных курсов компилятора колледжа. Если вы уже знаете С#, он предоставляет множество функций, которые облегчат вашу работу, чем когда я был в колледже! Существует множество библиотек, которые упрощают работу, не снимая вызов, и вы всегда можете заменить их собственным ad-hoc-кодом, если вам нужна гибкость, которую они не предоставляют.

Первый компилятор C был написан в BCPL, потому что это то, что у них было. Текущие компиляторы C обычно записываются на C, поскольку они нацелены на перенос. Я не думаю, что кто-то будет утверждать, что C - хороший язык для написания компиляторов. (С# не идеален, но это намного лучше!) На статически скомпилированном языке, таком как C, я не думаю, что вы получаете большую пользу, если таковые имеются, от использования целевого языка для записи компилятора.

Компилятор в HLL потенциально имеет много преимуществ. Это было бы короче и проще, чем одно, написанное на C. Это само по себе могло бы сделать много вещей достаточно легкими, чтобы их можно было вытащить ниже порога "слишком тяжело, чтобы никто никогда их не делал". (GCC - это тип плаката-ребенка, поскольку компилятор, написанный в LLL, может быть настолько сложным, что он перемещается с ледяной скоростью.) Оптимизации - это в основном преобразования графов, которые не являются точными. Сит.

Я вообще не считаю "обратным" использовать С# для компиляции C. Если кто-то не предложит переписать весь свой C-код на языке более высокого уровня, его все равно нужно скомпилировать, а это значит, что вам нужно компилятор. Не следует ли писать этот компилятор с помощью инструментов, которые позволят ему обеспечить лучшую надежность и производительность?

Удачи! Я с нетерпением жду того, что вы пишете!