Написать переводчик Haskell в Haskell - PullRequest
84 голосов
/ 18 сентября 2009

Классическим упражнением в программировании является написание интерпретатора Lisp / Scheme на Lisp / Scheme. Сила полного языка может быть использована для создания переводчика для подмножества языка.

Есть ли подобное упражнение для Haskell? Я хотел бы реализовать подмножество Haskell, используя Haskell в качестве движка. Конечно, можно сделать, но есть ли онлайн-ресурсы, на которые можно посмотреть?


Вот предыстория.

Я изучаю идею использования Haskell в качестве языка для изучения некоторых концепций в курсе Discrete Structures , который я преподаю. В этом семестре я остановился на Миранде , меньшем языке, вдохновлявшем Хаскелл. Миранда делает около 90% того, что я хотел бы сделать, но Хаскелл делает около 2000%. :)

Так что моя идея состоит в том, чтобы создать язык, обладающий именно теми характеристиками Haskell, которые мне нравятся, и запрещающий все остальное. По мере развития студентов я могу выборочно «включать» различные функции, когда они освоили основы.

Педагогические «языковые уровни» были успешно использованы для преподавания Java и Схема . Ограничивая то, что они могут делать, вы можете запретить им стрелять себе в ногу, пока они еще осваивают синтаксис и концепции, которым вы пытаетесь научить. И вы можете предложить лучшие сообщения об ошибках.

Ответы [ 15 ]

2 голосов
/ 08 апреля 2012

Мне сказали, что Idris имеет довольно компактный синтаксический анализатор, не уверен, действительно ли он подходит для изменения, но он написан на Haskell.

2 голосов
/ 22 сентября 2009

Uhc / Ehc - это серия компиляторов, которые включают / отключают различные функции Haskell. http://www.cs.uu.nl/wiki/Ehc/WebHome#What_is_UHC_And_EHC

2 голосов
/ 19 сентября 2009

посмотрим, станет ли гелий лучшей базой для построения, чем стандартный haskell.

1 голос
/ 19 сентября 2009

Не думаете ли вы, что было бы проще взять исходники GHC и вычеркнуть то, что вам не нужно, чем написать собственный интерпретатор Haskell с нуля? Вообще говоря, удаление функций должно быть на *1003* много меньше усилий, а не на создание / добавление функций.

GHC написан на Haskell, так или иначе, так что технически это не соответствует вашему вопросу о переводчике на Haskell, написанном на Haskell.

Вероятно, было бы не сложно сделать все это статически связанным, а затем только распространять ваш настроенный GHCi, чтобы учащиеся не могли загружать другие исходные модули Haskell. Что касается того, сколько работы потребуется, чтобы предотвратить загрузку других объектных файлов на Haskell, я понятия не имею. Вы также можете отключить FFI, если в ваших классах есть кучка читеров:)

0 голосов
/ 14 июня 2018

Причина, по которой существует так много интерпретаторов LISP, заключается в том, что LISP является в основном предшественником JSON: простой формат для кодирования данных. Это делает интерфейсную часть довольно простой в обращении. По сравнению с этим, Haskell, особенно с языковыми расширениями, не самый простой для анализа язык. Вот некоторые синтаксические конструкции, которые звучат сложно, чтобы получить право:

  • операторы с настраиваемым приоритетом, ассоциативностью и фиксированностью,
  • вложенных комментариев
  • правило размещения
  • синтаксис шаблона
  • do - блоки и обесцвечивание в монадический код

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

Мое предложение - реализовать проверку типов и интерпретатор для Core вместо полной версии Haskell. Обе эти задачи уже довольно сложны. Этот язык, хотя и является строго типизированным функциональным языком, гораздо менее сложен в плане оптимизации и генерации кода. Тем не менее, он по-прежнему не зависит от базовой машины. Поэтому GHC использует его в качестве языка-посредника и переводит в него большинство синтаксических конструкций Haskell.

Кроме того, вы не должны уклоняться от использования внешнего интерфейса GHC (или другого компилятора). Я не считаю это мошенничеством, поскольку пользовательские LISP используют синтаксический анализатор системы LISP хоста (по крайней мере, во время начальной загрузки). Очистка Core фрагментов и представление их учащимся вместе с исходным кодом должны дать вам представление о том, что делает интерфейс, и почему предпочтительно не переопределять его.

Вот несколько ссылок на документацию Core, используемую в GHC:

...