Делая язык, нужен хороший бэкэнд - PullRequest
4 голосов
/ 06 апреля 2009

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

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

Вот некоторые мои мысли о других возможных бэкэндах:

  1. Сборка: непереносимость и полная боль для программирования.
  2. .NET: чувствует себя очень медленно. 5 секунд для запуска и 5 секунд для оценки 1 + 2 на Ironpython и Boo. Невозможно запустить без большой библиотеки.
  3. JVM: чувствует себя немного медленно. Нет доступа к бинарным библиотекам. Невозможно запустить без большой библиотеки.
  4. LLVM: Нет поддержки Windows. Я слышал, что размер скомпилированного исполняемого файла составляет 16 МБ +
  5. C--: выглядит недостаточно развитым.
  6. C ++: возможно. Не могу найти хороший маленький бесплатный, с которым я могу связать.

Может кто-нибудь из вас передумает или у вас есть что добавить в этот список?

Редактировать

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

http://www.antlr.org/wiki/display/CS652/Generating+machine+executable+binaries+with+LLVM

Вот шаги:

  1. Запустите llvm-as на сборке LLVM, которая выдает файл байт-кода LLVM.
  2. Запустите llc в файле байт-кода LLVM, чтобы получить файл сборки.
  3. Запустите ассемблер для файла сборки, чтобы получить объектный файл. (или запустите llvm-ld, который зависит от установленного извне компилятора c)
  4. Компилировать в исполняемый файл с помощью gcc и т. Д.

Ответы [ 6 ]

6 голосов
/ 06 апреля 2009

В этом случае LLVM, вероятно, лучший выбор.

LLVM имеет поддержку Windows, компиляция

займет некоторое время
5 голосов
/ 06 апреля 2009

Рассматривали ли вы написание внешнего интерфейса для GCC ? Я упоминаю об этом только ради полноты - насколько я знаю, интерфейс бэкэнда довольно сложен, а кодовая база огромна и ее трудно понять.

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

Лично я бы предпочел LLVM (захватывающую архитектуру) или IL .NET: очень, очень прост в использовании, имеет отличную поддержку инструментов ( Reflector , Cecil , Reflexil и, что не менее важно, API отражения .NET) и две очень эффективные реализации (а именно каноническая реализация Microsoft и Mono).

Но я не могу требовать экспертизы ни в одной из архитектур, поэтому примите этот ответ с недоверием.

4 голосов
/ 06 апреля 2009

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

2 голосов
/ 06 апреля 2009

Для SmartEiffel мы используем C как бэкэнд.

Tcc - очень хороший вариант для разработки, но не для окончательного выпуска (созданный объект эквивалентен gcc -O0)

1 голос
/ 04 мая 2009

TCC - лучший выбор. Он переносим и имеет библиотеку, поэтому его легко можно использовать в качестве бэкэнда, который называется libtcc. Исполняемые файлы меньше, чем gcc, и это ANSI C.

1 голос
/ 07 апреля 2009

Еще одно добавление в список: Слава недавно внедрил Smalltalk на Factor backend . Я сам не пробовал, но у меня есть ощущение, что он предложит больше функций, которые вы хотите от высокоуровневых, и больше по размеру / производительности от низших.

...