LINUX.ORG.RU

Ruby в качестве замены Perl

 , ,


0

4

Давненько уже подумываю активно писать на чём-либо, помимо Perl'а.

Синтаксис наиболее популярного у хомячков Python'а вызывает у меня откровенное отвращение, язык Julia, который вроде и нравится, в качестве языка общего назначения пока откровенно слаб, да и его нестабильность несколько напрягает. Языки C#, D, Java - многословны и сложны для тех достаточно простых приложений и библиотек, которые я пишу (к тому же наиболее мне симпатичный здесь язык C# - по сути мало популярен на *nix'ах, поскольку ему нужен mono).

Посмотрел на Ruby - вроде неплохо. Есть конечно косяки в виде «@@» (очень странное изобретение - обозначать префиксом область видимости переменной) и прочих чудесных вещей наподобие end'ов и def'ов (что за идиотская обфускация, для чего?), но в целом явно лучше Python'а, вполне удобный синтаксис.

Несколько напрягает тот факт, что популярность Ruby явно обусловлена убывающей, насколько я знаю, популярностью Ruby-On-Rails и в целом, в отличие от того же Perl'а и Python'а, Ruby в качестве языка на все случаи жизни якобы мало используется - сфера применения у него ограничена веб-технологиями (опять же, не моё личное мнение).

Собственно, вопрос в том, насколько перспективен Ruby и есть ли у кого-то обоснованные возражения против того, что «Ruby без рельс бесполезен».

★★★★★
Ответ на: комментарий от DRVTiny

Тогда уж * надо было использовать для взятия ссылок.

Херово ты перл знаешь. Во-первых, * уже используется как сигил для глобов. Во-вторых, сишники бы путались, поскольку в си * имеет обратный смысл — разыменование указателя. Короче, я бы тебе посоветовал держать свои идеи о том, «как надо было» (особенно в отношении перла), в секрете. Всё равно перл ты уже не изменишь, а молча за умного сойдёшь.

Синтаксис прототипов у perl'а вообще весьма жуткий. Пользуюсь им весьма редко…

Для перла синтаксис вполне годный. Для функций прототипы — то, что надо. Позволяет получить ошибку о плохих параметрах (типа ждали два, передано три) ещё при компиляции. Это, конечно, не сравнимо со статически типизированными языками, но хоть что-то. Глупо этим не пользоваться. К сожалению, с методами прототипирование не работает.

У меня нет фундаментальных претензий к перлу кроме скорости работы интерпретатора и отсутствию вменяемых вакансий…

А ты много знаешь языков, у которых скорость работы интерпретатора сильно быстрее?

Хочешь скорости — бери компилируемый язык. Но и тут счастья не будет: на си затрахаешься со строками работать, на плюсах затрахаешься ждать когда компиляция закончится и разбираться с сообщениями об ошибках длиной в 2000 знаков, на ди — отсутствие вменяемых вакансий… и т. д. Нет счастья в жизни.

debugger ★★★★★
()
Ответ на: комментарий от outtaspace

Я поработал на 10 проектах на Ruby, 8 из них до сих пор в продакшене и коммерчески успешны, самый старший из них более 15 лет в проде. Говнокод был в 2 проектах, потому-что его писали джуны под руководством не очень опытного пм, в остальных все отлично. Ну и причем тут вообще стек технологий? Такой опыт мог быть на любом стеке.

с пафосными эльфами-рубистами

не повезло тебе, я работал с обычными прогерами-рубистами

anonymous
()
Ответ на: комментарий от Anatolik

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

В руби это *не* делается автоматически, так как там всё и всегда передаётся по значению (которое на самом деле есть ссылка).

«Everything is an object» красиво, но сильно сказывается на производительности.

debugger ★★★★★
()
Ответ на: комментарий от debugger

В руби это *не* делается автоматически

Давайте обойдемся без терминологических диспутов. Код, где «всё и всегда передаётся по значению (которое на самом деле есть ссылка)», проще для восприятия.

«Everything is an object» красиво, но сильно сказывается на производительности.

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

Кроме того, у Ruby есть потенциал для того, чтобы стать в разы быстрее. Посмотрите эту тему, «Practical Partial Evaluation for High-Performance Dynamic Language Runtimes» и другую информацию на http://chrisseaton.com/rubytruffle.

Anatolik ★★
()
Ответ на: комментарий от DRVTiny
%{$h2}=%{$h1};

Мелочь, конечно, но как-то ты неправильно бутерброд ешь, а потом люди перл птичьим языком называют. Четыре символа у тебя явно лишние, вот так и короче и понятней:

$h2 = { %$h1 };
debugger ★★★★★
()
Ответ на: комментарий от debugger

Хочешь скорости — бери компилируемый язык. Но и тут счастья не будет: на си затрахаешься со строками работать, на плюсах затрахаешься ждать когда компиляция закончится и разбираться с сообщениями об ошибках длиной в 2000 знаков, на ди — отсутствие вменяемых вакансий… и т. д. Нет счастья в жизни.

еще есть objc, swift и даже go (это если брать с вакансиями).

в них быстрая компиляция, и нет проблем со строками и крестовым идиотизмом.

(я на работе достаточно много пишу на перле и objc, но для go и swift пока не возникало необходимости)

waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 1)
Ответ на: комментарий от debugger

В руби это *не* делается автоматически, так как там всё и всегда передаётся по значению (которое на самом деле есть ссылка).

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

bread
()
Ответ на: комментарий от Anatolik

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

Ты программист или журналист? Я всегда думал, что программисты, основное занятие которых есть написание кода на *формальных* языках, где каждый символ имеет строго определённое значение (а аргументы типа «ну вы же поняли что я имел ввиду» не прокатывают), приобретают профпривычку изъясняться строго и правильно.

Ты тут сначала пишешь «язык делал это автоматически», а потом оказывается ты имел ввиду «язык проще для восприятия». Не хочу гадать что ты там ещё имел ввиду, посему обойдёмся без диспутов.

debugger ★★★★★
()
Ответ на: комментарий от debugger

Я считаю, что здесь я выразился вполне корректно. Подход Ruby позволяет автоматически «не копировать куски памяти, а передавать ссылки на них» по значению.

Anatolik ★★
()
Ответ на: комментарий от waker

еще есть objc, swift и даже go (это если брать с вакансиями).
в них быстрая компиляция, и нет проблем со строками и крестовым идиотизмом.

Верю. Но в Гадюкино на эти языки спроса нет, а для переезда в Нерезиновск или Копенгаген я уже стар.

(…но для go и swift пока не возникало необходимости)

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

debugger ★★★★★
()
Ответ на: комментарий от Anatolik

…автоматически «не копировать куски памяти…

Автоматически не копировать куски памяти — это когда компилятор сам решает передать ли аргумент по ссылке или по значению в зависимости от размера и мутабельности значения. А твой «автоматизм» в руби… «При всём богатстве выбора другой альтернативы нет».

Адью.

debugger ★★★★★
()
Ответ на: комментарий от debugger

Автоматически не копировать куски памяти — это когда компилятор сам решает передать ли аргумент по ссылке или по значению в зависимости от размера и мутабельности значения.

Вы сами придали словам дополнительное значение. Это ваше восприятие, а не устоявшаяся терминология.

Anatolik ★★
()
Ответ на: комментарий от debugger

Давай проведём опрос касательно понятности у людей, не знающих Perl: что им понятнее? Мне вот понятно и то, и другое, но мой пример симметричен, и хотя бы уже потому красив. А экономия на скобочках при лишних пробелах - ну, не знаю, на вкус и цвет фломастеры конечно разные, но мне, опять же, именно мой вариант видится более читабельным.

За само по себе сочетание диковатое «%$» уже можно perl невзлюбить, думаю. Как и ruby - за куда более редкое «@@».

DRVTiny ★★★★★
() автор топика
Последнее исправление: DRVTiny (всего исправлений: 1)

Смотря что надо делать, можно и общелисп посоветовать и эликсир.

loz ★★★★★
()
Ответ на: комментарий от Anatolik

Если учесть, что merge - слияние, а речь идёт о копировании - никакой особой элегантности в конструкции, предлагаемой Ruby я не вижу.

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Там еще и в результате новый ассоциативный массив создается, очень элегантно :). Мериться синтаксисом на отдельных случаях очень умно, кстати.

Virtuos86 ★★★★★
()
Ответ на: комментарий от debugger

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

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

waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 1)
Ответ на: комментарий от DRVTiny

Если учесть, что merge - слияние, а речь идёт о копировании - никакой особой элегантности в конструкции, предлагаемой Ruby я не вижу.

Видимо, я плохо понял ваш код. Если нужно только копирование:

h1 = { a: 1, b: 2 }
h2 = h1.dup

h2 == h1 #=> true

h2.object_id == h1.object_id #=> false
h2.equal? h1 #=> false

На мой взгляд, h2 = h1.dup — существенно лучше перловых вариантов.

Anatolik ★★
()
Ответ на: комментарий от Virtuos86

Там еще и в результате новый ассоциативный массив создается

Нет.

Anatolik ★★
()
Ответ на: комментарий от Leupold_cat

А в ваших скриптах есть что-нибудь специфичное для Illumos или Open Indiana Hipster, что-нибудь что в дистрибутиве Linux пришлось бы делать иначе?

Anatolik ★★
()
Ответ на: комментарий от Anatolik

Таких компонентов достаточно много и при этом я и сам, наверное, половины не видел, так как я использую ее в качестве системы для домашнего компьютера. Лично я в первую очередь обратил внимание на другой пакетный менеджер, несколько иную настройку сети, и smf (система управления службами), утилиты для получения информации о процессах, некоторые отличия в структуре /dev/
Если вы желаете узнать более подробную информацию, то вам лучше спросить у кого-то, кто работает с серверами на illumos или даже Solaris от Oracle.

Leupold_cat ★★★★★
()
Последнее исправление: Leupold_cat (всего исправлений: 1)
Ответ на: комментарий от DRVTiny

Нужно уточнить, что Object#dup — не для ссылок, а для копирования объектов:

h1 = { a: 1, b: 2 }
h2 = h1.dup

h2[:c] = 3

p h1 #>1 {:a=>1, :b=>2}
p h2 #>1 {:a=>1, :b=>2, :c=>3}

Для того, чтобы переменные ссылались на один и тот же объект, достаточно использовать =:

h1 = { a: 1, b: 2 }
h2 = h1

h2[:c] = 3

p h1 #>1 {:a=>1, :b=>2, :c=>3}
p h2 #>1 {:a=>1, :b=>2, :c=>3}

Anatolik ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.