Creșterea productivității computerelor și modificările în compoziția software-ului folosit fac ca rolul limbajelor de scripting în crearea unei aplicații viitoare să devină din ce în ce mai important. Aceste limbi diferă de limbile de programare la nivel de sistem, deoarece scopul lor principal este de a asocia diferite componente și aplicații între ele. îndeplinind rolul unui tip de adeziv. Ei găsesc aplicarea unor abordări neclintite la descrierea datelor, ceea ce permite aducerea programării la un nivel mai înalt și accelerarea procesului de dezvoltare în comparație cu limbile de nivel sistem.
În ultimii 15 ani, metodologia de scriere a programelor pentru computere a suferit o schimbare radicală. Dezvoltatorii s-au mutat de la limbi de programare la nivel de sistem, cum ar fi. Cu și. C ++, pentru limbile de scripting, dintre care exemple sunt PurlTell. Deși un număr mare de oameni au fost implicați în această schimbare, doar câțiva dintre ei sunt conștienți. că se întâmplă de fapt. și chiar mai puțini vor fi găsiți. care ar putea explica motivele.
Aceste limbi au fost create în scopuri diferite, ceea ce a condus la o serie de diferențe fundamentale între ele. Sistemele au fost dezvoltate pentru a construi structuri de date și algoritmi de la zero, pornind de la astfel de elemente primitive. ca un cuvânt de memorie de calculator. În contrast cu asta. au fost create limbi de scripting pentru a conecta programe pregătite. Utilizarea lor implică disponibilitatea unui sortiment suficient de componente puternice. Trebuie doar să fie combinate unul cu celălalt. Limbile de nivel sistem utilizează un tip de control strict, care ajută dezvoltatorii de aplicații să facă față unor sarcini complexe; limbile de scripting nu utilizează conceptul de tip, care simplifică stabilirea conexiunilor între componente și accelerează dezvoltarea sistemelor de aplicații.
Limbile acestor două tipuri sunt complementare. și cele mai multe platforme de calculatoare de la mijlocul anilor '60 sunt echipate ca acestea. și altele. În infrastructurile componente, ele sunt aplicate. ca regulă. Împreună, componentele sunt create în limbi de programare la nivel de sistem. și pentru comunicarea între ele, se folosesc limbi de scripting. Cu toate acestea, o serie de tendințe actuale. inclusiv apariția unor mașini mai rapide și limbi de scripting mai avansate. sporind importanța interfeței grafice a utilizatorilor și a arhitecturilor componentelor. precum și popularitatea crescândă a internetului, a extins considerabil domeniul de aplicare al limbilor scripting. Dezvoltarea acestor tendințe va continua și în următorul deceniu. în consecință, tot mai multe aplicații vor fi create în întregime în limbile de scripting. iar rolul limbajelor de programare la nivel de sistem este redus aproape exclusiv la crearea de componente.
2. Limbi de programare la nivel de sistem.
Pentru a înțelege diferența dintre limbile de scripting și sistemul. este util să ne amintim istoria celor din urmă. Pentru prima dată, acestea au apărut ca o alternativă la limbile de asamblare, permițând să se utilizeze în program aproape toate caracteristicile unui anumit subsistem hardware. Fiecare instrucțiune a acestei limbi corespunde exact unei instrucțiuni de mașină, iar programatorul trebuie să se ocupe de asemenea detalii de nivel inferior, cum ar fi alocarea registrelor și secvența apelurilor procedurale. Ca urmare, scrierea și menținerea programelor mari în limba asamblorului este extrem de dificilă.
Până la sfârșitul anilor 1950, limbi de programare de nivel superior, cum ar fi Lisp, Fortran, ALGOL, au început să apară. Nu mai există o potrivire exactă între construcțiile de limbă și instrucțiunile mașinii. Compilarea liniilor de cod sursă într-o secvență de comenzi binare a fost efectuată de compilator. În timp, numărul acestora a crescut cu limbile PL / 1, Pascal, C, C ++, Java. Toate acestea folosesc hardware mai puțin eficient decât limbile de asamblare, dar vă permite să creați mai rapid aplicații. Ca urmare, au fost capabili să deplaseze aproape complet limbile de asamblare atunci când creează aplicații mari.
Limbi de programare la nivel înalt.
Limbile de programare ale sistemului sunt diferite de cele ale asamblorilor, în primul rând prin faptul că sunt mai înalte și, în al doilea rând, folosesc un control mai strict de tip. Termenul "nivel înalt" înseamnă următoarele: multe părți sunt prelucrate automat, iar programatorul trebuie să scrie mai puține linii pentru a-și crea aplicația. În special:
Compilatorul este responsabil pentru distribuirea registrelor, deci programatorul nu are nevoie să scrie cod care să asigure transferul de date între registre și memorie;
Secvențele apelurilor de procedură sunt generate automat; programatorul nu are nevoie să descrie plasarea argumentelor funcției pe teancul și extragerea lor de acolo;
Pentru a descrie structurile de management, programatorul poate folosi și cuvinte cheie ca în cazul în care; secvențele de instrucțiuni ale mașinii care corespund acestor descrieri pe care compilatorul le generează în mod dinamic.
În contrast, limbile moderne de programare se caracterizează prin scrierea strictă. Fiecare variabilă în limbajul de programare la nivel de sistem trebuie declarată specificând un anumit tip, cum ar fi un întreg sau un pointer la un șir de caractere, și apoi utilizat numai în moduri adecvate pentru acel tip.
Codul de date și de program sunt separate; crearea unui nou cod în cursul derulării programului este dificilă, dacă este posibil. Variabilele pot fi combinate în structuri sau obiecte cu o substructură clar definită și metode de manipulare a componentelor lor. Un obiect de un singur tip nu poate fi folosit într-o situație în care este prescris un obiect de alt tip.
Limbile de scripting au fost create pentru a conecta programe pregătite. Utilizarea lor implică disponibilitatea unui sortiment suficient de componente puternice care trebuie combinate doar unul cu celălalt.
Tastarea oferă mai multe avantaje. În primul rând, programele mari devin mai ușor de gestionat datorită acesteia. Claritatea sistemului de tip face clar pentru programator care sunt datele specifice pentru; el poate distinge cu usurinta intre ele si in consecinta foloseste. În al doilea rând, compilatorii folosesc informații de tip pentru a detecta unele tipuri de erori, cum ar fi încercarea de a utiliza un număr de punct mobil în calitate de pointer. În al treilea rând, tastarea îmbunătățește performanța aplicațiilor, permițând compilatoarelor să genereze coduri mai specializate. De exemplu, dacă compilatorul știe că o variabilă conține întotdeauna valori întregi, ea poate genera instrucțiuni întregi pentru manipularea acesteia; Dacă tipul nu este cunoscut de compilator, atunci trebuie să introduceți instrucțiuni suplimentare pentru a verifica tipul în timpul rulării.
Figura 1 prezintă distribuția unui număr de limbi de programare în ceea ce privește puterea și gradul de severitate a tipării.
5. Limbi care descriu scenariile.
Limbile de scripting, cum ar fi limbile Perl, Python, Rexx, Tcl, VisualBasic și UNIX, sugerează un stil de programare foarte diferit de limbajul de sistem. Ele nu sunt destinate pentru scrierea unei aplicații de la zero, ci pentru combinarea componentelor, setul acestora fiind creat în prealabil folosind alte limbi. De exemplu, Tcl, VisualBasic pot fi folosite pentru a construi interfețe utilizator din controalele existente, iar limbile de scripting pentru shell-urile UNIX sunt utilizate pentru a forma conducte pentru prelucrarea fluxurilor de date dintr-un set de filtre standard. Limbile de scripting sunt adesea folosite pentru a suplimenta componentele gata făcute cu noi caracteristici; Cu toate acestea, această activitate acoperă rareori crearea unor algoritmi sau a unor structuri de date complexe deja deja integrate în componente. Uneori limbile de scriere sunt chiar numite legături sau limbi de integrare a sistemului.
Pentru limbile de scripting, există o lipsă de scriere, ceea ce ar complica doar sarcina de conectare a componentelor. Toate elementele din ele arată și funcționează identic și sunt complet interschimbabile. De exemplu, în Tcl sau VisualBasic, o variabilă poate conține un singur punct în șirul de programe, iar în altul - un număr întreg. Codul și datele sunt adesea interschimbabile. De exemplu, o variabilă Tcl, VisualBasic poate conține un șir într-un punct al programului și un întreg în celălalt. Codul și datele sunt, de asemenea, deseori interschimbabile, astfel încât programul poate genera un alt program - și îl puteți executa imediat. De obicei, limbile de scripting utilizează tipuri de șir de variabile care oferă un mecanism de reprezentare uniformă pentru diferite entități.
Absența în limbajul divizării a variabilelor în tipuri simplifică conectarea componentelor între ele. Nu există restricții a priori privind modul în care poate fi folosit un element și toate componentele unei valori sunt prezentate într-un singur format. Astfel, o componentă sau o valoare poate fi utilizată în orice situație; fiind concepute pentru anumite metode de aplicare, ele pot fi implicate în lucruri complet diferite pe care creatorul lor nu le-a crezut niciodată. De exemplu, în shell-urile UNIX, activitatea oricărui program de filtrare implică citirea datelor din fluxul de intrare și scrierea acestuia în fluxul de ieșire. Orice două astfel de programe pot fi conectate prin atribuirea unui flux de ieșire la unul ca flux de intrare al celuilalt. Următoarea comandă shell reprezintă un sistem de trei filtre, numărând liniile fragmentului de text selectat care conțin cuvântul "scipting":
Selectați | scripting grep | WC
Programul selectat citește textul selectat în mod curent pe ecran și afișează fluxul de ieșire; Filtrul grep citește fluxul de intrare și trece la liniile de ieșire care conțin cuvântul "scripting"; iar programul wc numără numărul de linii din fluxul său. Oricare dintre aceste componente pot găsi aplicații într-o varietate de situații diferite, rezolvând de fiecare dată o sarcină comună diferită. Difuzarea puternică a limbajelor de programare la nivel de sistem face dificilă reutilizarea codului. Încurajează programatorii să creeze un număr mare de interfețe incompatibile, fiecare necesitând utilizarea obiectelor de tip propriu. Compilatorul nu permite ca obiectele de alte tipuri să interacționeze cu această interfață, în ciuda faptului că rezultatul ar putea fi foarte util. Astfel, pentru a folosi un obiect nou cu o interfață existentă, programatorul trebuie să scrie un "adaptor" care convertește obiectul la tipul la care a fost proiectată interfața. Și utilizarea "adaptorului" necesită, la rândul său, recompilarea unei părți sau chiar a întregii aplicații ca întreg. Modul dominant de distribuție a software-ului sub formă de fișiere binare face ca această abordare să fie imposibilă.
Pentru a evalua avantajele unui limbaj de programare tipic, ia în considerare următorul exemplu în Tcl:
Butonul .b -text Hello! -font - comandă.Această comandă creează un nou buton pe ecran care spune Bună ziua! font Times 16 elemente, când se face clic, care afișează un mesaj scurt salut. În aceeași linie de aici se potrivesc șase tipuri diferite de elemente: (b.) Numele de comandă (buton), numele butonului, atribut de identificare (-text, -font, -command), un șir de simplu (Hello Hello!), Caietul de sarcini font (Times 16) constând din numele mărcii (Times) și dimensiunea la punctele (16), precum și un Tcl-script (putshello). Toate elementele sunt prezentate într-un mod uniform - sub formă de șiruri de caractere. În acest exemplu, atributele pot fi listate în ordine aleatorie, iar atributele nedefinite (există mai mult de 20) vor fi atribuite valori implicite.
Dacă este implementat în Java, același exemplu ar necesita șapte linii de cod care compun cele două metode. Pentru C ++ folosind biblioteca MicrosoftFoundationClasses (MFC), scările au crescut la aproximativ 25 de linii de cod care formează trei proceduri. Selectarea fonturilor necesită mai mult acces la funcțiile MFC
Cfont * fontPtr = nou Cront ();
FontPtr-> Creta Font (16, 0, 0, 0, 700,
0, 0, 0, ANSI_CHARSET,
"Times New Roman");
Limbi care descriu scenarii în creștere
Limbile pentru descrierea scenariilor au existat de mult timp, cu toate acestea, în ultimii ani, ca urmare a unei combinații de mai mulți factori, relevanța acestora a crescut semnificativ. Cel mai important dintre acești factori este direcția spre aplicație, asamblată din componentele terminate. Trei ilustrații ale manifestării sale pot fi numite interfețe grafice de utilizator, Internet și infrastructurile de dezvoltare a componentelor.
7. Interfețe grafice de utilizator
Primele interfețe grafice ale utilizatorilor au apărut la începutul anilor 1980 și au devenit larg răspândite până la sfârșitul deceniului. Astăzi, descrierea acestei părți a programului în multe proiecte necesită mai mult de jumătate din eforturile dezvoltatorilor. GUI este în mod inerent un sistem integrat. Scopul creării sale nu este de a implementa noi funcționalități, ci de a stabili legături între controalele grafice și funcțiile părților interne ale aplicației.
Unele sisteme sunt prevăzute cu un mijloc foarte convenabil pentru construirea ecrane grafice care ascund complexitatea limbii de bază, cu toate acestea, de îndată ce apare necesitatea de a scrie cod suplimentar, de exemplu, pentru a extinde gama de elemente de interfață comportamente, dezvoltatorul atunci când apar dificultăți. Toate cele mai bune medii de dezvoltare accelerate se bazează pe limbile de scripting: VisualBasic, HyperCard, TCL / TK.
8. Infrastructura componentelor
Al treilea exemplu de utilizare a limbilor de scripting este infrastructurile componente, cum ar fi ActiveX, JavaBeans. Deși limbile de programare la nivel de sistem sunt folosite cu succes pentru a crea componente, sarcinile de a construi aplicații de la acestea sunt rezolvate mai convenabil folosind scripturi. Fără o limbă bună de scripting pentru manipularea componentelor infrastructurii, o parte semnificativă a avantajelor sale este pierdută. Acest lucru ar putea explica de ce, în parte infrastructura componenta realizată o mai mare popularitate în lumea PC-ului, în cazul în care există un liant convenabil ca VisualBasic, mai degrabă decât pe alte platforme, cum ar fi Unix / Cobra, infrastructura componente, pentru care lipsa de limbaje de scripting.
9. Tehnologia scenariilor
În plus, tehnologia scenariilor a beneficiat în mare măsură de îmbunătățirea performanțelor echipamentelor informatice. Nu cu mult timp în urmă, pentru a atinge o viteză acceptabilă de aplicare a oricărui nivel de complexitate, a fost necesar să se acceseze limbile de sistem. În unele cazuri, chiar și eficacitatea lor era insuficientă și programul trebuia să fie scris în asamblare. Mașinile moderne funcționează de 100 până la 500 de ori mai repede decât computerele din anii 80, iar productivitatea lor continuă să se dubleze la fiecare 18 luni. Astăzi, o serie de aplicații pot fi implementate în limbi de scripting, dar cu performanțe excelente. De exemplu, un script TCL vă permite să manipulați mii de obiecte menținând în același timp un nivel bun de interactivitate. Pe măsură ce computerele devin mai rapide și mai rapide, utilizarea limbilor de scripting va deveni atractivă pentru implementarea mai multor aplicații la scară largă.
10. Alte limbi
Limbile de scripting se bazează pe un set diferit de compromisuri decât limbile de sistem. În acestea, viteza de execuție și severitatea controlului de tip sunt plasate pe prioritatea inferioară în scara prioritară, însă productivitatea și reutilizarea programatorului sunt mai mari. Această corelare a valorilor se dovedește a fi din ce în ce mai justificată, deoarece computerele devin repede și mai puțin costisitoare, ceea ce nu se poate spune despre programatori. limbaje de programare de sistem sunt potrivite pentru crearea componentelor în cazul în care principala dificultate constă în punerea în aplicare a algoritmilor și structurilor de date, în timp ce limbaje de scripting sunt mai potrivite pentru aplicații de construcții din componente pre-construite, în cazul în care dificultatea constă în stabilirea de legături de interconectare. Sarcinile ultimului tip devin tot mai răspândite, astfel încât rolul paradigmei scenariilor va crește în secolul următor.
Rezumatele sunt super! Luați o pauză, studentă, ați avut un moment bun: La examenul de fizică, profesorul încearcă să se bazeze pe o estimare pozitivă a studentului neglijent: - Puteți numi numele de familie al cel puțin unui fizician remarcabil? "Desigur, ești profesor." Apropo, un anecdot este luat de chatanekdotov.ru