
Zásadní otázka zní: Kde budeme tento převodník používat? Na serveru (uvažujme PHP), nebo na klientovi (v JavaScriptu)?
Odpověď je podobná jako třeba u tvorby obrázků, grafů... Někdy jej potřebujeme vygenerovat staticky ze serverových dat, jindy dynamicky na klientovi. A i při generování scény nastávají oba případy. Rozhodně ale nechceme kód psát 2x. Potřebujeme tedy nějak vyřešit přenositelnost mezi serverem a klientem. Stejně jako by se nám u kreslení hodilo, kdyby příkazy pro vykreslení grafu nebo obrázku na JS canvas
byly shodné s těmi z PHP knihovny GD
. Ale nejsou – a tak si vývojář musí buď vytvořit vlastní mezivrstvu, nebo napsat dva různé výstupy. Což je to, čemu se chceme vyhnout.
Některé přístupy, jak řešit přenositelnost mezi PHP a JS:
- Vytvořit kód v jazyce, který lze transpilovat do JS i PHP, např. Haxe
- Napsat kód v JS a spouštět ho v PHP pomocí rozšíření V8Js
- Vytvořit kód v PHP a spouštět ho v prohlížeči přes WASM, např. PIB
- Nechat kód v PHP a volat ho z klienta pomocí AJAXu, např. s využitím Livewire
Možností, jak problém uchopit, je tedy spousta. My ale zkusíme úplně jiný přístup: napsat takový kód, který bude fungovat jak na serveru v PHP, tak v prohlížeči v JS, a přitom vracet stejné výsledky.
Každý zkušený fullstack vývojář vám okamžitě vyjmenuje důvody, proč to nejde:
Problémy při psaní kódu společného pro PHP i JS:
- V PHP proměnné začínají znakem $, v JS ne.
- V JS se proměnné deklarují pomocí
var
,let
,... které PHP nezná. - Vestavěné funkce mají v obou jazycích jiné názvy.
- V PHP máme jednotný typ pole, v JS jsou numerická a asociativní pole oddělená.
- V PHP se pole předávají hodnotou, v JS odkazem.
- Knihovna v PHP začíná <?php, což v JS rozhodně bude vadit.
- Odlišný způsob zachytávání výjimek.
- Jiná práce s objekty.
- Různé výsledky výpočtů, např.
echo 1/7
je 0.14285714285714 aalert(1/7)
je 0.14285714285714285
My ale tyto překážky nebereme jako důvod, proč to nejde. Naopak – jsou to pro nás kreativní výzvy, které nás povedou k novým přístupům a řešením. Ukážeme si, jak dosáhnout toho, co se zdá nemožné.
Opravdu si ukážeme, jak napsat takový kód, který lze spustit jak na PHP serveru, tak v prohlížeči!
K čemu je takový kód dobrý?
Co to jsou izomorfní aplikace?
Izomorfní webové aplikace používají stejný kód na serveru i v prohlížeči.
Mezi PHP vývojáři (ke kterým se počítám) se ale příliš nepoužívají. Viz např. zde. Proč? Logicky: v prohlížeči běží jen JS, takže psát takové aplikace v PHP zdánlivě nejde.
Já si ale myslím, že výhody sdíleného kódu jsou nezanedbatelné – viz např. zde – a že pravidla lze změnit. Izomorfní aplikace podle mě mohou vznikat i s PHP na serveru.
Podle mě je užitečné znát jazyk nebo styl psaní, který umožní sdílení kódu mezi klientem a serverem. Někdy totiž nastanou úkoly, které potřebujeme řešit na obou stranách, ale nechceme psát dvě různé verze. Typicky třeba:
- Komplexní validace – chceme ji udělat už na formuláři, ale kvůli bezpečnosti i na serveru.
- Drobné převodníky – např. generování QR kódů, někdy v prohlížeči, jindy na serveru.
- Server-side rendering – např. pro roboty nebo uživatele bez JS, přičemž pro běžné uživatele běží JS klientsky.
- Izomorfní aplikace umožňující rozdělení výkonu mezi klient a server.
- A především – takový přístup nás učí přemýšlet nad algoritmy nezávisle na konkrétním jazyku.
Nicméně i pro toho, kdo zůstane stále u původního PHP či JS jsou tyto konstrukce zajímavé, protože je samozřejmě může použít i jen v jednom z těchto jazyků a tím rozšířit své programátorské schopnosti.
Pokusil se už někdo o něco podobného?
Snaze napsat kód, který lze spustit ve více jazycích, se říká polyglotní programování. Většina příkladů z Wikipedie je ale spíše hra s parserem než použitelný kód. Zdrojáky bývají zmatené a končí u "Hello, world".
Já budu chtít čistý, přehledný kód. A nejen pro ukázku. Půjdu dál – cílem jsou plnohodnotné programy s funkcionalitou, na kterou si někteří netroufnou ani ve svém hlavním jazyce.
Tohle přece není možné
Programovat tímhle způsobem je samozřejmě vzpoura proti konvencím a výzva všem autoritám, které "vědí", jak se má správně programovat. Je to čistá provokace – ale právě díky ní vznikají nové cesty a formy.
Zároveň jde o návrat ke kořenům, kdy bylo programování považováno za umění, ne za průmyslovou výrobu software s těžkopádnou architekturou a zbytečnými objekty. Ukážeme si místo toho syrové minimalistické obraty a zjednodušení až na dřeň. A spolu s tím i mikrokonstrukce, které připomínají ambigramy (obraz, který při otočení o 180° zobrazí něco zcela jiného) nebo Escherovy perspektivní hříčky. Jen my nebudeme měnit obrázek – budeme střídat PHP a JS.
Tohle je PUNK a SURREALISMUS ve zdrojovém kódu. A tento blog je jeho manifestem. Chcete být součástí vzpoury? Přihlaste se k odběru a těšte se na další kapitoly.
Jaké poučení si můžeme vzít z této kapitoly?
Pamatujte: první krok ke kreativitě je překonat přesvědčení, že něco nejde. A když to překonáte, otevře se vám svět nových možností.
Nenaslouchejte hlasům, že něco nejde.