Создавая язык, нужен хороший бэкэнд
-
05-09-2019 - |
Вопрос
Я хочу создать скомпилированный язык.В настоящее время я оцениваю бэкенды.Пока я смотрю на C из-за его скорости выполнения, компиляции и небольшого, простого в использовании компилятора под названием TCC.
Прочитав здесь обсуждения об использовании его в качестве промежуточного языка, я пытаюсь подумать о том, как сделать его совместимым со сборкой мусора и обработкой исключений.Пока что я думаю, что могу решить и то, и другое, но с большими накладными расходами.
Вот некоторые из моих мыслей о других возможных бэкэндах:
- Сборка:непереносимо и совершенно невыносимо программировать на нем.
- .NET:Кажется, действительно медленно.5 секунд на запуск и 5 секунд на оценку 1 + 2 на Ironpython и Boo.Невозможно запустить без большой библиотеки.
- JVM ( Совместное предприятие ):Кажется немного медленным.Нет доступа к двоичным библиотекам.Невозможно запустить без большой библиотеки.
- LLVM:Нет поддержки Windows.Я слышал, что размер скомпилированного исполняемого файла составляет 16 мб+
- C--:выглядит недоразвитым.
- C++:возможно.Не могу найти красивую маленькую свободную штуку, с которой я мог бы связать.
Может ли кто-нибудь из вас изменить мое мнение или у вас есть что добавить к этому списку?
Редактировать
Недавно я экспериментировал с LLVM.Я узнал, что у них есть предварительно скомпилированные двоичные файлы и что их можно скомпилировать в собственную сборку.
http://www.antlr.org/wiki/display/CS652/Generating+machine+executable+binaries+with+LLVM
Вот эти шаги:
- Запустите llvm-as на сборке LLVM, которая выдает файл байт-кода LLVM.
- Запустите llc в файле байт-кода LLVM, чтобы получить файл сборки.
- Запустите ассемблер для файла сборки, чтобы получить объектный файл.(или запустите llvm-ld, который, по-видимому, зависит от установленного извне компилятора c)
- Скомпилируйте в исполняемый файл с помощью gcc и т.д.
Решение
Рассматривали ли вы возможность написания интерфейса для ССАГПЗ?Я упоминаю об этом только для полноты картины – насколько я знаю, внутренний интерфейс довольно сложный, а кодовая база огромна и трудна для понимания.
С другой стороны, GCC - это зрелый продукт, над которым работает множество опытных программистов.По крайней мере, это, вероятно, обеспечивает наиболее прочную основу из всех альтернатив.
Лично я бы предпочел LLVM (захватывающая архитектура) или IL от .NET:очень, очень проста в использовании, имеет отличную инструментальную поддержку (Отражатель, Сесил, Рефлексил и последнее, но не менее важное: .NET reflection API) и две очень эффективные реализации (а именно реализация Microsoft canonical и Mono).
Но я не могу претендовать на экспертность ни в одной из архитектур, поэтому отнеситесь к этому ответу со всей серьезностью.
Другие советы
В этом случае LLVM, вероятно, является лучшим выбором.
LLVM поддерживает Windows, просто для компиляции требуется некоторое время
C ++ не даст вам многого, используйте вместо этого C.Но если вы хотите, чтобы ваш язык использовался в Интернете, используйте .NET или Java, конечно, они загружаются медленно, но когда загружаются, то так же быстро, как C.
Для Смартайффель мы используем C в качестве серверной части.
Tcc - очень хороший вариант для разработки, хотя и не для финальной версии (созданный объект эквивалентен gcc -O0)
Еще один, который нужно добавить в список:Слава недавно внедрил Smalltalk на Серверная часть фактора.Я сам этого не пробовал, но у меня такое чувство, что это предложило бы больше функций, которые вы хотите от более высокоуровневых, с большим сходством по размеру / производительности с более низкоуровневыми.
TCC - лучший выбор.Он переносим и имеет библиотеку, поэтому его можно легко использовать в качестве серверной части, которая называется libtcc.Исполняемые файлы меньше , чем gcc , и это ANSI C.