LINUX.ORG.RU

Perl 6 vs Python 3

 , ,


3

4

Дискач.

Чтобы писать утилиты и демоны например для десктопа. Допустим оставим в покое веб-девелопмент, там и так тесно. И забудем былое, Python 2, Perl 5 и связанные стереотипы.

P.S. Прошу не удалять за тупняк, я понимаю как это выглядит. Но тема то интересная

★★★★★

Последнее исправление: vertexua (всего исправлений: 2)
Ответ на: комментарий от anonymous

var1 = var2 " foo " var3

@var1 = qw( $var2 foo $var3 );
say "@var";

😁

Deleted
()
Ответ на: комментарий от vertexua

Сам архитектор просто весьма заморачивается и с многопоточностью и с ООП(впрочем, закончив Кембридж с major на тему канкаренси, неудивительно как-то), поэтому без этого просто не могло не обойтись. Есть тот же await без async-мусора, возможность писать кастомные шедулеры и прочая особая уличная магия, при этом есть хардовый CAS и «низкоуровневые»(ну, с точки зрения языка) треды для тех, кто «знает, что делает», хотя по факту для большинства машин M:N трединга хватает вполне. Никто, конечно, все эти фичи в рот не засовывает, не нужно не пользуешься.

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

Да и сама MoarVM анализирует выполнение в отдельном потоке и JIT-ит/применяет PEA для горячего, в общем, разработчики реализации не боятся приключений(в хорошем смысле).

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

Да, к сожалению это тернарный опертор, а он требует обязательный второй вариант:

index = 1
print(f"{index} is certainly a Str or Int!") if isinstance(index, (str, int)) else print()
Так честнее, но конечно не то.

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

котором вектор можно сложить со строкой и будет норм

Про контексты слышал? Не?

Про типы данных слышал, не? В 2019 году все основные ЯП имеют типы, а не контексты. Даже вон в Perl 6 типы завезли. С чего бы это??

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

Про типы данных слышал, не?

Про перегрузку слышал, не? Или у тебя на каждый тип своя функция? Если нет (а нет) — то почему бы не пойти дальше? Оператор та же функция.

В 2019 году все основные ЯП имеют типы, а не контексты.

все основные яп — не перл. перл уникален.

Даже вон в Perl 6 типы завезли. С чего бы это??

в perl5 тоже типы были давно, https://metacpan.org/pod/SPVM.

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

Всё равно выглядит неплохо, хотя меня от непривычки немного клинит, когда не видно сходу, где переменная, а где вызов. В Perl 6 если аргументов нет, то скобки и не нужны, что часто используется, особенно в методах. При этом если хочешь обратиться к блоку кода как к объекту первого класса, а не вызову, то просто добавляешь & к имени и готово. Это ситуация менее частая, чем вызовы, на мой взгляд.

Недавно рефакторил один кусок кода и дико повеселило, что вот такой код (имена изменены и упрощено, конечно) просто заработал:

class A {
    has $.foo is rw;
}

my $a = A.new(foo => 'hello'.encode); # загоняем в атрибут foo UTF8 байты 'hello'
# кстати, `encode` это вызов, но скобки без надобности

$a.foo .= decode;
# теперь в атрибуте $.foo будет 'hello', decode это тоже метод

`$a.foo` это геттер, который возвращает нам значение, казалось бы, это l-value, но потом ты вызываешь на нём метод и оно просто записывается и просто работает. Более длинная версия выглядела бы так:

$a.foo = $a.foo.decode;

И понятно, что это звучит как «И зачем это сокращение?», но это если $a и foo, а если там $message.error-status, то это уже превращается в `$message.error-status = $message.error-status.decode`, что не так приятно.

Кстати, непонятно, почему иногда считается, что += это окей, а .= (вызов метода на объекте и присваивание результата) это уже как-то странно, суть-то в операции.

Lilly
()
Последнее исправление: Lilly (всего исправлений: 2)
Ответ на: комментарий от Deleted

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

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

Сообщество есть, а Perl мертв?
Ныне так:

Ты любишь газ и будешь мне платить 200000 в месяц?
Я люблю - ГАЗ. 

Ты любишь нефть и будешь мне платить 200000 в месяц?
Я люблю - НЕФТЬ. 

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

Почти нинужно незаменим в машинлернинге и на нём в принципе слишком много всего запилело, чтобы говорить о ненужности, в отличие от перла его просто так не вылучится взять и выбросить.

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

Тут кому что нравится / нужно. Понятно, что это зависит от задач. Кому-то фича может вообще мешать, а кто-то будет молиться на неё, насколько она может подойти удобно.

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

Именно так. Конечно, рантайм анализирует выполнение и если видит, что проверки выгодно выбросить в пользу дешёвых guards на нужные бранчи, то на стеке прям так и делает. Разумеется, может произойти и деоптимизация, но кешмисы у всех бывают даже и без такого, а вот удобный для юзера where есть не везде.

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

Надеюсь, сейчас не будет «late binding ненужен», т.к. это просто очередной tradeoff, которых полно в дизайне ЯП - есть альтернативные X и Y и у каждого есть свои преимущества и недостатки. Выберешь X - будут ругать, что не Y, выберешь Y - будут ругать, что не X. Не очень продуктивно.

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

Lilly
()
Ответ на: комментарий от vertexua

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

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

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

Позволю себе поинтересоваться, работает ли этот аргумент в другую сторону? То есть, если за питон будет какой-то убойный аргумент(они есть), «вступят ли в игру другие языки, которые всё равно здесь питон уделывают»? Если не работает, то почему?

В теме вроде речь о простом сравнении «Здесь такие плюсы и минусы, а там такие», не о том, кто кому в подъезде перо под ребро загонит на радость своим фанатом, которые хотят крови и абсолютных доказательств о том, что некий икс это идеально во всём, а некий игрек это враг всего человечества, который нужно уничтожить.

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

Он частично прав что в постановке вопроса навязан false choice. Только одно или только другое. Но я не утверждаю что это какие-то вершины эволюции. Если что-то написать на Go, то одновременно будет лучше во чем что связано с рантайм характеристиками - скорость, память, реальный параллелизм. И не ощутимо время сборки. Просто удивляет перекос в сторону Python, когда вроде Perl 6 переболел всем старческим ревматизмом Perl 5 и теперь содержит тонну инноваций

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

200000 делают любой язык «прекрасным».

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

Странно представлять эту картину, будто питон не в силах сдержать удар превосходящего паралеллизма, канкаренси и асинхронности(все три штуки очень разные, а асинхронность вообще немного левая, хотя их почти всегда сбивают в кучу и изредка путают), и тут на ринг выскакивает, мм... У кого там неблокирующий await без async-а есть... В общем, выскакивает другой $lang-name и даёт врагу отпор, а то негоже как-то.

Вообще, как говорится, если в руках молоток, то всё вокруг гвозди, ну или как сказал мой коллега как-то, «If the only tool you have is a screwdriver, everything is pretty screwed». При этом люди упорно пытаются снизить сложность мира и применять один молоток ко всему.

Lilly
()
Ответ на: комментарий от vertexua

Ммм, нет, я не думаю, что это ложная дихотомия.

К примеру, если бы вопрос стоял так: «На чём лучше писать сервера, на X или на Y?», то можно было бы сказать «Но лучше на Z».

Но если вопрос стоит «В сфере такой-то, какие преимущества есть у X перед Y и наоборот?», то, конечно, можно прийти и рассказывать про то, какой Z хороший, но это не суть вопроса. Если я верно понял твой ОП-пост, конечно, если ты имел в виду первое, а не второе, то тогда можешь игнорировать.

Просто удивляет перекос в сторону Python, когда вроде Perl 6 переболел всем старческим ревматизмом Perl 5 и теперь содержит тонну инноваций

Перекос вызван тем, что 1)питон популярней, ведь он старше, чем Perl 6(не перл); 2)у наших кривых мозгов, продуктов эволюции в племенах и разных там жёстких условиях, трайбализм зашит крепче крепкого, поэтому редко когда люди могут обсуждать плюсы и минусы точек зрения, которых они придерживаются. Сравнение идей ощущается как война, где аргументы это солдаты, и ты же не будешь стрелять своим солдатам в спину, признавая недостатки своих взглядов и плюсы чужих взглядов? Люди готовы изворачиваться как угодно, потому что «О, есть точка зрения, которая отличается от моей, класс, она тоже нормальная, я делаю вот так, те ребята делают по-другому, и всех всё устраивает» это одна из самых труднейших вещей.

И, конечно, 3)у perl 6 абсолютно ужасный маркетинг, потому что название историческое и когда новичкам говоришь perl 6, то реакция обычно «А, перл это какой-то язык из девяностых, на котором уже никто не пишет, я понял, мне такое не надо». Надеюсь, с переименованием проблема перейдёт в другое русло (хотя, конечно, это полностью обнулит весь пиар, но может это и к лучшему).

Lilly
()
Ответ на: комментарий от vertexua

Если что-то написать на Go, то одновременно будет лучше во чем что связано с рантайм характеристиками - скорость, память, реальный параллелизм. И не ощутимо время сборки.

Это и нужно, а не тонны фич. Вот выше расписано как классно в перл6 писать утилиты ком.строки, а толку если медленный старт? Тонны фич дорого обходятся в реализации.

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

Это зависит от того, что тебе важнее, производительность или выразительность/гибкость, в каждом конкретном случае. Если первое - берёшь язык близкий к железу и поехали. Если второе - берёшь язык более высокого уровня и поехали. Это вопрос выбора, что важнее в каждом конкретном случае. В некоторых случаях скорость разработки важнее скорости реализации, поэтому мы и видим взлёт скриптовых языков за последнее время. Очень большие куски кода по факту-то холодные, а для горячего есть jit или сишные куски.

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

Меня в своё время шокировал (в хорошем смысле) код code red. Я смотрел на этот выровненный, дизассемблированный асм-код, и думал «господи, это прекрасно» :'|

А ведь встречался и говнистый асм-код. Но если читал кто vx сцену в те давние годы, не могли не заметить, что любовь кодеров к ассемблеру делала красивые вещи, как с точки зрения функционала, так и выразительности :)

То же самое с perl.

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

В Perl 6, кстати, тоже довольно любопытные идеи касательно того, что вовсе необязательно выбирать между динамикой и статикой. Лексические области видимости позволяют статически смотреть на вещи, объекты работают на метамодели, которая динамическая.

morning = "9am-12pm"
print("Opening hours:")
print(moroning)

^ питон, код умрёт в рантайме.

my $morning = "9am-12pm";
say "Opening hours:";
say $moroning;

^ perl 6 во время компиляции скажет, что нет такой переменной.

sub abbreviate($text, $chars) {
    $text.chars > $chars ?? $text.substr(0, $chars) ~ "..." !! $text;
}
say abbreviate("Long string is really long");

^ вот здесь во время компиляции скажет, что аргументы не подходят. Питон:

➜  ~ cat p.py
def a(aa, bb):
    return aa + bb

print(42)
print(a(42))
➜  ~ python3 p.py 
42
Traceback (most recent call last):
  File "p.py", line 5, in <module>
    print(a(42))
TypeError: a() missing 1 required positional argument: 'bb'
➜  ~ 

Приватные атрибуты тоже проверяются во время компиляции, приватные методы не виртуальные, поэтому тоже во время компиляции. На мой взгляд, сравнивая чисто perl 6 vs python 3, как тут в топике, в Perl 6 больше статики, которую ты хочешь. Конечно, это не прям всё строго, как в некоторых других языках, но это вроде и не требуется, потому что иначе ты теряешь в других местах.

Lilly
()
Ответ на: комментарий от vertexua

Сейчас основной ход мысли в плане названия это «Raku», мне лично нравится, надеюсь, поедет в эту сторону.

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

Всё от задачи зависит, если нам нужно молотить циферки или разбирать данные на 20 ядрах, то точно ли нам скриптуха нужна? Скорее всего нет, и тут перл выпадает из уравнения наравне с питоном.

Если ты думашеь, что я выгораживаю питон, то ошибаешься, ЛОР полон моего баттхёрта по его поводу. И главный из них — именно параллелизм. Если не веришь, можешь убедиться сам с помощью поиска комментариев в профиле по трём заветным буквам.

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

Да, я действительно так подумал, если не так, то тогда был не прав.

Мой аргумент был в том, что есть места, в которых perl 6 среди скриптовых силён и эти места вроде не скрываются. Это и статические проверки, о которых выше, и инструменты для разбора и наличие метамодели и расширяемость и так далее и уже затёртая до дыр параллельность, вместе с вменяемым канкаренси и асинхронностью без багажа callback hell-а, вменяемые лямбды, язык весьма гибок.

Чуть выше ты спрашивал, какие аргументы в пользу perl 6 - их перечислили, с некоторыми ты даже вроде согласен. Аргумент «Но эта фича делается лучше другими» работает всегда и для всех. Возьмёшь $lang-name1, не перл и не питон, и я тебе скажу «А вот есть язык $lang-name2, где эта фича круче сделана», возьмёшь $lang-name2, а тебе «А вот есть $lang-name3, где уже другая фича круче сделана». И рано или поздно этот граф начинает становиться зацикленным, потому что...

Дизайн языков это в некотором роде waterbed of complexity, у тебя есть альтернативные варианты, что делать лучше, а что хуже, они противоречат друг-другу физически/логически и ты не можешь иметь всё и сразу, ты выбираешь какой-нибудь из них, плюс в одном, минус в другом. Поэтому мы и пользуемся где-то си, а где-то высокоуровневыми скриптами, правда?

Именно поэтому мне кажется странным аргумент «Но если сравнивать с другими языками, то там это круче» - круче ли там по абсолютно всем критериям? Нет, потому что часто они взаимоисключающие. Тогда в чём соль?

Lilly
()
Ответ на: комментарий от perl5_guy

Сделай это работать @ Затем сделай это быстрым

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

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

Я про шестёрочку говорил. Ларри и братва именно таким путём идут: сделай чтоб работало -> сделай чтоб работало быстро. Но не понимаю чего ты переживаешь? Шестёрка уже давно стартует достаточно быстро. Всё хорошо.

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

Ну у нас тоже есть свои чудища. rperl там и прочие ништяки из движения perl11

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

Как? Расчехлять чудище XS?

Как - это уже головная боль авторов реализации, а не твоя. Чудище XS в Perl 6 было убито и заменено на NativeCall с более человеческим лицом.

Насчёт «perl 6 никогда не будет быстрым» - мне как-то уже даже лень в очередной раз постить ссылки на бенчмарки, где он уже сейчас быстрее питонов, рубей и перла, при большем количестве вещей в коробке.

Сделай, чтобы программа работала правильно. Потом сделай, чтобы она работала быстро. Сейчас второй этап, в том числе и быстрый старт, которого всем не хватает.

Lilly
()
Ответ на: комментарий от perl5_guy

Шестёрка уже давно стартует достаточно быстро

В 8 раз медленнее питона и 40 по сравнению с перлом это не круто, я требую догнать и перегнать. :)

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

Конечно, есть причины для такого медленного старта: к примеру, кеш юникодовых графем он, экхем, большой, у других этого нет. Парсер написан на Perl 6, а у perl разбором занимается крайне оптимизированный С. Есть прогрев moarvm и другие вещи. Но над всем этим можно работать. И понятно, что пользователям наплевать, как оно там устроено и как приходиться выкручиваться разработчикам, потому что все хотят чтобы было фичасто и чтобы было быстро, а желательно всего и побольше, побольше.

Lilly
()
Ответ на: комментарий от perl5_guy

Я про шестёрочку говорил.

А он хоть работает? А то может там глюкодром. Кто его проверял то? Хотя за 20 лет можно было вылизать конечно. Теперь еще 20 на оптимизацию.

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

В 8 раз медленнее питона и 40 по сравнению с перлом это не круто

Так и запишем, перл6 не для скриптов. Впрочем, это и сразу понятно.

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

А мне Albus больше нравится, он подходит языку больше остальных. Но похоже уже решили, что будет Raku.

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

Конвей предлагал ряд вариантов, но тут всем на свете мил не будешь. Альбус у меня вызывает ассоциации с литературным Альбусом, но вот raku в японском, во-первых, часть 駱駝(«rakuda»), что означает «верблюд», как бы намекая на корни, а с другой стороны имеет одинаковое звучание с 楽, что означает комфорт, отсутствие трудностей, удовольствие.

Да, если я кого выше напугал цифрами про 40 разницы в старте - это была банальная описка, на самом деле речь идёт о 20кратной разнице. Сам perl быстрый с его 0.0047, на его фоне 0.093 у perl 6 выглядят не очень. Но речь всё равно идёт о времени меньшем, чем десятая секунды. Скрипты не стартуют минутами, не стоит бояться этого по ночам.

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