
Zásadní otázka zní: Kde budeme tento převodník používat? Budeme jej používat na serveru (uvažujme PHP) nebo na klientovi (JS)?
Odpověď je stejná jako když třeba potřebujeme vytvořit třeba obrázek grafu. Někdy jej potřebujeme staticky z dat na serveru, někdy jej potřebujeme dynamicky na klientovi. A i v případě generování scény potřebujeme oba způsoby. Ale rozhodně náš kód nechceme psát 2x. Potřebovali bychom tedy nějak vyřešit přenositelnost klient-server.
Některé přístupy jak řešit přenositelnost mezi PHP a JS:- Vytvořit kód v jazyce, který je určen k transpilaci do JS i PHP např: Haxe
- Vytvořit kód v JS a pro jeho běh v PHP použít rozšíření PHP, které toto umožní: V8Js
- Vytvořit kód v PHP a pro jeho běh v prohlížeči použít spuštění PHP ve WASM např: PIB
- Vytvořit kód v PHP a do klienta jej neustále volat přes AJAX např. Livewire
Existuje tedy mnoho řešení, jak tento problém uchopit. My si vyzkoušíme úplně nový 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č takový kód napsat nelze:
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í klíčovými slovy (var, let,...), které PHP překladač vyhodnotí jako chybu
- Názvy vestavěných funkcí jsou v PHP a v JS jiné
- V PHP máme jeden druh pole na všechno, v JS je numerické a asociativní pole syntakticky odděleno
- V PHP se pole předávají hodnotou v JS odkazem
- PHP knihovna začíná znaky <?php což JS knihovně bude určitě vadit
- Jiný způsob zachytávání výjimek
- Jiný způsob práce s objekty
- Těžko očekávat stejné výsledky když
echo 1/7
je 0.14285714285714 aalert(1/7)
je 0.14285714285714285
Ovšem my tyto překážky rozhodnně nebude brát jako důvod, proč toto nejde naprogramovat, ale jako kreativní výzvu pro vytváření různých nových programátorských postupů a řešení a 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 i v Browseru!K čemu je schopnost psát takový kód dobrá?
Podle mne je znát takovýto jazyk velmi užitečné. Občas se totiž vyskytnou nějaké úkoly, které je potřeba udělat na serveru i na klientovi a nikdo je nechce programovat 2x. Typicky se jedná například o:
Co to jsou izomorfní aplikace?
Izomorfní webové aplikace jsou takové, které používají stejný kód na serveru i v prohlíči.
A mezi PHP vývojáři (ke kterým se počítám) se moc nepoužívají. Viz třeba zde. Proč? Odpověď je logická: V prohlížeči běží jen JS a proto je nelze psát v PHP.
Já si myslím, že mít stejný kód na serveru i na klientovi má své výhody popsané třeba zde. A myslím, že pravidla hry lze změnit a izomorfní aplikace psát i na PHP serveru.
- Složitější validace nějaké hodnoty, které chceme dělat z hlediska komfortu uživatele na formuláři, ovšem z hlediska bezpečnosti je musíme udělat i na serveru.
- Drobné převodníky dat, kdy z hlediska velikosti výsledných dat raději generujeme na klientovi. Ale v jiném případě tento převodník potřebujeme použít na serveru (třeba do mailu). Typicky např. generování QR kódů, jednou v browseru a jindy na serveru.
- Či se rozhodneme, že na serveru budeme stránky renderovat pro roboty, uživatele bez JS atd... a pro běžné uživatele je budeme generovat z JS v browseru.
- Navíc se v poslední době často mluví o izomorfních aplikacích, tj. o aplikacích, jejichž různé části mohou běžet na klientu (v prohlížeči), či na serveru a tím třeba rozkládat výkon.
- Takový přístup přístup v programování nám navíc přinese lepší pochopení jazyků a další úroveň v abstrakci programování, kdy opravdu přemýšlíme na úrovni algoritmů, nikoliv algoritmů v nějakém jazyce.
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 již někdo o něco podobného?
Snaze napsat zdrojový kód tak, aby byl spustitelný ve více programovacích jazycích se říká polyglotní programování. Z těchto na wiki uvedených příkladů je vidět naprostý zmatek ve zdrojovém kódu. Ovšem já budu vyžadovat přehledný a jasný zdrojový kód. A uvedené příklady končí někde u "Hello, word". Já budu vytvářet rozsáhlé programy s funcionalitou, na kterou si programátoři často netroufnou ani v jejich oblíbeném jazyku.
Tohle přece není možné
Samozřejmě, že programovat takovýmto způsobem, je vzpoura proti všem konvencím a výzva všem autoritám, které "ví" jak se má správně programovat a naprostá provokace mající ovšem jako výsledek nalezení nových cest a forem.
Je to zároveň návrat ke kořenům, kdy se programování považovalo za umění a opak "průmyslové výroby programů" s jejich těžkopádnou architekturou a často zbytečnými objekty. Místo toho si ukážeme syrové minimalistické obraty a zjednodušení různých principů až na dřeň. K tomu v rámci funkčnosti v obou jazycích uvidíte detailní mikrokonstrukce, které by se daly přirovnat k ambigramům (obrázek obličeje, který po otočení o 180° zobrazí zcela jiný obličej) či s Escherovým hrátkám s perspektivou. Jen my nebudeme obrázek otáčet či měnit jeho perspektivu, ale budeme střídat PHP a JS.
Ano, to co si předvedeme je PUNK a SURREALISMUS ve zdrojovém kódu. A tento blog bude jeho manifestem. Pokud chcete být součástí této 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, že první krok ke kreativitě je překonat přesvědčení, že něco není možné. Pokud se vám to podaří, otevřou se vám nečekané možnosti. A ty si ukážeme v dalších článcích.
Nenaslouchejte hlasům, že něco nejde.