Kouzlo funkcionálního programování

Školení, která pořádám

V čem spočívá rozdíl mezi následujícími dvěma kódy, které dělají totéž?

<?php
// procedurální přístup
$html = array();
foreach ($_REQUEST as $key => $val) {
    $html[$key] = htmlspecialchars($val);
}

// funkcionální přístup
$html = array_map('htmlspecialchars', $_REQUEST);
?>

Protentokrát pominu, že druhý kód je kratší, protože pokud bychom na prvky pole chtěli aplikovat vlastní transformaci, museli bychom si ve druhém případě vytvořit vlastní funkci, kdežto v prvním případě bychom postup mohli napsat rovnou do kódu, takže by se poměr obrátil.

Hlavní kouzlo funkcionálního přístupu spočívá v tom, že funkci můžeme aplikovat na všechny prvky nezávisle – tedy klidně najednou. V dnešní době se běžně používají dvou- nebo čtyřjádrové procesory a myslím, že se dočkáme sestav třeba se 64 jádry, které půjde koupit v běžném obchodě. Pokud webový server vyřizuje najednou alespoň tolik požadavků, kolik má jader, tak na tom nemusí záležet, ale pokud je požadavků méně, tak při sériovém zpracování nemají některá jádra co na práci. Při paralelním zpracování je možné využít jádra všechna. Totéž platí i ve větším měřítku – zpracování některých úloh je lepší rozdělit na více serverů.

Druhé kouzlo spočívá v možnosti odloženého spuštění – protože je mapování jasně dané, tak ho nemusíme provádět ihned, ale až v okamžiku, kdy se výsledek pokusíme použít někde jinde.

Aby nedošlo k nedorozumění – PHP se o paralelní ani odložené zpracování v současné době nepokouší, ale jistě ho bude v budoucnu jednodušší implementovat u funkcionálního přístupu. Stačí, když volaná funkce nemění celkový stav programu (nezapisuje do statických a globálních proměnných, nic nevypisuje) a můžeme ji klidně spustit paralelně. A jde to dokonce i kdyby tento stav měnila – funkce array_map na rozdíl od foreach neručí za to, v jakém pořadí se funkce na jednotlivé prvky aplikuje.

Nevýhoda funkcionálního přístupu v PHP spočívá v tom, že je potřeba definovat funkce. PHP před verzí 5.3.0 na rozdíl třeba od JavaScriptu nemá anonymní funkce, což tento přístup komplikuje. Existuje sice funkce create_function, ta má ale tu nevýhodu, že kód sestavuje z řetězce za běhu, takže se např. nedá předem syntakticky zkontrolovat a program zpomaluje.

Jakub Vrána, Seznámení s oblastí, 9.7.2008, diskuse: 2 (nové: 0)

Diskuse

kukulich:

Anonymní funkce by se měly v PHP objevit. Zřejmě ve verzi 6 nebo i 5.4, pokud ta verze bude. http://wiki.php.net/rfc/closures

~:

Closures jsou plne funkcni jiz s CVS verzi PHP 5.3, pred tydnem jsem se na jejich implementaci dival, nicmene vzhledem k tomu, ze PHP neni thread safe a musel by se prepsat i cely Zend Engine nevidim zadnou sanci na implementaci paralelnich vypoctu (napr. s pthreads) a rozhodne s tim nepocitam, ani v PHP 10.

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.