Python против Ruby для метапрограммирования [закрыто]

90

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

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

Важный:

  1. Хорошее метапрограммирование. Возможность создавать классы, методы, функции и т.д. во время выполнения. Желательно минимальное различие между кодом и данными в стиле Лисп.
  2. Хороший, чистый, разумный синтаксис и последовательная, интуитивно понятная семантика. По сути, это хорошо продуманный, интересный в использовании современный язык.
  3. Множественные парадигмы. Ни одна парадигма не подходит для каждого проекта или даже для каждой небольшой подзадачи в рамках проекта.
  4. Интересный язык, который действительно влияет на то, как люди думают о программировании.

Немного важно:

  1. Производительность. Было бы неплохо, если бы производительность была приличной, но когда производительность является реальным приоритетом, я буду использовать D.
  2. Хорошо задокументированы.

Не важно:

  1. Размер сообщества, доступность библиотеки и т. Д. Ничто из этого не является характеристикой самого языка, и все может измениться очень быстро.
  2. Наличие вакансий. Я не профессиональный программист, работающий полный рабочий день. Я аспирант, и программирование имеет косвенное отношение к моим исследованиям.
  3. Любые функции, которые в первую очередь разработаны для очень больших проектов, над которыми работает миллион кодовых обезьян.
дсимча
источник
1
+1 За вообще хорошо заданный вопрос.
Триптих
К сожалению, все ответы с высокими оценками в основном говорят «это зависит от обстоятельств», а более низкие ответы - это, в основном, пламенная война между Python и Ruby.
Дэн Бертон
Вы рассматривали Clojure?
Марк Томас
Ответ - Юля ! Тогда его просто не было: bit.ly/julia_meta ... радуйтесь! Джулия охватывает все важные моменты, перечисленные @dsimcha, плюс производительность, и все остальные моменты становятся правдой, поскольку Джулия продолжает взрослеть.
SalchiPapa

Ответы:

15

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

Джейсон Бейкер
источник
30
Это определенно не одно и то же. Внешне они выглядят одинаково, но если вы попробуете самые мощные возможности Ruby, вы поймете, что Python просто не подходит. Например, попробуйте написать DSL на Ruby вместо написания одного Python или создания функции, методов, классов и т. Д. Во время выполнения. В Ruby все намного проще.
FelipeC
14
Метапрограммирование - это не редкость, это просто редкость. Все программы, кроме самых тривиальных, имеют повторяющиеся шаблоны, которые не поддаются обычным инструментам рефакторинга, но могут быть легко уничтожены метапрограммированием.
Уэйн Конрад,
10
Ruby и Python сильно отличаются даже в идеях, которые определяют их дизайн. Python им нужен один и, надеюсь, один очевидный способ делать что-то. Обычно это делает язык не таким выразительным, как Ruby, но делает его более последовательным. Ruby немного больше похож на Perl, где есть много способов делать что-то. Также Ruby упрощает некоторые вещи и фактически включает идею закрытых членов. Python, с другой стороны, в лучшем случае просто усложняет выполнение некоторых задач, поэтому вы должны быть более явными (например, добавление или переопределение поведения в классах).
Шон Копенгейвер,
5
Вам, вероятно, следует пройти ускоренный курс по обоим, но для упрощения метапрограммирования кажется, что Ruby больше подходит. Однако у меня нет большого опыта, так что отнеситесь к этому с недоверием.
Шон Копенгейвер,
7
Ruby и Python похожи только тем, что проповедуют «красивый код». Просто у них совершенно разные взгляды на эту красоту (что, по-
моему,
69

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

Разве не все мы.

минимальное различие между кодом и данными, стиль Lisp

К сожалению, минимальное различие между кодом и данными и «странный» синтаксис являются следствием друг друга.

Если вам нужен простой для чтения синтаксис, у вас есть Python. Однако этот код не представлен ни в одной из обычно используемых встроенных структур данных. Он не попадает - как и большинство языков - в пункт № 1 вашего «важного» списка. Это затрудняет оказание полезной помощи.

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

S.Lott
источник
3
Я обнаружил, что многие языки реализуют макросы, подобные Lisp, в синтаксисах, отличных от Lispy, и что в итоге происходит, так это то, что писать макросы там очень сложно, потому что никто, естественно, не знает структуры данных, в которых представлен код, поэтому писать макросы становится слишком сложно. и никто этого не делает.
pupeno
11
Людям трудно читать Lisp, потому что они не знакомы с синтаксисом. Я считаю, что Lisp намного легче читать, чем C # (но сложнее, чем Python).
Jules
1
Я в целом согласен с этим, но мой опыт работы с Ruby и Lisp показывает, что первый вариант так же хорош для метапрограммирования, как и без круглых скобок. Другими близкими альтернативами могут быть TCL и JavaScript, но я бы не одобрил их по другим причинам.
inger
Давно давно существовал язык по имени Дилан, который должен быть именно таким.
Фридрих
17

Честно говоря, в том, что касается возможностей метапрограммирования, Ruby и Python намного больше похожи, чем некоторые из их приверженцев хотели бы признать. Этот обзор обоих языков предлагает довольно хорошее сравнение / обзор:

Итак, просто выберите один на основе некоторых критериев. Может быть, вам нравится Rails и вы хотите изучить этот код. Может быть, SciPy вам нравится. Посмотрите на экосистему библиотек, сообщества и т. Д. И выберите одну. Вы, конечно, не потеряете какую-то нирвану метапрограммирования, если захотите.

арс
источник
эта запись в блоге, похоже, больше связана с личными предпочтениями (достаточно справедливо, но красота в глазах смотрящего), а не с метапрограммированием - что было основным пунктом ОП.
inger
16

Отказ от ответственности: я только балуюсь любым языком, но я написал по крайней мере небольшие рабочие программы (а не только быстрые сценарии, для которых я использую Perl, bash или GNU make) на обоих.

Рубин может быть очень хорошо для «нескольких парадигм» пункта 3, потому что он усердно работает, чтобы сделать его легко создавать предметно-ориентированные языки. Например, зайдите в Интернет и посмотрите пару фрагментов кода Ruby on Rails и пару фрагментов кода Rake. Они оба являются Ruby, и вы можете видеть сходство, но они не похожи на то, что вы обычно думаете как один и тот же язык.

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

И оценка хорошо в 1 и 4. [Edit: на самом деле 1 довольно спорно - есть «Eval» в обоих, как общие в интерпретируемых языках, но они вряд ли концептуально чистым. Вы можете определять замыкания, назначать методы объектам и т. Д. Не уверен, доходит ли это так далеко, как вы хотите.]

Лично мне Ruby интереснее, но отчасти потому, что легче отвлечься, думая о крутых способах решения задач. На самом деле я больше использовал Python. Иногда тебе не хочется крутизны, ты хочешь заняться этим, так что это делается перед сном ...

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

Стив Джессоп
источник
15

Вы думали о Smalltalk? Он предлагает очень простой, понятный и расширяемый синтаксис с возможностями отражения и самоанализа, а также полностью интегрированную среду разработки, которая использует эти возможности. Взгляните, например, на то, что делается в Squeak Smalltalk . Многие исследователи, использующие Squeak, используют список рассылки Squeak и #squeak на freenode, поэтому вы можете легко получить помощь по сложным вопросам.

Другие индикаторы его актуальности: он работает на любой платформе, которую вы хотите назвать (включая iPhone ); Гилад Браха основывает свой новояз на писке; команда V8 набралась опыта в отношении виртуальных машин Smalltalk ; а Дэн Ингаллс и Рэндал Шварц недавно вернулись к работе над Smalltalk после многих лет в пустыне.

Желаем удачи в поиске - дайте нам знать, что вы решите в итоге.

Mykdavies
источник
14

Лисп удовлетворяет всем вашим критериям, включая производительность, и это единственный язык, который не имеет (странного) синтаксиса. Если вы откажетесь от него на такой поразительно плохо информированной / ошибочной основе и, следовательно, упустите опыт использования, например, Emacs + SLIME + CL, вы окажете себе большую медвежью услугу.

user23611
источник
4
Или вы можете попробовать Clojure, который мне очень нравится.
pupeno
1
Сильно согласен. Если вам нужна мощь Lisp, просто погрузитесь в нее и получите ее! На самом деле к паренсу довольно легко привыкнуть; они не так важны, как большинство людей представляет их.
Дэн Бертон
11

Ваши 4 «важных» точки ведут к Ruby, а 2 «несколько важных» точки - к Python. Быть по сему.

Нео
источник
11

Вы описываете Ruby.

  • Хорошее метапрограммирование. Возможность создавать классы, методы, функции и т.д. во время выполнения. Желательно минимальное различие между кодом и данными в стиле Лисп.

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

Вы также можете создавать ярлыки для синтаксического сахара, например, с помощью class_eval .

  • Хороший, чистый, разумный синтаксис и последовательная, интуитивно понятная семантика. По сути, это хорошо продуманный, интересный в использовании современный язык.

Ruby следует принципу меньшего удивления , и при сравнении кода Ruby с эквивалентом на другом языке многие люди считают его более «красивым».

  • Множественные парадигмы. Ни одна парадигма не подходит для каждого проекта или даже для каждой небольшой подзадачи в рамках проекта.

Вы можете следовать императивному, объектно-ориентированному, функциональному и рефлексивному.

  • Интересный язык, который действительно влияет на то, как люди думают о программировании.

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

Я пробовал Python, и он не соответствует вашим важным моментам.

FelipeC
источник
11
-1 Я использую Python, он мне подходит, разница между Python и Ruby заключается в других аспектах. Ты фанатский шумелок.
gorsky
6
Много разговоров, но без прогулки. Не хотите ли предоставить на Python пример динамического добавления метода, скажем, класса String?
FelipeC 05
6
@john Это именно моя точка зрения; это очень сложно и некрасиво (не говоря уже о невозможном для класса String). OTOH в Ruby это очень просто: "self.class.send (: define_method,: method_name) {method_code}"
FelipeC 03
2
Ruby может попытаться следовать PoLS, но я бы не сказал, что это так . Например, здесь, на SO , lambda/ Proc.newmess было названо «неожиданным поведением» и «крайне противоречивым». :-) В любом языке, таком большом и сложном, как Ruby, неизбежно будут такие запутанные области.
Кен
2
@Token вот пример обезьяньего исправления Stringв Ruby для целей метапрограммирования: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/… . Подклассы не годятся; однако простая функция с двумя аргументами будет.
П Швед
8

Сравните примеры кода, которые делают то же самое (присоединяются с новой строкой к непустым описаниям элементов из myListсписка) на разных языках (языки расположены в обратном алфавитном порядке):

Рубин :

myList.collect { |f| f.description }.select { |d| d != "" }.join("\n")

Или

myList.map(&:description).reject(&:empty?).join("\n")

Python :

descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions)) 

Или

"\n".join(f.description() for f in mylist if f.description())

Perl :

join "\n", grep { $_ } map { $_->description } @myList;

Или

join "\n", grep /./, map { $_->description } @myList;

Javascript :

myList.map(function(e) e.description())
      .filter(function(e) e).join("\n")

Ио :

myList collect(description) select(!="") join("\n")

Вот руководство по Ио .

J.F. Sebastian
источник
3
(формат nil "~ {~ a ~ ^ ~% ~}" (удалить nil (mapcar # 'description mylist)))
Райнер Йосвиг
приятно, а где тут метапрограммирование? это вроде какой-то слегка функциональный стиль, отдаленно связанный с вопросом.
inger
6

Ruby был бы лучше, чем Lisp, с точки зрения «мейнстрима» (что бы это ни значило на самом деле , но одна реальная проблема заключается в том, насколько легко было бы найти ответы на ваши вопросы о программировании на Lisp, если бы вы согласились с этим.) В любом случае , Я обнаружил, что Руби очень легко подобрать. За то же время, которое я потратил на первое изучение Python (или других языков, если на то пошло), я вскоре начал писать лучший код, намного более эффективно, чем когда-либо раньше. Однако это всего лишь мнение одного человека; Полагаю, воспринимайте это с недоверием. На данный момент я знаю о Ruby гораздо больше, чем Python или Lisp, но вы должны знать, что я был человеком Python довольно долгое время, прежде чем переключился.

Lisp, безусловно, довольно крутой, и его стоит изучить; как вы сказали, размер сообщества и т. д. может измениться довольно быстро. При этом сам размер не так важен, как качество сообщества. Например, #ruby-langканал до сих пор заполнен невероятно умными людьми. Lisp, кажется, привлекает и некоторых действительно умных людей. Я не могу много говорить о сообществе Python, поскольку у меня нет большого личного опыта, но иногда оно кажется «слишком большим». (Я помню, как люди были довольно грубы на своем IRC-канале, и из того, что я слышал от друзей, которые действительно увлекаются Python, это, похоже, скорее правило, чем исключение.)

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

1) Серия Ruby Metaprogramming от прагматичных программистов ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) - платная, но более поздние эпизоды весьма интригуют. (Код бесплатный, если вы хотите скачать его и посмотреть, что вы узнаете.)

2) О Лиспе Пола Грэма ( http://www.paulgraham.com/onlisp.html ). Это немного старовато, но это классика (и ее можно скачать бесплатно).

Бенджамин Оукс
источник
5

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

важный:

  1. Метапрограммирование: Python поддерживает метаклассы и создание классов / методов среды выполнения и т. Д.
  2. Синтаксис: Ну это как-то субъективно. Мне нравится синтаксис Pythons за его простоту, но некоторые люди жалуются, что Python чувствителен к пробелам.
  3. Парадигмы: Python поддерживает процедурное, объектно-ориентированное и базовое функциональное программирование.
  4. Я думаю, что у Python очень практичный стиль, это меня очень вдохновило.

Немного важно:

  1. Производительность: Ну, это язык сценариев. Но написание расширений C для Python - обычная практика оптимизации.
  2. Документация: я не могу жаловаться. Это не так подробно, как кто-то может знать по Java, но достаточно хорошо.

Поскольку вы аспирант, вы можете прочитать эту статью, в которой утверждается, что Python - это все, что нужно ученому . К сожалению, я не могу сравнивать Python с Ruby, поскольку никогда не использовал этот язык.

С уважением, Деннис

ксардии
источник
3
Python не чувствителен к пробелам. Он чувствителен к отступам.
jfs
5

@ Джейсон Я, соответственно, не согласен. Есть различия, которые делают Ruby лучше Python в плане метапрограммирования - как философские, так и прагматические. Во-первых, Ruby получает правильное наследование с помощью Single Inheritance и Mixins . А когда дело доходит до метапрограммирования, вам просто нужно понимать, что все дело в самом себе . Каноническая разница в том, что в Ruby у вас есть доступ к объекту self во время выполнения, а в Python - нет!

В отличие от Python, в Ruby нет отдельной фазы компиляции или выполнения. В Ruby каждая строка кода выполняется для определенного объекта self . В Ruby каждый класс наследуется как от объекта, так и от скрытого метакласса. Это дает интересную динамику:

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

Использование self.name обеспечивает доступ к методу имени метакласса классов Ninja, чтобы вернуть имя класса Ninja. Неужели метапрограммирование так красиво в Python? Искренне сомневаюсь!

Эрик Дэвидсон
источник
4

Что ж, если вам не нравится синтаксис lisp, возможно, вам подойдет ассемблер. :-)

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

Рикард
источник
Я думаю, что я сделал больше метапрограммирования на ассемблере, чем на любом другом языке. Код - это данные, а данные могут быть кодом. И данные не подписаны или неподписаны, решает код операции.
Nosredna
1
У меня есть ассемблерный код, который можно назвать объектно-ориентированным. У него есть вещи, которые больше похожи на методы - вы вызываете тот, который зависит от «класса».
Justintime
4

Ио удовлетворяет всем вашим "важным" пунктам. Я не думаю, что есть лучший язык для сумасшедшего мета-хакерства.

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

тот, который поддерживает хаки метапрограммирования, которые просто невозможно сделать на статически скомпилированном языке

Я бы хотел найти язык, который позволяет использовать некоторые из классных вещей, которые делает Lisp.

Лисп можно скомпилировать.

RHSeeger
источник
3

Мой ответ - ни то, ни другое. Я знаю оба языка, прошел курс Ruby и несколько лет программировал на Python. Lisp хорош в метапрограммировании из-за того, что его единственная цель - преобразовывать списки, его собственный исходный код - это просто список токенов, поэтому метапрограммирование является естественным. Три языка, которые мне больше всего нравятся для этого типа вещей, - это Rebol, Forth и Factor. Rebol - это очень сильный диалектный язык, который берет код из входного потока, запускает выражение против него и преобразует его, используя правила, написанные на этом языке. Очень выразительный и очень хорошо диалектирует. Фактор и Форт более или менее полностью отделены от синтаксиса, и вы программируете их, определяя и вызывая слова. Как правило, они в основном написаны на их родном языке. Вы не пишете приложения в традиционном понимании, вы расширяете язык, написав свои собственные слова для определения вашего конкретного приложения. Фактор может быть особенно хорош, поскольку он имеет множество функций, которые я видел только в smalltalk для оценки и работы с исходным кодом. Действительно красивое рабочее пространство, интерактивные документы и т. Д.

ToddB
источник
2

На самом деле не так уж и много разделять Python и Ruby. Я бы сказал, что сообщество Python больше и зрелее, чем сообщество Ruby, и это действительно важно для меня. Ruby - более гибкий язык, который имеет как положительные, так и отрицательные последствия. Однако я уверен, что будет много людей, которые подробно расскажут об обоих этих языках, поэтому я выберу третий вариант. А как насчет JavaScript?

Изначально JavaScript был разработан как схема для Интернета и основан на прототипах, что является преимуществом перед Python и Ruby в том, что касается мультипарадигмы и метапрограммирования. Синтаксис не так хорош, как два других, но, вероятно, это наиболее широко распространенный язык из существующих, и его производительность улучшается с каждым днем.

Джим
источник
2

Если вам нравится концепция «код - это данные» в стиле Lisp, но не нравится синтаксис Lispy, возможно, Prolog будет хорошим выбором.

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

JesperE
источник
2

Я выбрал Ruby после изучения Python, Smalltalk и Ruby.

ржать
источник
2

А как насчет OCaml?

Возможности OCaml: система статических типов, вывод типов, параметрический полиморфизм, хвостовая рекурсия, сопоставление с образцом, лексические замыкания первого класса, функторы (параметрические модули), обработка исключений и автоматическая сборка мусора с возрастающим поколением.

Я думаю, что это удовлетворяет следующему:

Важный:

  1. Хороший, чистый, разумный синтаксис и последовательная, интуитивно понятная семантика. По сути, это хорошо продуманный, интересный в использовании современный язык.
  2. Множественные парадигмы. Ни одна парадигма не подходит для каждого проекта или даже для каждой небольшой подзадачи в рамках проекта.
  3. Интересный язык, который действительно влияет на то, как люди думают о программировании.

Немного важно:

  1. Производительность. Было бы неплохо, если бы производительность была приличной, но когда производительность является реальным приоритетом, я буду использовать D.
  2. Хорошо задокументированы.
Роберт Вукович
источник
OCaml позволяет создавать классы / методы во время выполнения? Как это работает?
Джейсон Крейтон,
Я только что прочитал об OCaml и, возможно, он не может создавать что-то во время выполнения, поэтому я удалил его.
Роберт Вукович
2

Я немного использую Python, но гораздо больше - Ruby. Однако я бы сказал, что они оба предоставляют то, о чем вы просили.

Если я увижу все ваши четыре точки, вы можете хотя бы проверить: http://www.iolanguage.com/

И Моцарт / Оз тоже может быть вам интересен: http://mozart.github.io/

С уважением Фридрих

Фридрих
источник
1

Для синтаксиса в стиле Python и макросов, подобных Lisp (макросы, которые представляют собой реальный код) и хорошего DSL, см. " Converge" .

оборота Каспрзола
источник
1

Я не уверен, что Python выполнит все, что вы хотите (особенно вопрос о минимальном различии между кодом и данными), но есть один аргумент в пользу python. Существует проект, который упрощает программирование расширений для Python на языке D, так что вы можете получить лучшее из обоих миров. http://pyd.dsource.org/celerid.html

Маули
источник
1

если любишь розу, надо научиться жить с шипами :)

Агент апельсин
источник
1

Я бы порекомендовал вам пойти с Руби.

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

Mardix
источник
1

Не смешивайте язык программирования Ruby с реализациями Ruby, думая, что потоки POSIX невозможны в ruby.

Вы можете просто скомпилировать с поддержкой pthread, и это уже было возможно во время создания этого потока , если вы простите за каламбур.

Ответ на этот вопрос прост. Если вам нравится шепелявый, вы, вероятно, предпочтете рубин. Или как хотите.

анонимности
источник
0

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

Также прочтите эту ветку .

Александр Кожевников
источник
0

Пойдите с JS, просто проверьте AJS (альтернативный синтаксис JavaScript) на моем github http://github.com/visionmedia, он даст вам более чистые закрытия и т. Д .: D

Т. Дж. Головайчук
источник
0

Что касается вашей основной идеи (метапрограммирования): Groovy версии 1.6 имеет встроенное программирование AST (абстрактное синтаксическое дерево) в качестве стандартной и интегрированной функции. Ruby имеет RubyParser, но это надстройка.

отличный
источник