Calculatoarele nu pot efectiv executa codul pe care îl scrieți JavaScript (sau orice altă limbă pentru această problemă). Calculatoarele pot rula doar codul mașinii. Codul de mașină pe care îl poate rula un anumit computer este definit în procesorul care va rula acele comenzi și poate fi diferit pentru diferite procesoare.
Evident, scrierea codului mașinii a fost dificil pentru oameni (125 este o comandă de adăugare sau este 126 sau poate 27). Pentru a rezolva această problemă, au fost create cele cunoscute sub numele de limbaje de asamblare. Aceste limbi foloseau nume mai evidente pentru comenzi (cum ar fi ADD pentru adăugare) și astfel au eliminat nevoia de a aminti codurile exacte ale mașinii. Limbile de asamblare au încă o relație unu cu unu cu procesorul și codul mașinii în care computerul transformă aceste comenzi.
Limbile de asamblare trebuie să fie compilate sau interpretate
Foarte devreme s-a realizat că este mai ușor de scris limbi erau necesare și computerul însuși ar putea fi utilizat pentru a le traduce în instrucțiunile codului mașinii pe care computerul le poate înțelege de fapt. Cu această traducere s-au putut adopta două abordări și s-au ales ambele alternative (fie una, fie cealaltă va fi folosită în funcție de limba utilizată și unde se rulează).
Un limbaj compilat este unul în care odată ce programul a fost scris, alimentați codul printr-un program numit a compilator și care produce o versiune de cod de mașină a programului. Când doriți să rulați apoi programul, sunteți doar la versiunea codului mașinii. Dacă faceți modificări ale programului, trebuie să îl recompilați înainte de a putea testa codul schimbat.
Un limbaj interpretat este unul în care instrucțiunile sunt convertite din ceea ce ați scris în codul mașinii pe măsură ce programul este rulat. Un limbaj interpretat primește practic o instrucțiune din sursa programului, o transformă în mașină, rulează codul mașinii și apoi preia instrucțiunea următoare de la sursă pentru a repeta proces.
Două variante privind compilarea și interpretarea
O variantă folosește un proces în două etape. Cu această variantă, sursa programului dvs. este compilată nu direct în codul mașinii, ci în schimb, este convertit într-un limbaj asemănător, care este încă independent de particular procesor. Când doriți să rulați codul, atunci procesează codul compilat printr-un interpret specific procesorului, astfel încât să obțineți codul mașinii adecvat acelui procesor. Această abordare are multe dintre avantajele compilării păstrând independența procesorului, deoarece același cod compilat poate fi interpretat de mai multe procesoare diferite. Java este o limbă care folosește adesea această variantă.
Cealaltă variantă se numește un compilator Just in Time (sau JIT). Cu această abordare, nu executați de fapt compilatorul după ce v-ați scris codul. În schimb, asta se întâmplă automat atunci când rulați codul. Folosind un compilator Just in Time, codul nu este interpretat prin declarație, este compilat într-un singur du-te de fiecare dată când este chemat să fie rulat și apoi versiunea compilată pe care tocmai a creat-o este ceea ce primește alerga. Această abordare face să pară mult ca codul să fie interpretat, cu excepția faptului că în loc de erori se găsesc doar atunci când instrucțiunea cu este atinsă eroare, orice eroare detectată de compilator are ca rezultat că niciunul din codul nu este rulat în loc de tot codul până la acel punct alerga. PHP este un exemplu de limbaj care folosește de obicei doar la compilarea timpului.
Este compilat sau interpretat JavaScript?
Deci, acum știm ce înseamnă codul interpretat și codul compilat, întrebarea la care trebuie să răspundem în continuare este ce are de a face toate acestea cu JavaScript? În funcție de exact locul în care rulați JavaScript, codul poate fi compilat sau interpretat sau puteți folosi oricare din celelalte două variante menționate. De cele mai multe ori eștirularea JavaScript într-un browser web și acolo JavaScript este de obicei interpretat.
Limbile interpretate sunt de obicei mai lente decât limbile compilate. Există două motive pentru aceasta. În primul rând, codul care trebuie interpretat de fapt trebuie interpretat înainte de a putea fi executat și în al doilea rând, acesta este să se întâmple de fiecare dată când executarea instrucțiunii (nu numai de fiecare dată când executați JavaScript, dar dacă este activată A buclă atunci trebuie făcută de fiecare dată în jurul buclei). Aceasta înseamnă că codul scris în JavaScript va rula mai lent decât codul scris în multe alte limbi.
Cum ne ajută să cunoaștem acest lucru acolo unde JavaScript este singura limbă disponibilă pentru a rula pe toate browserele web? Interpretul JavaScript însuși care este încorporat în browserul web nu este scris în JavaScript. În schimb, este scris într-o altă limbă care a fost apoi compilată. Ceea ce înseamnă asta este că puteți face JavaScript să funcționeze mai rapid dacă puteți profita de orice comenzi pe care le oferă JavaScript care vă permit să descărcați sarcina pe motorul JavaScript însuși.
Exemple pentru a obține JavaScript pentru a rula mai repede
Un exemplu în acest sens este faptul că unele browsere, dar nu toate, au implementat o metodă document.getElementsByClassName () în motorul JavaScript, în timp ce alții încă nu au făcut acest lucru. Când avem nevoie de această funcționalitate specială, putem face ca codul să ruleze mai repede în acele browsere în care motorul JavaScript îl furnizează folosind funcția detectând dacă metoda există deja și creează propria versiune a codului respectiv în JavaScript atunci când motorul JavaScript nu o oferă ne. În cazul în care motorul JavaScript oferă această funcționalitate, ar trebui să funcționeze mai repede dacă folosim asta, în loc să rulăm propria noastră versiune scrisă în JavaScript. Același lucru este valabil pentru orice procesare pe care motorul JavaScript ne pune la dispoziție pentru a apela direct.
De asemenea, vor exista cazuri în care JavaScript oferă mai multe modalități de a face aceeași solicitare. În aceste cazuri, una dintre căile de acces la informații poate fi mai specifică decât cealaltă. De exemplu document.getElementsByTagName ('table') [0] .tBodies și document.getElementsByTagName ('table') [0] .getElementsByTagName ('tbody') ambele regăsiți aceeași nodelistă a etichetelor tbody din primul tabel din pagina web, însă prima dintre ele este o comandă specifică pentru preluare etichetele tbody unde a doua identifică că preluăm etichete tbody într-un parametru și alte valori pot fi înlocuite pentru a prelua alte Etichete. În majoritatea browserelor, varianta mai scurtă și mai specifică a codului va rula mai rapid (în unele cazuri mult mai rapid) decât a doua variantă și deci are sens să folosiți varianta mai scurtă și mai specifică versiune. De asemenea, face codul mai ușor de citit și de întreținut.
Acum, în multe dintre aceste cazuri, diferența reală în timpul procesării va fi foarte mică și va fi doar atunci când adăugați multe astfel de opțiuni de cod împreună, astfel încât veți obține orice diferență notabilă în timpul în care codul va dura alerga. Este destul de rar, însă, faptul că schimbarea codului dvs. pentru a-l face să funcționeze mai repede va face ca codul să fie semnificativ mai lung sau mai greu de întreținut, și adesea inversul va fi adevărat. Există, de asemenea, avantajul că pot fi create versiuni viitoare ale motoarelor JavaScript care grăbesc chiar și varianta mai specifică în plus, astfel încât utilizarea variantei specifice poate însemna că codul dvs. va rula mai repede în viitor, fără a fi necesar să schimbați nimic.