ABONAMENTE VIDEO REDACȚIA
RO
EN
NOU
Numărul 148
Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ LISTĂ EDIȚII ▼
Numărul 26
Abonament PDF

Limbajul Hack

Radu Murzea
PHP Developer
@Pentalog



PROGRAMARE

Acest articol e în strânsă legătură cu cel despre maşina virtuală HipHop, publicat în numărul 21 al revistei. Atunci când Mark Zuckerberg a scris primele linii de cod ale Facebook-ului, a fost nevoit să aleagă limbajul de programare în care să dezvolte noua reţea de socializare. A ales PHP-ul pentru că, după cum ştim cu toţii, acesta are un ciclu de dezvoltare foarte rapid: faci o modificare, salvezi fişierul, apeşi F5 în browser şi vezi modificarea instantaneu. Acest lucru e posibil pentru că nu există un pas de compilare pe care programatorul trebuie să-l facă şi pentru că PHP-ul e un limbaj dinamic (nu obligă declararea tipurilor variabilelor).

Toate acestea sunt în contrast cu limbajele bazate pe un model static, cum ar fi Java, C#, C++ etc..În aceste cazuri, compilarea e un pas obligatoriu şi, în cazul proiectelor mari, nu unul care să dureze puţin.

În schimb, modelul static al acestor limbaje oferă niște avantaje foarte mari: bug-urile se pot detecta extrem de repede şi informaţiile statice despre tipuri oferă un fel de documentare automată a codului.

Echipa de ingineri care dezvoltă partea front-end a Facebook-ului a crescut de la 80 de ingineri în 2008 până la 1000 în 2014. Iar lipsa scalabilităţii unei astfel de echipe, în combinaţie cu faptul că, la Facebook, se introduce cod în producţie de două ori pe zi, are drept consecință foarte mult cod şi foarte mult potenţial pentru probleme. Aşa că echipa de ingineri de la Facebook a decis să împrumute o parte din avantajele celeilalte lumi (cea a limbajelor statice) pentru a reduce o parte din riscurile asociate unei echipe atât de mare de programatori.

Din această dorinţă s-a născut limbajul Hack, un limbaj hibrid care face legătura între cele două lumi.

Hack-ul în detalii

După cum menționam mai sus, Hack este un limbaj hibrid care aduce în lumea PHP-ului (un limbaj dinamic) avantajele unui model static. Nu este nimic altceva decât o extensie sintactică a PHP-ului.

Hack-ul rulează momentan doar pe maşina virtuală HipHop, de la versiunea 3.0 şi în sus a acesteia. A fost făcut open source în Martie 2014.

Un aspect important este faptul că, dacă ştii PHP, atunci ştii Hack.

Există două caracteristici foarte importante ale Hack-ului care i-a asigurat adopţia în cadrul Facebook-ului şi, poate în viitor, şi în cadrul unor aplicaţii terţe:

Facilităţi

Hack-ul vine cu nişte facilităţi interesante în plus față de ceea ce ceea ce ofera deja PHP-ul. Pentru a vedea detalii şi sintaxa a ceea ce se prezintă mai jos, vedeţi documentaţia oficială a limbajului.

Anotări de tipuri

De departe, aceasta este cea mai importantă facilitate. Permite specificarea tipurilor de date în cadrul parametrilor de funcţii, tipului returnat de o funcţie şi câmpurilor claselor. Tipurile variabilelor din codul propriu-zis nu pot fi declarate; în schimb, sunt “ghicite” de către maşina virtuală.

Mulţi programatori specifică aceste informaţii sub formă de comentarii. Hack-ul formalizează această informaţie.

Tipurile de date ce se pot specifica sunt în general cele care pot fi specificate şi în cadrul altor limbaje statice: tipuri primitive, şiruri de caractere, nume de clase, “void”, “this” etc.

Astfel se oferă avantajul detectării mai rapide a bug-urilor. De asemenea, având în vedere existenţa în acest fel a informaţiei statice în plus, compilatorul JIT din cadrul maşinii virtuale va putea intui mai bine ce căi de execuţie vor fi traversate mai des. Acest aspect demonstrează performanţa crescută.

Generics

Multe limbaje au această calitate. În Hack, generics-urile vin ca o întărire şi mai puternică a conceptului de anotări descrisă mai sus. Implementarea şi sintaxa lor este mai simplă şi mai limitată decât în cazul limbajelor Java şi C# de exemplu. În schimb, în Hack se permite folosirea tipurilor de date primitive şi chiar a instanţelor de obiecte pentru a specifica tipul de date generic.

Există totuşi nişte cazuri speciale de care trebuie ţinut cont în legătura cu această facilitate.

Colecţii

La fel cum cele mai multe limbaje statice oferă această funcţionalitate, aceasta e binevenită şi în Hack. Cele mai importante clase din acest framework sunt “Map”, “Vector” şi “Set”, fiecare dintre acestea având un corespondent care oferă imutabilitate.

Codul PHP obişnuit este de obicei împânzit cu array-uri. Dacă, în schimb, se vor folosi aceste clase, atunci codul va deveni mai clar şi, în unele cazuri, se vor vedea şi sporuri de performanţă.

Cod asincron

PHP-ul nu are suport pentru mai multe fire de execuţie. Însă Hack introduce un foarte primitiv suport pentru această facilitate.

Expresii lambda

Acestea sunt similare cu closure-urile deja existente în PHP, însă elimină o parte din limitări şi oferă o mai mare flexibilitate. Sintaxa acestora este asemănătoare cu cea pe care o putem vedea în Java 8.

XHP

Aceasta e o extensie opţională a Hack-ului care permite folosirea de blocuri XML/HTML ca pe nişte elemente standard de sintaxă. În acest fel se uşurează foarte mult munca în cadrul codului care conţine logică şi elemente specifice templating-ului. Hack oferă şi alte facilităţi minore demne de luat în calcul. De asemenea, o parte din elementele de sintaxă ale PHP-ului despre care se ştie că sunt ineficient sau rar folosite, sunt dezactivate, cum ar fi de exemplu operatorul @, operaţiunea goto, globalele (global $x) şi multe altele. Prin urmare, acest nou aspect luat în considerare va forţa programatorul să urmeze bune practici de programare.

Mai jos puteți vedea o bucată de cod care exemplifică multe din facilitățile prezentate mai sus. Puteți vedea cum sunt specificate anotarile de tipuri, cum e folosită una din clasele din framework-ul colecțiilor, un exemplu de tipuri generice și o expresie lambda simplă:

class MyExampleClass {
   public int $number;
   public CustomClass $myObject;
   private string $name;
   private array $stuff;
   private MyBag $container;

   function doStuff(MyBag $container, ?bool $x) : string {
      //immutable Map
      $map = ImmMap {    
          ‹A› => $container->getA(),
          ‹B› => $container->getB(),
      };

      if ($map->get(‹A›) == $container->getA()) {
          //error here because $map is immutable
          $map->set(‹C›, $container->getC());
      }

      //$x is of type ?bool, which means:
      //a). it›s of type boolean
      //b). can also be null
      if (! is_null($x) && $x) {
          //lambda expression
          //and alternative/classic syntax for
          //accessing map elements
          $result = $r ==> $r + $map[‹A›] + $map[‹B›];
      } else {
          $result = 0;
      }

      //error here because function›s return type is string
      return $result;
   }
}

Unelte

Maşina virtuală HipHop vine împreună cu niște unelte foarte utile:

Erorile raportate de typechecker sunt doar legate de anotările de tip. Timpul de răspuns al acestuia este foarte rapid datorită monitorizării constante a sistemului de fişiere.

Acest typechecker are în schimb o serie de limitări:

Concluzie

Hack-ul este un suflu nou adus unui limbaj a cărui dezvoltare a cam stagnat în ultimii ani. Hibriditatea dată de adăugarea unui model static peste un limbaj dinamic este un concept interesant pe care cu siguranță îl vom mai vedea în următorii ani.

Personal, sunt impresionat de eleganța cu care facilitățile Hack-ului au fost implementate și îmbinate cu sintaxa existentă a PHP-ului. Sunt multe aspecte (în special sintactice) pe care nu le-am atins. Așa că vă invit să le explorați pe cont propriu, cu speranța că acest articol v-a trezit curiozitatea de a face asta.

Conferință TSM

NUMĂRUL 147 - Automotive

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects