prechod z PHP na jazyk hack rubrika: Programování: PHP

7 xxar3s
položil/-a 12.10.2019
 
upravil/-a 12.10.2019

Nedávno som oprášil jeden starý projekt napísaný v PHP, upravil som ho tak aby bežal aj pod PHP 7.3 pod x64. PHP je už celkom použiteľný, ale stále má pár drobných nedostatkov, ktoré nechýbajú nikde inde len v PHP... napríklad generiká. Neni to nič bez čoho by sa nedalo žiť, ale lepšie sa žije s nimi ako bez nich.

Keď som googlil ako je na tom PHP s podporou generík, tak som vygooglil jazyk od facebooku s trošku neštastným názvom "hack" (neštasytný z pohľadu vyhľadávačov), ktorý je syntakticky podobný PHP, ale navyše má aj všetko čo by mal mať moderný programovací jazyk. Má aj generiká, enumy, únie a vďaka arrow ==> funkciám sa v ňom dá konečne programovať funckionálne (už žiadne capturovanie premenných zo scope cez use). Taktiež má pipe operátor, konečne aj konzistentné základné knižnice a kompiluje sa do medzikódu HHVM. Vyzerá to tak že hack vyslišal modlitby PHP programártorov a vyriešil problémy, ktoré sa autorom PHP nepodarilo doriešiť za posledných 25 rokov.

Zvažujem že staré projekty ktoré sú v PHP by som preportoval na Hack-lang. Ale mám pár otázok ku kompatibilte:

  1. Dal by sa zobrať starý PHP projekt a po pár úpravách spustiť pod hackom? Keď som videl ukážky kódu, tak to vo mne vyvolalo dojem že tie nové vlastnosti pridávajú tak aby sa zachovala kompatibilita s PHP7.

  2. budú mi fungovať extensions z PHP aj v hacku?

  3. vo svojom projekte používam aj knižnice tretích strán napr Tracy, Latte, alebo NotORM viem že tieto knižnice používajú aj niektoré exotické vlastnosti PHP (npríklad reflexia) budú fungovať aj v hacku?

  4. Bude mi hack fungovať pod Windows Server 2012? A bude mi fungovať aj cez docker? Nechcem si server zaserinkať nejakým cygwinom.

Komentáře

  • Kit : Generika v PHP nechybí. Programuj tak, abys je nepotřeboval. Use ve funkcích umožňuje dělat closures. 12.10.2019
  • xxar3s : Obdobne nepotrebuješ auto zariaď si to tak aby si do práce mohol chodiť na kolobežke. Už len také základné veci ako typehint na kolekciu konkrétneho typu sa v PHP nejdú. Môžeš si dať typehint na array ale už nie na array stringov - lebo PHP nemá generiká. Takže tam kde ti hack vyhodí chybu PHP beží ďalej čo potom spomaluje vývoj a zvyšuje pravdepodobnosť vzniku chyby. 12.10.2019
  • xxar3s : A čo sa týka toho "use" (pri anonymných funkciách) - to je špecialita PHP, v iných jazykoch to ide aj bez neho. Do PHP ho pridali asi kôli spatnej kompatibilite. Niečo podobné síce má aj C++ ale tam to funguje trochu inak a je to tam len voliteľné. Pri low level programovaní to má opodstatnenie, ale vyššom jazyku je to len zbytočná otrava. A hack to vyriešil šalamúnsky. Zachoval anonymné funckie v pôvodnej podobe (aj s tým nešťastným use), ale pridal arrow funckie a pri nich už use používať nemusíš. 12.10.2019
  • xxar3s : tu je príklad https://gist.github.com/frank-hliva/34fb7c10dedd793b350620cb5a03f830 ešte doplním že hack má okrem array (ktorý je tam len kôli kompatibilite s PHP) aj generický vector (typ vec) - čo je vlastne vylepšený array. 12.10.2019
  • Kit : PHP nepotřebuje ani typehinty, protože je vývojáři stejně neumí používat a cpou tam názvy tříd. 12.10.2019
  • xxar3s : Blbosť, čím viac informácií o typoch tým rýchlejší vývoj. 12.10.2019
  • Kit : $bar v příkladu nefunguje a $baz by také fungovat neměl. Odkud vezme informaci, kterou proměnnou $a má použít, když ji nemá ve scope? 12.10.2019
  • Kit : Sám typehinty používám, ale generika jsem v PHP dosud nepotřeboval. Možná proto, že programuji objektově. 12.10.2019
  • harrison314 : @Kit: Ta posledna veta, to je taky facepalm... 12.10.2019
  • rastakayakwana : Composition over inheritance se prosazuje už poměrně dlouho, a je tomu tak dobře. Reflexe není exotická funkce. Když nechceš mít server zaneřáděnej, tak proč používáš windows? Funkcionální programování není závislé na zkráceném zápisu lambda funkcí. Jediné co chybí jsou asi tak enumy. 13.10.2019
  • Kit : @rastakayakwana: Úplně stačí přestat se zneužíváním dědičnosti, kterou běžně používám tam, kde má smysl. Možná právě proto jí mám v aplikacích tak málo. Je dobré přestat používat "protected", které napáchá nejvíc zla. 13.10.2019
  • xxar3s : @Kit: presne ako píše @harrison314 je to čistý facepalm :D Podľa reakcie je evidentné že si nikdy v inom jazyku ako v PHP nepožíval anonymné funkcie a potom máš veľmi obmedzený pohľad na programovanie ako také. Najlepšie by bolo keby si si dal pauzu od PHP a začal sa učiť iný jazyk a nakódil si v ňom nejakú aplikáciu. Lebo poznal som jedného kodéra, ktorý bol veľký expert na JS, ale okrem JS nikdy v živote neprogramoval v ničom inom. Ten sa tiež vždy tváril že všetko vie, všetko čo bolo v JS bolo vždy najlepšie a ostatné jazyky boli zlé, lebo neboli také ako javascript. Až potom som pochopil, že on okrem javascriptu nikdy v inom jazyku nič nenaprogramoval (možno nejaký vyskúšal). Tak neviem či to neni aj tvoj prípad. 13.10.2019
  • xxar3s : @rastakayakwana ja som nehovoril o skrátenom zápise ten ma trápi najmenej, ale o nutnosti používať use. Nie si ty náhdou nejaké Kitovo dvojča? Lebo tie univerzálne "pravdy", chytanie za slovíčka mi trošku kita pripomínajú. Mám dobré dôvody prečo tam mám Windows. Linux používam inde tiež a mám ho rád, ale nemyslím si že je lepší ani že je horší. Každá platforma sa hodí na niečo iné. Bohužiaľ na linuxe nefunguje všetko čo moja aplikácia potrebuje, ale do flame windows vs linux sa púšťať nebudem. Keď si myslíš že linux je lepší tak si to mysli mne to je jedno. 13.10.2019
  • harrison314 : @Kit: este... povedal som to preto, ze povedat, to ze nepotrebujes generika, lebbo objektujes objektovo je ako povedat, ze nepotrebujes sushi, lebo jazdis na mtoroke. Tie dve veci spolu nesuvisia, aj ked pouzitim generik sa v OOP daju robit iste veci, ktore sa tak priamociaro v dynamicky typovych jazykoch nedaju. 13.10.2019
  • Kit : @xxar3s: Jak vysvětlíš ve svém příkladu, že $bar v PHP neprojde? Neměl by projít ani $baz v hacku, protože je mimo scope. 13.10.2019
  • Kit : @rastakayakwana: Enumy mi kdysi v PHP také chyběly, než jsem přišel na to, že to jde snadno i bez nich. Navíc efektivněji a přehledněji. Inspirovaly mě enumy z Javy, které lze v PHP posunout na ještě vyšší level. 13.10.2019
  • Taco : @Kit: protože v $bar je $a mimo scope, zatímce v $baz $a ve scope je. 13.10.2019
  • Kit : $baz by také neměl být ve scope. Je to hnusný hack. 14.10.2019
  • Taco : @Kit: Jenže ve scope je. (Používání use při deklaraci lambd v PHP je sice docela zajímavé, ale každopádně je to tvrdě atypické.) 14.10.2019
  • Kit : Use je syntaktickým cukrem pro dvojitou lambdu. Nemusíš ho používat, pokud nechceš, ale čitelnosti to nepřidá. Je to sice atypické, ale připadá mi to jednoduché, elegantní a snadno pochopitelné. 15.10.2019
  • Taco : @Kit: Tak to use jaksi nejde nepoužívat, že. Druhak, reaguješ na tebou vymyšlené námitky. Myslím, že já mám dost. 15.10.2019
  • anti.cz : Hezka diskuze. Taky si prisadim. Typehinty jsou dobre, kdyz uz neni jina moznost a je dobre, kdy je tom aspon napsane v anotaci. Generika bych v php videl rad. Vsechno mam Iterable object, protoze bych si radsi urazil pazoury nez neco natypovat na array. Ale me spis me zajima, jestli se xxar3s dival jak to HACK resi napozadi, vim ze jsi rikal, ze sam pises nejaky jazyk. Me treba napada jak HACK resi array. array si napozadi predala na List? Takze se vlastne bavime o List<(S)string> nebo to resi jinak? A to same u te array function v HACK. V javascriptu je array fn. jen syntax sugger(myslim self vs this), je to i tady a cely ten context to tam stejne napozadi strci jako v php nebo je to udelane chytreji. A jak to vlastne funguje? Vzhledem ktomu, ze je to od FB, tak bych si typnul, ze to kompiluji primo do cecka? O neco podobneho se pred par lety pokouseli i u php. 21.10.2019
  • Andreaw Fean : @anti.cz: "Vsechno mam Iterable object, protoze bych si radsi urazil pazoury nez neco natypovat na array." - proč? 28.10.2019
odkaz
1 miloslav.hula
odpověděl/-a 21.10.2019

HHVM 3.30 je poslední verze, která podporuje kompatibilitu s PHP (https://hhvm.com/blog/2018/12/17/hhvm-3.30.html).

Generika jsou moc fajn. Třeba na kolekce se hodí jak nic jiného. Na phpCE 2018 Rasmus vysvětloval, proč je není jednoduché implementovat. A snad to nedomotám... jde o runtime. V runtime by se musel při předání proměnné pokaždé kontrolovat typ generika a to má nezanedbatelný vliv na výkon. V Hacku se to proto nedělá, takže generika tam jsou jen syntactic sugar. Navíc, nejsou generika jako generika a i v Hacku jsou myslím také jen na půl. Podpora v IDE také chybí. Bez generik ala Hack se dá obejít, jen je to víc psaní.

  • Starý projekt v pohodě přepíšeš. Většinou stačí <?php vyměnit za <?hh
  • Extensions z PHP fungovat nebudou, je to kompletně jiný ekosystém.
  • Nette projekty do nějaké verze s Hackem poběží, ale 12.7.2017 jsem podporu odebral z Testeru protože: to komplikovalo kód; nikdo to nepoužíval; nefixovali BUGy v HHVM, které jsem jim nareportoval

Hack byl boom, ale IMHO je po něm.

Pro zobrazení všech 3 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.