CNIV 2019

Câteva aspecte privind activitatea în utilizarea limbajelor de programare


BUCUREȘTI 20 FEBRUARIE 2019, CNIV România
Prof. dr. Valeriu Iorga, Universitatea Politehnica București
From M. Vlada, https://mvlada.blogspot.ro/


Referință la această pagină (utilizarea de text sau imagine se va face cu citarea referinței): V. Iorga,Câteva aspecte privind activitatea în utilizarea limbajelor de programare http://www.c3.cniv.ro/?q=2019/v-iorga , 2019

Recent, am aflat de pe mediul virtual că ”... limbajul Python a fost adoptat oficial, alături de Java și C++ ca limbaj în concursurile ACM”. Concurenții nu au fost prea impresionați, dovadă că puțini au decis să-l folosească, dar există opinia că limbajul se va impune încet și sigur. Pentru mine a fost o surpriză plăcută, întrucât se reunesc două bune cunoștințe ale mele: una mai veche – concursurile ACM și alta mai nouă – limbajul Python. Deci, voi vorbi despre amândouă.

I Impresii despre limbajul de programare Python

Timp de 40 de ani, la Facultatea de Automatică și Calculatoare – Universitatea Politehnica București (UPB) (foto: agerpres), am predat limbaje de programare (cursul “Programarea Calculatoarelor”) studenților din anul I, folosind ca limbaje de programare FORTRAN, Pascal și C/C++. Desigur că, în cursul acestor ani mi-am pus întrebarea: care ar fi cel mai potrivit limbaj pe care să-l învețe un începător? Mie mi-au plăcut limbajele Algol 60 și Pascal. Dar, iubirea cea mare am găsit-o în ultimul timp și se numește limbajul Python. Limbajul a fost conceput la începutul anilor ’90 de danezul Guido Van Rossum, care pe lângă informatician este și matematician.

Interesul pentru acest limbaj de programare mi-a fost trezit de laudele ce i-au fost adresate de un fost student. Am găsit pe Internet cărți potrivite (Rick Halterman – Fundamentals of Python Programming, Fabrizio Roman – Learning Python) și am pornit la treabă pentru a testa si a cunoaște cum se programează în acest limbaj.

Pentru a evita o lectură superficială, am instalat pe Laptop cea mai nouă versiune de Python și, după o primă lectură, am început să rezolv diferite probleme, pentru a face o comparație cu limbajul C++. Este o diferență enormă! În primul rând, m-a surprins simplitatea sintaxei. Ce deosebire față de barocul încărcat din C++ !

• Nu mai există nici un fel de declarație,
• recunoașterea tipului variabilelor fiind dedusă din contextul folosirii lor,
• au dispărut o serie de delimitatori: punct virgulă după instrucțiuni, în locul acoladelor, pentru a evidenția blocurile este suficientă indentarea, iteratorii au primit o semnificație mult mai largă – poți itera pe o listă sau pe un dicționar.

După ce am rezolvat câteva probleme cu întregi lungi am constatat că acestea nu mai aveau nici un sens, întrucât întregii pot fi oricât de mari (poți calcula instantaneu 2^100).
A fost limitat sever efectul lateral de modificare a variabilelor globale în interiorul funcțiilor. Parametrii funcțiilor sunt exclusiv de intrare, iar o funcție poate calcula mai multe rezultate, pe care le întoarce printr-un tuplu. În corpul funcților pot apare funcții locale, structura programului nemaifiind liniară.

Tipurile de date s-au simplificat enorm. În afara tipurilor standard: întreg (de orice lungime), real (în precizie dublă) și șiruri de caractere există lista (eterogenă), mulțimea și dicționarul.
Limbajul este multi paradigmă, putând fi folosit ca limbaj imperativ, orientat pe obiecte sau funcțional. În limbajul Python orice lucru (variabilă, funcție) este un obiect. La definirea unei clase constructorul este obligatoriu și are un nume unic. Se pot defini ierarhii de clase, folosind moștenirea simplă și multiplă.
Proliferarea numelor a fost rezolvată prin spațiile de nume și domeniile lor, care sunt evidențiate în mod natural, fără declarații suplimentare. Căutarea unui nume se face spre exterior, pornind din domeniul local, trecînd apoi succesiv prin domeniile: înconjurător, global și predefinit.

Dezvoltarea unui program se face prin scripturi – fișiere de dimensiune mică, organizate în module și pachete. Pentru a fi folosit de programul client, un modul, sau numai unele funcții din el trebuie importate. Modulele sunt grupate în biblioteci.

Limbajul dispune de biblioteci impresionante (de exemplu biblioteca Django).
Există un singur dezavantaj: limbajul, fiind un interpretor este mai lent decât un limbaj compilat, dar acest neajuns este estompat de interacțiunea mult mai strânsă cu utilizatorul, depanarea mult mai rapidă, portabilitatea ridicată.  Suportă sistemele de operare Linux, Windows și Mac, portarea unui program de pe un sistem pe altul fiind făcută cu ușurință.

Concluzie.
Limbajul ajută efectiv la formarea unui stil de programare, încurajând eleganța și simplitatea. Se evaluează că un program scris în Python are 1/5 la 1/3 din dimensiunea programului corespondent în Java sau C++. Păcat că l-am descoperit așa de târziu!

II Concursuri de programare pentru echipe de studenți

Timp de aproape 25 de ani (1982-2006) am fost antrenor (coach) al echipei Universității Politehnica București (UPB) ce participa la concursurile de programare pentru studenți, așa încât mă voi referi mai mult la participarea echipelor de la Universitatea Politehnica București - Facultatea de Automatică și Calculatoare.
Din initiațiva mea, în anul 1982 am organizat primul concurs de programare pentru studenți. Era un concurs local în Politehnică. Au participat studenți de la Facultatea de Automatică și Calculatoare și un student de la Facultatea de Electronică. În concurs au fost date 3 probleme și a fost un singur câștigător cu 2 probleme rezolvate.

Perioada 1983-1989

Între anii 1983 și 1989 s-au organizat Concursuri naționale anuale, la care au participat universități din București, Timișoara, Cluj-Napoca, Iași, Craiova, etc, care se desfășurau pe rând în orașele mai sus menționate. Se propuneau 3-4 probleme care trebuiau rezolvate în 3 ore. La aceste concursuri au participat cadre didactice din facultățile respective, printre care amintim Mircea Petrescu, Nicolae Țăpuș, Irina Athanasiu, Ștefan Trăușan-Matu de la Politehnica București, Ion Văduva și Marin Vlada de la Universitatea București, Jurcă Ioan, Crețu Vladimir de la Timișoara, Pusztay Kalman, Salomie Ion și Nedevschi Sergiu de la Cluj, Burdescu Dumitru de la Craiova și mulți alții. Corectarea problemelor era un chin: se făcea de către cadrele didactice de la aceste facultăți și conținea un element de subiectivism, soluțiile erau greu de descifrat, fiind foarte puțin documentate. Detectarea erorilor în logica algoritmului era un proces dificil, erorile sintactice ducând firesc, la respingerea problemei.

Perioada 1992-2006

În anul 1992 echipa Facultății de Automatică, la care mă voi referi exclusiv în continuare, a participat la primul Concurs internațional regional ACM (The ACM SouthEastern European Region - ACM (Association for Computing Machinery), care s-a desfășurat la Varna în Bulgaria.
Apoi, au urmat participări anuale la faza finală (mondială) a concursului ACM, condiționate de câștigarea fazei regionale Europa de Sud-Est a concursului ACM.
Concursul ACM a fost creat în 1977, la Computer Science Conference of ACM, având sediul, începând din 1989 la Universitatea Baylor.
Ce pot spune despre acest concurs ACM? Este cel mai prestigios concurs de algoritmică la nivel mondial. Este un concurs foarte greu. Evaluarea este de tipul „totul sau nimic”. Pentru a fi acceptată, o soluție trebuie să satisfacă absolut toate cazurile testate. Evaluarea este făcută de un program software de evaluare, deci aspectele legate de ingeniozitatea soluției, claritate, stil de programare sunt complet ignorate. Complexitatea este luată totuși în considerare prin restricțiile impuse asupra duratei de execuție. Studenții erau foarte motivați să participe, deoarece în afara prestigiului pe care îl obțineau, dacă se clasificau în față, atrăgeau atenția firmelor Google și Microsoft, în vederea unei angajări ulterioare. Când am vizitat Google Mountain View, am regăsit acolo mulți dintre foștii mei studenți, care au participat în anii precedenți la concursuri ACM.

Făcând un tur al participărilor echipei Politehnicii din București avându-mă pe mine ca antrenor la etapa finală a concursului ACM, aș menționa: Nashville-1995, San Jose 1996, Atlanta 1997, Eindhoven 1999, Vancouver 2002, Hawaii 2003, Shanghai 2005.
Ce rezultate am obținut ? În 1995 locul 16 cu 4 probleme rezolvate, în 1997 tot locul 16 cu 4 probleme, în 1999 locul 11 cu 5 probleme, în 2005 locul 10, cu 6 probleme rezolvate.
Ce studenți s-au remarcat? Menționez câțiva dintre cei mai reprezentativi: Gheorghiță Ștefan, Gheorghioiu Ovidiu, Stroe Mihai, Andreica Mugurel, Ghinea Dan, Marius Andrei. Aproape toți sunt în prezent la Google.

Ce pregătire au studenții care participă la concursurile ACM? Aceștia sunt de obicei foști studenți olimpici, participanți și câștigători ai olimpiadelor internaționale de informatică.
În 2001, la Vancouver, am primit premiul Life Coach Award, pentru participarea constantă a echipei în etapa finală. Meritul a fost de fiecare dată, al echipei.


 

În imagine: Mugurel Andreica, student UPB (stg.), prof. univ. dr. Valeriu Iorga (ctr.), si Dan Ghinea (dr.), student UPB. Echipa studentilor de la Universitatea Politehnica din București (UPB) a câștigat medalia de bronz la Finalele Mondiale ale Concursului Internațional Universitar de Programare ACM, competiție organizată de IBM (foto Agerpres, https://foto.agerpres.ro/storage/watermark/128425.jpg)

Concursul ACM – South Eastern European Region

Alături de Ucraina, Bulgaria Grecia, România se încadrează în regiunea Europei de sud-est. (South Eastern European Region).
Concursurile ACM se desfășoară pe 3 niveluri:
• concursuri locale
• concursuri regionale
• concursul final
Echipele sunt formate din 3 concurenți și un antrenor. Rolul antrenorului este de a asigura pregătirea echipei privind algoritmica, limbajul de programare și strategia de echipă. Echipele câștigătoare în concursurile regionale participă la ”marea finală”. Popularitatea concursului a crescut în mod constant. Astfel, dacă în 1977 numărul participanților era de ordinul sutelor, în 2017 au participat 49,935 studenți din 3078 universități, din 111 țări de pe cele 6 continente. Anul 2018 a înregistrat o participare record: 53,446 studenți de pe 536 siteuri.

Concursul dezvoltă creativitatea, lucrul în echipă și inovația în creerea de noi programe software, testând abilitățile concurenților sub presiunea timpului. Numărul problemelor propuse a crescut de la 6 în primii ani la 13 în 2017.
O echipă, când consideră că a terminat o problemă, o trimite, marcându-se momentul trimiterii. Dacă aceasta este acceptată, momentul trimiterii reprezintă penalitatea acumulată la acea problemă. Dacă problema este respinsă se adaugă o penalitate de timp. In momentul acceptării penalitatea totală acumulată va fi dată de momentul acceptării, la care se adaugă penalitățile acumulate de respingerile anterioare. Clasificarea se face după numărul de probleme rezolvate, iar în caz de egalitate se ține cont de penalizările acumulate.

Problemele sunt formulate ca aplicații din lumea reală, evitându-se formulările matematice.

De asemeni se precizează foarte riguros intrările și forma dorită a ieșirilor.

Tematica problemelor este foarte variată:

• probleme care se modelează prin grafuri – componente conexe, drum minim, colorare
• probleme de programare dinamică foarte des
• probleme care se rezolvă folosind strategia divide et impera, greedy, mai rar backtracking
• probleme de geometrie computațională
• probleme de simulare etc


Din cele 10 probleme, una sau două sunt foarte ușoare, mai multe sunt de dificultate medie, iar 2-3 probleme sunt foarte dificile. Strategia (greedy) a unei echipe, pentru a acumula cât mai puține puncte de penalizare este de a sesiza problemele foarte ușoare, a le rezolva și trimite foarte repede.
Dacă în primii ani universitățile americane se situau pe primele locuri, acum acestea sunt ocupate de Rusia și China. Universitățile americane mai bine clasate au echipe formate din studenți chinezi, indieni etc. De altfel în acest an am sesizat prezența unei echipe de la Universitatea din Oxford formată din 3 români.
• Dintre echipele cu care ne-am întâlnit în confruntările regionale, echipa Universității din București a fost o prezență constantă. Uneori au obținut rezultate mai bune ca noi (de exemplu în 1999 au câștigat locul 4).
• În Politehnică, după 2006 s-a constatat o scădere a interesului, o participare mai redusă a studenților la concursul ACM, concretizată prin numai una sau două participări la faza finală, în decurs de 12 ani.

Ultimul rezultat: The ACM SEERC 2018 Winners! 1st Place in SEERC 2018: Bucharest, Romania, Politehnica University of Bucharest and Vinnytsia, Ukraine, Vinnytsia National Technical University, Date: 19-21 October 2018 (Director: Prof. Dr. Nicolae Țăpuș)
În acest an – 2019, la faza mondială, care va avea loc la Porto, s-a calificat echipa Universității „Alexandru Ioan Cuza” din Iași.

Referințe.
1. Guido van Rossum, Wikipedia, https://en.wikipedia.org/wiki/Guido_van_Rossum
2. Python (programming language), https://en.wikipedia.org/wiki/Python_(programming_language)
3. The Python Software Foundation (US), https://docs.python.org/3/tutorial/
4. Universitătea Politehnica București (UPB), Facultatea de Automatică și Calculatoare, http://acs.pub.ro/
5. ACM (Association for Computing Machinery), https://www.acm.org/


Cărți publicate de prof. univ. dr. Valeriu Iorga.