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

Какой лучший язык (с точки зрения простоты, удобочитаемости и элегантности кода), на ваш взгляд, учиться и работать с метапрограммированием?

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

Ответы

Ответ 1

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

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

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

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

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

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

Некоторые места, чтобы узнать о макросах Scheme:

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

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

Для Prolog вы можете прочитать "Программирование в Prolog" от Clocksin и Mellish (получить последнее издание!), а затем перейти к "Пролог, программируемому по глубине" Covington, Vellino и Nute. См. Главу 6.

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

Ответ 2

Lispы - это в значительной степени язык выбора для самых разных методов метапрограммирования. Из доступных современных Lisp я бы рекомендовал Clojure как более доступный Lisp, который имеет доступ к положительно ОГРОМНОЙ библиотеке (что-либо в Java земля), если вы хотите, чтобы сразу было полезно то, что одновременно является мощным и.

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

Я удивлен, что никто не упомянул ML. ML означает Meta Language. так... да... CaML - стандартная реализация. (OCaML, на который JUST MY правильный OPINIO упоминается OO версия CaML, которая, вероятно, добавляет функции, которые делают метапрограммирование менее очевидным...)

Кроме этого, я большой поклонник Scheme, но практически любой функциональный язык программирования хорош для этого... Всегда есть Маленький Lispер, э-э, извините, Little Schemer...

Ответ 7

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

веселит, Ахим