С++, вероятно, самый популярный язык для статического метапрограммирования и Java не поддерживает его.
Существуют ли другие языки помимо С++, которые поддерживают генеративное программирование (программы, которые создают программы)?
С++, вероятно, самый популярный язык для статического метапрограммирования и Java не поддерживает его.
Существуют ли другие языки помимо С++, которые поддерживают генеративное программирование (программы, которые создают программы)?
Альтернативой метапрограмме стиля шаблона является макро-стиль, который вы видите в различных реализациях Lisp. Я предлагаю загрузить Paul Graham On Lisp, а также посмотреть Clojure, если вы заинтересованы в Lisp с макросами, которые запускаются на JVM.
Макросы в Lisp гораздо более мощные, чем стиль C/С++, и составляют собственный язык - они предназначены для метапрограмм.
позвольте мне перечислить несколько важных деталей о том, как метапрограммирование работает в lisp (или scheme или slate или выбрать свой любимый "динамический" язык):
случайные примеры того, что можно реализовать как пользовательскую библиотеку с помощью метапрограммирования lisp (это фактические примеры общих библиотек lisp):
Метапрограммирование шаблонов - это, по сути, злоупотребление шаблоном. Я имею в виду, что вы получаете в основном то, что вы ожидаете от функции, которая была незапланированным побочным эффектом - это беспорядок, и (хотя инструменты становятся все лучше) реальная боль в заднице, потому что язык не (я должен отметить, что мой опыт работы с новейшими технологиями устарел, поскольку я по сути отказался от подхода. Я не слышал о каких-либо больших успехах, хотя)
Беседа с этим примерно в 98-м году побудила меня искать лучшие решения. Я мог писать полезные системы, которые полагались на него, но они были адскими. Вздрогнув, в конце концов привело меня к Common Lisp. Несомненно, механизм шаблонов является полным, но затем снова интеркаль.
Общий Lisp выполняет метапрограммирование `right '. У вас есть полная доступность языка, когда вы это делаете, нет специального синтаксиса, и потому что язык очень динамичен, вы можете сделать больше с ним.
Конечно, есть и другие варианты. Никакой другой язык, который я использовал, делает метапрограммирование лучше, чем Lisp, поэтому я использую его для кода исследования. Есть много причин, по которым вы, возможно, захотите попробовать что-то еще, но все это будет компромисс. Вы можете посмотреть Haskell/ML/OCaml и т.д. Многие функциональные языки имеют что-то, приближающееся к силе макросов Lisp. Вы можете найти некоторые целевые компоненты .NET, но все они довольно незначительны (с точки зрения пользовательской базы и т.д.). Ни один из крупных игроков на индустриально используемых языках не имеет ничего подобного.
Nemerle и Boo - мои личные фавориты для таких вещей. Nemerle имеет очень элегантный синтаксис макроса, несмотря на его плохую документацию. Документация Boo отличная, но ее макросы немного менее элегантны. Оба работают невероятно хорошо, однако.
Обе целевые .NET, поэтому они могут легко взаимодействовать с С# и другими языками .NET - даже двоичными файлами Java, если вы используете IKVM.
Изменить: Чтобы уточнить, я имею в виду макросы в значении слова Lisp, а не в макросах препроцессора C. Они позволяют определять новый синтаксис и тяжелое метапрограммирование в compiletime. Например, Nemerle отправляет макросы, которые будут проверять ваши SQL-запросы на ваш SQL-сервер в compiletime.
"D" язык программирования является С++-подобным, но имеет гораздо лучшую поддержку метапрограммирования. Вот пример лучеискателя, написанного с использованием метапрограммирования только времени компиляции:
Кроме того, существует ветвь gcc, называемая "Concept GCC", которая поддерживает метапрограммирование, что С++ не делает (по крайней мере, пока).
Я рекомендую Haskell. Вот paper, описывающий его возможности метапрограммирования времени компиляции.
Общие Lisp поддерживает программы, которые пишут программы несколькими способами.
1) Данные программы и программа "абстрактное синтаксическое дерево" являются однородными (S-выражения!)
2) defmacro
3) Макросы чтения.
4) MOP
Из этого, настоящий вентилятор - СС. Прочтите "Искусство метаобъектного протокола". Это меняет вещи для вас, я обещаю!
Много работы в Haskell: определенные доменные языки (DSL), исполняемые спецификации, трансформация программы, частичное приложение, поэтапные вычисления. Несколько ссылок для начала работы:
Nim - относительно новый язык программирования, который имеет обширную поддержку статического метапрограммирования и создает скомпилированный код с эффективным (С++).
Он поддерживает оценку функции компиляции, lisp -подобные преобразования кода АСТ через макросы, отражение во времени компиляции, общие типы, которые могут быть параметризованы с произвольными значениями, и термин переписывание, который может использоваться для создания пользовательских высоких Оптимизация глазок на основе уровня. В процессе компиляции возможно выполнение внешних программ, которые могут влиять на формирование кода. В качестве примера рассмотрим возможность разговора с локально работающим сервером баз данных, чтобы убедиться, что определение ORM в вашем коде (поставляемом через некоторые DSL) соответствует схеме базы данных.
"метапрограммирование" действительно плохое имя для этой конкретной функции, по крайней мере, когда вы обсуждаете более одного языка, поскольку эта функция нужна только для узкого фрагмента языков, которые:
вытащите любой из них, и "статическое метапрограммирование" просто не имеет смысла. поэтому я был бы удивлен, если бы какой-либо отдаленный основной язык имел что-то подобное, как понял на С++.
конечно, динамические языки и несколько функциональных языков поддерживают совершенно разные понятия, которые также можно назвать метапрограммированием.
Семейство языков ML разработано специально для этой цели. Одной из самых известных историй успеха OCaml является библиотека FFTW для высокопроизводительных БПФ, которая является кодом C, сгенерированным почти полностью программой OCaml.
Cheers, Джон Харроп.
Большинство людей пытаются найти язык, который имеет "окончательное отражение", для самоконтроля и что-то вроде "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 преуспевает, потому что он обеспечивает регулярный метод и поддерживает инфраструктуру для полного доступа к структуре программы как АСТ, и в большинстве случаев дополнительные данные, такие как таблицы символов, информация о типе, управление и анализ потока данных, все необходимое для выполнения сложной программы манипуляция.
Lisp поддерживает форму "метапрограммирования", хотя и не в том же смысле, что и метапрограммирование шаблона С++. Кроме того, ваш термин "статический" может означать разные вещи в этом контексте, но Lisp также поддерживает статическое типирование, если это то, что вы имеете в виду.
Мета-язык (ML), конечно: http://cs.anu.edu.au/student/comp8033/ml.html