C или C ++, чтобы написать компилятор? - PullRequest
3 голосов
/ 07 января 2011

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

Мульти-парадигмальный язык программирования (C ++) больше подходит для реализации современных шаблонов проектирования , но я думаю, что это немного снизит производительность (например, RTTI ), которые более или менее может сделать C лучшим выбором.

Интересно, какой язык лучше (C, C ++ или даже целевой C), если кто-то хочет создать современный компилятор (в смысле соответствия современным принципам разработки программного обеспечения как программного обеспечения), который является быстрым, эффективным и хорошо дизайн.

Ответы [ 6 ]

18 голосов
/ 07 января 2011

«Дорогие» функции C ++ (например, исключения, виртуальные функции, RTTI) просто не существуют в C. К тому времени, как вы смоделируете их в C, вы, вероятно, получите что-то, по крайней мере, столь же дорогое как в C ++, но менее известно, менее документировано и т. д. (давайте посмотрим правде в глаза: авторы компиляторов не глупы - хотя возможно , вы можете реализовать функцию "лучше", чем они, это не так действительно особенно вероятно).

В другом направлении шаблоны (для одного примера) часто позволяют относительно легко написать код, который значительно * на 1005 * быстрее , чем это практично в C. Просто для одного очевидного примера, код C ++ с использованием std::sort часто будет в два-три раза быстрее, чем эквивалентный код C, используя qsort.

Итог: единственная причина, по которой программа на C ++ медленнее, чем эквивалент, написанный на C, - это если вы решили (по какой-либо причине) писать более медленный код. Распространенными причинами являются простота и удобочитаемость, и в большинстве случаев важнее скорости выполнения. Тем не менее, использование C ++ не обязательно влечет за собой снижение скорости. Вам решать, делать ли что-то, что может работать медленнее.

4 голосов
/ 07 января 2011

C ++ придерживается политики «плати только за то, что используешь». Вы не будете видеть хиты производительности из-за выбора языка; производительность вашего приложения будет зависеть только от вашей реализации.

3 голосов
/ 07 января 2011

Рассматривали ли вы OCaml? Функциональные языки хорошо подходят для написания компилятора. Сопоставление с образцом является чрезвычайно полезной конструкцией, и отсутствие побочных эффектов облегчит распараллеливание.

OCaml может быть скомпилирован в собственный код, а его производительность сопоставима с C и C ++. В его стандартной библиотеке что-то не хватает, но на самом деле вам не нужно больше писать компилятор.

F # - очень похожий язык, если вы предпочитаете среду .NET.

1 голос
/ 07 января 2011

Забудьте, какой язык программирования вы используете, а также учитывая, что у вас есть огромная поддержка памяти в эту современную компьютерную эпоху, вы можете писать хорошие и быстрые программы на интерпретируемом языке, а также очень плохие и медленные программы на C / C ++ (скомпилированные языки)наоборот.

Важно использовать правильные структуры данных и алгоритмы и следовать стилю / шаблонам языка программирования, который вы используете для его реализации.Помните, что кто-то сказал: «ОО не панацея», а с другой стороны, кто-то еще сказал: «покажите ваши структуры данных, и я напишу алгоритм решения проблемы, которую вы пытаетесь решить».

1 голос
/ 07 января 2011

У меня нет ссылок, но из того, что я слышал, и из опыта C / C ++ - плохой язык для написания компилятора. Прежде всего, вам действительно нужно, чтобы оно было масштабируемым? Или масштабируемый на этом этапе? Особенно для языка разметки? вы не компилируете 60+ мегабайт исходного кода, так что я не думаю, что вам действительно нужно, чтобы он был масштабируемым.

В любом случае для своего языка программирования я использовал bison для парсера (чтение bison + flex обязательно, постарайтесь избежать всех конфликтов, которых нет в моем языке). Затем я использую и C и C ++ для кода. C, потому что bison использует C, и я просто вызываю простую функцию C, которая создает и заполняет структуру для создания абстрактного синтаксического дерева. Затем, когда это сделано, он вызывает мой код C ++, который проходит через AST и генерирует двоичный файл.

Предполагается, что Standard ML действительно хорош в создании языка. Если вы не используете этот функциональный язык, это хороший выбор, потому что он соответствует образу мышления (синтаксический анализ может выполняться слева направо, но вызовы ваших функций не будут в таком порядке). Поэтому я рекомендую, если вы не используете bison (или знаете, как его назвать, используя C / C ++ и bison).

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

1 голос
/ 07 января 2011

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

В частности, узнайте про lex и yacc (в их бесплатных реализациях flex и bison ).

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

...