Подтвердить что ты не робот

Не-С++ языки для генеративного программирования?

С++, вероятно, самый популярный язык для статического метапрограммирования и Java не поддерживает его.

Существуют ли другие языки помимо С++, которые поддерживают генеративное программирование (программы, которые создают программы)?

4b9b3361

Ответ 1

Альтернативой метапрограмме стиля шаблона является макро-стиль, который вы видите в различных реализациях Lisp. Я предлагаю загрузить Paul Graham On Lisp, а также посмотреть Clojure, если вы заинтересованы в Lisp с макросами, которые запускаются на JVM.

Макросы в Lisp гораздо более мощные, чем стиль C/С++, и составляют собственный язык - они предназначены для метапрограмм.

Ответ 2

позвольте мне перечислить несколько важных деталей о том, как метапрограммирование работает в lisp (или scheme или slate или выбрать свой любимый "динамический" язык):

  • При выполнении метапрограммирования в lisp вам не нужно иметь дело с двумя языками. код мета-уровня написан на том же языке, что и код уровня объекта, который он создает. метапрограммирование не ограничивается двумя уровнями, и это легче и для мозга.
  • в lisp у вас есть компилятор , доступный во время выполнения. на самом деле разметка времени компиляции/времени выполнения здесь очень искусственна и очень подвержена тому, где вы размещаете свою точку зрения. в lisp с помощью простого вызова функции вы можете скомпилировать функции для машинных команд, которые вы можете использовать с этого момента, в качестве объектов первого класса; то есть они могут быть неназванными функциями, которые можно сохранить в локальной переменной или глобальной хэш-таблице и т.д.
  • макросы в lisp очень просты: множество функций, заполненных хэш-таблицей и переданных компилятору. для каждой формы компилятор собирается скомпилировать, он справляется с этой хэш-таблицей. если он находит функцию, то вызывает ее во время компиляции с исходной формой, а вместо исходной формы он компилирует форму, возвращаемую этой функцией. (по модулю некоторые не важные детали), поэтому lisp макросы являются в основном плагинами для компилятора.
  • запись функции lisp в lisp, которая оценивает код lisp, составляет около двух страниц кода (обычно это называется eval). в такой функции у вас есть все возможности ввести любые новые правила, которые вы хотите на мета-уровне. (заставляя его работать быстро, потребуется некоторое усилие, хотя... примерно так же, как при загрузке нового языка...:)

случайные примеры того, что можно реализовать как пользовательскую библиотеку с помощью метапрограммирования lisp (это фактические примеры общих библиотек lisp):

  • расширять язык с помощью ограниченных продолжений (hu.dwim.delico)
  • реализует макрос js-to-lisp -rpc, который можно использовать в javascript (который генерируется из lisp). он расширяется в смесь кода js/lisp, который автоматически отправляет (в HTTP-запрос) все указанные локальные переменные, декодирует их на стороне сервера, запускает тело кода lisp на сервере и возвращает обратный возврат значение для стороны javascript.
  • добавить пролог, например, вернуться к языку, который очень легко интегрируется с "нормальным" кодом lisp (см. крик)
  • a расширение шаблона XML в общий lisp (включает пример макросов читателя, которые являются плагинами для парсера lisp)
  • тонна небольших DSL, например loop или iterate для легкого цикла.

Ответ 3

Метапрограммирование шаблонов - это, по сути, злоупотребление шаблоном. Я имею в виду, что вы получаете в основном то, что вы ожидаете от функции, которая была незапланированным побочным эффектом - это беспорядок, и (хотя инструменты становятся все лучше) реальная боль в заднице, потому что язык не (я должен отметить, что мой опыт работы с новейшими технологиями устарел, поскольку я по сути отказался от подхода. Я не слышал о каких-либо больших успехах, хотя)

Беседа с этим примерно в 98-м году побудила меня искать лучшие решения. Я мог писать полезные системы, которые полагались на него, но они были адскими. Вздрогнув, в конце концов привело меня к Common Lisp. Несомненно, механизм шаблонов является полным, но затем снова интеркаль.

Общий Lisp выполняет метапрограммирование `right '. У вас есть полная доступность языка, когда вы это делаете, нет специального синтаксиса, и потому что язык очень динамичен, вы можете сделать больше с ним.

Конечно, есть и другие варианты. Никакой другой язык, который я использовал, делает метапрограммирование лучше, чем Lisp, поэтому я использую его для кода исследования. Есть много причин, по которым вы, возможно, захотите попробовать что-то еще, но все это будет компромисс. Вы можете посмотреть Haskell/ML/OCaml и т.д. Многие функциональные языки имеют что-то, приближающееся к силе макросов Lisp. Вы можете найти некоторые целевые компоненты .NET, но все они довольно незначительны (с точки зрения пользовательской базы и т.д.). Ни один из крупных игроков на индустриально используемых языках не имеет ничего подобного.

Ответ 4

Nemerle и Boo - мои личные фавориты для таких вещей. Nemerle имеет очень элегантный синтаксис макроса, несмотря на его плохую документацию. Документация Boo отличная, но ее макросы немного менее элегантны. Оба работают невероятно хорошо, однако.

Обе целевые .NET, поэтому они могут легко взаимодействовать с С# и другими языками .NET - даже двоичными файлами Java, если вы используете IKVM.

Изменить: Чтобы уточнить, я имею в виду макросы в значении слова Lisp, а не в макросах препроцессора C. Они позволяют определять новый синтаксис и тяжелое метапрограммирование в compiletime. Например, Nemerle отправляет макросы, которые будут проверять ваши SQL-запросы на ваш SQL-сервер в compiletime.

Ответ 5

"D" язык программирования является С++-подобным, но имеет гораздо лучшую поддержку метапрограммирования. Вот пример лучеискателя, написанного с использованием метапрограммирования только времени компиляции:

Ctrace

Кроме того, существует ветвь gcc, называемая "Concept GCC", которая поддерживает метапрограммирование, что С++ не делает (по крайней мере, пока).

Концепция GCC

Ответ 6

Я рекомендую Haskell. Вот paper, описывающий его возможности метапрограммирования времени компиляции.

Ответ 7

Общие Lisp поддерживает программы, которые пишут программы несколькими способами.

1) Данные программы и программа "абстрактное синтаксическое дерево" являются однородными (S-выражения!)

2) defmacro

3) Макросы чтения.

4) MOP

Из этого, настоящий вентилятор - СС. Прочтите "Искусство метаобъектного протокола". Это меняет вещи для вас, я обещаю!

Ответ 8

Много работы в Haskell: определенные доменные языки (DSL), исполняемые спецификации, трансформация программы, частичное приложение, поэтапные вычисления. Несколько ссылок для начала работы:

Ответ 9

Nim - относительно новый язык программирования, который имеет обширную поддержку статического метапрограммирования и создает скомпилированный код с эффективным (С++).

http://nim-lang.org/

Он поддерживает оценку функции компиляции, lisp -подобные преобразования кода АСТ через макросы, отражение во времени компиляции, общие типы, которые могут быть параметризованы с произвольными значениями, и термин переписывание, который может использоваться для создания пользовательских высоких Оптимизация глазок на основе уровня. В процессе компиляции возможно выполнение внешних программ, которые могут влиять на формирование кода. В качестве примера рассмотрим возможность разговора с локально работающим сервером баз данных, чтобы убедиться, что определение ORM в вашем коде (поставляемом через некоторые DSL) соответствует схеме базы данных.

Ответ 10

"метапрограммирование" действительно плохое имя для этой конкретной функции, по крайней мере, когда вы обсуждаете более одного языка, поскольку эта функция нужна только для узкого фрагмента языков, которые:

  • статичным
  • скомпилирован для машинного языка
  • сильно оптимизирован для производительности во время компиляции
  • расширяемый с пользовательскими типами данных (OOP в случае С++)
  • чрезвычайно популярный

вытащите любой из них, и "статическое метапрограммирование" просто не имеет смысла. поэтому я был бы удивлен, если бы какой-либо отдаленный основной язык имел что-то подобное, как понял на С++.

конечно, динамические языки и несколько функциональных языков поддерживают совершенно разные понятия, которые также можно назвать метапрограммированием.

Ответ 11

Семейство языков ML разработано специально для этой цели. Одной из самых известных историй успеха OCaml является библиотека FFTW для высокопроизводительных БПФ, которая является кодом C, сгенерированным почти полностью программой OCaml.

Cheers, Джон Харроп.

Ответ 12

Большинство людей пытаются найти язык, который имеет "окончательное отражение", для самоконтроля и что-то вроде "eval" для обновления нового кода. Такие языки трудно найти (LISP является основным контрпримером) и они, безусловно, не являются основными.

Но другой подход заключается в использовании набора инструментов, которые могут проверять, генерировать и управлять программным кодом. Джекпот - такой инструмент ориентированной на Java. http://jackpot.netbeans.org/

Наш инструментарий для реинжиниринга программного обеспечения DMS такой инструмент, который работает на C, С++, С#, Java, COBOL, PHP, Javascript, Ada, Verilog, VHDL и множество других языков. (Он использует передние контуры качества продукции, чтобы он мог читать все эти langauges). Лучше, он может сделать это с несколькими языками в один и тот же момент. См. http://www.semdesigns.com/Products/DMS/DMSToolkit.html

DMS преуспевает, потому что он обеспечивает регулярный метод и поддерживает инфраструктуру для полного доступа к структуре программы как АСТ, и в большинстве случаев дополнительные данные, такие как таблицы символов, информация о типе, управление и анализ потока данных, все необходимое для выполнения сложной программы манипуляция.

Ответ 13

Lisp поддерживает форму "метапрограммирования", хотя и не в том же смысле, что и метапрограммирование шаблона С++. Кроме того, ваш термин "статический" может означать разные вещи в этом контексте, но Lisp также поддерживает статическое типирование, если это то, что вы имеете в виду.