Programarea Calculatoarelor 2: Laborator 1
UNIX și Linux
Laboratoarele la aceasta disciplina se desfășoara pe calculatoare rulând
sistemul de operare Linux, aceasta cu mai multe obiective:
- dobândirea de experiență pe o platformă alternativă celei DOS/Windows
- utilizarea unui mediu frecvent folosit în dezvoltarea de programe
(compilatorul gcc, editorul Emacs, utilitarul make
pentru managementul proiectelor)
- familiarizarea cu modul de a rezolva o problema prin conectarea unor
utilitare simple și generale, concept caracteristic sistemului UNIX
- pregătirea pentru alte discipline (sisteme de operare, etc.)
Linux este o versiune a
sistemului de operare UNIX dezvoltat inițial
în anii '70 la Bell Labs concomitent cu limbajul C, folosit pentru cea mai
mare parte a implementării. Sistemul de operare Linux e un efort comun
al multor programatori, dezvoltat sub
licența GNU, conform căreia
codul său sursă este distribuit și disponibil public în mod gratuit.
Comenzi Unix
UNIX are un sistem de fișiere arborescent. Spre deosebire de sistemul de
fișiere DOS/Windows, separatorul între componentele numelui de fișier
(cataloage și numele propriu-zis) este caracterul / (slash) și nu
\ (backslash). De asemenea, numele de fișiere nu conțin un
identificator al discului fizic (A:, C:, etc.), ci întreaga ierarhie de
fișiere pornește de la o rădăcină unică, notată /.
În continuare, numele comenzilor sunt scrise cu caractere tip mașină
de scris, argumentele lor sunt scrise cursiv, iar textul
între [ ] denotă un argument opțional. Câteva comenzi de bază sunt:
- mkdir nume_catalog
Creează un catalog (directory) cu numele dat.
- cd [nume_catalog]
Schimbă catalogul curent, trecând în cel specificat (implicit: în
catalogul personal (home directory) al utilizatorului).
La fel ca și sub DOS/Windows, . denotă catalogul curent, iar
.. catalogul părinte. Notația ~ se referă la catalogul
personal al utilizatorului curent.
- ls [nume_catalog]
Listează (afisează numele pentru) fișierele din catalogul dat (implicit:
catalogul curent).
- cat fișier
Afișează conținutul fișierului
- cp [opțiuni] fișier1 fișier2
Face o copie a lui fișier1, cu numele fișier2
cp [opțiuni] fișier1 fișier2 fișier_n dir
Copiază fișierele indicate în catalogul dir.
Opțiuni: -i (interactiv): întreabă înainte de a suprascrie;
-r (recursiv, folosit): copiază toate fișierele și
subcataloagele din catalogul sursă indicat.
- mv [opțiuni] fișier1 fișier2
Redenumește fișier1, cu numele fișier2
mv [opțiuni] fișier1 fișier2 fișier_n dir
Mută fișierele indicate în catalogul dir.
Opțiuni: -i (interactiv): întreabă înainte de a suprascrie.
(Un catalog e mutat implicit împreună cu întreg conținutul, deci opțiunea
-r nu mai apare, spre deosebire de copiere.
- rm [opțiuni] nume_fisier
Șterge fișierul specificat.
Opțiunea -i (interactiv) solicită confirmare, -f forțează
(fără confirmare) iar -r șterge recursiv tot conținutul catalogului
indicat.
- rmdir nume_catalog
Șterge catalogul indicat (acesta trebuie să fie gol).
- man nume_comandă
Afișează pagina de manual pentru comanda indicată (cu toate opțiunile).
Pentru o navigare și manipulare mai facilă a fișierelor se poate folosi
programul Midnight Commander (mc), similar
lui Norton Commander din mediul DOS/Windows.
Compilatorul gcc
Compilatorul gcc (GNU Compiler
Collection) este unul din cele mai performante compilatoare pentru
limbajul C, și e realizat în același model de distribuție gratuită a
sursei ca și celelalte componente ale sistemului GNU/Linux.
Fișierele sursă au în mod convențional extensia .c. Obișnuit,
pentru a compila programul nume.c, se execută comanda
gcc -o nume nume.c
Argumentul nume al opțiunii -o indică numele dat
executabilului (de obicei, același nume de bază ca și pentru sursă).
Fără opțiunea -o, executabilul e denumit implicit a.out.
[În UNIX, fișierele executabile nu sunt identificate prin extensie (cum ar
fi .exe), ci printr-un atribut (permisiune de execuție) care în
acest caz e setat automat de compilator].
Pentru a compila programe cu funcții matematice standard e nevoie de
biblioteca libm. În acest caz, se folosește opțiunea -l
urmată, fără spațiu, de numele bibliotecii (fără prefixul lib
folosit convențional pentru toate bibliotecile). De exemplu:
gcc -lm -o prog prog.c
La compilare, e utila generarea cat mai multor avertismente.
Aceasta se specifica cu optiunea -Wall (warnings: all).
Alte opțiuni pentru gcc vor fi discutate ulterior.
Editorul Emacs
Emacs este un
editor puternic și flexibil care folosește în același timp și ca mediu
integrat de dezvoltare de programe și oferă multe alte facilități (e-mail,
browser web, etc). Emacs poate fi ușor adaptat preferințelor fiecărui
utilizator și interfațat cu alte programe scriind funcții (extensii) în
LISP. Frecvent folosită este versiunea xemacs, realizată special
pentru mediul X Windows. Emacs este un program complex, de dimensiuni
mari. Pentru nevoile uzuale de programare se pot folosi cu succes
editoare similare mai simple, cum ar fi jed sau xjed.
Comenzi Emacs
Emacs are o mare varietate de comenzi care pot fi adaptate preferințelor
utilizatorului. Pentru o introducere (î n limba română) a celor mai
utilizate, apelați din meniu Help -> Tutorials -> Romanian.
O listă concisă cu comenzile cele mai simple găsiți de exemplu
aici.
Majoritatea comenzilor Emacs la nivel de caracter, cuvânt și linie au
fost încorporate în interpretoarele de comenzi UNIX, fiind utile pentru
editarea facilă și rapidă a liniei de comandă.
Interfața cu gcc
Emacs oferă un mod specializat pentru compilarea programelor, permițând
astfel editarea, compilarea și corectarea erorilor din același mediu.
Pentru aceasta se apelează în editor comanda M-x compile.
Această comandă poate fi personalizată pentru a executa direct compilatorul
gcc pe fișierul sursă editat. Pentru aceasta, introduceți
următoarele linii în fișierul ~/.emacs și reporniți apoi editorul
(acesta e și un prim exercițiu pentru folosirea sa):
(add-hook 'c-mode-common-hook
(lambda ()
(set (make-local-variable 'compile-command)
(concat "gcc -Wall -o " (file-name-sans-extension buffer-file-name)
" " buffer-file-name))))
(defvar compiled-in-this-buffer nil
"T if \[compile-with-same-commands] has been run in this buffer.")
(defun compile-with-same-commands ()
"Run \[compile] with the same commands as the
last \[compile] or \[compile-with-same-commands]."
(interactive)
(make-local-variable `compiled-in-this-buffer)
(if compiled-in-this-buffer
(compile compile-command)
(call-interactively `compile))
(setq compiled-in-this-buffer t))
(global-set-key "\C-xc" `compile-with-same-commands)
Cu aceste modificări, comanda C-x c (control-x urmat de c) va
prezenta spre confirmare linia de comandă pentru compilarea fișierului
curent cu gcc (ea poate fi editată în caz de nevoie). La orice
recompilare ulterioară, se va folosi automat linia anterioară.
Rezultatele compilării sunt prezentate într-o fereastră separată.
Prin poziționare pe un mesaj de eroare, și apăsarea tastei Enter, cursorul
se mută în fereastra de cod la poziția corespunzătoare erorii.
Se pot defini și alte personalizări utile. De exemplu, adăugați tot
în fișierul ~/.emacs linia următoare:
(global-set-key [(f1)] (lambda () (interactive) (manual-entry (current-word))))
Aceasta stabilește ca efect al tastei F1 afișarea paginii de manual pentru
cuvântul aflat în dreptul cursorului (sau în apropierea lui), lucru util
la vizualizarea documentației pentru funcțiile standard în C.
Compilarea cu make
Utilitarul make este folosit pentru managementul proiectelor
software, el efectuând prelucrarea automată a părților din sistem
care sunt afectate de modificările făcute. În varianta cea mai simplă
de utilizare a sa, putem compila un fișier C prog.c cu comanda
make prog
Ca urmare, make va executa comanda
cc prog.c -o prog
care efectuează compilarea dorită. În acest caz, make folosește
una din regulile sale implicite: dacă există o sursă prog.c, atunci
programul prog se obține din compilarea ei cu compilatorul C numit
convențional cc, care pe sistemele Linux este doar alt nume pentru
compilatorul gcc.
Marius Minea
Last modified: Wed Oct 8 11:54:25 EEST 2003