EC++

С Википедије, слободне енциклопедије

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[1] 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”.[2]

Razlike u odnosu na C++[уреди | уреди извор]

Ugrađeni C++ je podskup C++-a. Sledeće karakteristike C++ su uklonjene:

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++”.[3] 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

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[уреди | уреди извор]

Osnovna premisa koja stoji iza dizajna EC++ je da jezik koji predstavlja podskup onog od kog je nastao postiŽe bolje rezultate kada su u pitanju memorija I efikasnost. Verovatno sam mnogo puta rekao da podrŽavam izbegavanje novih karakteristika u jeziku, najviŠe iz razumevanja kako prema programerima tako i prema implementatorima. To je prolazan problem koji će biti rešen sam od sebe u narednih nekoliko godina kako C++ Standard bude postao zvaničan i stabilan, kompajleri budu počeli da prate njegov napredak i programeri budu naučili kako da koriste te nove karakteristike. Ali, problemi vezani za performanse će biti važni za ugrađene sisteme i u mnogo daljem periodu. Ono sto ću sada predstaviti su neki anegdotični rezultati za koje smatram da su reprezentativan uzorak za prikazivanje pravog stanja u programiranju. Oni upoređuju relativne veličine programa par malih testova koji su kompajlirani na različite nacine i povezani sa različitim bibliotekama.

Te dve biblioteke su Dinkum C++ I Dinkum EC++ biblioteke. Prva je kompletna implementacija nacrta Standard C++ biblioteke, a druga je implementacija koju je napravila kompanija Dinkumware za Embedded C++ biblioteku. Green Hills Software je vodeći prodavac na tržištu ugrađenih sistema. Oni licenciraju Dinkumware biblioteke za distribuciju sa svojim kompajlerima. Dva test programa su kompajlirana svojim PowerPC kompajlerom. Moje iskustvo je pokazalo da moderni mikroprocesori ovako funkcionišu: vreme izvršavanja najviše zavisi od broja bajtova u kodu koji procesor mora da pročita. Izuzimajući hot spots, to je proporcionalno ukupnoj veličini programa. Čak i na mali program koji na jednostavan način koristi I/O biblioteku veliki uticaj imaju posledice njenog korišćenja. Relativne veličine takvih programa su:

 3 — EC++, bez izuzetaka
 5 — EC++, sa izuzecima 
 6 — Kompletan C++, bez izuzetaka
 8 — Kompletan C++, sa izuzecima 

Prvo primetite značajnu uštedu ako kompajler ne mora da brine o obradi grešaka u kodu. Zatim primetite sta vam pruža korišćenje jednostavnije biblioteke. Izbacivanjem nepotrebne mašinerije koja se ne može izbeći u kompletnoj C++ biblioteci, veličina EC++ programa je duplo manje od veličine C++ programa. Uzimajući u obzir uštede koje pružaju i jezik i biblioteka, vidimo da EC++ program ima velicinu kao 8/3 C++ programa.

Razlike su jos značajnije za neke veće programe koji u većoj meri koriste I/O biblioteku. U tom slučaju je kompletnoj C++ biblioteci teže da izbegne ubacivanje velike količine dodatnog koda. Relativne veličine koda su sledeće: 3 — EC++, bez izuzetaka 5 — EC++ sa izuzecima 30 — Kompletan C++, bez izuzetaka 45 — Kompletan C++ sa izuzecima

Da, veličina EC++ programa je 15 puta manja od veličine C++ programa. Setite se da sada živimo u svetu u kom tradicionalan, trivijalan program koji samo ispisuje “hello, world” može da zauzima čitav megabajt na nekim desktop implementacija C++ programa. Ušteđevine na koje se najčešće nailazi su uglavnom manje značajne , ali pruženi dokazi su dovoljni da se vidi razlika. Postoje zaista velike prednosti sto se tice performasi prilikom programiranja na EC++ i korišćenjem njegovim biblioteka.

Bjarne Stroustrup o EC++[уреди | уреди извор]

Šta mislite o jeziku EC++? EC++ je (skoro) podskup C++ iz kog su izbačeni izuzeci, sabloni, prostori imena, podrška RTTI, višestruko nasleđivanje, itd., kako je definisan od strane “industrijskog konzorcijuma”. Ja nisam zagovornik podskupa i dijalekata programskih jezika. Posebno ne podržavam podskupe koji ne podržavaju standardnu biblioteku što dovodi do toga da korisnici tog jezika moraju sami da izmisle svoje nekompatibilne osnovne biblioteke. Plašim se da ovako definisan podskup jezika C++ moze da podeli korisničku zajednicu i uzrokuje gorčinu: 31.3.1999. - “Upravo sam video reklamu koja koristi zivopisnu grafiku da bi prikazala kako je EC++ smanjio viškove (na primer veličinu memorije) ukidanjem – između ostalog – prostora imena, šablona i standardne C++ stringove.” Ja sam naprotiv veliki zagovornik toga da se rad na “standardima” obavlja na otvorenom forumu (poput ISO ili nacionalne organizacije za standardizaciju).

Koliko sam ja upućen, EC++ je mrtav, a ako nije, trebalo bi da bude.

Vidi još[уреди | уреди извор]

Reference[уреди | уреди извор]

  1. ^ „EC++ Rationale”. 
  2. ^ EC++ Questions and Answers
  3. ^ „Embedded and Extended Embedded C++”. Архивирано из оригинала 21. 5. 2013. г. Приступљено 9. 12. 2012. 
  4. ^ „IAR Systems - Compilers and debuggers”. IAR Systems website. Архивирано из оригинала 5. 01. 2015. г. Приступљено 18. 02. 2018. 
  5. ^ „Embedded C++ compiler technology”. Tasking website. Архивирано из оригинала 1. 1. 2009. г. 
  6. ^ „Green Hills Optimizing C/C++/EC++ Compilers”. Green Hills Software website. Архивирано из оригинала 25. 10. 2008. г. 

Spoljašnje veze[уреди | уреди извор]