Python против Ruby для метапрограммирования [закрыто]
в настоящее время я в основном D программист и я ищу, чтобы добавить другой язык в мой инструментарий, предпочтительно тот, который поддерживает метапрограммирование хаки, которые просто не могут быть сделаны в статически скомпилированном языке, как D.
Я немного читал о Lisp, и мне бы хотелось найти язык, который позволяет некоторые интересные вещи, которые делает Lisp, но без странного синтаксиса и т. д. шепелявит. Я не хочу начинать языковую войну пламени, и я уверен, что и Руби и Python имеют свои недостатки, поэтому я перечислю то, что важно для меня лично. Пожалуйста, скажите мне, будет ли Ruby, Python или какой-то другой язык лучше для меня.
важно:
- хороший метапрограммирования. Возможность создания классов, методов, функций и т. д. во время выполнения. Предпочтительно, минимальное различие между кодом и данными, стиль Lisp.
- хороший, чистый, вменяемый синтаксис и последовательная, интуитивная семантика. В основном хорошо продуманный, интересный в использовании, современный язык.
- несколько парадигм. Ни одна парадигма не подходит для каждого проекта или даже для каждой небольшой подзадачи в рамках проекта.
- интересный язык, который на самом деле влияет на то, как человек думает о программировании.
несколько важных:
- производительность. Было бы неплохо, если бы производительность была неплохой, но когда производительность является реальным приоритетом, я буду использовать D вместо.
- хорошо документированы.
Не важно:
- общий размер, наличие библиотеки и т. д. Ни одна из этих характеристик не является характеристикой самого языка, и все может измениться очень быстро.
- наличие рабочих мест. Я не полный рабочий день, профессиональный программист. Я аспирант, и программирование имеет касательное отношение к моим исследованиям.
- любые функции, которые в основном разработаны с очень большими проектами, над которыми работает миллион обезьян кода в разум.
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 предоставляет все функции, которые вы просили.
важно:
- метапрограммирование: Python поддерживает метаклассы и время выполнения класса/метода генерации и т. д
- синтаксис: Ну это как-то субъективно. Мне нравится синтаксис Pythons за его простоту, но некоторые люди жалуются, что Python чувствителен к пробелам.
- парадигмы: Python поддерживает процедурные, объектно-ориентированные и базовые функциональное программирование.
- Я думаю, что Python имеет очень практическую направленность, стиль, это было очень вдохновляющим для меня.
несколько важных:
- производительность: ну его скриптовый язык. Но написание расширений C для Python-это обычная практика оптимизации.
- документация: я не могу жаловаться. Не так подробно, как кто-то может знать из Java, но его достаточно хорошо.
Как вы студент, вы можете чтобы прочитать эту статью, утверждая, что питон-это все, что нужно ученому. К сожалению, я не могу сравнить Python с Ruby, так как я никогда не использовал этот язык.
с уважением, Деннис
@Jason я соответственно не согласен. Есть различия, которые делают Ruby лучше Python для метапрограммирования-как философского, так и прагматического. Для начала, Ruby получает право наследования с одним наследованием и Mixins. И когда дело доходит до метапрограммирования вам просто нужно понять, что это все о self. Каноническая разница здесь заключается в том, что в Ruby у вас есть доступ к self
Ну, если вам не нравится синтаксис lisp, возможно, ассемблер-это путь. : -)
Он, безусловно, имеет минимальное различие между кодом и данными, является многопарадигмой (или, может быть, это не парадигма), и это ум, расширяющий (если утомительный) опыт как с точки зрения обучения, так и трюков, которые вы можете сделать.
Io удовлетворяет все ваши "важные" моменты. Я не думаю, что есть лучший язык для сумасшедшего мета-хакерства.
тот, который поддерживает метапрограммирование хаки, которые просто не может быть сделано в статически компилируемый язык
Я бы хотел найти язык, который позволяет некоторые интересные вещи, которые Lisp тут
Lisp может быть скомпилирован.
мой ответ не будет ни тем, ни другим. Я знаю оба языка, взял класс на Ruby и программировал на python в течение нескольких лет. Lisp хорош в метапрограммировании из-за того, что его единственной целью является преобразование списков, его собственный исходный код-это просто список токенов, поэтому метапрограммирование естественно. Три языка, которые мне больше всего нравятся для этого типа вещей, - это Rebol, Forth и Factor. Rebol-это очень сильный диалектный язык, который берет код из своего входного потока, запускает выражение против него и преобразует его с помощью правил, написанных на языке. Очень выразительный и очень хорошо говорит на диалекте. Фактор и далее более или менее полностью отделены от синтаксиса, и вы программируете их, определяя и вызывая слова. Они, как правило, в основном написаны на своем родном языке. Вы не пишете приложения в традиционном смысле, вы расширяете язык, написав свои собственные слова, чтобы определить ваше конкретное приложение. Фактор может быть особенно приятным, поскольку он имеет много функций, которые я видел только в языке для работы с исходным кодом. Действительно хорошее рабочее место, интерактивных документов и т. д.
на самом деле не так много, чтобы отделить Python и Ruby. Я бы сказал, что сообщество Python больше и более зрелое, чем сообщество Ruby, и это действительно важно для меня. Ruby-это более гибкий язык, который имеет положительные и отрицательные последствия. Тем не менее, я уверен, что будет много людей, чтобы подробно изучить оба этих языка, поэтому я брошу третий вариант на ринг. Как насчет JavaScript?
JavaScript изначально был разработан как схема для Web, и на основе этого прототипа, что является преимуществом по сравнению с Python и Ruby насколько мультипарадигменный касается и метапрограммирование. Синтаксис не так хорош, как два других, но это, вероятно, самый широко распространенный язык в существовании, и производительность становится лучше с каждым днем.
Если вам нравится концепция lisp-style code-is-data, но не нравится синтаксис Lispy, возможно Пролог было бы хорошим выбором.
Если это квалифицируется как" весело использовать, современный язык", я оставлю другим судить. ; -)
Как насчет OCaml ?
Я думаю, что он удовлетворяет следующее:
важно:
- хороший, чистый, вменяемый синтаксис и последовательная, интуитивная семантика. В основном хорошо продуманный, интересный в использовании, современный язык.
- несколько парадигм. Ни одна парадигма не подходит для каждого проекта или даже для каждой небольшой подзадачи в рамках проекта.
- интересный язык, который на самом деле влияет на то, как человек думает о программировании.
несколько важных:
- производительность. Было бы неплохо, если бы производительность была неплохой, но когда производительность является реальным приоритетом, я буду использовать D вместо.
- хорошо документированы.
Я использую 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