Renașterea în informatică

A.D. Corlan, mai 2006

Motto 0: Cine nu citește istoria este condamnat s-o retrăiască.
Motto 1: Those who do not understand Lisp are doomed to reinvent it, poorly.

Istoria recentă a Europei este împărțită de obicei în trei faze de relativă civilizație: antichitatea greco-romană, evul mediu și epoca modernă, ultima precedată de o perioadă de `renaștere'.

Barbarie și renaștere

De fapt, această secvență descrie relația triburilor care au populat continentul pana recent față de o invenție aparuta acum doar 25 de secole: statul laic, adică o anumită combinație funcțională între o justiție laică și o structură militară. Statul laic a facut posibilă dezvoltarea unei lumi civile și a unei culturi creative, laicitatea lui separând aspectele culturale de activitatea statală.

Cele trei faze despre care vorbim au constat în dezvoltarea și afirmarea acestei invenții (antichitatea), recunoașterea și adoptarea ei pe scară largă de către populațiile gentilice barbare care au luat contact cu ea, adoptare făcută inițial doar în formă și motivată de prestigiul conferit de această formă (evul mediu---o îmbinare de stat religios și gintă), și descoperirea în generații progresive a fondului invenției, asimilarea lui în cultura și apoi în structura societății (renașterea) apoi adaptarea și dezvoltarea lui.

Aici plecăm de la premiza că această schemă descrie impactul multor invenții epocale în societate și că li se aplică împărțirea în astfel de faze, de descoperire și recunoaștere, de adoptare formală, de redescoperire a fondului și de aplicare generalizată.

Invenția care ne interesează aici este, desigur, calculul digital și aplicațiile sale. Considerăm că acesta a trecut printr-o fază `antică,' axată pe mașini mainframe (și apoi mini) în jurul cărora s-a dezvoltat o întreagă cultură a aplicației numerice; o fază medievală de generalizare la o populație admirativă dar inocentă, care a adoptat mai ales formele (de exemplu a confundat calculatorul personal cu un fel de mașină de scris și l-a adoptat în principal în această formă) și care a început cu microcomputerele personale în anii '80; iar acum ne aflăm în plină renaștere care a început izolat cu proiectul GNU (iminența renașterii), a explodat cu fenomenul Linux/OSS (recunoașterea renașterii) și intră acum într-o fază de căutare și redescoperire sistematică a `clasicilor', după care ar urma, logic, o fază de dezvoltare a rezultatelor lor, de data aceasta pe o scară mult mai largă.

Din perspectiva `civilizatului' evurile medii par dezagreabile: din toată splendoarea culturii originale se ia o fațadă greșit înțeleasă cu care `barbarii' se împăunează ridicol, și această mascaradă ajunge să înlocuiască însăși cultura. De fapt, privite de la distanță, evurile medii sunt fenomene îmbucurătoare, în care invenția cu pricina se generalizează în sfârșit. Rareori martorii `invaziilor' pot însă să se detașeze și să nu deplângă sfârșitul splendidei lor izolări, sau promotorii renașterii să nu se dezică disprețuitori de `evul întunecat'.

De fapt, nici în societatea europeană, și nici în lumea calculatoarelor, structurile arhaice n-au dispărut pe parcursul evului mediu, ci chiar au evoluat lent, sub forma statului bizantin și a celui abasid în primul caz și a unor proiecte de dezvoltare în cazul calculatoarelor---proiecte despre care vom vorbi mai jos.

Această dezvoltare pare să încetinească însă progresiv, și într-un caz și în celălalt, dar tocmai când pare să se fi oprit complet, se amorsează renașterea și revalorizarea---fenomen pe care nu ni-l putem explica. Poate renunțarea formală la orice pretenție de proeminență îngăduie în sfârșit preluarea soluției cu pricina de către o nouă generație dornică de afirmare, fără ca aceasta să mai aibă sentimentul că ar participa de pe o poziție inferioară într-un sistem de prestigiu existent.

Mecanismele renașterii

Preluarea parțială a unei structuri culturale stabile într-o alta cultură nu duce la un rezultat stabil. Mai devreme sau mai târziu apar aceleași probleme care s-au întâlnit și în cultura originală și trebuie sa li se dea o rezolvare de regulă similară. Îndeobște, prima soluție adoptată este chiar cea `antică' dar deseori reîmpachetată sub o altă denumire și prezentată ca o mare descoperire a momentului.

În Sfântul Imperiu Roman de Origine Germană nu s-a putut promite de către împărat o pace civilă poporului fără separarea acestuia de biserică și nu s-a putut face asta fără separarea dreptului general de cel canonic---adică fără apariția dreptului general---și de aici a prezumției de nevinovăție, a obligativității apărării, a încurajării opiniilor contrare și cântăririi lor și a întregii metode de explorare juridică din jurul codului iustinian. Generalizând, adoptarea formei: un împărat care promite populației o stare civilă a deschis întreaga problemă a justiției, de aici a educației și științei de carte, etc.

Tot așa, adoptarea unor aplicații minimale, single user, pe mașini PC, fără mari considerații de fiabilitate sau eficiență, a dus la utilizarea lor extensivă, de aici la utilizarea în întreprinderi și de aici la nevoia de fiabilitate și eficiență, la nevoia de a concentra aspectele mai dificile de administrare de sistem pe mai puține mașini și la apariția configurațiilor client-server, a rețelelor locale și la generalizarea Internet-ului.

Când s-a produs acest fenomen, tot mai mulți au redescoperit că simplitatea și generalitatea design-ului sistemului de operare, eleganța modelului de multiprocesare, disponibilitatea și claritatea surselor programelor de sistem, continuitatea cu ce se predă în facultățile de calculatoare, respectarea standardelor, eficiența implementării, nu sunt niște simple mofturi ale unor savanți frustrați ci calități subtile dar de fapt indispensabile, care se traduc direct în scăderea costurilor și riscurilor. Și că aceste probleme n-au apărut în istoria omenirii în 1990 ci prin anii '60, iar după multe căutări (gen multics sau gcos) s-au rezolvat mulțumitor prin inventarea sistemului de operare Unix. Cu această (re)descoperire s-a propagat și adoptarea sistemului de operare Linux și a unora din instrumentele și aplicațiile cu surse deschise.

Direcții emergente ale renașterii

Aceleași trăsături se pot identifica și pentru tehnologii dezvoltate până în anii '80, cunoscute doar în cercuri restrânse, uneori chiar ridiculizate în cercuri semidocte, ceva mai largi, care rezolvă de fapt diverse probleme ce apar doar când devin evidente cerințele de eficiență, fiabilitate, portabilitate sau chiar estetică, sau alte cerințe atât de subtile încât nu au un nume în vocabularul general. Unele din aceste tehnologii au devenit între timp populare, sau sunt evident în curs de expansiune, odată ce crește în rândul consultanților densitatea celor care ajung să perceapă respectivele necesități subtile. Deseori, la probleme percepute ca noi (deși, de fapt, cunoscute și rezolvate de mult) se așteaptă soluții noi---și atunci se `reîmpachetează' tehnologia mai veche sub o etichetă nouă pentru a accelera adoptarea ei.

Mai jos încercăm să enumerăm câteva dintre ele, începând cu cele mai larg adoptate deja. Toate tehnologiile prezentate au atins stadiul maturității depline și al standardizării de cel puțin 10 ani și au fost și mai sunt folosite în aplicații masive, uneori gigantice, unele fiind la un moment dat, sau chiar actualmente, soluțiile unice sau cel puțin majore ale unor clase întregi de probleme. Toate sunt accesibile oricărui programator interesat cu costuri și eforturi simbolice, de regulă liber, pe Internet. Dar, din niște motive misterioase, în multe din facultățile noastre de profil nici nu se pomenește de ele. Unele sisteme descrise mai jos sunt componente standard ale oricărei distribuții de Linux și mulți utilizatori s-ar putea să le aibă de fapt deja instalate pe propriile PC-uri.

SGML

O problemă clasică a fost descrierea conținutului și structurii logice a documentelor, separat de elementele grafice ale așezării în pagină, în scopul stocării și regăsirii automate a documentelor în organizații mari cum este administrația Statelor Unite. În acest scop au fost inventate o serie de limbaje de marcare care au culminat cu formularea SGML (standard generalised markup language) de către IBM, care s-a maturizat suficient pentru a fi adoptat de ISO în 1986. Acest limbaj este de o complexitate, generalitate și impenetrabilitate legendară, dar nici măcar această legendă n-a depășit nici astăzi lumea utilizatorilor tehnici din câteva guverne și câteva edituri. Limbajul SGML rezolva însă, practic definitiv, problema standardizării reprezentării documentelor. [1]

Nici unul din `procesoarele de texte' larg folosite începând din anii '80 n-a adoptat măcar în parte soluția definitivă menționată, fiecare (WordStar, WordPerfect, Word for DOS, nenumaratele versiuni de Word for Windows, Ventura Publisher, Adobe Pagemaker, framemaker și multe altele) implementând propriul ad-hoc, de regulă (și poate intenționat uneori) incompatibil cu toate celelalte. Utilizatorii, în cvasitotalitatea lor amatori, proaspeți fani ai noilor pc-uri, au luat dificultățile de interoperare ca naturale și s-au descurcat cum au putut (de regulă, jalnic).

Problema interoperării a luat proporții cu extinderea rețelei Internet, pentru că transmiterea de documente electronice s-a accelerat. O soluție incipientă a fost formatul HTML, o aplicație de SGML. Separarea formei de conținut nu a fost respectată riguros până la versiuni mai tardive de HTML și introducerea limbajului CSS (pentru descrierea stilurilor). SGML-ul în (aproape) toată generalitatea lui a atins reala popularitate sub numele de XML abia prin anul 2000, iar ralierea procesoarelor de texte la standard nu s-a făcut nici în ziua de azi. Dar un standard pentru reprezentarea documentelor produse manual în SGML tocmai a fost totuși finalizat (ODF). Unul dintre sistemele Office (OpenOffice) este în plină ofensivă pentru segmentul de piață tocmai pe baza acestei standardizări, a cărei rațiune începe în sfârșit să fie înțeleasă larg.

Documentația de linux este întreținută cu un SGML numit docbook, iar instrumentele și documentătiile necesare sunt componente standard ale oricărei distribuții de linux.

Mașini virtuale, mainframe

Nevoia de a rula mai multe programe în paralel pe același procesor, sau mai multe fire (thread-uri) de execuție în același program este o parte a nevoii de a partaja resursele aceluiași sistem între mai mulți utilizatori sau între mai multe configurații (incluzând instanțe ale unor sisteme de operare potențial diferite și imagini diferite asupra perifericelor accesibile) pe același hardware.

Această partajare face ca o resursă ale cărei costuri și accesibilitate (inițiale sau de întreținere) sunt mari să își poată găsi mai multe aplicații simultan. Pe acest drum, de la o mașină izolată cu un singur utilizator care lansează un singur program până la un sistem în care tot mai mulți utilizatori să aibă impresia că dispun de mașini separate (în sensuri tot mai largi) a fost început cu primele calculatoare și a continuat într-o istorie neîntreruptă a evoluției calculatoarelor mainframe și continuă și astăzi.

Aceeași evoluție se întâlnește și la calculatoarele personale, de la mașini cu un procesor și fără management de memorie până, astăzi, la noua modă cu mașinile virtuale (vmware, xen) și cu server-ele de Linux virtuale închiriabile (vserver).

O problemă conexă, a cărei rezolvare pe scară largă este impusă de nevoile server-elor de rețea, este partajarea fiabilității unei instalații de server. La ce evenimente trebuie ne-am dori să reziste un server de rețea, fără nici o întrerupere? La o pană de curent de 1 secundă, de 1 oră sau de 1 săptămână, la defectarea unui ventilator, a unui harddisk, a unui procesor, la distrugerea printr-o catastrofă naturală a clădirii în care se află server-ul, la reconfigurarea unor utilitare, la upgrade-ul lor, la upgrade-ul sistemului de operare, la upgrade-ul hardware-ului? Toate aceste probleme s-au rezolvat de mult. Dar, din ce cerem o fiabilitate mai mare, din aceea costă mai mult și devine tot mai necesar ca aceste costuri să se distribuie între mai multe aplicații ale aceleiași resurse, iar soluția tehnică este mașina virtuală.

Tehnologia M (MUMPS, GT.M, VistA)

M este un sistem de gestiune a bazelor de date de string-uri și un limbaj de programare specializat în prelucrarea acestor baze de date. A fost dezvoltat la MIT și Massachusetts General Hospital în anii '60 pentru gestiunea datelor clinice ale pacienților și a fost aplicat pe scară largă în rețeaua de spital `Veteranș Administration'. La un moment dat s-a decis administrativ înlocuirea sa prin alt sistem, dar schimbarea s-a dovedit imposibilă. Actualmente multe eforturi naționale de standardizare a datelor despre pacienți se bazează pe M.

O altă clasă largă de aplicații o constituie baze de date ale unor instituții financiare (ING, Lloyd's). Aplicațiile medicale ale Linux-ului par a fi aproape sinonime cu noua încarnare, open-source, a sistemului, numită VistA (vezi de exemplu [3])

`Calitatea sa subtilă' pare a fi potrivirea între modelul de reprezentare a datelor și problema de rezolvat, dar ar putea avea și alte calități care țin de fiabilitate și eficiență.

Autorul, deși medic, nu știe foarte multe despre acest sistem, iar sintaxa sa îi cam displace; motivul pentru care este inclus aici este observația că VistA este adoptată tot mai larg la nivel global și că este o tehnologie foarte veche, standardizată ISO de mult, și care, pe undeva, a renăscut de două ori.

TeX

Spre deosebire de toate celelalte exemple, care au fost create în câteva decenii fiecare, una din `calitățile subtile' ale acestui sistem s-a distilat în experimente care au durat câteva secole: regulile de estetică ale textului tipărit. Forma tipografică trebuie, ideal, să fie un martor perfect din punct de vedere estetic, care să încânte percepția subconștientă, dar tăcut, care să nu interfere în nici un fel cu conștientul cititorului pentru a nu-l abate de la firul lecturii.

Această calitate este în mod special dificil de obținut în tipărirea formulelor matematice, chimice, a partiturilor și altor reprezentări de specialitate.

Regulile esteticii tipografice făceau obiectul unor lucrări voluminoase și puteau fi asimilate doar după o lungă ucenicie care presupunea diferențierea și dezvoltarea simțului estetic al viitorului tehnoredactor. Prin anii '70, un matematician, Donald Knuth, profesor de `arta programării calculatoarelor' la Stanford s-a însărcinat cu codificarea acestor reguli într-un program de calculator, cu scopul inițial de a realiza stocarea electronică a textelor de matematică și în special arhiva Societății Americane de Matematică (sponsorul proiectului).

TeX a avut (și a rezolvat) o serie de cerințe care i-au conferit printr-o combinație de efecte diverse `calități subtile':

  • pentru a-și îndeplini funcția de arhivare, același fișier sursă trebuie să producă exact același rezultat grafic pe orice combinație calculator/dispozitiv grafic (sau imprimantă), existentă la data scrierii sau oricând în viitor; nu numai în principiu, dar TeX trebuia să fie efectiv portabil și portat pe orice mașină/imprimantă existentă sau viitoare;
  • autorii nu trebuie să știe mai nimic despre regulile estetice menționate ci doar sintaxa limbajului (uneori destul de simplă, un text alfanumeric terminat cu '\end' este de exemplu un 'program' TeX corect care se tipărește sub forma unui document de calitate) toate aspectele de formă tipografică specifice documentului trebuind sau asigurate de sistem sau introduse într-un fișier separat de un tehnoredactor; această calitate trebuia păstrată la niveluri multiple de competență estetică și TeXistică ale unei posibile ierarhii de tehnoredactori;
  • trebuia să fie posibilă reprezentarea estetică a oricărei scrieri, alfabetice, silabice, ideografice sau schematice, dispărute, curente sau care avea să fie inventată într-un viitor rezonabil;
  • trebuia să fie facilă generarea conținutului, sau unei părți a conținutului documentelor în mod automat (de exemplu, în sensul sistemului Sweave [4]).

La aceste cerințe s-au adăugat cerințe personale ale autorului, cum ar fi o anumită cvasiperfecțiune a programului și documentației, astfel încât programul să ilustreze--pentru uzul studenților--fezabilitatea scrierii unui program care rezolvă o problemă reală și este în acelaști timp perfect din punct de vedere ingineresc. Indirect, această cerință este legată de cea de portabilitate în timp și spațiu, pentru că dacă programul ar avea erori ar avea și versiuni multiple iar textele n-ar mai fi portabile. Cvasiperfecțiunea programului este demonstrată prin concordanța între implementare și manualul de utilizare (desigur, elaborate separat) și prin oferirea unui premiu pentru orice divergență raportată autorului. În realitate s-au descoperit mici discordanțe, foarte ezoterice, o dată la câțiva ani, și sistemul are versiuni succesive dar diferențele între ele sunt chiar neglijabile și pentru a exprima această dispariție asimptotică a erorilor, versiunile sunt numerotate prin siruri tot mai lungi de zecimale ale numărului π, convergând spre acest număr.

Sistemul TeX nu a fost standardizat oficial pentru că nu era nimic de standardizat: există practic o singură sursă și un singur manual care sunt la fel de valabile și funcționează identic pe toate tipurile și combinațiile de hardware.

TeX a fost adoptat rapid pentru tipărirea și arhivarea documentelor tehnice, în special din matematică și fizică, de cele mai multe organizații de profil, cum ar fi Asociația Americană de Matematică, Societatea Americană de Fizică, IEEE, IEE, ACM, arxiv, cvasitotalitatea editurilor de publicații tehnice și științifice și de firme ca HP și IBM. Utilizarea lui este in creștere, mai ales recent; de exemplu numărul de hit-uri la una din arhive a crescut cu 60\% între aprilie 2005 și aprilie 2006 [5].

Asta nu l-a împiedicat pe un amic, mare specialist în Linux, să exclame mai deunăzi într-un e-mail: `sublimul (La)Tex e inaccesibil/inutil pentru 99.995% din userii de computere (putem constata asta si statistic)'. Ținând cont că în majoritatea țărilor dezvoltate, în care mai toată populația activă este ă din utilizatori de calculatoare, proporția celor cu studii superioare și angajați în cercetare științifică e cam de 3\%, cam jumătate activând în inginerie și științe cantitative, dar și de utilizarea de către studenți și practicieni, probabil că o estimare mai realistă a proporției nesemnificativilor utilizatori de TeX este între 1 și 5% din toți utilizatorii.

Totuși, este un sistem în mare parte necunoscut publicului. Și s-ar putea să rămână așa, dar în același timp majoritatea populației să înceapă să-l folosească fără să știe, deoarece formează o combinație excelentă ca motor de tipografie pentru documente sau date SGML (ale cărui reîncarnări devin rapid modul preferat de stocare a documentelor, chiar daca acronimul e în general necunoscut).

O astfel de combinație este folosită în distribuțiile de Linux. TeX este sistemul de typesetting standard, toată documentația de Linux fiind pusă în forma tipărită în TeX, dar reprezentarea sursă fiind docbook-sgml.

APL (notația Iverson, J, S, Splus, R)

APL este un limbaj de programare care excelează în operatori matriciali și în conciziunea cu care se pot exprima prelucrări complexe ale unor seturi de date. Din el a fost inspirat un limbaj de prelucrare statistică a datelor numit S, dezvoltat prin anii '70 la Bell Laboratories. S a combinat o sintaxa mai familiară, asemănătoare C-ului, cu operatori matriciali și cu proceduri statistice și grafice.

Cea mai mare parte a cercetării în institutele și facultățile de profil s-a făcut în acest limbaj, așa încât s-au făcut biblioteci cu aproape toate metodele statistice cunoscute, implementarea în S precedând de regulă alte implementări. Dezvoltarea lui a fost preluată de o firmă privata, dar din 1988 o echipă din lumea statisticii academice a dezvoltat o versiune free, numită R, care este un frontend S cu un backend Scheme. Acest proiect s-a dezvoltat spectaculos, acoperă azi practic `toată' statistica și a înglobat și echipele altor proiecte cu surse deschise `concurente' așa încât azi nu mai are practic decât concurenți comerciali. R ar putea reprezenta punctul de convergență al statisticii computaționale pentru multă vreme de-acum înainte.

Sistemul R este inclus în toate distribuțiile Linux de uz general.

Lisp

Limbajele de programare se distribuie, după intenția proiectantului lor, între două extreme: limbaje apropiate de mașină și limbaje apropiate de gândirea omenească. În afara limbajului de asamblare, toate celelalte sunt limbaje care fac o concesie familiarității pentru programatorul uman, eventual în dauna eficienței sau simplității compilatorului.

La celălaltă extremă se găsește Lisp, un limbaj care la origine (în anii '50) a fost o simplă notație pentru care nu se intenționa o implementare. Limbajul Lisp este o reprezentare formalizată, foarte abstractă, a gândirii omenești despre date, numere, tipuri, algoritmi, funcții, simboluri, metode și agregate ale acestora. Într-o formulare suficient de abstractă de fapt toate aceste elemente se reprezintă până la urmă prin același fel de structuri.

Evident, această reprezentare ar fi interesantă dar, cel puțin în implementarea directă, deosebit de ineficientă. Este mai subtil evident că o reprezentare cu suficientă putere de expresie, ale cărei consecințe sunt explorate suficient de departe, poate realiza și traducerea (compilarea) unor astfel de reprezentări în programe mașină la fel de eficiente cu cele scrise direct în cod, programatorul nefăcând altceva atunci când programează decât să traducă astfel de reprezentări într-un limbaj apropiat de mașină, manipulându-le ca pe niște date. Oricărui cititor avizat ar trebui însă să-i fie evident că scrierea unui asemenea compilator trebuie să fie un proiect gigantic, poate posibil doar în teorie.

În realitate însă, un astfel de compilator este posibil practic și s-a scris. Este adevărat că durat aproape o jumătate de secol, este adevărat că din credința imposibilității lui practice s-a născut o întreaga industrie (a mașinilor Lisp) care ulterior a dispărut, și este adevărat că toată povestea e neverosimilă. Dar este tot așa de adevărat că este reală și că un program Lisp echivalent cu un program Fortran va fi compilat, dacă este scris corect, la fel de eficient de compilatorul de Lisp, de exemplu de cmucl, ca și de cel de Fortran [8].

Lisp-ul este un limbaj atât de general încât interpretoare sau compilatoare ale tuturor limbajelor se pot redefini în Lisp prin programe relativ triviale, chiar dacă uneori voluminoase, făcându-le---dincolo de considerente practice de moment---inutile pentru clase largi de probleme. Mediul de programare Lisp are nevoie de zeci de Mb de memorie și de procesoare de o viteză decentă (măcar de ordinul a 1 GHz), dar aceste cerințe au fost îndeplinite de curând pe scară largă.

Clase importante de mecanisme de expresie în lisp, cum ar fi macro-urile structurale [9]

Standardul de Lisp, adoptat de ANSI și ISO în anii '80 poartă numele de CommonLisp, un limbaj extensiv care tratează ca esențială compilabilitatea eficientă. Un alt standard (adoptat de IEEE) privește un dialect reducționist de Lisp, numit Scheme.

În special în forma reducționistă, Lisp-ul este un instrument minunat pentru formarea unei minți deschise și armonioase în chestiuni de programare. Din această cauză este folosit ca prim limbaj de programare pentru novici în multe universități de vârf, începând cu M.I.T. [6].

Prin acest proces și prin calitățile intrinseci ale limbajului, mulți specialiști (printre care R. Stallman și P. Graham) prezic în viitorul apropiat înlocuirea cvasitotalității celorlalte limbaje, în special cele de scripting, cu Lisp. Guile, de exemplu, este un proiect care urmărește în mod specific unificarea limbajelor de scripting cu Scheme. Este adevărat că această profeție nu se poate împlini complet decât în aproximativ două generații profesionale (până când generațiile care au pornit în programare cu Pascal sau Java, și mai ales nefericiții care au descoperit programarea prin Basic, vor ieși la pensie) dar este indiscutabil că anvergura aplicațiilor Lisp este în creștere.

O categorie de limbaje care nu vor putea fi însă înlocuite de Lisp sunt cele de timp real, descrise mai jos.

O primă expansiune a infrastructurii limbajului a fost apariția și propagarea mașinilor virtuale interpretate gen Java Virtual Machine, care împrumută mecanisme mai simple ale mașinii Lisp.

Între limbajele în care sunt scrise sursele unei distribuții standard de Linux, Lisp ocupă locul 4 ca număr de linii de program (după C, C++ și Shell). Distribuțiile de Linux de uz general vin de regulă cu doua sau trei medii complete de CommonLisp (gcl, cmucl, clisp), cu multiple versiuni generale de scheme (guile, scm, rscheme) și cu mai multe dialecte de Lisp ca limbaje de extensie ale unor utilitare (gimp, emacs, R).

Ada și VHDL

Pentru o clasă importantă de programe ciclul editare-compilare-testare nu funcționează, în sensul că testarea în condiții reale este imposibilă. Un exemplu extrem este o navă spațială: nu se poate testa direct faptul că programul care o controlează va funcționa conform cerințelor în condițiile reale. La fel pentru un element de muniție (cu software incorporat) și la fel pentru orice software care urmează să funcționeze în condiții despre care putem simula un scenariu pe care ni-l imaginăm noi, dar pe care nu le putem descrie în întregime. Și la fel pentru un design de circuit integrat, despre care nu se știe sigur dacă va funcționa decât după ce va trece faza costisitoare a producției.

La o examinare mai atentă, această dificultate de a testa se întâlnește de fapt în tot mai multe sisteme software și în special în aplicații de rețea care rulează multiple fire de execuție---de exemplu, câte unul pentru fiecare utilizator---fire care interacționează între ele. La extrema cealaltă se găsesc programe `batch', cu intrări de date simple și complet cunoscute, care se execută determinist.

În programele multithreaded apare o clasă de erori care nu se pot reproduce prin testare pentru că este implicată secvența de execuție a thread-urilor, așa cum s-a întâmplat să se producă sub acțiunea evenimentelor exterioare.

Problema este atât de severă încât schema actuală general acceptată pentru abordarea ei o ocolește fără ca măcar s-o menționeze. Această schemă (numită și LAMP adică Linux Apache MySQL Perl/PHP/Python) separă problema firelor de execuție care interacționează în motorul de baze de date (MySQL), în Apache și în Linux, programe cu o definiție relativ fixă, la care s-a ajuns in zeci de ani și testate de milioane de utilizatori, programatorul scriind de fapt componente care pot fi considerate programe (script-uri) batch.

Dar forțarea aplicațiilor în această schemă impune distorsiuni, ineficiențe și complicații care sunt tot mai problematice pe măsură ce dorim mai multă funcționalitate/performanță de la aplicația de web respectivă.

Din această cauză soluția problemei generale de a putea prezice că programul va funcționa, fără să fie posibilă testarea lui propriuzisă, ar putea să devină tot mai relevantă.

Limbajele, oarecum înrudite, Ada și VHDL au fost proiectate anume ca să asigure că dacă un program se compilează este foarte probabil ca el să și funcționeze. Limbajul Ada a fost impus de criticitatea aplicațiilor aerospațiale și militare descrise la început, este standardizat MIL (din 1983) și ISO (din 1995) și cu ajutorul său este scris software-ul de control din majoritatea sistemelor de armament și avionică moderne. Nu este aici locul să povestim cum s-a atins această `calitate ascunsă', dar în parte programele se scriu cu un fel de redundanțe care, în caz că se fac erori de scriere, vor permite compilatorului să le detecteze înainte să se ajungă la execuție---cumva tot așa cum concordanța între cod și documentație, produse separat, a asigurat lipsa de erori a programului TeX.

Compilatorul de referință al standardului ISO curent, Ada-95, cu toate extensiile existente și propuse este parte din GCC. Sintaxa sau structura limbajului se regăsește în alte limbaje, unele experimentale (Eiffel, AdaScript) altele de producție și larg utilizate (VHDL, PL/SQL).

Sisteme cu microkernel

Aceste sisteme nu sunt descrise aici pentru că evoluția, starea și motivele pentru care, în condițiile unei conștientizări tot mai largi a importanței fiabilității și eficienței, vor avea o importanță tot mai mare sunt expuse în altă parte mai bine decât aș putea-o face eu.

COBOL

Limbajului COBOL, standardizat din anii '60, trebuie să-i recunoaștem o calitate subtilă, dar unică: programele pot fi scrise doar de programatori, dar pot fi citite de oricine, și în special de orice contabil care trebuie să răspundă pentru validitatea rezultatelor. Pentru un motiv neclar, această nevoie de validare directă a programelor de contabilitate nu este încă percepută de profesia respectivă în ansamblul ei, profesie care se împacă deocamdată cu nenumăratele probleme cauzate de imposibilitatea controlului rezultatelor. Dificultatea, ce-i drept, nu survine decât la aplicațiile contabile complexe (care în bună parte sunt deja scrise în COBOL) nu și la cele care încap într-un spreadsheet.

Dacă această calitate specială va reapărea, și dacă sistemul în care o să reapară o să se numească tot COBOL sau o să semenea foarte mult cu COBOL-ul vom vedea.

FORTRAN

Trăiască, în veci, FORTRAN! [2]

Bibliografie

  1. A History of Markup Languages
  2. Real programmers don't use Pascal
  3. Linux Med News
  4. Sweave
  5. The UK TeX Archive. Usage statistics
  6. Structure and interpretation of computer programs
  7. Counting Source Lines of Code (SLOC)
  8. Programming language benchmark
  9. Lisp. Paul Graham

Copyright (c) 2006 A.D. Corlan