Язык для изучения [закрытого] метапрограммирования

16
задан Erup 21 May 2010 в 12:57
поделиться

7 ответов

Во-первых, я не думаю, что согласен с вашим утверждением, что «метапрограммирование - это« будущее кодирования »». Это отличный инструмент, но не всем он нравится (например, разработчики Java намеренно исключили макросы из языка - не то чтобы мне нравилась Java, но у людей действительно есть причины возражать против метапрограммирования).

В любом случае ... Я могу думать о двух разных способах выполнения метапрограммирования: на синтаксическом уровне и во время выполнения.

Для синтаксического метапрограммирования я думаю, что Scheme - хороший вариант (если бы вы не упомянули простоту и т. Д., Я бы предложил Common Lisp). Что касается метапрограммирования во время выполнения, я полагаю, что и Prolog, и Smalltalk очень интересны. (Вы можете добавлять, изменять и удалять факты в базе данных Prolog "на лету"; и вы можете "на лету" изменять объекты Smalltalk на). Вы, вероятно, можете выполнять метапрограммирование во время выполнения и в Ruby, но я не знаю Ruby.

Итак - в Scheme есть несколько различных методов метапрограммирования (разные макросистемы). Я предлагаю вам взглянуть на какую-нибудь базовую книгу схем, а затем прочитать о двух разных макросистемах.

Некоторые хорошие книги по схемам:

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

Некоторые места, где можно узнать о макросах схемы:

Если вы решили использовать язык, который больше и сложнее Scheme, попробуйте Common Lisp. Я бы предложил три книги:

  • Во-первых, « Практический Common Lisp » Питера Зайбела. Это поможет вам начать работу с Common Lisp и макросами;
  • Во-вторых, " On Lisp " Пола Грэма. Затем вы узнаете, что макросы более мощные, чем вы думали раньше, и изучите действительно хорошие методы;
  • В-третьих, « Let Over Lambda » Дуга Хойта. Продвинутая книга, которую лучше всего читать после книги Грэма «О Лиспе».

Что касается Пролога, вы можете прочитать «Программирование на Прологе» Клоксина и Меллиша (получите последнюю версию!), А затем перейти к «Глубокое программирование на Прологе» Ковингтона, Веллино и Нута. См. Главу 6.

Есть много хороших книг по Smalltalk. Мне нравится "Искусство и наука Smalltalk" Саймона Льюиса.Есть очень хорошее бесплатное руководство / учебник от Canol Gokel и по Smalltalk (но это не касается обучения метапрограммированию).

9
ответ дан 30 November 2019 в 21:36
поделиться

Лиспы - это в значительной степени язык выбора для широкого спектра техник метапрограммирования. Из современных лиспов я бы рекомендовал Clojure как более доступный лисп, имеющий доступ к огромной библиотеке (все, что есть в стране Java), если вам нужно что-то мощное и немедленно полезное.

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

В мире скриптовых языков Ruby - это язык, в котором метапрограммирование является популярной техникой. Его подход смутно напоминает Lisp, но с гораздо более традиционным синтаксисом. Однако ему не хватает полной мощи и гибкости Лиспа, но с другой стороны, за исключением Clojure, о котором говорилось выше, он имеет гораздо больше непосредственной практической пользы.

5
ответ дан 30 November 2019 в 21:36
поделиться

Ruby обладает очень мощными и гибкими возможностями метапрограммирования.

2
ответ дан 30 November 2019 в 21:36
поделиться

Есть несколько языков, которые я бы рекомендовал для изучения мета-программирования.

Первый - это Prolog. Программа на Prolog - это база данных. Прологский "код", клаузулы, являются частью данных. Программа может читать их, включая их содержание. Она также может генерировать новый код как структуру данных и утверждать его, тем самым изменяя себя во время выполнения. И все это без использования расширения терминов, которое представляет собой интеллектуальную систему макросов Prolog. Некоторые книги по ИИ на Прологе начинают с реализации метаинтерпретатора на Прологе, а затем изменяют его по необходимости.

Вторым, как уже упоминалось, является Lisp, и особенно CLOS (Common List Object System), который включает команды для мета-ООП.

Наконец, Python поддерживает приятный и не слишком непонятный механизм для мета-программирования во время выполнения, который представляет собой мета-классы (классы, создающие классы).

2
ответ дан 30 November 2019 в 21:36
поделиться

Что вы имеете в виду под метапрограммированием? Метапрограммирование - это набор концепций, а не одна конкретная техника.

См. этот ответ , где я перечислил различные концепции и родственные языки. Вот резюме:

  • Метапрограммирование с помощью макроса -> Lisp
  • Метапрограммирование с помощью DSL -> Многие языки для внутреннего DSL, внешний DSL более сложен
  • Отражение -> Smalltalk, Ruby
  • Аннотации - -> Java
  • Байт-код или преобразование AST -> Groovy

Подробнее см. Полный ответ. Вообще говоря, я считаю, что Ruby - это хороший универсальный объектно-ориентированный объект. В противном случае любой Lisp-подобный ему подойдет: это как замазка в ваших руках. Но это будет зависеть от того, что вы хотите сделать ...

5
ответ дан 30 November 2019 в 21:36
поделиться

Я удивлен, что никто не упомянул ML. ML расшифровывается как Meta Language. так что ... да ... CaML - это стандартная реализация. (OCaML, который ПРОСТО МОЙ правильный OPINIO упомянул, это OO-версия CaML, которая, вероятно, добавляет функции, которые делают метапрограммирование менее очевидным ...)

Помимо этого, я большой поклонник Scheme, но в значительной степени для этого годится любой функциональный язык программирования ... Всегда есть Маленький Лиспер, извините, Маленький Шеймер ...

2
ответ дан 30 November 2019 в 21:36
поделиться

Не знаю, есть ли у нас такое же определение «метапрограммирования», но определенно не существует ОДНОГО лучшего языка для изучения. Я предлагаю вам глубже взглянуть на функциональное программирование. Какой язык выбрать для этого, зависит от вашего опыта и условий работы. Я бы сейчас выбрал F #, но Haskel тоже должен быть хорошим выбором.

ура, Ахим

0
ответ дан 30 November 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: