momente şi schiţe de informatică şi matematică
To attain knowledge, write. To attain wisdom, rewrite.

Borland C++ compiler 5.5

Borland C++ | STL
2008 nov

În sfera mediilor de programare (IDE) pentru DOS/Windows - excelează de 15 ani, produsele Borland; învăţământul informatic din multe ţări s-a bazat mult timp pe Borland Pascal 7.0 şi apoi pe Borland C++ 3.1. După ce a apărut Windows 3.1 - care a vitalizat domeniul interfeţelor grafice (GUI) - Borland a dezvoltat Pascal-ul său (compilator pe 16 biţi), creând limbajul Delphi pentru aplicaţii Windows pe 32 de biţi (este interesant că arhitectul limbajului Delphi s-a mutat apoi la Windows, pentru a dezvolta limbajul C#). Ulterior, s-a creat varianta Borland C++ Builder, care combină componentele vizuale şi IDE-ul din Delphi cu un compilator C++ pe 32 de biţi.

Produsele Borland costă de obicei £80 - £2000 (funcţie de Standard/Professional/Enterprise); este interesant însă că Borland oferă gratis compilatorul de C++ pe care se bazează C++ Builder. Aceasta înseamnă că valoarea comercială e dată de instrumentele de dezvoltare vizuală încorporate şi mai puţin de compilatorul de C++, ceea ce este explicabil: apariţia GNU Compiler Collection aproape că a anulat valoarea comercială a compilatoarelor de C++.

Obţinere şi instalare

Accesaţi http://cc.codegear.com/Free.aspx?id=24778 şi creaţi-vă un cont (dacă nu aveţi deja); după ce veţi activa contul respectiv (prin intermediul serviciului de Mail), veţi putea descărca pachetul freecommandLinetools.exe a cărui execuţie asigură instalarea:

La instalare se creează implicit următoarea structură:

BIN (de la binaries: fişiere binare) conţine compilatorul bcc32.exe precum şi câteva utilitare (ilink32.exe, make.exe, tdump.exe) menite toate să fie rulate dintr-un shell DOS, C:\windows\system32\cmd.exe.

În HELP găsiţi fişierul bcb5tool.HLP pe care-l puteţi deschide din Windows (click pe icon), pentru documentare.

Pentru a putea lansa (de pe linia de comandă a shell-ului) utilitarele din BIN, indicând doar numele - trebuie să adăugăm calea de căutare C:\Borland\Bcc55\BIN în variabila de sistem path:

Desigur, fereastra System Properties se deschide făcând click-dreapta pe My Computer şi click Properties (apoi click pe tabul Advanced şi pe Environment Variables).

Putem seta din start şi calea spre fişierele header şi spre fişierele OBJ şi LIB, editând fişierul bcc32.cfg:

Analog, înscriem -L"c:\borland\bcc55\lib" (atenţie: fără spaţiu) în fişierul ilink.cfg.

Testare şi portabilitate

Creem întâi un director de lucru ("workspace"), pentru propriile programe C sau C++:

Pentru a deschide din Windows un shell DOS: click butonul Start, click submeniul Run..., tastează cmd.

Comanda cd - Change Directory
cd \ - trece în directorul rădăcină

Comanda mkdir - make directory

Directorul de lucru curent este C:\mywork

Pentru a scrie un program C++ putem folosi editorul de text edit.com (Windows moşteneşte de la MS-DOS şi păstrează aproape fără schimbare, două utilitare foarte bune: EDIT şi DEBUG).
Dacă se lucrează asemenea programe şi sub Windows şi sub Linux, atunci chiar este mai avantajos să se folosească EDIT şi nu binecunoscutul NOTEPAD, pentru că EDIT (spre deosebire de Notepad) converteşte automat caracterele newline-Linux (ASCII 0x0A) la caractere newline-DOS (ASCII 0x0D0A).

Deci tastăm pe linia de comandă (la promptul C:\mywork>) edit test.cpp şi edităm un program C++:

Salvăm fişierul (folosind meniul File) şi închidem sau (mai bine!) "minimizăm" editorul (folosind meniul File/Exit, respectiv click pe butonul Minimize). Apoi lansăm compilatorul bcc32.exe:

Surpriză: bcc32 (adică "Borland C++ 5.5.1 for Win32") a compilat test.cpp fără erori şi a apelat automat editorul de legături ilink.exe (adică "Turbo Incremental Link 5.00"). Lansând fişierul executabil rezultat astfel, test.exe, obţinem pe consolă mesajul "Hello world!" emis de program.

"Surpriză" - pentru că BCC32 respectă (ca şi GNU-GCC) standardul ANSI/ISO pentru C++ (elaborat între 1990 - 2000); ori conform ANSI C++, fişierele header specifice C++ sunt tratate de către compilator în mod diferit faţă de cele specifice C; iar pe de altă parte, funcţia main() trebuie să aibă prototipul int main([parametri]), adică trebuie să returneze un int. Aceste aspecte au fost ignorate în programul reprodus mai sus; bcc32 a reuşit să compileze fără erori, dar compilatorul g++ din GCC ar refuza (în mod normal) să compileze programul test.cpp de mai sus (exact din motivele de respectare a standardului, menţionate mai înainte).

Pentru a scrie programe C/C++ conforme standardului C/C++ - şi deci, pentru a crea programe care să poată fi compilate (fără modificări) pe diverse sisteme (Windows, Linux, etc.) - trebuie respectate măcar două-trei reguli de bază. Astfel, test.cpp trebuie rescris astfel:

Acest program va fi compilat şi de bcc32 (pe Windows) şi de g++ (pe Linux). Pentru fişierele header specifice C (de exemplu, stdio.h, sau math.h) se păstrează sintaxa obişnuită (folosind extensia .h); dar pentru cele specifice C++ (care folosesc class) trebuie eliminată extensia .h - ca urmare, compilatorul va înregistra clasele respective într-un spaţiu de memorie identificat prin std (astfel că obiectul cout de exemplu, va trebui referit prin std::cout, fiind membru al spaţiului std).
Declaraţia iniţială using namespace std; permite ca în program să se evite prefixarea cu std:: a obiectelor proprii headerelor C++.

Un exemplu cu STL

Lucrând în C/C++ poate fi nevoie de documentaţie privind limbajul şi bibliotecile utilizate de compilator, împreună cu exemple de programe; o foarte bună sursă în acest sens este cppreference.com.

O bună parte a bibliotecilor C++ (inclusiv pentru BCC32) este bazată pe STL - o colecţie de şabloane de clase (containere de obiecte de diverse tipuri) şi de algoritmi generici care permit programatorului să implementeze uşor diverse structuri tipice de date (vectori, cozi, liste, stive, mulţimi). De exemplu, pentru a utiliza o stivă de întregi e suficient #include <stack> şi o declaraţie stack<int> myStack; - clasa STL stack furnizează deja funcţionalitatea generică specifică unei stive de obiecte (de exemplu, operaţii myStack.push(5) şi myStack.pop()). Deasemenea, STL modelează la nivel generic (pentru diverse containere STL) o serie de algoritmi standard (binary_search, sort, for_each, etc.) care pot fi utilizaţi ca atare pe o varietate de structuri de date şi totodată, prevede iteratori generici pentru parcurgerea elementelor de un tip sau de altul.

În C:\Borland\BCC55\EXAMPLES\Stdlib sunt date diverse exemple de folosire a STL; intenţionam iniţial să exemplificăm STL printr-un program de obţinere a numerelor prime folosind "ciurul lui Eratostene" - dar un astfel de program există deja (EXAMPLES\Stdlib\sieve.cpp). Modelăm folosind STL următoarea problemă binecunoscută (dar măcar nu se suprapune exemplelor din EXAMPLES): să se afişeze cuvintele dintr-un fişier, în ordine alfabetică, împreună cu frecvenţa corespunzătoare:


Lansează CMD, schimbă directorul curent în \mywork şi compilează map_wf.cpp.

Lansează executabilul rezultat map_wf.exe, folosind operatorul de redirectare < (de la dispozitivul standard de intrare (tastatura) - la fişierul test.cpp).

Obţinem astfel lista cuvintelor şi frecvenţelor acestora (în cadrul fişierului test.cpp) - "cuvânt" însemnând desigur orice secvenţă de caractere (eventual de lungime 1) delimitată de spaţiu.

Fireşte, ne putem gândi la "cuvânt" în sensul obişnuit (conţinând numai caractere alfanumerice); în EXAMPLES\Stdlib\concord.cpp găsim următorul model instructiv de funcţie:

void split (const string&, const string&, list<string,allocator<string> > & );

Invocarea split(text, separators, words) separă cuvintele din text delimitate de caractere prezente în şirul separators şi le înscrie în lista words.

Programul map_wf.cpp poate fi compilat (fără nici o modificare) şi pe un sistem Linux:

invocând compilatorul g++. Este interesant de comparat executabilele în privinţa dimensiunii:

Vedem că executabilul obţinut cu BCC32 sub Windows este de 7 ori mai voluminos decât cel obţinut cu GCC sub Linux (161792 octeţi faţă de 23202 octeţi). Dar explicaţia acestei diferenţe nu ţine totuşi, de sistemul de operare - ci de maniera diferită (static într-un caz, dinamic în celălalt) în care editorul de legături a gestionat codurile bibliotecilor necesitate de program.

vezi Cărţile mele (de programare)

docerpro | Prev | Next