Lectia de programare

Thursday, 01 July, Year 2 d.Tr. | Author: Mircea Popescu

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.

Category: Trilenciclopedia
Comments feed : RSS 2.0. Leave your own comment below, or send a trackback.

16 Responses

  1. Adevarul e ca de știa tineretul programare 64kb de memorie ajungeau pentru orice aplicație.

  2. Ruby: a,b = b,a sau chiar a,b,c = c,b+a,a

  3. Mircea Popescu`s avatar
    3
    Mircea Popescu 
    Thursday, 1 July 2010

    @Dr.A Sa nu dezgropam adevaruri triste, zic.

    @TBD ;)

  4. Problema fiind ca daca muta pepeni ii da cu hand overflow.

  5. Mircea Popescu`s avatar
    5
    Mircea Popescu 
    Thursday, 1 July 2010

    Nu exista overflow ca suntem pe o masina teoretica.

  6. 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 ...

  7. 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.

  8. Mircea Popescu`s avatar
    8
    Mircea Popescu 
    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.

  9. 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.

  10. Mircea Popescu`s avatar
    10
    Mircea Popescu 
    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.

  11. Mihai`s avatar
    11
    Mihaiinsigna de prim sositinsigna de trolinsigna pentru 1000 de comentarii 
    Friday, 2 July 2010

    nu prea cred ca e fata, mirceo, ca ti-a scapat acolo un plm! ;)

  12. Mircea Popescu`s avatar
    12
    Mircea Popescu 
    Friday, 2 July 2010

    Si pe mine ma uimeste trendu' asta nou sa vorbeasca fetili cu plm, da' el exista, din nefericire.

  13. :)) Foarte tare. Dar oameni buni nu e de ras, nu multi stiu programare dar intr-adevar, faza e de ras :))

  14. Mircea Popescu`s avatar
    14
    Mircea Popescu 
    Thursday, 18 November 2010

    Ma bucur ca te-a distrat :D

  15. 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

  1. [...] tot discutam subtilitati de teoria programarii masinilor numerice sub acoperirea unor intamplari absolut banale - acoperire care spre incantarea mea n-a impiedicat cititorii sa urmareasca firul discutiei - hai [...]

Add your cents! »
    If this is your first comment, it will wait to be approved. This usually takes a few hours. Subsequent comments are not delayed.