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


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

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

важно:

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

несколько важных:

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

Не важно:

  1. общий размер, наличие библиотеки и т. д. Ни одна из этих характеристик не является характеристикой самого языка, и все может измениться очень быстро.
  2. наличие рабочих мест. Я не полный рабочий день, профессиональный программист. Я аспирант, и программирование имеет касательное отношение к моим исследованиям.
  3. любые функции, которые в основном разработаны с очень большими проектами, над которыми работает миллион обезьян кода в разум.
30 87

30 ответов:

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

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

Не все мы.

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

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

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

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

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

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

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

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

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

Обе забьют в 1 и 4. [Edit: на самом деле 1 довольно спорно - есть "eval" в обоих, как обычно в интерпретируемых языках, но они вряд ли концептуально чисты. Можно определить замыкания, назначить методы объектам и многое другое. Не уверен, что это идет так далеко, как вы хотите.]

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

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

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

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

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

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

вы описываете Рубин.

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

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

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

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

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

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

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

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

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

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

ваши 4 " важных "точки приводят к Ruby точно, в то время как 2" несколько важных " точки управляются Python. Да будет так.

сравнить примеры кода которые делают то же самое (соедините с новой строкой непустые описания элементов из 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")

Io:

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

здесь руководство Ио.

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

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

в любом случае, некоторые ресурсы, которые вы может оказаться полезным являются:

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

2) on Lisp by Paul Graham (http://www.paulgraham.com/onlisp.html). это немного старый, но это классика (и загружается бесплатно).

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

важно:

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

несколько важных:

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

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

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

@Jason я соответственно не согласен. Есть различия, которые делают Ruby лучше Python для метапрограммирования-как философского, так и прагматического. Для начала, Ruby получает право наследования с одним наследованием и Mixins. И когда дело доходит до метапрограммирования вам просто нужно понять, что это все о self. Каноническая разница здесь заключается в том, что в Ruby у вас есть доступ к self

Ну, если вам не нравится синтаксис lisp, возможно, ассемблер-это путь. : -)

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

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

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

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

Lisp может быть скомпилирован.

вы пробовали Rebol?

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

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

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

Если вам нравится концепция lisp-style code-is-data, но не нравится синтаксис Lispy, возможно Пролог было бы хорошим выбором.

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

Ruby-это мой выбор после изучения Python, Smalltalk и Ruby.

Как насчет OCaml ?

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

важно:

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

несколько важных:

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

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

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

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

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

для синтаксиса python-style и lisp-подобных макросов (макросы, которые являются реальным кодом) и хорошего DSL см. сходятся.

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

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

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

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

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

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

ответ на этот вопрос прост. Если вам нравится lisp, вы, вероятно, предпочтете ruby. Или, как вам больше нравится.

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

Читайте также этой теме.

пойти с JS просто проверить айс (альтернативный синтаксис JavaScript) на моем GitHub http://github.com/visionmedia это даст вам некоторые ищут уборщика затворы и т. д. :D

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