Limbaje de programare: 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 browser
Mediul grafic de lucru are în partea de jos o bară în care sunt
reprezentare principalele programe de uz curent.
Pentru vizualizarea paginilor cu lucrările de laborator se lansează un
browser, fie Safari, reprezentat printr-o busolă, fie Firefox.
Lansarea unui terminal
Ca prim pas e util să
pornim un terminal cu interpretorul de comenzi, printr-un clic pe
imaginea cu aspect de ecran de calculator.
Cum scriem și rulăm un program
Pentru a rezolva o problemă de laborator, urmăm trei pași:
- Scriem programul C folosind un editor de texte.
- Compilăm programul (fișierul sursă) cu un compilator, care produce un fișier executabil.
- Rulăm programul executabil din linia de comandă a terminalului.
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.
Lucrul cu fișiere. Comenzi Unix
Pentru a putea lucra cu succes, trebuie să ținem minte unde sunt
fișierele pe care le-am creat (să fim organizați și ordonați),
și să știm câteva comenzi esențiale pentru a lucra cu ele.
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:
- pwd
Afișează numele catalogului curent. E utilă pentru a ști unde ne aflăm în sistemul de fișiere.
- mkdir nume_catalog
Creează un catalog (directory) cu numele dat. La începutul
sesiunii de lucru e util să creăm un catalog (de exemplu cu numele nostru)
în care să ne scriem programele.
- cd [nume_catalog]
Schimbă catalogul curent, trecând în cel specificat. Dacă nu se indică vreun nume, se trece î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.
Dacă știm că avem deja un catalog cu numele nostru, nu mai trebuie să îl creem din nou, ci folosim comanda cd nume pentru a trece în el ca și catalog curent de lucru.
- ls [nume_catalog]
Listează (afisează numele pentru) fișierele din catalogul dat (implicit:
catalogul curent). Așa putem verifica dacă fișierele dorite încă mai există (sau dacă poate am scris numele greșit).
- 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.
- rmdir nume_catalog
Șterge catalogul indicat (acesta trebuie să fie gol).
- 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.
Un catalog care conține fișiere poate fi șters complet cu comanda
rm -fr numecatalog (șterge recursiv, fără confirmare)
- 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/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.
Cel mai frecvent vom compila cu comanda
gcc -Wall -o nume nume.c
Opțiunea -Wall (Warnings: all) generează avertismente pentru multe situații de folosire a limbajului care constituie potențiale erori în program.
Opțiunea -o nume precizează numele pe care dorim să-l aibe fișierul executabil generat. (Dacă compilăm simplu cu comanda
gcc nume.c va primi numele a.out).
De regulă, alegem același nume ca și al fișierului sursă, fără extensia .c
Rularea programului executabil obținut se face cu comanda
./numefișier
(înaintea numelui de fișier se scrie un punct și caracterul / fără spații.
În general, putem specifica mai multe opțiuni de compilare:
gcc opțiuni 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
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.
Marius Minea
Last modified: Wed Sep 26 8:00:00 EET 2012