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