Note de curs, clasele 11-12, 24 aprilie 2014

From Algopedia
Jump to: navigation, search

Diverse

  • Discuții despre olimpiadă, cum ne ținem motivați până la anul
  • Propuneri de subiecte pentru ultimele cercuri pe anul acesta
    • Anul trecut am făcut: alpha-beta, criptografie, algoritmi randomizați, compresie, clasificare bayesiană, ...
    • Alte idei: algoritmi de aproximare, proof number search (algoritm pentru arbori de jocuri), ...
    • Sau continuăm cu algoritmica: fluxuri în grafuri, treaps și alți arbori echilibrați, ...

GNU/Linux, noțiuni introductive

De unde începem să discutăm despre un întreg sistem de operare? Este un domeniu vast. Vom încerca să combinăm noțiunile practice cu o expunere a principiilor sistemului de operare.

Scopul nostru practic pentru astăzi este să edităm, să compilăm și să executăm un fișier C sau C++.

Țineți minte că obișnuința este a doua natură. Dacă vreți să învățați rapid Linux, obligați-vă să-l folosiți. Dacă încă nu v-ați lepădat de Windows, vă puteți instala un sistem dual boot. Tot ce puteți face în Windows veți putea face și în Linux, plus multe altele. Singura deficiență sunt jocurile.

GNU sau Linux

Mă veți auzi adesea spunând „GNU/Linux”. Îmi cere un efort conștient de atenție și, adesea, distrage de la ceea ce am de spus, căci lumea întreabă ocazional „GNU? Ce-i aia?”. Dar consider că este important, suficient de important încât să dau explicații suplimentare neîntrebat. :-)

Linux este kernelul sistemului de operare GNU/Linux. Kernelul este o componentă vitală: toate programele trec prin kernel pentru a obține accesul la procesor, memorie, disc și alte echipamente. El a fost creat începând cu 1991 de Linus Torvalds, un inginer software finlandez. Linux a fost dezvoltat pe i386, dar a fost portat între timp la multe alte arhitecturi și este folosit de multe alte sisteme de operare (Android, de exemplu). Prima versiune stabilă datează din 1994.

Proiectul GNU a fost lansat în 1983 de Stallman cu scopul de a oferi un sistem de operare compus în întregime din software liber. Acest lucru era important deoarece, la începutul anilor '80, lumea folosea aproape exclusiv software neliber. Pentru majoritatea programelor, trebuia să semnezi o clauză de confidențialitate (chiar și pentru binar, pentru că oricum codul sursă nu-l mai primeai). Richard Stallman a definit ce înțelege prin „software liber” și a început să scrie bucăți din sistemul de operare, în special GCC și Emacs. Alți autori s-au alăturat proiectului și au scris diverse utilitare de bază.

Din punctul meu de vedere, Linux este o realizare tehnică remarcabilă fără niciun fel de considerente morale. În schimb, GNU aduce o multitudine de alte componente fără de care nu am fi putut avea un sistem de operare liber. GNU este o filozofie de viață și o perpetuare a spiritului de întrajutorare. Linux a accelerat cu câțiva ani existența acestui sistem liber, dar atât. De aceea, eu aleg să spun mereu „GNU/Linux”.

Dincolo de această controversă, important este că GNU/Linux constă în întregime din software liber. Aceasta este trăsătura principală care îl diferențiază de Windows.

Despre software liber

Pentru ca un program să se numească liber, el trebuie să-i dea patru libertăți utilizatorului:

  • de a utiliza programul, în orice scop;
  • de a studia modul de funcționare a programului, și de a-l adapta nevoilor proprii;
  • de a redistribui copii, în scopul ajutorării aproapelui tău (libertatea 2);
  • de a îmbunătăți programul și de a pune îmbunătățirile la dispoziția publicului, în folosul întregii societăți.

Această definiție are implicații practice și etice pe care le vom discuta în limita timpului.

Desigur, nimeni nu studiază codul-sursă al tuturor programelor pe care le folosește. Dar este suficient ca o singură persoană să citească un program pentru ca întreaga comunitate să beneficieze.

Cum implementăm, în practică, această definiție? Printr-o licență, adică o declarație a autorului programului care spune ce au voie să facă utilizatorii cu programul. Sunt multe metode, din care două sunt de interes:

  1. Putem spune, pur și simplu „acesta este codul meu, faceți ce vreți cu el”. Aceasta înseamnă că adăugăm codul în domeniul public. Atunci unii programatori ar putea să ia acel cod, să-l refolosească pentru propriile lor programe, dar să nu redistribuie decât binarul și sub o licență restrictivă.
  2. Licența publică generală GNU (GPL) merge mai departe și introduce conceptul de copyleft. Acesta spune că programul și toate copiile lui (modificate sau nu) rămân perpetuu libere. Mai exact, dacă un programator preia programul și alege să-l redistribuie (cu modificări sau fără), el nu are dreptul de a interzice utilizatorilor săi să redistribuie, la rândul lor, programul.

Termenul de „copyleft” este un joc de cuvinte reprezentativ pentru o licență făcută de un hacker. Prin definiție copyright-ul limitează libertatea utilizatorilor, pe când copyleft-ul le garantează.

Distribuții

O distribuție de GNU/Linux este o colecție de programe. Ele diferă în diverse moduri:

  • în alegerea de programe implicite (ca sistem de ferestre, ca procesor de texte, ca playere de muzică / filme etc.).
  • în folosirea exclusivă (sau nu) de software liber
    • discuție despre drivere, Flash, formate proprietare de documente, DRM
  • în organizarea programelor, a directoarelor de date, de configurare etc.
  • în gestiunea versiunilor și în ușurința de a migra între versiuni

Întotdeauna un utilizator care știe ce face va putea instala un program, chiar dacă el nu este oferit implicit de distribuția aleasă. Dar, evident, este mai comod când îl poți instala și șterge printr-o singură comandă.

Modul grafic

Versiunile moderne de GNU/Linux au interfețe grafice... prietenoase sau mai puțin. Țineți minte că, spre deosebire de Windows, puteți schimba mult mai mult decât poza de pe desktop. Desigur, pentru a folosi o altă interfață trebuie să aveți dreptul de a o instala.

Personal am încercat, în anii recenți, gnome2 (numit gnome-session-fallback în Ubuntu) și cinnamon. Există interfețe pentru toate gusturile, de la cele lucioase, dar inflexibile, până la cele mai urâțele, dar mai personalizabile. Mie îmi plac acestea din urmă, în special pentru că îmi place să fac cât mai multe treburi cu tastatura, nu cu mouse-ul.

Modul grafic este bun pentru pensionarii care trimit scrisori în lanț din contul lor de Hotmail. :-) Nu voi insista asupra lui. Are un meniu, are un file manager, are tot ce v-ați aștepta să aibă.

Pentru cei ca noi, mult mai interesantă este linia de comandă.

Linia de comandă

Vezi și

Console și terminale

Pentru a deschide un terminal, căutați-l prin meniu. Este posibil să aibă și o scurtătură de la tastatură (Ctrl-Alt-T sau altceva).

O consolă este un ecran special în care vă puteți conecta cu contul vostru normal și care, în plus, afișează toate erorile și avertismentele de kernel. Puteți obține o consolă cu Ctrl-Alt-F1 (sau -F2, -F3 etc.). Consola Linux este implementată la nivel de kernel și este utilă în situații în care mediul grafic nu funcționează bine (probleme cu driverele etc.).

Interpretorul de comenzi (shell)

Când spunem „linie de comandă”, înțelegem un loc unde tastăm comenzi pentru a executa programe. Acest loc este el însuși un program, numit interpretor de comenzi sau shell.

Ca în orice alte situații in GNU/Linux, există multe shelluri. Toate implementează o interfață comună, numită sh, dar își adaugă propriile extensii. Unul dintre cele mai răspândite este bash, despre care vom vorbi și noi (mărturisesc că este singurul pe care îl stăpânesc binișor). Alte shelluri sunt bash, dash, ksh, tsh și, în general, orice grup de litere terminat în -sh. :-)

Dincolo de executarea comenzilor, un shell poate avea multe funcții care să îl facă mai util:

  • colorarea comenzilor și a directoarelor
  • stocarea istoricului comenzilor
  • căutarea prin istorie
  • aliasuri
  • bucle, condiții
  • redirectarea intrării și ieșirii
  • scrierea de întregi scripturi în limbajul shell

Experimente în shell

Această parte este enumerată pe scurt, dar aici vom petrece cel mai mult timp.

  • man, apropos
    • pagini de manual: printf, time etc.
    • paginile de manual includ documentația limbajului C!
  • cd, ls
  • ~
  • ce shell folosesc?
    • echo $SHELL (sau ps)
    • alte variabile
  • particularități despre shell
    • căutări
    • suspendarea proceselor (Ctrl-Z)
    • &, bg, fg, jobs
    • >, <, |

Dezvoltarea în g++ + Emacs (sau vi etc.)

Punând cap la cap tot ce am învățat astăzi, putem scrie programe C/C++ în editorul nostru favorit:

mkdir ~/proiecte
cd ~/proiecte
emacs problema.cpp problema.in &
# Alt-Tab înainte și înapoi între ferestre. Mouse-ul este pentru cei slabi!
g++ -Wall -O3 -o problema problema.cpp
rm -f problema.out; time ./problema; cat problema.out
# Săgeți în sus pentru a rula din nou ultimele două comenzi după editarea sursei