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


90

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

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

Важливо:

  1. Хороше метапрограмування. Можливість створення класів, методів, функцій тощо під час виконання. Переважно, мінімальна різниця між кодом і даними, стиль Lisp.
  2. Гарний, чистий, здоровий синтаксис та послідовна, інтуїтивна семантика. В основному добре продумана, цікава у використанні, сучасна мова.
  3. Кілька парадигм. Жодна парадигма не підходить для кожного проекту або навіть для кожної невеликої підзадачі в рамках проекту.
  4. Цікава мова, яка насправді впливає на те, як людина думає про програмування.

Дещо важливе:

  1. Продуктивність. Було б непогано, якби продуктивність була гідною, але коли продуктивність є справжнім пріоритетом, я замість цього буду використовувати D.
  2. Добре задокументовані.

Не важливо:

  1. Розмір спільноти, доступність бібліотеки тощо. Жодне з них не є характеристикою самої мови, і все може змінюватися дуже швидко.
  2. Вакансія. Я не штатний професійний програміст. Я студент, і програмування дотично стосується мого дослідження.
  3. Будь-які функції, які в першу чергу розроблені для дуже великих проектів, над якими працював мільйон кодових мавп.

1
+1 Для загально добре заданого питання.
Триптих

На жаль, усі високо оцінені відповіді в основному говорять "це залежить", а нижчі відповіді - це в основному війна Python проти Ruby Flame.
Ден Бертон,

Ви розглядали Clojure?
Марк Томас

Відповідь - Джулія ! Тоді його просто не існувало: bit.ly/julia_meta ... радійте! Джулія охоплює всі важливі моменти, перелічені @dsimcha, плюс продуктивність, а всі інші моменти стають істинними, оскільки Джулія продовжує дозрівати.
SalchiPapa

Відповіді:


15

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


30
Там точно не одне і те ж. Зовні схожий на зовнішній вигляд, але якщо ви використовуєте найпотужніші риси Ruby, ви розумієте, що Python просто не відповідає. Наприклад, спробуйте написати DSL у Ruby проти написання одного Python, або створити функцію, методи, класи тощо під час виконання. У Ruby це набагато прямолінійніше.
FelipeC

14
Не рідко вам потрібно робити метапрограмування, просто рідко це робиться. Усі, крім найбільш тривіальної програми, мають повторювані шаблони, які не підпадають під звичайні інструменти рефакторингу, але можуть бути легко вбиті метапрограмуванням.
Wayne Conrad

10
Ruby та Python сильно відрізняються навіть за ідеями, що регулюють їх дизайн. Python вони хочуть один і, сподіваємось, один очевидний спосіб зробити щось. Це, як правило, робить мову не такою виразною, як Ruby, але робить її більш послідовною. Рубі походить трохи більше від способу Perl, де існує багато способів зробити щось. Крім того, Рубі робить деякі речі надзвичайно простими і фактично включає ідею приватних членів. З іншого боку, Python просто робить щось складнішим у виконанні, тому ви повинні бути більш явними (наприклад, додавання або перевизначення поведінки в класах).
Шон Копенгавер

5
Ймовірно, вам слід пройти аварійний курс в обох, але для простого метапрограмування виявляється, що Рубі більше підходить. У мене немає дуже великого досвіду, тому сприймайте це з достатньою кількістю солі.
Шон Копенгавер

7
Рубі та Пітон схожі лише тим, що вони проповідують "прекрасний код". Вони просто мають абсолютно різні погляди на цю красу (що ІМО добре)
Габі Пуркару

69

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

Чи не всі ми.

мінімальна різниця між кодом і даними, стиль Lisp

На жаль, мінімальна різниця між кодом і даними та "дивний" синтаксис - це наслідки один для одного.

Якщо ви хочете легко читати синтаксис, у вас є Python. Однак код не представлений у жодній із загальновживаних вбудованих структур даних. Це не вдається - як це робить більшість мов - у пункті 1 вашого "важливого" списку. Це ускладнює надання корисної допомоги.

Ви не можете мати все це. Пам’ятайте, ви не перші замислюєтесь над цим. Якби існувало щось на зразок вашої ідеальної мови, ми б усі цим користувались. Оскільки реальний світ не відповідає вашим ідеалам, вам доведеться заново розставити пріоритети у своєму списку бажань. Розділ "важливий" повинен бути переставлений, щоб визначити, що для вас насправді важливо.


3
Я виявив, що багато мов реалізують схожі на Lisp макроси у синтаксисах, що не є Ліспі, і що закінчується тим, що писати там макроси дуже важко, тому що ніхто, природно, не знає структури даних, в яких представлений код, тому написання макросів стає занадто складним і ніхто цього не робить.
пупено

11
Людям важко читати Lisp, оскільки вони не знайомі з синтаксисом. Мені зручніше читати Lisp, ніж C # (але складніше, ніж Python).
Жуль

1
Я багато в чому погоджуюся з цим, але мій досвід роботи з Рубі та Ліспам показує, що перше рішення настільки ж добре підходить для метапрограмування, як і без дужок. Іншими наближеними альтернативами можуть бути TCL та JavaScript, але я б не надав їм перевагу з інших причин.
inger

Довгий час агі існувала мова під назвою Ділан, яка повинна бути саме такою.
Фрідріх

17

Чесно кажучи, що стосується засобів метапрограмування, Ruby та Python набагато більше схожі, ніж деякі з їхніх прихильників хотіли б визнати. Цей огляд обох мов пропонує досить гарне порівняння / огляд:

Отже, просто виберіть один, виходячи з деяких критеріїв. Можливо, вам подобається Rails і ви хочете вивчити цей код. Можливо, SciPy - це ваша річ. Подивіться на екосистему бібліотек, спільноти тощо і виберіть одну. Ви, звичайно, не програєте на якійсь метапрограмуванні нірвани, виходячи з вашого вибору.


здається, що запис у блозі пов’язаний з особистими уподобаннями (досить справедливо, але краса в очах спостерігача), а не метапрограмуванням - що було головним пунктом ОП.
inger

16

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

Ruby може бути дуже приємним для пункту "множинні парадигми", оскільки він докладає всіх зусиль, щоб полегшити створення мов для певних доменів. Наприклад, перегляньте Інтернет і подивіться на пару біт коду Ruby on Rails та пару біт коду Rake. Вони обидва Рубі, і ви можете помітити схожість, але вони не схожі на те, що ви зазвичай вважаєте однією мовою.

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

Обидва мають хороші оцінки в 1 і 4. [Редагувати: насправді 1 досить суперечливо - в обох існує "eval", як це часто трактується мовами, але вони навряд чи концептуально чисті. Ви можете визначати закриття, призначати методи об’єктам та ін. Не впевнений, чи заходить це так далеко, як ви хочете.]

Особисто я вважаю Рубі веселішим, але частково це тому, що легше відволіктися, думаючи про круті способи робити щось. Я насправді використовував Python більше. Іноді вам не хочеться круто, ви хочете продовжувати, щоб це було зроблено перед сном ...

Жоден з них не є складним, тому ви можете просто вирішити зробити своє наступне другорядне завдання в одному, а одне після цього в іншому. Або візьміть у бібліотеці вступну книгу по кожному, прочитайте їх обох і подивіться, що вас захоплює.


15

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

Інші показники його актуальності: він працює на будь-якій платформі, яку ви хочете назвати (включаючи iPhone ); Гілад Брача базує свою роботу на "Новій мові" на "Піску"; команда V8 вирізала зуби на віртуальних машинах Smalltalk ; і Ден Інгалс та Рендал Шварц нещодавно повернулися до роботи Smalltalk після багатьох років у пустелі.

Удачі вам у пошуку - повідомте нам, що ви вирішите врешті-решт.


14

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


4
Або ви можете спробувати Clojure, що мені здається дуже приємним.
pupeno

1
Сильно погоджуюсь. Якщо ви хочете сили Lisp, просто зануртесь і отримайте її! Насправді досить легко звикнути до парен; вони не така велика справа, як більшість людей робить їх такими.
Dan Burton

11

Ваші 4 "важливі" очки ведуть до Рубі точно, тоді як 2 "дещо важливі" очки, якими керує Python. Нехай буде так.


11

Ви описуєте Рубі.

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

Дуже легко розширити та змінити існуючі примітиви під час виконання. У рубіні все є об'єктом, рядками, цілими числами, навіть функціями.

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

  • Гарний, чистий, здоровий синтаксис та послідовна, інтуїтивна семантика. В основному добре продумана, цікава у використанні, сучасна мова.

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

  • Кілька парадигм. Жодна парадигма не підходить для кожного проекту або навіть для кожної невеликої підзадачі в рамках проекту.

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

  • Цікава мова, яка насправді впливає на те, як людина думає про програмування.

Це дуже суб’єктивно, але, з моєї точки зору, здатність використовувати багато парадигм одночасно дозволяє дуже цікаві ідеї.

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


11
-1 Я використовую Python, і він ідеально підходить, відмінності між Python і Ruby полягають в інших аспектах. Ви, шанувальник фанатичного шуму.
Горський

6
Багато розмов, але ні прогулянки. Хочете навести приклад у Python динамічного додавання методу, щоб сказати клас String?
FelipeC

6
@john Це саме моя думка; це дуже складно і потворно (не кажучи вже про неможливе для класу String). OTOH в Ruby дуже просто: "self.class.send (: define_method,: method_name) {method_code}"
FelipeC 03.03.10

2
Рубі може спробувати дотримуватися PoLS, але я б не сказав, що це так . Наприклад, lambda/ Proc.newmess тут, на SO, називають "дивовижною поведінкою" та "дуже неінтуїтивною". :-) Будь-яка така велика та складна мова, як Рубі, обов’язково має такі заплутані області.
Ken

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")

Ось путівник Io .


3
(формат нуль "~ {~ a ~ ^ ~% ~}" (видалити нуль (mapcar # 'description mylist)))
Райнер Йосвіг

приємно, але де тут метапрограмування? здається, це трохи злегка функціональний стиль, віддалено пов’язаний із питанням.
inger

6

Рубі був би кращим за Ліспа з точки зору того, що він є "основним" (що б це насправді не означало, але одне реалістичне занепокоєння полягає в тому, як легко було б знайти відповіді на ваші запитання щодо програмування Ліспа, якщо б ви хотіли з цим погодитися.) У будь-якому випадку , Я знайшов Рубі дуже легко підібрати. За той самий проміжок часу, який я витратив на перше вивчення Python (або інших мов), я незабаром писав кращий код набагато ефективніше, ніж будь-коли раніше. Це думка лише однієї людини; візьміть це із зерном солі, мабуть. На даний момент я знаю про Ruby набагато більше, ніж про Python чи Lisp, але ви повинні знати, що я досить давно був людиною Python, перш ніж перейти на інший.

Lisp, безумовно, досить прохолодний і вартий уваги; як ви вже сказали, розмір спільноти тощо може змінюватися досить швидко. Тим не менш, сам розмір не такий важливий, як якість спільноти. Наприклад,#ruby-lang канал все ще наповнений неймовірно розумними людьми. Схоже, Лісп приваблює і справді розумних людей. Я не можу багато говорити про спільноту Python, оскільки у мене немає великого досвіду з перших вуст, але, здається, це іноді "занадто велике". (Я пам’ятаю, що люди були досить грубими на своєму каналі IRC, і з того, що я чув від друзів, які справді люблять Python, це, здається, швидше правило, ніж виняток.)

У будь-якому випадку, деякі ресурси, які можуть вам виявитися корисними, є:

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

2) На Lisp, Пол Грем ( http://www.paulgraham.com/onlisp.html ). Він трохи старий, але класичний (і завантажується безкоштовно).


5

Я використовую Python для багатьох проектів, і я думаю, що Python надає всі функції, про які ви просили.

важливо:

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

Дещо важливе:

  1. Продуктивність: Ну це мова сценаріїв. Але написання розширень на мові Python є загальною практикою оптимізації.
  2. Документація: Я не можу скаржитися. Це не так детально, як хтось може знати з Java, але досить добре.

Оскільки ви студент, ви можете прочитати цю статтю, стверджуючи, що Python - це все, що потрібно вченому . На жаль, я не можу порівняти Python з Ruby, оскільки я ніколи не користувався цією мовою.

З повагою, Деннісе


3
Python не чутливий до пробілів. Він чутливий до відступів.
jfs

5

@ Джейсон Я відповідно не погоджуюсь. Існують відмінності, які роблять Рубі перевершує Python в метапрограмуванні - як філософському, так і прагматичному. Для початку Рубі отримує право на спадщину за допомогою функції Single Inheritance та Mixins . А коли справа доходить до метапрограмування, вам просто потрібно зрозуміти, що справа вся в собі . Канонічна різниця тут в тому , що в Ruby , у вас є доступ до самостійного об'єкту під час виконання - в Python ви не робите!

На відміну від Python, у Ruby не існує окремої фази компіляції або виконання. В Ruby, кожен рядок коду виконується в відношенні конкретного самостійного об'єкта. У Ruby кожен клас успадковує як об'єкт, так і прихований метаклас. Це дає деяку цікаву динаміку:

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

Використання self.name отримує доступ до методу імені метакласу класів Ninja для повернення імені класу Ninja. Чи так красиво квітка метапрограмування у Python? Щиро сумніваюся!


4

Ну, якщо вам не подобається синтаксис lisp, можливо, асемблер - це шлях. :-)

Він, безумовно, має мінімальну різницю між кодом і даними, є багатопарадигмою (а може, це і не парадигма), і це розум, що розширює (якщо це нудно), як з точки зору навчання, так і з прийомами, які ви можете зробити.


Я думаю, що я зробив більше метапрограмування на мові асемблеру, ніж на будь-якій іншій мові. Код - це дані, і дані можуть спробувати бути кодом. А дані не підписані чи не підписані, це вирішує код коду дії.
Носредна

1
У мене є код асемблера, який ви можете заявити як ОО. У ньому є речі, схожі на методи - ви називаєте той, який залежить від "класу".
justintime

4

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


Дякую за це, не знав цього. На перший погляд виглядає весело, можливо, багато (()), але в будь-якому випадку. Сподіваюся, я знайду час, щоб подивитися, незабаром.
flq

3

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

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

Lisp можна скласти.



3

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


2

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

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


2

Якщо вам подобається концепція коду-даних у стилі lisp, але вам не подобається синтаксис Lispy, можливо, Prolog буде хорошим вибором.

Чи кваліфікується це як "весела у використанні, сучасна мова", я залишу іншим судити. ;-)


2

Рубі - це мій вибір після вивчення 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

Щодо синтаксису в стилі пітона та макросів, схожих на lisp (макроси, які є реальним кодом) та хорошого DSL, див. Збіжність .


1

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



1

Я рекомендую вам піти з Рубі.

Коли я вперше почав це вивчати, мені було дуже легко це підібрати.


1

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

Ви можете просто скомпілювати з підтримкою pthread, і це було можливо вже на момент створення цього потоку , якщо ви пробачаєте каламбур.

Відповідь на це питання проста. Якщо вам подобається шепелявість, ви, напевно, віддасте перевагу рубіну. Або, що завгодно.




0

Щодо вашої основної точки зору (метапрограмування): Версія 1.6 Groovy має вбудоване програмування AST (Абстрактне дерево синтаксису) як стандартну та інтегровану функцію. У Ruby є RubyParser, але це доповнення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.