PHP programuotojas: Facebook sukurta programavimo kalba, sujungusi statines ir dinamines kalbas

About The Author

Denis is a PHP Developer, Mentor, Cybersecurity Enthusiast, Office Committee Member @ Visma Lietuva. Visma Lietuva employee since 2014

Kai Markas Zuckerbergas ėmė kurti thefacebook.com, jam reikėjo pasirinkti programavimo kalbą. Jis pasirinko PHP ir tam buvo kelios priežastys. PHP turi labai greitą grįžtamojo ryšio ciklą – atliekate pakeitimą, išsaugote failą, F5 ir išsyk matote pakeitimus. Dar viena priežastis – PHP yra dinamiška, ji nereikalauja nurodyti kintamųjų tipų. Tarkim, Java, C#, C++ – statiškos kalbos reikalauja sukompiliuoti kodą prieš paleidžiant programą. Visgi, statinės kalbos turi pliusų, pavyzdžiui – galimybė greitai atrasti klaidas, ar tai, kad statinė informacija apie kintamuosius siūlo tam tikrą automatizuotą kodo dokumentaciją.

Nuo 80 programuotojų 2008 – aisiais, iki 1000 – čio 2012 – aisiais. Tiek išaugo Facebook gretos. Dirbti tokioje didelėje komandoje yra sunku, o Facebook jau tada bent 2 kartus per dieną leisdavo naujas versijas. Tad rezultatas – turime daug kodo eilučių ir daug potencialių klaidų. Reikėjo ieškoti sprendimo  – IT specialistų komanda nusprendė apjungti geriausias statinių ir dinaminių kalbų savybes – taip gimė Hack kalba.

Pirma sykį kalba pristatyta 2012 metais, ji tapo socialinio tinklo pagrindu. Dabar Hack kalbos naudojimas minimalus, dauguma framework’ų Hack nepalaiko. Visgi, tam tikrus Hack kalbos sprendimus perėmė PHP 7 – jos vystosi kartu ir sinchronizuojasi kartu.

Denis – PHP programuotojas @Visma Lietuva ir hub‘ų entuziastas – dalinasi žiniomis iš hub’o apie Hack programavimo kalbą. Kokie pagrindiniai šios programavimo kalbos aspektai?

TYPE ANNOTATIONS:

  • Platesnės skaitymo ir palaikymo galimybės
  • Klaidų radimas prieš paleidžiant
  • Leidžia turėti geresnes type-aware autocomplete funkcijas IDE
  • Galima naudoti parametrams, klasės narių kintamiesiems ir gražinamoms metodu reikšmėms

Į galimas anotacijas įeina:

  • Primityvūs tipai: int, float, string, bool, array, resource
  • Vartotojo nustatytos klasės: Vector<some type>
  • Mišrios: mixed
  • Tuščios: void
  • nullable-reikšmės: ?<type>
  • Tipizuoti masyvai: array<string>, array<Bartender>

Generics

Generics`ai leidžia programuotojams parašyti klasę ar metodą su galimybe bet kokiam tipui parinkti parametrus, tuo pačiu išsaugant tipo saugumą. Be generics, kuriant panašų modelį kaip pavaizduota paveikslėlyje žemiau, reikėtų sukurti kelias panašias klases kiekvienam skirtingam tipui, pvz., “PairString” ir “PairInt”, ir tai greitai tampa per sudėtinga, nes atsiranda daug, iš esmės, besikartojančio kodo.

  • Nepakeičiama (immutable), kai tik tipas buvo priskirtas
  • Gali būti patikrinta statiškai
  • Palaikomi nullable tipai
  • Palaikoma bendra kovariacija (+) ir kontravariacija (-)

Nullable tipai

  • Saugesnis būdas dirbti su null-reikšmėmis
  • Palaikoma naudojant ? operatorių
  • void ir noreturn tipai – negali būti nullable (negali turėti reikšmės null)
  • ?mixed – neleidžiama, nes mixed tipas jau ir taip leidžia turėti null reikšmę

Kolekcijos

  • PHP masyvai yra pernelyg bendro pobūdžio (vienas dydis tinka visiems)
  • Vector, Map, Set, Pair
  • Immutable versijos: ImmVector, ImmMap, ImmSet
  • Traversable
  • Type annotation (pvz., Map<int, int>)

Kolekcijos teikia pirmos klasės integruotus parametrų tipus, tokius kaip “Vector” (surikiuotas, indeksuojamas sąrašas – angl. “ordered index-based list”), “Map” (surikiuotas žodynas – angl. “ordered dictionary”), “Set” (unikalių elementų rinkinis) ir “Pair” (indeksuojama kolekcija, turinti lygiai du elementus).

Lambdas

Lambda – yra anoniminė funkcija užrašyta naudojant lambda operatorių. Veikimo principas yra toks pat, tačiau lambda sintaksė skiriasi nuo kanoninės anoniminių PHP funkcijų sintaksės savo “minimalizmu” (angl. “less verbose”).

Rašoma naudojant lambdą rodyklę ==>

  • Dešininė asociacija (right-associative), ir galimas nuoseklus sujungimas (angl. “chaining”)
  • Netiesiogiai naudoja kintamuosius iš išorinio konteksto (angl. “outer scope”)

Kiti aspektai:

  • Async palaikymas
  • Konstruktoriaus parametrų iškėlimas (angl. “parameter promotion”)
  • Variadinės (angl. “variadic”) funkcijos (priima kintamą argumentų kiekį)
  • Tipu aliasinimas (angl. “type aliasing”): type Counter = int; arba newtype Point = (int, int)
  • Formos (angl. “shapes”) – grupė iš nulių ar daugiau duomenų laukų, paimta nedalomai kaip visuma
  • XHP (XML-pavidalo išvedimo atvaizdavimas, su duomenų tipų patikra)

Nuorodos:

  1. https://docs.hhvm.com/hack/overview/
  2. https://hacklang.org/tutorial.html
  3. https://docs.hhvm.com/hack/tools/hackificator