- PVSM.RU - https://www.pvsm.ru -
Эта статья является переводом поста Chris Hodapp Embedding Haskell: Compilers, and compiling compilers [1] В своём посте автор рассматривает различные подходы к использованию Haskell для написания кода для встраиваемых систем. Предоставим слово автору.
В моем последнем посте [2] упоминалось, что некоторые вещи требуют лучшего объяснения, потому что я всегда пытаюсь объяснить и уточнить.
Этот блог посвящен использованию Haskell со встраиваемыми системами. Что это хотя бы значит? Мы видим пару широких категорий (которые отражают слайды на последней странице, а также наша страница ссылок [3]):
Насколько мне известно, эти категории придумал я. Если кому-то известна более устоявшаяся классификация, более подходящие названия или примеры того, кто написал об этом первым, сообщите, пожалуйста.
Это может выглядеть как односторонняя, произвольная группировка; это вроде так. Общность заключается в том, что во всех случаях Haskell используется для выражения чего-либо (программы, схемы, спецификации, называйте это как хотите) для встраиваемого назначения. Подробнее об этом далее.
Я исключаю такие вещи, как Cryptol и Idris, потому что, будучи реализованными на Haskell и пригодными для встраиваемых платформ, они сами по себе являются другими языками. Я могу произвольно отбросить это различие в будущем, если захочу...
Это то, что обычно приходит на ум, когда люди слышат об использовании Haskell со встраиваемыми системами — компиляция кода на Haskell для запуска непосредственно во встраиваемой системе, в сочетании с обычной средой выполнения (плюс все, что требуется для начальной загрузки и поддержки). Раздел Compiling to Embedded Targets [5] на странице ссылок будет особенно интересен в этом отношении.
Тем не менее, это на самом деле кажется довольно редким. Природа языка Haskell ставит некоторые сложные задачи. В частности, необходимо обеспечить соответствие среды выполнения Haskell целевой системе и заставить сборщик мусора и ленивые вычисления вести себя предсказуемым и вменяемым образом.
Ajhc [6], компилятор, производный от JHC [7], от Kiwamu Okabe из METASEPI, является единственным таким примером, который я обнаружил — он может компилироваться и выполняться на ARM Cortex-M3 / M4. Kiwamu много писал о своем опыте работы с Haskell по этим следам. Его последующее переключение на язык ATS может быть подсказкой.
HaLVM [8] от Galois, возможно, вписывается в эту категорию.
В этом случае используется существующий компилятор для определенных этапов (таких как синтаксический анализ и проверка типов), и пользовательский бэкэнд для фактического создания кода, часто с большим количеством статического анализа. Здесь может быть адаптация или же запрет определенных конструкций (например, с плавающей точкой, рекурсивные функции, рекурсивные типы данных: Неподдерживаемые CλaSH возможности Haskell [9]).
GHC обеспечивает это, позволяя разработчикам вызывать функциональность GHC из Haskell в качестве библиотеки [10].
В разделе Compiling for FPGA/ASIC [11] есть несколько примеров такого.
Разделы Code Generation EDSLs [12] и Circuit Design EDSLs [13] на странице ссылок содержат множество примеров этого. Атом, тема нескольких моих предыдущих постов, находится в этой же категории.
Именно эту категорию мне чаще всего приходится объяснять. Обычно здесь используется EDSL (Embedded Domain-Specific Language, встроенный предметно-ориентированный язык) внутри Haskell, чтобы направить процесс генерации кода в представление более низкого уровня. Иначе это называется компиляция.
Подчеркнем: код, который выполняется на целевой системе, полностью отделен от среды выполнения Haskell. Компилятор Haskell здесь ничего не компилирует для целевой среды — он компилирует другой компилятор и ввод для этого компилятора. Эти входные данные являются спецификациями того, что будет работать на целевой системе.
Здесь есть ограничения одного вида:
Этот подход также даёт преимущество другого рода:
В последнем посте я говорил о том, что в этой категории Haskell берет на себя роль метапрограммирования или языка шаблонов. Хотя это может быть правдой, я вроде проигнорировал, что это менее актуально, потому что это будет также и во всех других категориях.
Объединение этих категорий может показаться натяжкой, особенно если учесть, что последняя категория включает дополнительные этапы и сдвиг, заключающийся в том, как человек думает о программном обеспечении.
Обдумайте следующее:
Тенденция ясна? (Нет, это не монады. Сигнал только аппликативен, и я подозреваю, что Lava ведет себя аналогично.)
Этот список охватывает наши три категории. В каждой из них создается программа (в широком смысле), просто создавая значение в Haskell. Помимо этого, единственные реальные различия это:
Игнорирование расплывчатой природы термина «декларативный» довольно напрямую связано с декларативным характером программ на Haskell.
С этой точки зрения, Haskell все еще компилируется для запуска в какой-то встраиваемой среде. При этом компиляция может продолжаться вне системного компилятора Haskell, и запуск может не использовать его среду исполнения.
Автор: Евгений А. Симоненко
Источник [24]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/fpga/354932
Ссылки в тексте:
[1] Embedding Haskell: Compilers, and compiling compilers: https://haskellembedded.github.io/posts/2015-10-09-compiler-compilers.html
[2] посте: https://haskellembedded.github.io/posts/2015-06-09-atom-cincyfp-slides.html
[3] ссылок: https://haskellembedded.github.io/pages/links.html
[4] Хостинг: https://www.reg.ru/?rlink=reflink-717
[5] Compiling to Embedded Targets: https://haskellembedded.github.io/pages/links.html#compiling-to-embedded-targets
[6] Ajhc: https://github.com/ajhc/ajhc
[7] JHC: http://repetae.net/computer/jhc/
[8] HaLVM: https://github.com/galoisinc/halvm
[9] Неподдерживаемые CλaSH возможности Haskell: http://hackage.haskell.org/package/clash-prelude-0.10/docs/CLaSH-Tutorial.html#unsupported
[10] библиотеки: https://wiki.haskell.org/GHC/As_a_library
[11] Compiling for FPGA/ASIC: https://haskellembedded.github.io/pages/links.html#compiling-for-fpgaasic
[12] Code Generation EDSLs: https://haskellembedded.github.io/pages/links.html#code-generation-edsls
[13] Circuit Design EDSLs: https://haskellembedded.github.io/pages/links.html#circuit-design-edsls
[14] Num: https://hackage.haskell.org/package/base/docs/Prelude.html#t:Num
[15] Shake: https://shakebuild.com/
[16] Atom: https://hackage.haskell.org/package/atom-1.0.13/docs/Language-Atom.html#t:Atom
[17] Atom: https://hackage.haskell.org/package/atom-1.0.13/docs/Language-Atom.html#g:2
[18] Ivory eff: https://hackage.haskell.org/package/ivory-0.1.0.0/docs/Ivory-Language.html#t:Ivory
[19] Module: https://hackage.haskell.org/package/ivory-0.1.0.0/docs/Ivory-Language.html#t:Module
[20] Ivory: https://hackage.haskell.org/package/ivory-backend-c-0.1.0.1/docs/Ivory-Compile-C.html
[21] CλaSH: https://clash-lang.org/
[22] Signal: https://hackage.haskell.org/package/clash-prelude-0.10/docs/CLaSH-Signal.html#t:Signal
[23] topEntity: https://hackage.haskell.org/package/clash-prelude-0.10/docs/CLaSH-Annotations-TopEntity.html
[24] Источник: https://habr.com/ru/post/510648/?utm_source=habrahabr&utm_medium=rss&utm_campaign=510648
Нажмите здесь для печати.