LINUX.ORG.RU

Чего мне не хватает в Perl?

 ,


1

12

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

Итак, претензии к Perl от человека, который его осилил и знает особенности языка не по наслышке:

1) Не хватает собственно скорости. Скорость исполнения кода, т.е. его непосредственной интерпретации - Ахиллесова пята не только Perl, но и Ruby, и Python, и PHP. Но если интерпретаторы PHP и Python становятся быстрее с каждым годом, то интерпретатор Perl застрял в своём развитии - и при этом язык не имеет LLVM-компиляторов, как тот же Crystal, реализующий очень быстрый диалект Ruby. Для Perl есть RPerl, который непонятно как работает и работает ли у кого-то, кроме самого Вина Бразвелла. Ну и да, RPerl - это всё-таки не вполне Perl, по сути это какой-то «perl'оподобный диалект языка Си»

2) Не хватает адекватной проверки входных параметров. Есть куча сторонних модулей для этого: MooseX::Method::Signatures, Params::Validate и ещё тысячи их, но все они добавляют дикий оверхед к и без того не быстрой работе интерпретатора

3) Отсутствует как класс нормальный параллелизм: без пула потоков работать с потоками невозможно (создание потока - крайне медленная операция), с пулом потоков в принципе удобно, но всё одно памяти они жрут как не в себя. На Perl в 100 раз всё лучше с процессами, в том числе есть неплохие модули для работы с shared memory (правда, Redis для того же самого намного удобнее).

4) CPAN конечно замечательный репозиторий пакетов, но выкладывать что-то туда - это лишняя трата времени, да и все эти инструкции по правильному выкладыванию немного бесят: мне что, заняться больше нечем? ИМХО подход того же Crystal'а с его shards'ами намного удобнее.

5) Отсутствие макрогенерации кода. Есть конечно eval, но это, мягко говоря, всё равно что бульдозером шпалы укладывать: неудобно, анахронично, работает в рантайме (что просто ппц на самом деле), чревато ошибками. Учитывая стоимость вызова процедур в Perl5 отсутствие макрогенерации негативно влияет на потенциальную производительность

Относительно удобства ООП претензий не имею - те, у кого они есть, просто пришли из других языков и пытаются применять к совершенно иначе устроенному Perl'у свои «обобщённые» знания.

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 2)

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

Кстати, нормально вообще приводить переменную к числовому типу таким залихватским способом: «$_+=0» ?

В JavaScript я видел +foo для приведения к числу.

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

когда пишешь на перле, всё хочется писать на перле, ибо получается прям простыми английскими словами говоришь, что делать — и делается.

прямо магия какая-то

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

Зато проще всего было, это сейчас тот же librenms автоматом все находит и добавляет

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

Магия действительно есть, но на проверке переменных она ломается. Складывается абсурдная ситуация, когда на исходно не ООП-языке писать не ООП-код без инкапсуляции данных, фильтруемых через сетеры - весьма проблематично.

Ну или tied-переменные использовать, что по сути то же ООП, просто все tied-переменные одного типа принадлежат одному классу.

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

а если что то подобное при использовании лиспа

интересны ощущения

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

Параллелить можно не только числодробилки. Из недавних юзкейсов - обработка больших текстовых файлов(от пары сотен метров до нескольких гигов) без загрузки целиком в оперативу и без мемори-маппинга. На перле после распараллеливания удалось добиться скорости в несколько секунд на ~500 метровый файл при минимальном потреблении оперативы и достаточно небольшой нагрузке на ядра процессора.

shell-script ★★★★★
()
Ответ на: комментарий от pawnhearts

Ну я на процессах и сделал, потому как с тредами в перле всё плохо. Но управлять всем этим хозяйством с нормальными тредами было бы легче. С учётом того, что SharedIPC мне использовать было нельзя.

shell-script ★★★★★
()
Ответ на: комментарий от pawnhearts

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

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

Взрыв мозга в виде реализации таймера наподобие AnyEvent->timer в Mojolicious:

Mojo::IOLoop->delay(
	sub {
		Mojo::IOLoop->timer($keepAliveTimings->[TIMER_OPT_AFTER] => $_[0]->begin);
	}, # <- set one-time alarm
	sub {
		sub {
			state $cntRun=0;
			$cntRun++ or 
				$aeh{'keep_alive_timer'}=
				Mojo::IOLoop->recurring($keepAliveTimings->[TIMER_OPT_INTERVAL] => __SUB__);
			$redCastObj->('redc')->ping(sub {
				my ($redO,$err,$res)=@_;
				if ($err || $res ne 'PONG') {
					$redCastObj->reconnect('(keep_alive) failed to re-animate Redis connection after ping lost');
				} else {
					$log->debug('(keep_alive) PING returned status: OK');
				}
			});
		}->()
	} # <- set recurring timer
); # <- $loop->delay()

Пришлось в одном модуле заменять AnyEvent на Mojo - столько всего насмотрелся...

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

мрак, а не реализация

дарю таймер в стиле AE:

sub timer ($after, $interval, $cb) {
    my $id; $id = Mojo::IOLoop->timer(
        $after,
        $interval ? sub { $cb->(); $id = Mojo::IOLoop->recurring($interval, $cb) } : $cb
    );
    \ $id
}
# usage
my $id = timer(1, 2, sub { say 'bump' });
timer(10, 0, sub { Mojo::IOLoop->remove($$id) }); # stop

p.s. прошу, избавляйте примеры кода от деталей приложений - тошно продираться через этот микс только вам понятных переменных, сокращений и camelCase-a

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

Никто не запрещает. Просто в languagename зачастую всё сильно хуже. Большинство perl-программистов хотя бы знает недостатки языка и готово их признать и по возможности исправить(или обойти). Чего не скажешь о подавляющем большинстве известных мне питонистов, например.

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

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

И чем это лучше моего примера? У меня вот хотя бы нет колбечной лапши, аккуратно через delay сделано. Вся разница: вы завернули в функцию, а я не стал.

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

* лучше тем, что мой код reusable

* лапша видимо у тебя в голове, сначала хочешь как в AE, потом используешь delay для создания recurring timer-a

anonymous
()

1) Не хватает сильной типизации, статической типизации(например такой как в TypeScript, где можно писать any и использовать динамическую типизацию для конкретной переменной).

2) Нету тредов.

3) Нету компиляции в llvm.

4) Разные люди пишут на разном подмножестве языка perl.

5) Язык существует давно, но нету устоявшегося стека технологий как например в java, где есть всякие JSR спецификации, которые могут быть по разному реализованы, но при этом иметь один интерфейс. Пакеты на cpan развиваются слишком хаотично.

6) На java принято разбивать приложение на слои Repository/Service/Controller использовать паттерны проектирования(да я понимаю, что не все из них подходят для perl). В интернете мало информации о том, как делать тоже самое на perl. Разобраться с синтаксисом это одно, а разрабатывать это другое.

7) К вышеуказанному добавлю, что многие представители perl сообщества, которые пишут только на perl, так и остались в плане стиля разработки ПО где-то в начале двухтысячных. Например они могут на полном серьезе полагать, что паттерны проектирования не нужны. Или то, что распихать всю бизнес логику в Entity и контроллеры это нормально(то есть отсутствие слоя бизнес логики в принципе). Многие perl программисты думают о том, как бы им самовыразится с помощью выразительного языка perl записать одну строчку вместо трех, при этом не думают, как сделать нормальную архитектуру.

8) Из 2-x пунктов выше следует, что не понятно как должен развиваться perl джун. Я наверное, он должен сначала изучить другой ЯП типа java стать там хотя бы мидлом, а только потом изучать perl с учетом уже имеющихся знаний о разработке ПО. Подозреваю, что некоторые крупные компании предлагают программистам на других ЯП переходить на perl не потому, что мало людей, которые знают perl, а потому, что есть куда более важные фундаментальные вещи, чем знание конкретного ЯП.

9) Очень мало новых и интересных проектов, все что есть, это легаси. Из новых проектов я знаю только облако mail.ru, но я слишком либерален чтобы хотеть там работать.

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

посмотрите на модуль Coro его в том же reg.ru используют

pinachet ★★★★★
()

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

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

ты не сделаешь интерпретатор быстрее

может немного веры в ТСа? Вдруг он ща накатит 100 грамм и как пойдёт и как отрефакторит всё!

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Iron_Bug

Ну так а что другое-то? По выразительности и мощности языковых средств близко к Perl'у стоит Ruby. Но Руби тоже медленный и тоже непопулярен ныне. Всякие Go, Rust и уж тем более Python вызывают стойкое отвращение. В итоге пишу критичные по скорости вещи (или просто не терпящие тяжёлых многосложных зависимостей, как у приложений на perl) - на Crystal. Но то, как он выводит ты меня не устраивает, это какой-то непредсказуемый геморрой на каждом шагу.

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

Может, вы имели в виду это?

Да. Редко тут пишу, отвык от местного форматирования :)

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

N

1) Про это уже говорили. Да, не хватает. На практике это редко критично.

2) Да, нету. Хотелось бы.

3) Да, компиляции в JIT нету, тоже хотелось бы. Её, как я понимаю, изначально отложили на Perl6, в итоге забив на Perl5. Теперь уже вряд ли появится. Есть RPerl и/или Inline:: модули для написания критичных кусков на других языках.

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

5) Технологий хоть отбавляй. Если не знаешь что взять — спроси у тех, кто знает. Не надо приводить мне в пример джаву, там свои заморочки.

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

7) «Очень многие представители» — громкое заявление без какого либо обоснования, кроме «личного мнения», которое используется в следующем пункте.

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

9) Да, проблема есть.

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

По выразительности и мощности языковых средств близко к Perl'у

Эта относительная красота (ибо есть куда более выразительные ЯП, да любой DSL) мало кому нужна. Это не прагматично. Прагматично, это когда DSL используется там где уместно, или где DDD удачно внедрили.

Мощность языковых средств очень относительное понятие. Опять таки, любой DSL тут уделает ЯП общего назначения. Те же функциональные ЯП уделают Perl в своей нише.

В итоге пишу критичные по скорости вещи (или просто не терпящие тяжёлых многосложных зависимостей, как у приложений на perl) - на Crystal

Как работодатели к такому относятся? Если мой тех-лид узнает, что в продакшене появился какой-то там «кристал», в этот же день я начну искать новое место работы.

outtaspace ★★★
()
Ответ на: N от Casus

Поощряется участие в перл-тусовках, типа телеграммовской.

Если это та, в которой Акжан Абдуллин назначил себя королём шлагбаума, то что-то не хочется: он меня 2 раза выкинул за то, что моё мнение отличается от его, и больше мне туда не хочется. Я ж в России живу, и такого дерьма уже нажрался по самое не могу.

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

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

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

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

Есть RPerl и/или Inline:: модули для написания критичных кусков на других языках.

Если удобно писать Inline::C тот же, который работает правильно, то почему тогда сразу XS-модуль не писать, а лучше уж сразу всё на Си.

Мне, например, был интересен Inline::Asm, но он не работает практически никогда.

RPerl даже при его идиотском синтаксисе типа «my int $x» использовал бы, если бы его создатель объяснил толком, как это делать или если бы нашлись другие энтузиасты, способные понять глубокую задумку товарища Вина. RPerl даже автоматом что-то параллелит - и наверное у самого Бразвелла это даже работает (если конечно он психически здоров, в чём есть сомнения).

Собственно, писал бы полезные всем XS-модули на Crystal - но как? Возможно, кстати, Акжан должен быть в курсе.

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

Если удобно писать Inline::C тот же, который работает правильно, то почему тогда сразу XS-модуль не писать, а лучше уж сразу всё на Си.

Ты перегибаешь. «Сразу на Си» я буду писать месяц, что на Perl напишу за несколько дней. Опыт имеется.

На счёт Inline::C — он позволяет написать XS намного проще и быстрее (он внутри компилирует Си-код в XS), но по сути, конечно, эквивалент, просто более удобный.

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

Да, он сейчас в сообществе crystal'а пишет изредка, а так, видимо, в работу погружен.

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

Ты перегибаешь. «Сразу на Си» я буду писать месяц, что на Perl напишу за несколько дней. Опыт имеется.

Абсолютно согласен, опыт того же mail.ru имеется

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

Адекватный, но горячий. Всё-таки нетерпимость к чужому мнению приемлема в азиатской культуре, но не в европейской.

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

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

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

Сорри, его вообще-то Вильямом зовут :)

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

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

Хотя проверка достаточно сложная: на входе должен быть либо [AFTER, PERIOD], причём если PERIOD==0, то берётся default, либо «AFTER:PERIOD» (и если чего-то нет - тоже берётся default)

Вот так и должен был бы читаться код этой функции. Сейчас он напоминает индийские народные сказки. У меня бы вы код-ревью не прошли, mythCreator не даст соврать, он у меня целых пол года отработал джуном (что не мешает ему выступать экспертом, несмотря на меньше чем годовой стаж в профессии).

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