Выбор промежуточного языка

Я сейчас играю с языками программирования. Я потратил некоторое время на написание парсеров и интерпретаторов на языках высокого уровня (особенно на Haxe).

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

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

Конечно, я мог бы попытаться написать интерфейс для LLVM или сгенерировать байт-код MSIL или JVM. Но я чувствую, что сейчас это слишком много, чтобы учиться, и на самом деле я не вижу особого выигрыша.
Кроме того, C отлично читается человеком, поэтому, если я облажаюсь, будет намного легче понять, почему. А C в конце концов - это высокий уровень. Я действительно могу переводить концепции с языка ввода без особых усилий. У меня должно быть что-то работающее и работающее в разумные сроки, а затем оптимизировать это по своему усмотрению.

Итак: есть ли недостатки в использовании C? Можете ли вы порекомендовать альтернативу?
Спасибо за понимание :)


Изменить: некоторые пояснения

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

person back2dos    schedule 14.06.2011    source источник
comment
Большинство компиляторов, которые я могу придумать, делают промежуточный шаг перед тем, как нативный переходят на C, так что да, я думаю, что C - хороший выбор, тем более что это автоматически дает вам большую переносимость. Если ваш язык объектно-ориентированный, возможно, вам будет удобнее переводить на C ++ или Objective-C; аналогично, если он функционален, возможно, вам будет удобнее переводить на Haskell.   -  person Rafe Kettler    schedule 14.06.2011
comment
@Rafe Kettler: опубликуйте это как ответ, зачем ограничиваться комментарием? :)   -  person BlackBear    schedule 14.06.2011


Ответы (4)


C - хороший и довольно популярный вариант для того, что вы пытаетесь сделать.

Тем не менее, взгляните на промежуточный язык (IR) LLVM. Он довольно удобочитаемый, и я думаю, что он чище и проще сгенерировать и проанализировать, чем C. LLVM поставляется с довольно большим набором инструментов для работы с ним. Вы можете сгенерировать собственный код для различных платформ (как в случае с C, но с немного большим контролем над выводом) или для виртуальных машин. Возможность JIT-компиляции также является плюсом.

См. Архитектура приложений с открытым исходным кодом, глава 11 для ознакомления с подходом LLVM и некоторыми фрагментами ИК.


Какая у вас целевая среда? Это может помочь нам дать вам лучший ответ.

person Tomek Szpakowicz    schedule 14.06.2011
comment
@rubenvb: Да, было. Вот почему на него стоит взглянуть, даже если в конце концов вы им не воспользуетесь. И вы, возможно, не сможете использовать его напрямую (например, LLVM - это C ++, поэтому его может быть сложно использовать в некоторых средах). Или это может вдохновить вас сделать что-то прямо противоположное вашему первоначальному плану: использовать интерфейс LLVM для некоторого существующего (и популярного) языка и предоставить свой собственный настраиваемый бэкэнд или виртуальную машину для вашего приложения. - person Tomek Szpakowicz; 17.06.2011

На самом деле C - довольно хороший выбор в качестве целевого языка для небольшого или экспериментального компилятора - он широко доступен на многих платформах, поэтому ваш компилятор сразу становится полезным во многих средах. Главный недостаток связан с вещами, которые плохо поддерживаются в C или не определены в спецификации C. Например, если вы хотите выполнить динамическую генерацию кода (JIT-компиляцию), использование C проблематично. Такие вещи, как раскручивание стека и отражение, сложно реализовать в C (хотя setjmp / longjmp и осторожное использование структур, для которых вы генерируете описания макетов, могут многое сделать). Такие вещи, как размер слов, макет с прямым порядком байтов или обратным порядком байтов, а также арифметическая точность различаются в зависимости от компилятора C, поэтому вы должны знать об этом, но это то, с чем вам нужно иметь дело, если вы все равно хотите поддерживать несколько целевых машин.

Могут использоваться и другие языки - главное преимущество C - его повсеместность.

person Chris Dodd    schedule 14.06.2011
comment
Порядок байтов с прямым или обратным порядком байтов будет проблемой независимо от языка. Конечно, языки, которые находятся на слишком высоком уровне, чтобы даже делать что-то на байтовом уровне, не будут испытывать никаких проблем с порядком байтов, потому что они даже не поддерживают их. - person Lundin; 14.06.2011

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

person Ira Baxter    schedule 14.06.2011
comment
Спасибо, звучит очень интересно;) - person back2dos; 15.06.2011

C - хороший выбор, ИМХО. В отличие от многих языков, C обычно считается «элегантным», поскольку у вас есть только 32 ключевых слова и очень простые конструкции (последовательность, выбор, итерация) с очень простым и согласованным набором токенов и операторов.

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

person charley    schedule 15.06.2011