Python Vs. Ruby для метапрограммирования

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

Важно:

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

В некоторой степени важно:

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

Не важно:

  • Размер сообщества, доступность библиотеки и т.д. Ни один из них не является характеристикой самого языка, и все может очень быстро измениться.
  • Доступность работы. Я не полный рабочий день, профессиональный программист. Я студент-градир, и программирование косвенно связано с моими исследованиями.
  • Любые функции, которые в основном разработаны с очень большими проектами, на которых работает миллион кодовых обезьян.

Ответ 1

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

Ответ 2

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

Не все ли мы.

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

Удачи вам в поиске - сообщите нам, что вы решите в конце.

Ответ 6

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

Ответ 7

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

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

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

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

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

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

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

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

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

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

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

Ответ 8

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

Ответ 9

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

Здесь Io guide.

Ответ 10

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) На Lisp Полом Грэмом (http://www.paulgraham.com/onlisp.html). Это немного старо, но это классика (и загружаемая бесплатно).

Ответ 11

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

важно:

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

В некоторой степени важно:

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

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

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

Ответ 12

@Jason I, соответственно, не согласны. Существуют различия, которые делают 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? Я искренне сомневаюсь в этом!

Ответ 13

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

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

Ответ 14

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

Ответ 15

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

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

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

Ответ 16

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

Ответ 17

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

Ответ 18

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

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

Ответ 19

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

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

Ответ 20

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

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

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

Отношения Friedrich

Ответ 21

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

Ответ 22

Как насчет OCaml?

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

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

Важно:

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

В некоторой степени важно:

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

Ответ 23

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

Ответ 24

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

Ответ 25

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

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

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

Ответ 26

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

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

Ответ 27

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

Также читайте этот поток.

Ответ 28

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

Ответ 29

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

Ответ 30

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