2010-05-21 3 views
13

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

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

+4

Возможно, вы захотите сделать этот вопрос в вики-сообществе, чтобы избежать закрытия на субъективной и аргументативной основе , –

+1

Теперь это сообщество wiki. – Erup

+2

+1 Хороший вопрос. Настоящий позор был закрыт, потому что об этом можно многое сказать. Лисп (1960) - мать всех языков метапрограммирования. Схема - это простой в освоении Lisp. Семейство языков MetaLanguage (ML, 1970) было разработано специально для метапрограммирования, а современные производные (OCaml, Haskell, F #) имеют большую поддержку для этого. Проверьте языки, которые позволяют настроить таргетинг на виртуальные машины, такие как .NET, но также и LLVM. Регулярные выражения - убедительный практический пример полезности метапрограммирования. –

ответ

2

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

+4

Ruby продолжает восприниматься как метаязык, но у него нет хорошо структурированной структуры метапрограммирования. Он просто использует свою динамическую природу, такую ​​как Python. Изучение мета-программирования ИМХО заслуживает обзора метаклассов и саморефлексивных языков, даже если общепринятой практикой является использование динамического языка на основе хеширования. –

0

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

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

4

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

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

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

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

+0

Думая о корпоративных приложениях и наборе понятий, а не только технике, но все это можно сделать с помощью метапрограммирования. Я имею в виду, используя легкую для работы и обучения технологии. Ruby seens - хороший выбор. – Erup

+0

Как показано на сайте @Jay, техника синтаксиса метапрограммирования, по-моему, будет лучше в среде предприятия. Манипуляция во время выполнения не подходит, иногда (например, Ruby?). – Erup

5

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

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

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

2

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

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

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

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

8

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

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

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

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

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

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

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

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

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

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

Есть много хороших книг Smalltalk. Мне нравится «Искусство и наука Smalltalk» Симона Льюиса. О Smalltalk тоже очень хорошо free tutorial/primer by Canol Gokel (но это не так, как преподавание метапрограммирования).

+1

Мне понравилось то, как вы освещали тему. Кроме того, думая о приложениях enterpise и наборе концепций, о внедрении и ремонтопригодности (работая в команде), я понимаю, что технология метапрограммирования синтаксиса (как вы описали) является лучшим выбором по сравнению со временем выполнения. – Erup

+1

@Erup: Не изучайте понятия, используя язык, который ваша команда будет использовать сейчас. Изучайте концепции, чтобы изучать концепции, используя любой инструмент, который помогает лучше всего, а затем выбирайте свой язык, как только вы поймете концепцию. Вы можете выполнять метапрограммирование в C++, например, если вы очень хорошо разбираетесь в шаблонах, но метапрограммирование LEARNING через C++ будет ... нетривиальным. –

+0

Благодаря @JUST МОЕ правильное МНЕНИЕ, изучение понятий - это то, что я хочу. Когда я сказал «работа над командой», я имею в виду идеологию использования технологии, с которой будет легко работать. Вся команда должна будет учиться! – Erup

2

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

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

+2

Люди, которые программируют в OCaml, как правило, бросают часть O действительно, очень быстро, оставляя только Caml. Я не думаю, что любой серьезный программист OCaml использует объектно-ориентированные части с любой частотой. –

Смежные вопросы