Я написал интерпретатор для функционального языка, который я пытаюсь загрузить с помощью компилятора. Язык имеет систему динамического типа и использует списки, числа и строки. Он также является функциональным, и функция принимает свой аргумент как список (например, perls @_ или аргументы js). Функции являются первоклассными и могут быть вложенными. На каком языке я должен настраиваться с помощью компилятора, кстати. Я думаю, что цель статического типизированного императивного языка, такого как C, будет сложной. Язык должен поддерживать динамическое типирование и функциональное программирование (js не будет приятным - язык должен иметь сам компилятор, например обычный lisp)Бэкэндер компилятора для функционального языка
ответ
Вам не нужна специальная поддержка с вашего целевого языка. Динамическую отправку можно решить, используя общие версии ваших функций (но подумайте об оптимизации, когда типы могут быть безопасно выведены), например, для a + b
вы можете сгенерировать код, например generic_add(a, b)
, где generic_add
- это функция, которая выбирает подходящую реализацию в зависимости от информацию о времени выполнения.
Для функциональной части тривиально устранить ее, используя подъем лямбда. Для последнего вам просто нужно создать списки свободных и связанных переменных для каждого узла AST: список свободных переменных строится из листьев в корень, а связанный список построен в противоположном направлении. Для каждого лямбда-узла вы вычитаете свободную от привязки и создаете новую функцию верхнего уровня, которая принимает как явные аргументы лямбда, так и эту разницу (т. Е. Захваченные переменные).
Кроме того, если вы хотите сделать оптимизацию или если ваш язык должен поддерживать продолжения, рассмотрите возможность использования CPS-преобразования.
Отличный ответ! Большое вам спасибо, можете ли вы назвать конкретный язык, который я должен использовать? Это было бы очень приятно –
Используйте любой язык, который может предоставить вам требуемые функции времени исполнения (вы можете или не хотите, чтобы GC, например, некоторые конкретные библиотеки, что угодно). Если у вас есть сомнения или нет каких-либо конкретных потребностей, не стесняйтесь использовать C, это общий выбор, и этот путь очень хорошо освещен в нескольких книгах и учебниках. Вы также можете напрямую настроить LLVM IR. –
Есть ли подобная кнопка в stackoverflow, я действительно хочу нажать ее :) –
Ориентация на языки низкого уровня, такие как LLVM и C, прекрасна, если вы готовы реализовать динамическую отправку, закрытие и т. Д. Самостоятельно. Однако, поскольку вы упоминаете JavaScript как возможную цель (за исключением отсутствия компиляторов, хотя даже JS скомпилирован JIT в основных браузерах в настоящее время), как насчет Scheme? Это динамически типизированный функциональный язык более высокого порядка и уже содержит компиляторы с собственным кодом: http://community.schemewiki.org/?scheme-faq-standards#implementations Единственная проблема может заключаться в том, что она слишком близка к исходному языку, и ваш компилятор (или «переводчик», я бы сказал, был бы слишком легко возможно :-)
Если вы готовы предназначаться C, является хорошей отправной точкой может быть учебник Марк Фили «The 90 минут Схема для компилятора Си»:. http://churchturing.org/y/90-min-scc.pdf
- 1. Ocaml переводчик для функционального языка
- 2. Как создать компилятор функционального языка
- 3. Быстрый поиск элементов для функционального языка (Haskell)
- 4. Почему это важно для функционального языка для поддержки неизменяемых типов?
- 5. Изучение Scala как первого «функционального» языка?
- 6. Измерительная сложность кода функционального языка и императивного языка
- 7. Ошибка: «Нет компилятора для языка C#»
- 8. Вызов функционального языка участника() по нуле
- 9. Big-O для компилятора
- 10. Является ли F # плохим выбором для функционального языка
- 11. В чем причина «let rec» для нечистого функционального языка OCaml?
- 12. Каковы основные проблемы при разработке интерпретатора для функционального языка?
- 13. Расширения языка Haskell: флаг pragma против компилятора?
- 14. Есть ли в мире какой-либо сильный оптимизирующий компилятор для простого функционального языка для себя?
- 15. Какой язык функционального программирования я должен выбрать в качестве первого функционального языка программирования?
- 16. Какие инструменты компилятора используются «официальными» разработчиками языка?
- 17. Состояние веб-разработки с использованием языка функционального программирования
- 18. Какие методы функционального языка могут использоваться на императивных языках?
- 19. Вопросы о создании компилятора для прохладного языка в C++
- 20. Как я могу решить «Ошибка компилятора отчета для языка: null»?
- 21. Какие реализации функционального языка позволяют параллельным потокам потоков?
- 22. JMeter для функционального тестирования
- 23. Новое для функционального программирования
- 24. Состояние вычисления функционального шаблона Scala
- 25. лямбда-исчисление для функционального программирования
- 26. TestNG для функционального тестирования API
- 27. Распределение памяти для функционального указателя
- 28. Грамматика Antlr4 для функционального применения
- 29. Модель машины для функционального программирования
- 30. Письменные тесты для функционального кода?
Выезд [QBE] (HTTP://c9x.me/compile/). – Agis