Articol scris de Major Tom, singurul cititor al acestui blog care a fost în vizită într-un univers paralel.

Cineva trebuia să-și facă mila și de ITști, nu-i putem marginaliza la nesfârșit pentru micile și neînsemnatele lor aroganțe. Până la urmă au și ei dreptul să înțeleagă ce fac. Glumesc, da ?

Acum că mi-am asigurat toata antipatia de care aveam nevoie, pot răsufla ușurat știind că voi găsi toată îngăduința în cazul în care dau cu bățul în baltă.

NOTĂ: Multe concepte sunt simplificate sau chiar ușor distorsionate pentru a face articolul mai digerabil.

Computația reprezintă proprietatea unui sistem de a rezolva probleme. Primul sistem cu această proprietate care probabil vă vine in minte se numește “socotitoare” – sublim nume. În funcție de numărul de linii și coloane, poți rezolva ecuații polinomiale mai simple sau mai complexe. O ecuație polinomială este o ecuatie inventată pentru a-l găsi pe X exclusiv cu ajutorul operatorilor matematici de bază:

  • adunare
  • scădere
  • înmulțire
  • împărțire

În matematică există mai mulți operatori, dar sunt derivabili din acești operatori prin serializare.

Problema cu socotitoarea este că e un sistem foarte lent și limitat ca spatiu de stocare. Pentru a rezolva o problemă matematică complexă, este mai ușor să folosești o foaie și un creion. Pentru a crea un sistem care rezolvă orice problemă din viața reală (clasică, nu cuantică) avem nevoie de un set de reguli care să poată reprezenta abstract orice problemă matematică. Până în anii 1930 nu exista nici un model logic și repetabil de abordare a oricarei probleme matematice. Existau o grămadă de abordări diferite (moștenite toate din procesul de transformare numit “calculus”), fiecare abordare fiind limitată de rezolvarea unui set restrâns de probleme.

Ce înseamnă de fapt a calcula? E un proces de transformare a informației într-o informație cu entropie diferită.

Generalizarea computației clasice

În anii 1930, matematicianul logician american Alonzo Church vine cu primul model structurat de calcul care poate rezolva orice problemă clasică și il numeste “Lambda calculus”. λ-calculus este practic primul limbaj de programare capabil să rezolve abstract pe o foaie de hartie absolut orice problema clasică. Este un limbaj de programare pur funcțional (in λ-calculus informația este reprezentată ca o funcție), care se poate interpreta și rescrie singur.

Diviziunea celulară, cel mai spectaculos proces de transfomare a informației, se poate reprezenta în λ-calculus ca o expresie lambda numita “Y Combinator”.

Automatizarea și accelerarea computației clasice

λ-calculus e un limbaj de programare gândit pentru a fi folosit pe o foaie de hârtie, dar era nevoie de automatizare și accelerare a procesului de calcul.

Cred că ați auzit de Alan Turing, matematicianul și criptanalistul care a spart codul aparatului de encriptare nazist Enigma, salvand numeroase vieți omenești. A contat prea puțin, problema principală era orientarea lui sexuală de neiertat în rândul primatelor.

În fine. În anul 1936 el vine cu primul model abstract al unei mașini de calcul numită mașină Turing. O mașină Turing este primul model abstract și strămoșul computerelor de astăzi. Ce e așa special la mașina asta ? Păi definește într-un mod abstract pașii pe care o mașină de calcul mecanică sau electronică trebuie să-i parcurgă pentru a putea rezolva orice problemă clasică. Pentru a putea sparge Enigma, Turing a avut nevoie să automatizeze și să accelereze procesul de calcul, construind o mașină de calcul acționată mecanic, folosind modelul abstract al mașinii Turing inventate de el în 1936. Aveți mai jos o animație gif captată de aici: turingmachine.io

Ceea ce vedeți în animație reprezintă o secvență de pași efectuați de o mașină Turing. Pașii aceștia compun un “program”. În exemplul de față, scopul programului este de a însuma aritmetic valoarea inițială, decimală 11 reprezentată de cei 4 biți (1011 binar = 11 decimal), cu valoarea decimală 1. Adică 11+1 = 12 (1100 binar = 12 decimal).

Pentru a citi valoarea inițială 11, mașina trebuie să parcurgă 4 pași, ca să citească cei 4 biți. După citire va trebui să rescrie primii 3 biți pentru a obține valoare decimală 12.

Destul de banal, însă acest model procedural stă la baza automatizarii computației clasice. E principiul fundamental pe care se bazează computația clasică.

FAQ:

În ce limbaj de programare este scris acest mic program ?

 În cazul de față este scris in cod mașină. Codul mașină este unic pentru fiecare tip de mașină/arhitectură în parte, fie că e vorba de procesorul unui Smartphone, fie că e vorba de o mașină Turing mecanică.

Într-o caracterizare superficială, definiția codului unei mașini cu trei taste colorate (alb, negru, roșu) ar suna așa:

  • dacă apeși tasta albă o singură dată, capul de citire sare o poziție în față;
  • dacă apeși tasta neagră, sare o poziție în spate;
  • dacă apeși tasta roșie, salvează valoarea temporară într-un acumulator de valori,

Ați prins, cred, ideea.

Practic, pentru a introduce și rula un program într-o mașină, ai de executat o serie de tastări pe care astăzi noi le numim “opcode” atunci când rulează direct pe hardware sau “bytecode” când rulează în mașini virtuale. Astăzi opcodeul reprezintă adresele instrucțiunilor suportate de procesor (move, add, load, store etc.). Acest set de instrucțiuni este specific fiecărui procesor în parte.

Procesorul unui smartphone, de exemplu, având un set redus de instrucțiuni (ceea ce îl ajută să economisească baterie), se numște un procesor RISC, pe când procesorul clasic pe care îl știți (x86) are un set complex de instrucțiuni, adică este un procesor CISC.

Poate el fi scris în λ-calculus ?

Da, poate fi scris în λ-calculus pentru că este un limbaj de programare “Turing complete”, adică poate fi tradus în cod mașină, deci pentru a-l rula pe mașina noastră de calcul, avem nevoie ca cineva (om sau un alt program) să-l interpreteze (adică să-l înțeleagă) și cineva (om sau alt program) să îl compileze (traducă) în codul pe care mașina de calcul îl întelege, adică combinația specifică de butoane.

Notă: Turing și-a susținut teza de doctorat cu Alonzo Church drept profesor.

Există limbaje de programare sau proccesoare care nu sunt “Turing complete” ?

Da. De exemplu, limbajele de programare a graficii 3D (numite shaders) nu sunt TC și nici  procesoarele DSP nu sunt TC pentru că nu sunt proiectate pentru a rezolva probleme generale. Sunt proiectate pentru a rezolva probleme specifice foarte eficient și rapid.

De ce valorile sunt reprezentate binar și nu decimal ?

Pentru că a fost mai convenabil dpdv mecanic dar si dpdv electronic să foloseșsti un comutator în 2 poziții, în locul a 10 poziții. Întrerupatorul acționat mecanic cred că îl știți cu toții. Întrerupătorul acționat electronic se numește tranzistor.

Evoluția computației clasice.

În 1945, matematicianul și fizicianul de origine maghiară John Von Neumann vine cu prima arhitectură evoluată a unui computer (arhitectura Von Neumann) și descrie primul model abstract evoluat și structurat al unei mașini Turing, pe care noi astăzi îl numim computer. (De fapt astăzi utilizăm arhitectura Harvard, care este la rândul ei un model evoluat al arhitecturii Von Neumann).

Prezentul computației clasice

Computația modernă așa cum o știți se bazează pe tranzistori. Tranzistorul este un simplu comutator acționat electronic. Cu cât frecevența de acționare a comutatorului este mai mare, cu atât mai rapid termină de efectuat o operație. Dacă dorim creșterea numărului de operații, atunci vom crește numărul de tranzistori în procesor.

Tranzistorul este componenta fundamentală în computație.

El funcționează simplu. Este format din 3 terminale asa cum se vede in imaginea de mai jos (bază, colector și emitor). Inițial, între emitor și colector nu circulă curent, adică 0 logic, ceea ce înseamnă că tranzistorul este închis. În momentul în care aplicăm o tensiune, la baza lui se formează un canal conductor între emitor și colector, adică tranzistorul este deschis și reprezintă valoarea logică 1.

Din tranzistori se formează celule logice de baza (Flip-Flop/Latch/D-Latch etc.) care pot stoca sau șterge valori logice. Mai simplu spus, acestea sunt blocuri fundamentale de memorie statică. Din aceste celule de baza sunt formate blocuri mai avansate pe care le vedeți în specificații denumite NAND, NOR etc.

În ultimii 30 de ani, necesitatea creșterii computației a condus la creșterea densității numărului de tranzistori în procesor. Poate ați auzit de legea lui Moore, care spune că densitatea se dublează odată la 2 ani. Pentru a dubla densitatea trebuie micșorată distanța dintre emitor și colector. Problema este că am cam atins limita. Limita legii lui Moore este de 5 nanometri. Mai jos de distanța asta apare fenomenul numit “quantum tunneling” care impiedică închiderea tranzistorului. Un tranzistor care nu poate fi controlat e total inutil. Cei din industrie au totuși niște idei care rezolvă problema, înconjurând baza tranzitorului. Astăzi distanța dintre emitor și colector este de 7nm în tehnologie FinFet sau 12nm in tehnologie FD-SOI.

Viitorul computației clasice

Necesitatea creșterii puterii de calcul e abia la început, însă creșterea numărului de tranzistori nu este suficientă. Avem nevoie de creșterea paralelismului per instrucțiune.

Aici intervine computația cuantică despre care vom vorbi data viitoare. Un alt domeniu care prinde tot mai multe rădăcini odată cu avansul nanotehnologiei (în principal avansul în industria litografică), este computația moleculară.

Dați un search pe youtube după “molecular machines”. Sunt practic ansamble mecanice la nivel molecular. În corpul nostru găsim o serie de mașini moleculare, însă nu sunt Turing complete.

ADNul este și el un subansamblu al unei mașini moleculare. Nici mașinile (computerele) moleculare, nici computerele cuantice nu sunt o alternativă la computația clasică bazată pe tranzistori, sunt doar o extensie care duce la rezolvarea unor probleme foarte specifice de paralelism, în cazul computerelor cuantice sau de miniaturizare la nivel molecular în cazul computerelor moleculare.

Recomandare de carte: The Information: A History, a Theory, a Flood.