Lectia de programare
Asa cum probabil banuiti, n-am venit cu mana goala in urma calatoriei recente. Pe langa miere, tuica de pruna, muraturi, dulceturi si alte diverse produse constituind plata in natura datorata seniorului feudal, m-am ales si cu o domnita tanara si blonzie, binecuvantata cu multe calitati trupesti dar din nefericire victima pana de curand a unei oarecare neglijente in ce priveste educatia. Atat din punct de vedere cat si cultural.
Suflet bun si generos cum ma cunoasteti, am purces de indata la educarea tineretului, sa nu se duca tara - Doamne fereste! - de rapa. Dinjos aveti un exemplu, ca sa stiti si voi, naivii, cum si ce tre' sa vorbesti cu fetele ca sa le iei mintile. Zau asa.
- Eu : auzi
Eu : am o problema de logica pentru tine.
Eu : ai o variabila a, si o variabila b
Eu : acum inverseaza-le valorile.
Ea : ok, le-am inversat.
Eu : um ? ia sa vedem ?
Ea : a = de exemplu 2, b = de exemplu 3, inversate a = 3 si b = 2
Eu : lol. scrie cod care s-o faca, tu!
Ea : in ce limbaj? eu nu stiu nici unul...
Eu : pseudocod, nu conteaza ce limbaj. scrie pur si simplu cum s-ar face.
Ea : um. pai nu-i totuna cu instructiunile pe care mi le-ai dat la inceput?
Eu : nu-i totuna. eu am descris sarcina, tu trebuie sa descrii solutia.
Ea : nu prea pricep ce se cere facut. daca se cere cod pentru a inversa variabilele, dar nu ne pasa de particularitatile unui limbaj, si tot ce avem de facut e sa descriem "cum", "a inversa" suna exact ca acel "cum"
Eu : nu suna. codul intelege doar operatii artimetice cu variabile. nu exista o functie inverseaza(); decat daca o definesti tu.
Ea : a = x, b = y, dupa un moment anumit sau o instructiune numita inverseaza, fie a = y si b = a.
Ea : b = x vreau sa zic.
Eu : da. acum foloseste doar 3 variabile.
Ea : n-am cum sa reprezint doua variabile si valorile lor in trei simboluri.
Eu : sigur ca ai cum. sa-ti dau o sugestie ?
Ea : te rog.
Eu : b nu-i folosit in timp ce a = y
Ea : plm
Ea : a = x, b != x, dupa un moment anumit sau o instructiune numita inverseaza, fie b = x si a !=x
Eu : ce-i fie a != x ?
Ea : fie a egal cu ceva ce nu-i x
Eu : deci aleg orice valoare la intamplare ?
Ea : ah.
Eu : lol
[dupa o pauza]
Ea : frustrant
Eu : de ce ?
Ea : pentru ca n-am idee ce fac, si am incercat in tot felul, si n-am idee cum sa-ti folosesc sugestia, si in general...
Eu : mergi de ia un bol si pune-l pe masa.
Ea : da
Eu : ai un mar ?
Ea : da
Eu : portocala ?
Ea : da
Eu : ia maru-ntr-o mana, portocala-n cealalta si hai napoi.
Ea : bon
Eu : acum, folosind doar bolul, muta portocala in mana cu marul si marul in mana cu portocala.
Ea : facut
Eu : da ? si cum ai facut ?
Ea : am pus portocala in bol, am luat marul in mana din care-am pus portocala si pe urma am luat portocala inapoi in mana cealalta.
Eu : pai scrie cod.
Ea : da am nevoie de 4 variabile (portocala, mar, mana stanga, mana dreapta)
Eu : variabilele sunt cele doua maini si bolul. ele tin date.
Ea : pasul 1, c =b. pasul 2, b = a. pasul 3, a = c.
Eu : dap. bravo. acum fa-o cu doua variabile.
Ea : pasul 1, b = a + b. pasul 2, a = b
Eu : ahahaha! bravo! si 3 ?
Ea : b = a?
Eu : mnoa, acum ai cate-un mar si-o portocala in fiecare mana. nu-i bine. da' esti aproape.
[o alta pauza]
Ea : deci pasul 1, b = a + b. pasul 2, a = b - a.
Eu : mhm. si b = ?
Ea : hrm
Ea : pasul 3, b = b- a.
Eu : ei da. felicitari. acum stii mai mult despre programarea calculatoarelor decat jumatate dintre expertii romani.
Thursday, 1 July 2010
Adevarul e ca de știa tineretul programare 64kb de memorie ajungeau pentru orice aplicație.
Thursday, 1 July 2010
Ruby: a,b = b,a sau chiar a,b,c = c,b+a,a
Thursday, 1 July 2010
@Dr.A Sa nu dezgropam adevaruri triste, zic.
@TBD ;)
Thursday, 1 July 2010
Problema fiind ca daca muta pepeni ii da cu hand overflow.
Thursday, 1 July 2010
Nu exista overflow ca suntem pe o masina teoretica.
Thursday, 1 July 2010
Uite asa incepe totul, cu incetul. Mai intai te opresti sa-ti tragi sufletul, chipurile ii spui bancuri. Peste citiva ani te bucuri cind te suna vreun amic, iti faci de lucru cu telefonul citeva minute bune. Apoi o dai in probleme de logica toata noaptea.
Desi, ca sa fiu sincer, la tine e prea devreme ...
Friday, 2 July 2010
Nț. Fata are dreptate, de exemplu x86 are XCHG atomic implementat în microcod, nu mai ai tu nevoie de implementare explicită. :D
Da' pentru a nu părea tendențios, vroiam să bat spre faptul că depinde pur și simplu care-i nivelul de abstractizare la care lucrezi. Un inginer sau specialist în computer science (adicătelea programator cu calificare) trebuie să știe a abstractiza la orice nivel, de la electronică la programare funcțională. Un programator „strungar”, cum îmi place mie să le spun (adică fără calificare) nu are nevoie de așa ceva, la fel cum nici deținătorul de carnet de șofer nu-i musai să fie șofer.
Sigur, trist e că de pe băncile facultății ies foarte mulți care au pregătire de strungar și nu de inginer.
Da' revenind la exemplul de mai sus, să dau și eu o problemă aproximativ inginerească: de ce în practică se folosește totuși mai des varianta cu trei registre decât cea cu două? (hint: răspunsul nu e „pentru că programatorii-s proști”). Nu-i bai, revin și cu o explicație când am timp dacă e nevoie.
Friday, 2 July 2010
@spyked Pai primo ca noi vorbeam de-o masina teoretica, nu de x86. Si secundo ca fata e la Litere, n-are nici un fel de treaba cu CS. Sau ma rog, cata ai tu cu istoria limbii portugheze.
Cat despre practica, problema de overflow ar trebui sa fie suficienta. Varianta cu 2 nu-i, de fapt, utilizabila in practica.
Friday, 2 July 2010
Faza cu x86 mi-a venit nu știu cum, a fost o glumă. :D
Treaba tocmai aia e, depinde cât de mult abstractizezi în mașina teoretică. Sau dacă presupui că mașina teoretică știe să facă o chestie anume printr-o instrucțiune explicită sau nu. Asta mă gândesc că se alege în funcție de problemă și abia după aia se face trecerea în arhitectură hardware (sau alegerea unui limbaj potrivit, dacă problema-i de software).
Problema cu overflow-ul e suficientă pe 32 de biți, ce-i drept. Pe 64 de biți s-ar putea să nu fie, deși e și acolo o problemă de securitate dacă utilizatorul introduce numere mai mari decât are nevoie doar pentru a face praf programul.
Mie mi-a venit altă chestie în minte, cum mă uitam eu la cele două variante. Pe un calculator cu 8 registre generale, un registru în plus s-ar putea să coste. Pe de altă parte, varianta cu operații aritmetice (btw, văzusem undeva o implementare doar cu operații logice) e mai costisitoare în timp, destul de costisitoare încât să merite mai degrabă să folosești un registru temporar. Și pentru a nu merge chiar până la mașină turing, o să rămân tot la ceva apropiat de x86:
Prima variantă are trei atribuiri, care-s foarte simplu de implementat în orice mașină. A doua variantă e înșelătoare, în sensul că pare la nivel înalt că s-ar putea să folosească doar două registre, dar în spate să folosească tot trei (e vorba de operațiile de adăugare și scădere). Și chiar dacă folosește doar două...
O adăugare înseamnă: ia variabilele, execută operația, stochează, ceea ce-i mai costisitor decât simple atribuiri. Chiar mai mult de atât, scăderea e și mai costisitoare: treci a doua variabilă în cod complementar (două operații: o negare și o adunare cu 1) și adună (încă o operație), ceea ce adaugă semnificativ la ciclurile de ceas ale procesorului.
Deci dacă ai un program care face un milion de iterații cu câte un exchange (lucru foarte posibil în practică), cea de-a doua variantă va fi clar de evitat. Alternativa ar fi optimizarea operațiilor de add/sub la nivel hardware, care adaugă în schimb la costurile hardware-ului. Dar nu-i cazul aici, fiindcă în practică lucrăm pe mașini de uz cât mai general.
Friday, 2 July 2010
Din punctul asta de vedere ai clar dreptate ca varianta cu 3 registrii si atribuiri, evitand adunari-scaderi e departe mai rapida.
Nu-mi dau seama asa extemporal pe ce tip de masina situatia ar fi simetrica, desi teoria matematica pare a indica c-ar trebui sa existe o simetrie.
Varianta cu operatii logice creeaza doi registri impliciti in registrul folosit, si practic eludeaza astfel. shift b len a ; b V a ; in loc de adunare.
Friday, 2 July 2010
nu prea cred ca e fata, mirceo, ca ti-a scapat acolo un plm! ;)
Friday, 2 July 2010
Si pe mine ma uimeste trendu' asta nou sa vorbeasca fetili cu plm, da' el exista, din nefericire.
Thursday, 18 November 2010
:)) Foarte tare. Dar oameni buni nu e de ras, nu multi stiu programare dar intr-adevar, faza e de ras :))
Thursday, 18 November 2010
Ma bucur ca te-a distrat :D
Saturday, 19 May 2018
Există și o variantă cu sau exclusiv (XOR) - notat mai jos prin ⊕) - care ar trebui să fie mai eficient decât o operație aritmetică de scădere sau adunare. Teoretic, că practic conform unui tabel până și pe 8086 aveau aceeași durată de execuție.
a ← x
b ← y
a ← a ⊕ b = x ⊕ y
b ← b ⊕ a = y ⊕ (x ⊕ y) = y ⊕ x ⊕ y = y ⊕ y ⊕ x = (y ⊕ y) ⊕ x = 0 ⊕ x = x
a ← a ⊕ b = (x ⊕ y) ⊕ x = x ⊕ y ⊕ x = x ⊕ x ⊕ y = (x ⊕ x) ⊕ y = 0 ⊕ y = y