Лисп / Схема DSEL в C ++ - PullRequest
       66

Лисп / Схема DSEL в C ++

10 голосов
/ 24 февраля 2011

Я наткнулся на следующий пост в списках рассылки boost (выделено мной):

Привет всем,

кто-нибудь знает о существующей склонности духа / лиспа, и есть ли Вы заинтересованы в разработке такого проекта с открытым исходным кодом?

Пока нет, AFAIK.

Я напишу пример для Spirit2 дополнить виртуальный крошечный C машина там. Что одинаково Интересно, что эта схема (или по крайней мере, его часть) может быть реализовано в чистом с ++. Нет разбора, просто чистый DSEL в C ++. Теперь представьте синтаксический анализатор, который предназначается для этого DSEL (через C ++) - переводчик исходного кода. По сути, ваш код схемы будет скомпилирован в высокоэффективный C ++.

Кто-нибудь на самом деле делал это? Я был бы очень заинтересован в таком DSEL.

Ответы [ 3 ]

6 голосов
/ 17 марта 2011

Я написал похожий на Лисп язык под названием Funky, используя Spirit в C ++. Версия с открытым исходным кодом доступна по адресу http://funky.vlinder.ca.. Чтобы превратить ее в переводчик, похожий на Lisp-C ++, не потребовалось бы много времени.

На самом деле, требуется библиотека поддержки времени выполнения для обеспечения общего времени закрытия и тому подобное: если вы хотите превратить код Lisp в эффективный C ++, вам в основном понадобятся классы C ++ (функторы и т. Д.) Для выполнения как только вы доберетесь до времени выполнения, ваш переводчик Lisp-to-C ++ должен будет:

  1. разбор Лисп
  2. создать AST из Lisp
  3. преобразуйте AST, чтобы оптимизировать его, если это возможно (оптимизации в Lisp отличаются от оптимизаций в C ++, поэтому, если вы хотите быстро увеличить C ++, вы должны оптимизировать Lisp и позволить вашему компилятору C ++ оптимизировать сгенерированный C ++)
  4. генерирует C ++, для которого вы полагаетесь на свою библиотеку поддержки времени выполнения для таких вещей, как встроенные функции, типы функторов и т. Д.

Если бы вы начали с Funky, у вас уже были бы разбор и AST (хотя Funky не оптимизирует AST), так что вы могли бы оттуда создать среду выполнения и сгенерировать C ++ .. .

Также было бы не слишком сложно написать его с нуля: грамматика Lisp не так уж сложна, поэтому большая часть работы будет посвящена AST и поддержке во время выполнения.

Если бы я сейчас не писал объектно-ориентированный DSL, я мог бы попробовать свои силы в этом.

1 голос
/ 26 октября 2011

схема (читабельная) c ++ http://www.suri.cs.okayama -u.ac.jp / servlets / APPLICATION.rkt

Как насчет этого

0 голосов
/ 02 марта 2011

Не уверен, что это то, что вы хотите, но:

http://howtowriteaprogram.blogspot.com/2010/11/lisp-interpreter-in-90-lines-of-c.html

По крайней мере, похоже на начало.

...