У меня есть несколько языков, которые я создавал в качестве переводчиков. Когда я буду готов сделать «следующий шаг», какие варианты лучше всего подходят для неродных скомпилированных форматов ... каковы плюсы и минусы каждого?
Я смотрел на компиляцию в CLR или LLVM и несколько раз рассматривал C-midcompile, но я не совсем уверен.
Вот несколько функций, которые я надеюсь перенести:
Ладно, не совсем «несколько», а всего два. Мне нравится думать, что я могу перенести любые другие функции, поддерживаемые моими языками, на «что угодно».
Каковы мои лучшие варианты и их плюсы / минусы?





LLVM кажется многообещающим. Команда заявляет о лучшей производительности во время выполнения на gcc с их бэкэндом по сравнению с родным. Возможность компилировать из AST действительно интересна (взгляните на руководство). Он может компилироваться и оптимизироваться во время выполнения, что является обязательным для динамических. Он также может работать как чистый интерпретатор.
Я рассматриваю возможность использования LLVM в проекте, который предполагает создание языка, подобного Tcl. Tcl сильно динамичен, поэтому я не знаю, что это означает на данном этапе, но я уверен, что получу лучшую производительность, чем текущее ядро на основе байт-кода.
за / против:
CLR:
LLVM:
C как целевой язык:
Java ByteCode в качестве цели:
Исходя из всего вышесказанного, я думаю, что вам лучше всего подойдет Java ByteCode.
Обновлено: на самом деле ответ на комментарий, но 300 символов недостаточно.
JByteCode сомнительный - я согласен (поскольку я Smalltalker, JBytecode для меня слишком ограничивает).
Что касается виртуальных машин, я думаю, что существует относительно широкий диапазон производительности, который вы можете получить как JVM, от чисто медленных интерпретаторов байт-кода до сложных виртуальных машин JITting высокого уровня (IBM). Я предполагаю, что виртуальные машины CLR наверстают упущенное, поскольку MS рано или поздно крадет и интегрирует все инновации, а методы ускорения динамического перевода опубликованы (например, прочтите статьи Self). LLVM, вероятно, будет продвигаться немного медленнее, но кто знает. С C вы бесплатно получите лучшие компиляторы, но такие вещи, как динамическая ретрансляция и т. д., Трудно реализовать с C в качестве цели. Моя собственная система использует смесь предварительно скомпилированного и динамически скомпилированного кода (со всем: медленным интерпретатором байт-кода, JITter и предварительно скомпилированным статическим C-кодом в одном пространстве памяти).
Генерация кода C выглядит легко, пока вы не занимаетесь этим от 6 до 18 месяцев. Затем внезапно все становится невозможным.
Генерация кода - это мое дело :-)
Комментарии к нескольким вариантам:
CLR:
LLVM:
C как целевой язык
Резюме: ничего, кроме C - разумный выбор. Для наилучшего сочетания гибкости, качества и ожидаемой долговечности я бы, вероятно, порекомендовал LLVM.
Полное раскрытие информации: я связан с проектом C--.
Небольшое примечание: вам не обязательно использовать API LLVM, вместо этого вы можете настроить таргетинг на его подобный ассемблеру язык.
Java ByteCode - это то, в чем я всегда сомневался. Назовите это плохим прошлым опытом. Есть ли у кого-нибудь из них какие-либо льготы в отношении мощности их внутренней виртуальной машины (кроме вызовов библиотеки?)