Ugrađeni C++ (-{Embedded C++, EC++}-) varijacija je programskog jezika C++ namenjena ugrađenim sistemima. Kreirala ga je industrijska grupa predvođena velikim japanskim proizvođačima CPU-a (centralnih procesorskih jedinica) koja uključuje imena poput NEC, Hitači, Fudžicu i Tošiba. Oni su hteli da ukažu na nedostatke C++ pri kreiranju aplikacija za ugrađene sisteme. Cilj im je bio da sačuvaju sve najkorisnije karakteristike objektno-orijentisanog programiranja koje poseduje C++ a da pri tome minimizuju veličinu koda i maksimizuju efikasnost prilikom izvršavanja kao i da učine konstrukciju kompajlera jednostavnijom. Na zvaničnom sajtu kao njihov cilj stoji rečenica: “pružiti programerima za ugrađene sisteme podskup C++-a koji prosečan C programer može da razume i koristi”.EC++ Questions and Answers

Razlike u odnosu na C++

Ugrađeni C++ je podskup C++-a. Sledeće karakteristike C++ su uklonjene: višestruko nasleđivanje virtuelne bazne klase informacije o tipu podataka prilikom izvrsavanja (typeid) (typeid) novi načini kastovanja (static_cast, dynamic_cast, reinterpret_cast and const_cast) mutable storage class specifier prostori imena obrada izuzetaka šabloni

Neki kompajleri (poput Green Hills i IAR Systems) dozvoljavaju ponovno omogućavanje pojedinih karakteristika iz gore navedene liste po želji, implementacija poznata kao “produžen ugrađen C++”. Takođe, mnogi korisnici Embedded C++ izbegavaju standardnu biblioteku šablona zbog njenje dinamičke alokacije memorije.

Kompilacija

Program napisan u EC++ može biti kompajliran pomoću bilo kog C++ kompajlera. Ali, poseban kompajler za EC++ može lakše da uradi optimizaciju.

Kompajleri specificni za EC++ pružaju kompanije poput: IAR Systems Freescale Semiconductor, (spin-off from Motorola in 2004 who has acquired Metrowerks in 1999) Tasking Software, part of Altium Limited Green Hills Software IAR Systems Freescale Semiconductor, (spin-off from Motorola in 2004 who has acquired Metrowerks in 1999) Tasking Software, part of Altium Limited Green Hills Software

Kritike

EC++ je loše prihvaćen od strane eksperata za programiranje u C++. Na primer, Bjarne Stroustrup je rekao: “ Koliko ja znam EC++ je mrtav (2004), a ako nije, to se mora desiti”. Takođe, zvaničan EC++ na engleskom nije apdejtovan od 2002. Uprkos tome, ograničen podskup C++ (zasnovan na EC++) je usvojen od strane Apple, Inc.

Istorija - P.J. Plauger o EC++-u

P.J. Plauger je autor standardne C++ biblioteke koja je uključena u Microsoft Visual C++. Njegova kolumna “State of the Art” se svakog meseca objavljuje u Embedded Systems Programming.

Jeseni 1997. je održana Konferencija o ugrađenim sistemima u San Hoseu koja je bila ogroman uspeh. Posebna pažnja na konferenciji je bila posvećena EC++. Samo godinu dana ranije, na istoj konferenciji, imao sam čast da predstavim ovaj projekat publici. Cela ideja je lako mogla biti zaboravljena i nestati bez traga, kao sto se dešava sa mnogim optimističnim idejama, ali desilo se bas suprotno. Za početak ću ispričati kako sam saznao za ovaj projekat te kako je on počeo.

Istorija

Prvi put sam čuo za EC++ projekat u novembru 1995. na sastanku ISO i ANSI komiteta za standardizaciju C++. Advanced Data Controls Corp. (ADaC) je japanska kompanija sa kojom sam sarađivao od 1982. godine. Uzimajući u obzir uspeh naših prethodnih poslovnih saradnji, vrlo rado sam produžio svoj boravak i prisustvovao sastanku koji su organizovali tog petka uveče. Sastanku su pored ljudi iz AdaC-a, prisustvovali i developeri iz četiri velike japanske kompanije: Toshiba, Fujitsu, Hitachi i NEC, kao i nas nekoliko iz Amerike. Predstavnici sve četiri kompanije su imali jedan zajednički problem: njihove mušterije – skoro svi developeri ugrađenih sistema koji koriste njihove čipove – su počeli da zahtevaju C++ kompajlere. Naravno, prodavci su želeli da udovolje željama svojih kupaca. Sve četiri kompanije su ili već ponudile neku formu C++ kompajlera ili su se spremale da to učine. Međutim, kada su kupci počeli da koriste C++, velika većina je bila veoma nezadovoljna. Oni su bili naviknuti na C, naučili su kako da se izbore sa poteškoćama prilikom njegovog korišćenja u odnosu na asemblerske jezike, a pri tome su bili kako iznenađeni tako i zadivljeni novim karakteristikama koje su dodate C++. Najveći problem je međutim bio što je svaki komercijani C++ kompajler implementirao drugu kolekciju njegovih karakteristika. To je bila posledica toga sto se C++ menjao brzo i stalno tokom godina. “Standardizacija”, proces koji inače stabilizuje programski jezik, počeo je 1989. godine, ali je u slučaju C++, proces standardizacije korišćen kao prilika da se jeziku dodaju važne nove karakteristike pa pisci kompajlera nisu mogli da prate taj tempo. Ali, za programere ugrađenih sistema postaje jos gore. Neke od novih karakteristika cine C++ dosta zahtevnijim za korišćenje, javljaju se viškovi i u veličini koda i u brzini izvršavanja. U nekim slučajevima, ti viškovi se javljaju čak i ako ne koristite eksplicitno te karakteristike. Prodavci su tako naišli na čestu softversku dilemu: kako da budemo sigurni da je ono sto kupci misle da žele blizu onoga sto njima zaista treba? Popularno rešenje u takvim situacijama je definicija odgovarajućeg podskupa. U taj podskup uključiti sve sto odgovara potrebama programera ugrađenih sistema. Izbaciti sve sto se može izbaciti, da li zbog toga sto dodaje velike i nepotrebne viškove ili zbog toga sto je previše novo da bi bilo šire rasprostranjeno. Okupiti ljude koji ce se složiti oko toga kako taj podskup treba da izgleda. Ako nekoliko prodavaca bude svojim kupcima pružalo na korišćenje isti podskup, korisnici će moći da pišu C++ kod koji je i efikasan i prenosiv između različitih implemetacija. Tako je stvorena ideja o EC++, varijaciji programskog jezika C++, čija su ciljna grupa programeri ugrađenih sistema. Grupa koja se prvi put sastala tog petka uveče u Tokiu je sebe nezvanično nazvala Embedded C++ Technical Committee. Za šefa komiteta je izabran Hiroshi Monden iz NEC-a a Dr. Kiichiro Tamaru iz Tošibe za potpredsednika. Mi, Amerikanci, smo bili samo savetnici komitetu koji je sve buduće sastanke održavao na japanskom. Do septembra 1996. godine, Embedded C++ Technical Committee je napravio skicu specifikacija podskupa koji su izabrali, a kao što sam rekao na početku, ja sam ga prvi put predstavio javnosti na konferenciji te jeseni u San Hoseu.

EC++ kao jezik

Možda je najbolji način da opišemo EC++ kao jezik taj da navedemo koje su sve karakteristike iz C++ izbačene iz njega, a da vas uverimo da je podskup koji je ostao prilikom tog izbacivanja potpuno funkcionalan. Na primer: višestruko nasleđivanje i virtuelne bazne klase: dodaju jeziku prilično na kompleksnosti a podižu mu ekspresivnost na relativno niskom nivou. informacije o tipu podataka prilikom izvršavanja (typeid) obrada grešaka: jaki argumenti se mogu izneti i za i protiv ove odluke, ali što se tiče programera za ugrađene sisteme, oni često više vole da isključe ovaj mehanizam i koriste neki jednostavniji način šabloni: dovoljno dugo sam radio sa šablonima da bih znao da su oni zaista moćna stvar i da su često vredni kompleksnosti koja se zbog njih dodaje jeziku. Prvi komercijalni kompajleri koji u potpunosti podržavaju šablone tek postaju dostupni. Korišćenje šablona takođe može da dovede do značajnih viškova. Promenite tip jednog argumenta u jednom pozivu šablonske funkcije i možete nesvesno da duplirate veličinu koda koji se generiše za implementaciju te funkcije. Koliko god da su korisni, vredi izbegavati šablone u ugrađenim sistemima. prostori imena: oni su dodati u C++ pre nekoliko godina sa namerom da se podeli standardna C++ biblioteka kako bi posle mogla biti selektivno zamenjena. Međutim, do danas nisam video dizajn koji ostvaruje taj cilj te smatram da je njihovo izbacivanje iz EC++ pametna odluka novi načini kastovanja (static_cast, dynamic_cast, reinterpret_cast i const_cast): ovo je bila teža odluka. Operator za kastovanje tipa je postojao u C-u skoro od njegovog nastajanja 70-ih godina. Ali, mnogi programeri se slažu oko toga da treba da se predefiniše. Od ova četiri operatora koja su dodata C++ , za sada samo dynamic_cast stvara viškove pri izvršavanju. Lično smatram da su novi načini kastovanja izbačeni čisto zbog toga jer su novi i treba da prođe vreme da se ispita njihov uticaj na izvrsavanje programa

Srećom, bio sam samo savetnik na ovo projektu. Divim se kreatorima na hrabrost prilikom donošenja nekih od jako teških odluka. Istovremeno, ne moram da pravdam neke kontraverzne odluke.

Sadržaj EC++ biblioteke

EC++ biblioteka je podskup C i C++ biblioteka. Ovo je kratak opis onoga sto se zahteva na bazi header-by-header: The header <cctype>: functions is*, to* The header <cerrno>: macros EDOM, ERANGE, errno The header <cfloat>: macros DBL_*, FLT_*, LDBL_* The header <climits>: macros CHAR_BIT, *_MIN, *_MAX The header <clocale> type lconv; function localeconv The header <cmath>: macro HUGE_VAL; functions (overloaded on float, double, and long double) abs, acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor, fmod, frexp, ldexp, log, log10, mod, pow, sin, sinh, sinh, sqrt, tan, tanh The header <csetjmp>: type jmp_buf; macro setjmp; function longjmp The header <cstdarg>: type va_list; macros va_arg, va_end, va_start The header <cstddef>: macro offsetof; types ptrdiff_t, size_t The header <cstdio>: types FILE, fpos_t, size_t; macros EOF, NULL; functions fclose, fflush, fgetc, fgetpos, fopen, fputc, fsetpos, getchar, gets, printf, putchar, puts, scanf, setvbuf, sprintf, sscanf, ungetc, vprintf, vsprintf; objects stdin, stdout The header <cstdlib>: types div_t, ldiv_t; macros MB_CUR_MAX, RAND_MAX; functions abort, abs, atol, atof, atoi, bsearch, calloc, div, free, labs, ldiv, malloc, qsort, rand, realloc, srand, strtod, strtol, strtoul The header <cstring>: type size_t; macro NULL; functions memchr, memcmp, memcpy, memmove, memset, strcat, strchr, strcmp, strcpy, strcspn, strlen, strncat, strncmp, strncpy, strpbrk, strrchr, strspn, strstr, strtok The header <complex>: types double_complex, float_complex; functions (overloaded on float_complex and double_complex) abs, arg, conjg, cos, cosh, exp, imag, log, log10, norm, polar, pow, real, sin, sinh, sqrt, tan, tanh The header <fstream>: types filebuf, ifstream, ofstream The header <iomanip>: manipulators resetiosflags, setbase, setfill, setiosflags, setprecision, setw The header <ios>: types ios, ios_base; manipulators boolalpha, dec, fixed, hex, internal, left, noboolalpha, noshowbase, noshowpoint, noskipws, nouppercase, oct, right, scientific, showbase, showpoint, skipws, uppercase The header <iosfwd>: forward references to iostreams classes The header <iostream>: objects cin, cout The header <istream>: type istream; manipulators endl, ends, flush The header <new>: types new_handler, nothrow, nothrow_t; functions operator delete, operator delete[], operator new, operator new[], set_new_handler The header <ostream>: type ostream; manipulator ws The header <sstream>: types istringstream, ostringstream, stringbuf The header <streambuf>: types fpos, streambuf, streamoff, streamsize The header <string>: type string; function getline

Performanse