Programarea Calculatoarelor: Introducere la laborator

Mediul de lucru

Laboratoarele la aceasta disciplina se desfășoara pe calculatoare Mac (Apple). Ele au o interfață grafică intuitivă; în același timp, sistemul lor de operare (Mac OS) are la bază sistemul de operare UNIX, dezvoltat inițial în anii '70 la Bell Labs concomitent cu limbajul C studiat în acest curs. Vom folosi astfel utilitare existente pentru sistemele tip UNIX (inclusiv sistemele Linux pe care puteți să vi le instalați gratuit).

Lansarea unui terminal

Mediul grafic de lucru are în partea de jos o bară în care sunt reprezentare principalele programe de uz curent. Ca prim pas e util să pornim un terminal cu interpretorul de comenzi, printr-un pe imaginea cu aspect de ecran de calculator.

Lansarea unui browser

Pentru vizualizarea paginilor cu lucrările de laborator se lansează un browser, fie Safari, reprezentat printr-o busolă, fie Firefox.

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 (la folosire NU se scriu și parantezele!). 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/Total Commander din mediul DOS/Windows.

Compilatorul gcc

Programele C nu pot fi executate ca atare de către procesorul calculatorului. Ele trebuie traduse în instrucțiuni pe care procesorul le înțelege și le poate executa direct: în cod mașină. Programul care face această traducere este un compilator. Pornind de la unul sau mai multe fișiere sursă care conțin programul scris în limbajul C, el creează un fișier executabil care poate fi rulat pe calculator.

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. Cea mai simplă comandă pentru a compila programul nume.c este
gcc nume.c
În acest caz, compilatorul creează un fișier executabil numit a.out (prin convenție). Orice fișier executabil poate fi rulat dând ca și comandă numele lui, în acest caz:
./a.out
unde numele fișierului a fost precizat în raport cu directorul curent . (punct).
În general, putem specifica mai multe opțiuni de compilare
gcc opțiuni nume.c
De exemplu, adesea dorim să precizăm un nume (altul decât a.out) pentru fișierul executabil creat. Putem face aceasta cu opțiunea -o numeexecutabil. De regulă, alegem același nume ca și al fișierului sursă, fără extensia .c [Î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]
gcc -o nume nume.c
și rulăm atunci programul cu comanda:
./nume
Opțiunea -Wall (Warnings: all) generează avertismente pentru multe situații de folosire a limbajului care constituie potențiale erori în program. E recomandabil să compilăm deci cu comanda

gcc -Wall -o nume nume.c

Opțiunea -std=c99 specifică folosirea standardului ISO (1999), care oferă facilități suplimentare față de versiunile anterioare.
Bibliotecile suplimentare necesare la compilare se specifică opțiunea -l urmată, fără spațiu, de numele bibliotecii (fără prefixul lib folosit convențional pentru biblioteci). De exemplu, pentru a compila programe cu funcții matematice folosiți opțiunea -lm. (Pe sistemele MacOS nu e necesară, biblioteca e găsită implicit).
Opțiunile de compilare pot fi date în orice ordine. Nu despărțim în două opțiunea -o nume intercalând alte opțiuni, ea este o singură opțiune formată din două cuvinte.
Pentru programe compuse, se indică toate fișierele sursă pe linia de comandă:
gcc opțiuni fișier1.c fișier2.c fișierN.c

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ă. În documentația comenzilor, apăsarea tastei control e reprezentată convențional prin prefixul C-. De exemplu, C-g înseamnă control g. Similar, prefixul M- reprezintă modificatorul meta (obținut prin apăsarea tastelor Alt sau Escape. Pentru editarea programelor C, e util să activăm opțiunea Options -> Syntax Highlighting care va colora diferit diversele elemente de limbaj, ușurând înțelegerea și detectarea erorilor.

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 (din meniu: Tools -> Compile). Pe sistemele din laborator, această comanda e personalizată (prin intermediul fișierului de configurare .emacs să efectueze compilarea cu gcc, dând toate avertismentele (-Wall) și producând un executabil cu același nume ca si sursa, dar fără extensia .c. 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.

Exemplu de program

Pentru început, scrieți si compilați următorul program simplu, care afișează faloarea lui pi calculată cu ajutorul funcției arcsinus, prezentă cu numele asin în biblioteca standard de funcții matematice.
#include <math.h>
#include <stdio.h>

int main(void)
{
  printf("Valoarea lui pi este: ");
  printf("%f", 2 * asin(1));
  return 0;
}

Erori de compilare

E important să urmărim cu atenție și să înțelegem eventualele mesaje de apărute la compilare, pentru a putea corecta erorile semnalate. Câteva exemple de erori care pot apărea la transcrierea greșită a acestui program:

error: studio.h: No such file or directory
Compilatorul nu a găsit fișierul indicat, deoarece a fost scris cu nume eronat: nu este studio.h, ci stdio.h, de la Standard Input/Output.

error: syntax error before 'return'
Acest mesaj va apare dacă uităm să terminăm linia anterioară cu punct-virgulă. E important de reținut că adesea cauza reală a erorii poate să se afle de fapt puțin înainte de locul în care o detectează compilatorul. Acesta indică locul presupusei erori prin numele de fișier urmat de numărul liniei sursă, de exemplu: /home/student/pi.c:8:error: ...

error: syntax error at end of input
Această eroare va fi semnalată dacă se uită acoloada închisă } și deci fișierul se termină în mod neașteptat.

Programe compuse din mai multe fișiere

Makefile polygon.c fungraph.c
Marius Minea
Last modified: Mon Feb 25 10:45:13 EET 2008