Geniepro писал(а):
Ну, самопальные процессоры мне использовать не приходилось. увы... Но разве нельзя было портировать тот же GCC, например? По какой причине вы стали изобретать свой компилятор, если не секрет?
Возможно, я несколько сбил Вас с толку, когда сказал про
свой компилятор.
Его front-end (до построения синтаксических деревьев) взят из lcc.
http://en.wikipedia.org/wiki/LCC_%28compiler%29http://www.cs.princeton.edu/software/lcc/Дело было так. Как я устроился на работу, меня попросили написать компилятор Си за 2-3 месяца. Я прикинул, какой из доступных front-end'ов позволит мне надежнее справиться с этой задачей, и выбрал lcc.
(Для этого я целый день потратил на эксперимент: реализовал виртуальную стековую машину, быстро "сварганил" для нее генератор кода -- только для целых чисел, затем прогнал ряд тестов; в результате этого этого я почуствовал уверенность в том, что я выполню работу в срок.)
Документации у меня тогда не было, и я руководствовался исключительно документом, описывающим синтаксические деревья.
http://storage.webhop.net/documents/interface4.pdfПоэтому я пошел в обход типичного для lcc back-end'а (через .md-файлы), а генерил код непосредственно по дереву. Т.к. синтаксический разбор в lcc осуществляется методом рекурсивного спуска (нетипично для компиляторов Си, хотя первый компилятор Ритчи тоже так делал), то у меня возникла мысль облегчить себе генерацию кода с помощью (свободного от парсинга) yacc. Я его использовал для "внедрения" столь любимого Вами паттерн-матчинга.
Потом узнал, что этот способ генерации кода не нов (т.н. генератор кода Грэхема-Гленвилла из "Красного дракона"). Принцип прост: линеаризуем синтаксическое дерево (как префиксную польскую запись) и пропускаем через специальный парсер на основе yacc, который генерит код. Этот подход особенно удачен, когда процессор использует много режимов адресации (у нас их было 8 ).
Короче, компилятор я сделал быстро. Ну, а дальше его поддержка, написание новых компиляторов на основе lcc (для других процессоров), уже с новыми знаниями: к этому времени я уже познакомился с книгой Хэнсона и Фрейзера.
Мой вопрос по поводу библиотек. Их специально затачивают под конкретную систему команд (порой даже пишут на ассемблере), т.к. эффективность очень важна. Так что "совершенная" реализация библиотеки, одинаково пригодная везде, думается, не существует. (А от ПК-шных реализаций float-point многому не научишься: как правило, все сводится к вызову встроенной операции сопроцессора.) Но, возможно, я просто не в курсе, и где-то существует эталонная универсальная сишная библиотека.