Po roce tu dnes máme zase novou major verzi perlu 5. Stručně nahlédneme, co verze 5.24 přináší.
9.5.2016 14:00 | Jiří Václavík | read 13860×
DISCUSSION
Jako každý rok i letos vychází nová verze perlu. Hodně věcí ohledně verzování a souvisejících věcí jsme popsali loni při představování změn v perl 5.22. Loni se verze 5.22 o něco opozdila a release vyšel až na začátek června, což nechtěl Ricardo Signes opakovat a tak letos máme novou major verzi naopak o něco dříve.
Hlavním maintainerem řady 5.24 je tedy opět Ricardo Signes. Je to ale naposledy, v p5p konferenci totiž uvedl, že hlavním "pumpkinem" bude od verze 5.26 Izraelec Sawyer X. Koho zajímá, co je Sawyer za člověka a ovládá ruštinu nebo použije nějaký překladač, může si přečíst 3 roky starý rozhovor s ním.
Změn je letos o něco méně než obvykle, proto bude dnešní článek stručnější. To ale neznamená, že by tam nebylo nic zajímavého - naopak, pokrok verze 5.24 je kvůli rychlosti jedním z největších za posledních mnoho let. Seznam změn je již tradičně v souboru perldelta
.
Rychlost
Verze 5.10 byla velmi rychlá a od té doby až do 5.20 se s každou verzí perl mírně zpomaloval. Poté ale byl konečně ve verzi 5.22 udělán obrovský kus práce a rychlost se vrátila tam, kde byla ve verzi 5.10 (a možná ještě o malý kousek dále).
Letos ve verzi 5.24 se vývojáři na výkon opět zaměřili a posunuli ho hned o celou čtvrtinu! Tedy v tom smyslu, že "průměrný program" poběží o čtvrtinu kratší dobu. Hlavně z tohoto důvodu nyní stojí za to vážně uvažovat o upgradu.
Základní aritmetické operace včetně inkrementace by měly být o trochu rychlejší, je rychlejší přiřazování, lehce rychlejší bude i volání podprogramů, case-insensitive jazyky nyní přeskakují kontrolu modifikátoru /i
u regulárních výrazů a další optimalizace.
Postfixové dereferencování nyní v jádře jazyka
Od verze 5.20 máme v perlu experimentální featuru postfix dereferencing a tedy po zadání
use experimental 'postderef';
jsme mohli featuru využívat. Od verze 5.24 již experimentální není a předchozí řádek není nadále potřeba.
Článek o perlu 5.20 na linuxsoftu nevyšel a tak se podívejme nyní, o co přesně jde. V předchozích verzích perlu jsme byli zvyklí používat circumfix dereferencing - referenci na pole jsme pro získání pole museli napsat mezi @{
a }
. Tedy nějak takto:
my $listref = [1, 2, 3];
@list = @{$listref};
S postfixovým dereferencováním to půjde i takto:
my $listref = [1, 2, 3];
@list = $listref->@*;
Hlavní výhodu vidím v tom, že programátor může psát kontinuálněji a nemusí se vracet, aby před proměnnou přidal levou část circumfixu, což je potřeba každou chvíli.
Za druhé samozřejmě bude nutných méně závorek v zřetězení více dereferencí, což lehce usnadní čitelnost a možná je takový zápis systematičtější, i když to už dost záleží na úhlu pohledu. Lépe než na předchozích ukázkách bez zanořených struktur to lze demonstrovat například na poli polí:
Pro zajímavost uveďme, že podobně můžeme získat i poslední index:
my $last_index = $listref->$#*;
Postfixové dereferencování funguje samozřejmě se všemi ostatními datovýmy typy. Místo
&{$coderef};
%{$hashref};
${$scalarref};
můžeme psát
$coderef->&*;
$hashref->%*;
$scalarref->$*;
Nová boundary pro zalomení řádku
Ke stávajícím boundaries představeným ve verzi 5.22 přibyla další: \b{lb}
. Jednoduše řečeno, v textu jsou místa, kde je možné zalomit řádek. Právě tato místa nyní budou matchovat kotvu \b{lb}
. Detaily o dalších kotvách vyšly v loňském článku.
Tato featura vychází z modulu Unicode::LineBreak.
Dále se lehce mění chování \b{wb}
a to má nyní trochu blíže k původnímu \b
Parsování hashbang řádku
Pokud voláme perlový program explicitně s příkazem perl
, tj.
nikoliv pouze
pak vynucujeme perlový interpret. Není moc známá věc, že sám perl řádek #!
parsuje. Spustíme-li například
> cat program.pl
#!/bin/sh
ls;
> perl program.pl
zobrazí se skutečně seznam souborů v aktuálním adresáři. To proto, že perl předává program jinému interpretu, pokud se řetězec "perl"
nevyskytuje na hashbang řádku. S příchodem perlu 6 se toto chování však mění na 'přenechej jinému interpretu i tehdy, pokud navíc hashbang řádek obsahuje řetězec "perl6"
'.
Toto sice není nijak extra zajímavá změna, ale rozepisujeme ji zde především proto, že se někdy může hodit informace, jak se příkaz perl
zachová, když ho aplikujeme na neperlový soubor.
Experimentální featura autoderef končí
Již delší dobu se ví, že autoderef v perlu končí. Nadále tak není možné volat push
, pop
, shift
, unshift
, splice
, keys
, values
a each
s parametrem jako odkazem na pole resp. hash.
Přesto bylo trochu překvapením, když byla tato featura označena v perlu 5.20 jako experimentální. Důvody jsou však podrobně popsané například na blogpostu na effectiveperlprogramming.com.
S postfixovou dereferencí nicméně bude místo této featury možné napsat něco takového:
push $listref->@*, $element;
my $_
už není možné
Následující řádek po dlouhé a bouřlivé diskuzi na p5p nyní způsobí výjimku:
Lexikální deklarace $_
byla používána v konstrukci given-when
, která ale byla zavržena, viz downgrade na experimental/deprecated. Nebudeme to zde rozepisovat, zájemce odkažme na tento blogpost na Effective perl programming. Můžete si přečíst i nesouhlasný názor Reiniho Urbana, autora cperlu (viz dále v článku), který s odstraněním lexikální proměnné $_
nesouhlasí.
Další změny
- V případě selhání funkce
close
při editaci souboru (tj. se zápisem do téhož souboru, tzv. in-place edit) bude nyní vyvolána výjimka
- Podpora pro nové Unicode 8.
- Lepší synchronizace
%ENV
a getenv()
- Nadále nejsou povoleny zanořené deklarace jako například
my($x, my($y));
.
chdir('')
již nevrátí domovský adresář, ale vyvolá výjimku; zůstává smysluplnější chdir()
bez parametrů.
- Neviditelné znaky už nesmí být v názvu proměnné (znaky s ordinály 0, 31, 127), což by snad nikoho ani nenapadlo udělat (ale nutno dodat, že třeba v kombinaci se symbolickými referencemi není problém se do této situace dostat).
- Blok
?[...]
uvnitř regulárního výrazu nyní plně UTF-8 kompatibilní i při use locale;
.
- V
printf
a sprintf
lze zadat místo přesnosti znak *
. Dané číslo vyjadřující přesnost se pak vezme z odpovídající pozice z parametrů funkce.
- Lepší vymezení bitových operátorů na číselných resp. řetězcových hodnotách, nově definovaný negativní bitový posun.
qr/\N{}/
bez hodnoty v závorce specifikující unikódový znak nyní vyvolá výjimku při use re qw(strict);
a \C
je z jazyka vyhozený úplně.
sysread
, syswrite
, recv
a send
nyní vyvolají výjimku pro ovladače s :utf8
vrstvou, protože samy už tuto vrstvu mají a docházelo by tak k chybnému překódování.
Nedávné forky perlu
Aby článěk nezůstal na půli stránky, můžeme pro zajímavost zmínit, že v uplynulých letech se objevily dva forky perlu 5 - stableperl a perl 11 (cperl).
Stableperl je projekt Marca Lehmanna a není to ani tak fork. Je to spíše snapshot perlu 5.22 s několika změnami, které autor udělal, aby jeho moduly (hlavně Coro) fungovaly, protože po vydání perlu 5.22 přestaly být kompatibilní. Bohužel se Coro spoléhalo na nějaké nedokumentované featury. Nejde o moc šťastné řešení, ale údajně jiná skupina vývojářů pracuje na opravě rozbitých modulů, aby fungovaly i v perlu 5.22 a 5.24.
Autorem perlu 11 jsou Will Braswell a Reini Urban. Perl 11 zastřešuje několik projektů. Cílem je vytvořit maximálně modulární fork perlu, který přejme co největší množství featur z perlu 6 tak, aby nebyla narušena kompatibilita s perlem 5.22. Proto ostatně ten název: perl 11 = perl 5 + perl 6. Zároveň je cílem autorů cperl co nejvíce zrychlit.
Dalším projektem v rámci perl 11 je RPerl (Restricted Perl). Jeho autor, Will Braswell, provedl benchmarky pro různé perlové featury a ty nejpomalejší, které provádí nejvíc magie, se rozhodl odstranit. Na webu tvrdí, že takto ořezaný perl je sedminásobně rychlejší než perl 5.22 a prostoru na zrychlování je nadále dost. Na svůj projekt získal i financování. Koho by zajímaly detaily, může zhlédnout přednášku z lednového FOSDEMu.
Měli bychom přejít na perl 6?
Loni konečně vyšla první implementace perlu 6. Je tedy čas opustit perl 5?
Perl 5 tu bude ještě dlouho s námi. Stačí se podívat, kolik souborů v /usr/bin
začíná řádkem #!/usr/bin/env perl
. Musíme mít na paměti, že perl 6 je zcela jiný jazyk, který sice patří perlové rodiny jazyků, jeho základní filozofie pochází z perlu 5, ale není to perl 5.
Perl 6 zatím teprve začíná. Benchmarky na rychlost jeho první implementace vychází zatím hůře, ale z komunity občas prosákují optimistické prognózy. Uveďme alespoň jeden z mnoha blogpostů na toto téma. Jak ukazuje verze 5.24, určitě se s tím dá leccos udělat.
Perl 6 je modernější a ještě podstatně expresivnější jazyk než perl 5. Dejme mu čas na plné rozvinutí. Jazyk je sice vydán, ale řada věcí okolo potřebuje ještě hodně práce - optimalizace, dokumentace, tutoriály na internetu, knihy atd. Zlepšuje se to a čím více lidí se s perlem 6 seznámí, tím to bude lepší - tak je to s každou exponenciálou.
Seznámit se s perlem 6 rozhodně stojí za to - je to neskutečně bohatý a zajímavě navržený jazyk, obsahuje obrovské množství nových myšlenek a i když někdo nepíše v perlu či ho dokonce nemá rád nebo tvrdí, že perl6 používat nebude, určitě ho to v mnohém obohatí.
Přednášky z FOSDEMu
Zajímá-li vás nejnovější dění okolo perlu, určitě se podívejte také na seznam přednášek z perl devroomu, které se konaly v rámci FOSDEMu 2016. U každé přednášky je záznam a tentokrát jsou dokonce všechny nahrané správně.
Článek je vydán bez honoráře.
Verze pro tisk