Címkék: A C, ANSI C, ISO C, C99, C11, ISO/IEC C, C szabványosítás története.

eredet

C és a UNIX operációs rendszer létrehozásának „társterméke”, amelyet a Bell Laboratories-ban fejlesztettek ki Ken Thompson, Denis Ritchie és társai. Thompson egymaga megírta a UNIX eredeti verzióját, amely a DEC PDP-7-en futott, az egyik első miniszámítógépen, amely mindössze 8K szónyi főmemóriával rendelkezik (végül is 1969 volt).

A korabeli többi operációs rendszerhez hasonlóan a UNIX is assembly nyelven készült. Az assembly nyelvű programok hibakeresése igazi fájdalom, és nehéz javítani, ez alól a UNIX sem volt kivétel. Thompson úgy döntött, hogy egy magas szintű nyelvre van szükség az operációs rendszer további fejlesztéséhez, és egy kis nyelvet talált ki B. Thompson a BCPL nyelvet vette át, amely egy nyelv rendszer programozás a 60-as évek közepén alakult ki. A BCPL pedig az Algol 60-ból, az egyik legkorábbi (és legbefolyásosabb) nyelvből származik.

Ritchie hamarosan csatlakozott a UNIX projekthez, és B nyelven kezdett írni. 1970-ben a Bell Labs vásárolt egy PDP-11-et a projekthez. Mivel B készen állt a PDP-11-en való futtatásra, Thompson átírta a UNIX egy részét B-re. 1971-ben világossá vált, hogy B nem egészen alkalmas a PDP-11-hez, így Ritchie elkezdte létrehozni a B kiterjesztett változatát. először NB-nek (New B) nevezték, de amikor a nyelv nagyon eltér a B-től, a név C-re változott. 1973-ra a nyelv elég stabil volt ahhoz, hogy a UNIX-ot át lehessen írni benne. A C-re való átállás fontos előnyt jelentett: a hordozhatóságot. Ha a Bell Labs minden egyes gépéhez ír egy C-fordítót, a fejlesztőcsapat a UNIX-ot portolhatja rájuk.

Szabványosítás

A C a 70-es években tovább fejlődött, különösen 1977 és 1979 között, amikor megjelent az első C könyv.A Brian Kernighan és Denis Ritchie által írt és 1978-ban kiadott C programozási nyelv a C programozók bibliája lett. Hivatalos szabvány híján ez a könyv – más néven K&R, vagy a C-rajongók szeretik nevezni „Fehér Könyv” – de facto szabvány lett. A 70-es években kevés C programozó volt, és legtöbbjük UNIX felhasználó volt. A 80-as években azonban a C túllépett a UNIX világ szűk határain. A C fordítók különféle operációs rendszereket futtató gépeken váltak elérhetővé. Különösen a C kezdett elterjedni a gyorsan fejlődő IBM PC platformon.

A népszerűség növekedésével párhuzamosan problémák is jelentkeztek. Azok a programozók, akik új fordítókat írtak, a K&R-ben leírt nyelvet vették alapul. Sajnos a K&R-ben a nyelv egyes jellemzőit homályosan írták le, így a fordítók gyakran saját belátásuk szerint értelmezték azokat. Ezenkívül a könyv nem tett egyértelmű különbséget a nyelv és a UNIX operációs rendszer sajátosságai között. A helyzetet rontotta, hogy a K&R megjelenése után a C tovább fejlődött: új funkciókat adtak hozzá, a régieket pedig kivágták belőle. Hamarosan nyilvánvalóan szükség volt a nyelv átfogó, pontos és naprakész leírására. Ilyen szabvány nélkül kezdtek megjelenni a nyelv dialektusai, amelyek megzavarták a hordozhatóságot, a nyelv legerősebb oldalát.

Az amerikai C szabvány fejlesztése 1983-ban kezdődött az Amerikai Nemzeti Szabványügyi Intézet (ANSI) égisze alatt. Számos felülvizsgálat után a szabvány 1988-ban készült el, és hivatalosan 1989 decemberében fogadták el ANSI X3.159-1989 néven. 1990-ben a Nemzetközi Szabványügyi Szervezet (ISO) jóváhagyta az ISO/IEC 9899:1990 nemzetközi szabványként. A nyelvnek ezt a verzióját általában C89-nek vagy C90-nek nevezik, hogy elkerüljük az összetéveszthetőséget a C eredeti verziójával, amelyet általában K&R C-nek neveznek.

A nyelvezet 1995-ben kisebb változásokon ment keresztül (a változtatásokat egy dokumentum írja le, amelyet általában 1. módosításként emlegetnek). Jelentősebb változások történtek 1999-ben, amikor megjelent az ISO/IEC 9899:1999 szabvány. Az ebben a szabványban leírt nyelvet általában C99-nek nevezik. A C99 leírására használt „ANSI C”, „ANSI/ISO C” és „ISO C” kifejezések kétértelműek, mivel két szabvány létezik.

2011-ben a C++ nyelvi változattal együtt megjelent a C11 szabvány is. A 11-es szabvány jelenléte ellenére sok fordító még mindig nem támogatja teljes mértékben még a C99-es verziókat sem, így a C11-es szabvány használata kifejezetten kimondva lesz.

Amikor a hírneved a nyereségedért dolgozik

Közösségi menedzsment

Hangszín létrehozása. Mind a negatív, mind a pozitív megjegyzések azonnali feldolgozása a márka nevében. Kommunikáció kezelése az adott forgatókönyvek szerint. Problémás pillanatok közvetítése az ügyfél felé.

Befolyásolók

"Virtuálok" létrehozása és megvalósítása fórumokon és innen a közösségi hálózatokon. Több mint 300 webhelyen található a pumpált és élő fiókok adatbázisa.

Munka véleményekkel

Márkaértékelések írása, koordinálása és közzététele a legnépszerűbb webhelyeken és értékelési webhelyeken. A negatív megjegyzések feldolgozása és átfedése pozitívakkal. Eredményeképpen Keresési eredmények a negatív fokozatosan cserélődik.

A közösségi média figyelése

Dolgozik Youscan, IQbuzz, Brand Analytics rendszerekkel. A márka említésének ellenőrzése. A kulcsfontosságú meglátások azonosítása, azonnali válasz a negativitásra. Nélkülözhetetlen eszköz az ellenőrzéshez Visszacsatolásügyfelektől.

Analitika és kutatás

Elemzés információs mező, termékkategória kutatás és a márka fő versenytársai. Ez az eszköz a reputáció ellenőrzésétől és a valós idejű marketingtől a mélyreható kutatásig terjedő feladatokat fedi le.

SERM

Részletes elemzés keresési eredmények a kiválasztott kulcsszavakra. Az ügyfélről szóló említések gyűjteménye közösségi hálózatokon, fórumokon és híroldalakon. Stratégia kidolgozása a negatív információk kezelésére. Az ügyfél egy teljesen ellenőrzött kérdést kap a TOP10-ben.

Mi a C nyelv állapota? Történelmileg ez a nyelv elválaszthatatlan a Unix operációs rendszertől, amely most éli újjászületését. A 60-as évek az operációs rendszerek és a magas szintű programozási nyelvek kialakulásának korszaka voltak. Abban az időben az operációs rendszert és a fordítókat külön-külön fejlesztették ki minden számítógéptípushoz, sőt gyakran a saját programozási nyelveiket is (emlékezzünk például a PL/I-re). Ugyanakkor az ebben az esetben felmerülő problémák általánossága már nyilvánvalóvá vált. Ennek a közösnek a felismerésére a válasz egy univerzális mobil létrehozására tett kísérlet volt operációs rendszer, ehhez pedig nem kevésbé univerzális és mobil nyelv programozás. A C lett ez a nyelv, a Unix pedig az első operációs rendszer, amelyet szinte teljes egészében magas szintű nyelven írtak.

A Unix-szal való szoros kapcsolat olyan tesztelési terepet adott a C-nek, amilyenben akkoriban egyetlen másik nyelv sem rendelkezett. A rendszerprogramozási feladatokat joggal tekintették akkoriban a legösszetettebbnek az iparágban. Többnyire annyira gépfüggőek voltak, hogy sokaknak eszébe sem jutott más megoldás, mint assemblerben. A magas szintű nyelveket alkalmazásprogramozásra szánták, és csak nagyon korlátozottan valósították meg az ehhez szükséges funkciókat rendszer munka, és gyakran csak egy bizonyos típusú géphez.

A C nyelvet kezdettől fogva úgy tervezték, hogy rendszerfeladatokat lehessen benne írni. A C készítői nem a nyelvi végrehajtó elvont modelljét kezdték el kidolgozni, hanem egyszerűen megvalósították benne azokat a funkciókat, amelyekre a rendszerprogramozás gyakorlatában a legnagyobb szükség volt. Mindenekelőtt ezek voltak a memóriával való közvetlen munka eszközei, a szerkezeti vezérlési struktúrák és a program moduláris felépítése. És valójában semmi más nem szerepelt a nyelvben. Minden más a futásidejű könyvtárba került. Ezért a rosszindulatúak néha a C nyelvről mint szerkezeti összeszerelőről beszélnek. De nem számít, mit csevegtek, a megközelítés nagyon sikeresnek bizonyult. Neki köszönhetően új szintre került az egyszerűség és a nyelv lehetőségeinek aránya.

Van azonban egy másik tényező is, amely meghatározta a nyelv sikerét. Az alkotók nagyon ügyesen választották el benne a gépfüggő és független tulajdonságokat. Ennek köszönhetően a legtöbb program univerzálisan írható - teljesítményük nem függ a processzor és a memória architektúrájától. A kód néhány hardverfüggő része lokalizálható egyedi modulok. Az előfeldolgozó segítségével pedig olyan modulokat hozhat létre, amelyekre lefordítva különböző platformokon generálja a megfelelő gépfüggő kódot.

A C nyelv szintaxisa sok vitát váltott ki, a benne használt rövidítések túlzott használat esetén teljesen olvashatatlanná tehetik a programot. De, ahogy Dijkstra mondta, - az eszközök nem hibásak azért, mert írástudatlanok használják őket. Valójában a C-ben javasolt szintaktikai rövidítések megfelelnek a gyakorlatban leggyakrabban előforduló sztereotip helyzeteknek. Ha a rövidítéseket idiómáknak tekintjük az ilyen helyzetek kifejező és tömör bemutatására, akkor hasznosságuk feltétlen és nyilvánvalóvá válik.

Így a C általános célú rendszerprogramozási nyelvként jelent meg. De nem maradt e határokon belül. Az 1980-as évek végére a C nyelv, amely félretolta a Fortran-t a vezető pozícióból, tömeges népszerűségre tett szert a programozók körében szerte a világon, és az alkalmazott feladatok széles körében kezdték használni. Jelentős szerepet játszott itt a Unix (és így a C) egyetemi környezetben való elterjedése, ahol a programozók új generációját képezték ki.

Mint minden nyelv, a C is fejlődött az idők során, de a fejlesztések többsége nem volt radikális. Ezek közül talán a legjelentősebbnek a funkciótípusok szigorú specifikációjának bevezetését kell tekinteni, ami jelentősen megnövelte a modulok közötti interakció megbízhatóságát C-ben. Minden ilyen fejlesztést 1989-ben rögzítettek az ANSI szabványban, amely máig meghatározza a C nyelv.

De ha minden olyan felhőtlen, akkor miért használják továbbra is az összes többi nyelvet, mi támogatja a létezésüket? A C nyelv Achilles-sarka az volt, hogy túl alacsony szintű volt a 90-es évek által napirendre tűzött feladatokhoz. És ennek a problémának két aspektusa van. Egyrészt túl alacsony szintű eszközöket építettek a nyelvbe - elsősorban a memóriával és a címaritmetikával dolgozott. A processzorok kapacitásának megváltoztatása nem hiába van nagyon fájdalmas hatással számos C-programra. Másrészt a C-ből hiányoznak a magas szintű eszközök - absztrakt adattípusok és objektumok, polimorfizmus, kivételkezelés. Ennek következtében a C programokban gyakran a feladat végrehajtásának technikája dominál a tartalmában.

Az első kísérletek e hiányosságok kijavítására az 1980-as évek elején kezdődtek. Bjorn Stroustrup az AT & T Bell Labs-nál már akkor elkezdte fejleszteni a C nyelv kiterjesztését feltételes néven. A fejlesztés stílusa teljesen összhangban volt azzal a szellemiséggel, amelyben magát a C nyelvet létrehozták – bizonyos funkciókat bevezettek benne, hogy jobban tegyék. kényelmes munkavégzés konkrét emberek és csoportok. Az új nyelv első kereskedelmi fordítója, a C++ 1983-ban jelent meg. Egy előfeldolgozó volt, amely a programot C kódra fordította, de Stroustrup könyvének 1985-ös megjelenése tekinthető a nyelv tényleges születésének. Ettől a pillanattól kezdve a C++ világszerte népszerűvé vált.

A C++ fő újítása az osztálymechanizmus, amely lehetővé teszi új adattípusok meghatározását és használatát. A programozó leírja egy osztályobjektum belső reprezentációját és a reprezentáció eléréséhez szükséges metódusfüggvények halmazát. A C ++ létrehozásakor az egyik dédelgetett cél az volt, hogy növeljék a már megírt kódok újrafelhasználásának arányát. Az osztályok koncepciója kínált erre egy öröklődési mechanizmust. Az öröklődés lehetővé teszi új (származott) osztályok létrehozását kiterjesztett reprezentációval és módosított metódusokkal anélkül, hogy ez befolyásolná az eredeti (alap) osztályok lefordított kódját. Ugyanakkor az öröklődés biztosítja a polimorfizmus megvalósításának egyik mechanizmusát - az objektum-orientált programozás alapkoncepcióját, amely szerint az azonos típusú feldolgozás végrehajtása érdekében különböző típusok adatok, ugyanaz a kód használható. Valójában a polimorfizmus is az egyik módszer a kód újrafelhasználásának biztosítására.

Az osztályok bevezetése nem meríti ki a C++ nyelv összes újítását. Teljes értékű strukturált kivételkezelő mechanizmussal rendelkezik, aminek hiánya C-ben jóval megnehezítette a megbízható programok írását, sablonmotorral, a nyelvbe mélyen beágyazott kifinomult makrógenerálási mechanizmussal, újabb utat nyitva a kód újrafelhasználhatóságához, és még sok más.

Így a nyelvi fejlesztés általános irányvonala arra irányult, hogy új, magas szintű konstrukciók bevezetésével bővítse képességeit, miközben a lehető legteljesebb kompatibilitást megtartotta az ANSI C. műveletekkel, így a programozó ténylegesen leállítja a memóriával és a rendszerfüggő entitásokkal való közvetlen munkát. A nyelv azonban nem tartalmaz olyan mechanizmusokat, amelyek a fejlesztőt a program helyes felépítésére kényszerítenék, és a szerzők nem adtak ki szisztematikus ajánlásokat a meglehetősen kifinomult konstrukciók használatára. Nem gondoskodtak időben és egy szabványos osztálykönyvtár létrehozásáról, amely a leggyakoribb adatstruktúrákat valósítja meg.

Mindez oda vezetett, hogy sok fejlesztő kénytelen volt feltárni a nyelvi szemantika labirintusait, és önállóan keresni a sikeresen működő idiómákat. Így például a nyelv fejlesztésének első szakaszában az osztálykönyvtárak számos alkotója egyetlen osztályhierarchiát akart felépíteni egy közös alaposztályú Object-tel. Ezt az ötletet a Smalltalktól – az egyik leghíresebb objektum-orientált nyelvtől – kölcsönözték. C++-ban azonban teljesen életképtelennek bizonyult - a kidolgozott osztálykönyvtári hierarchiák rugalmatlannak bizonyultak, és az osztályok munkája sem volt szembetűnő. Ahhoz, hogy az osztálykönyvtárak használhatóak legyenek, azokat forráskódban kellett megadni.

A sablon osztályok megjelenése teljesen megcáfolta ezt a fejlődési irányt. Az öröklődést csak olyan esetekben kezdték használni, amikor egy meglévő osztály speciális verzióját kellett létrehozni. A könyvtárak elkezdtek különálló osztályokból és kis, egymással nem összefüggő hierarchiákból állni. A kód újrafelhasználása azonban fokozatosan csökkenni kezdett, mivel a C++ nem teszi lehetővé a független hierarchiákból származó osztályok polimorf használatát. A sablonok széles körben elterjedt használata a lefordított kódok mennyiségének elfogadhatatlan növekedéséhez vezet – ne felejtsük el, hogy a sablonok megvalósítása makrógenerálási módszerekkel történik.

A C++ egyik legrosszabb hiányossága, amely a C szintaxisából örökölt, az, hogy a fordító rendelkezésére áll az összes használt osztály belső szerkezetének leírása. Ennek eredményeként egyes könyvtárosztályok reprezentációjának belső struktúrájában bekövetkezett változás ahhoz vezet, hogy minden olyan programot újra kell fordítani, ahol ezt a könyvtárat használják. Ez nagymértékben korlátozza a könyvtári fejlesztőket a korszerűsítésük szempontjából, mert a kiadás új verzió, meg kell őrizniük a bináris kompatibilitást az előzővel. Ez a probléma az, ami miatt sok szakértő elhiteti, hogy a C++ nem alkalmas nagy és rendkívül nagy projektekre.

Pedig a felsorolt ​​hiányosságok, sőt a nyelvi szabvány elérhetetlensége ellenére (ez több mint tizenöt év használat után történt!), a C ++ továbbra is az egyik legnépszerűbb programozási nyelv. Erőssége elsősorban a C nyelvvel való szinte teljes kompatibilitásban rejlik, ennek köszönhetően a C nyelven elért összes vívmány elérhető a C ++ programozók számára, ugyanakkor a C ++ osztályok használata nélkül is C számos fontos további jellemzőkés olyan szolgáltatások, amelyeket sokan egyszerűen továbbfejlesztett C-ként használják.

Vonatkozó tárgymodell C++, akkor mindaddig, amíg a programod nem lett túl nagy (több százezer sor), teljesen lehetséges a használata. A komponensre való átállás legújabb trendje szoftver csak a C ++ pozícióját erősíti. Az egyes komponensek fejlesztésénél még nem jelentkeznek a C ++ hiányosságai, a komponensek működő rendszerbe kötése már nem nyelvi, hanem operációs rendszer szinten történik.

Az elmondottak fényében a C++ kilátásai nem tűnnek borúsnak. Bár a programozási nyelvek piacán a monopólium nem ragyog neki. Talán csak annyit állíthatunk biztosan, hogy ez a nyelv nem fog túlélni egy újabb modernizációt-bővítést. Nem ok nélkül, amikor a Java megjelent, akkora figyelmet fordítottak rá. A C++ szintaxisában közel álló, és ezért sok programozó számára ismerősnek tűnő nyelvet megkíméltek a C++ legkirívóbb hiányosságaitól, amelyeket a 70-es évektől örökölt. Úgy tűnik azonban, hogy a Java nem felel meg annak a szerepnek, amelyet egyesek neki adtak.

A C/C++ nyelvek különleges szerepe a modern programozásban szinte értelmetlenné teszi konkrét címek megadását az interneten, ahol anyagokat találhat róluk. Túl sok ilyen hely van. Ha azonban többet szeretne megtudni a C++ evolúciójáról, kezdje egy rövid cikkel http://citforum.syzran.ru/programming/prg96/76.shtml.

Alekszandr Szergejev, [e-mail védett]
Cikk a BYTE/Russia magazinból, 2000. március

A leírt nyelvek gyakorlati használatának vizuális bemutatása érdekében olyan feladatot választottunk, amelyben a szabványos bemenetből vagy egy fájlból egész számokat kellett megadni, majd csak a páratlanokat kellett kiadni. fordított sorrendben. Ez az egyik legegyszerűbb probléma, amelynek megoldása sok munkát igényel tömbökkel, hurkokkal, elágazásokkal és I/O-val, és lehetővé teszi a szubrutinhívások demonstrálását is. Ugyanakkor látható és könnyen észlelhető.

Listázás 1. C

1 #beleértve /* I/O függvények csatlakoztatása */ 2 3 void main(void) 4 ( 5 int M; /* 10 egész számból álló tömb, 0-tól számítva */ 6 int N; 7 for (N=0; N<10; ++N) /* Вводим не более 10 чисел */ 8 if (EOF == scanf ("%d, M+N)) 9 break; /* Если конец файла, прерываем цикл */ 10 11 for (-N; N>=0; --N) /* Végigpörgetés a tömbön fordított irányban */ 12 if (M[N]%2) /* sorrendben, és kiírja a páratlanokat */ 13 printf("%d\n", M[N]) ; tizennégy)

  • 3. sor. C/C++ nyelven a programvégrehajtás mindig a főfüggvénnyel kezdődik.
  • 7. és 11. sor. A hurok fejléce pontosvesszőt tartalmaz, amely jelzi a kezdeti beállítást, a folytatási feltételt és a hurokparaméter újraszámításának szabályát. Tevékenységek ++ és -/- - a C nyelv leghíresebb rövidítése, ami egy változó növelését és csökkentését jelenti, azaz értékének eggyel történő növelését és csökkentését.
  • 8. sor. Funkció scanf beírja az első paraméter által megadott formátumnak megfelelően azoknak a változóknak az értékeit, amelyek címét a többi paraméter megadja. Itt a cím, ahová az értéket beírtuk, a címaritmetika segítségével számítja ki a tömb helyének címére M offset hozzáadódik N elemeket. Ugyanez a hatás érhető el írással &M[N].
  • 12. sor. Művelet % kiszámolja az osztás maradékát. Kezelői állapot ha teljesítettnek tekinthető, ha a kifejezés számértéke nem nulla.
  • 13. sor. Funkció printf- a formátum szerinti nyomtatás hasonlóan működik scanf, de a címek helyett a kiadandó értékeket adja át.
1 #beleértve 23 sablon class Array 4 ( 5 public: Array (T Size=1) : M (new T), N(Size), n(0) () 6 Array (void) ( törlés M;) 7 T Count (void) const ( return n; ) 8 T operátor (int i) const ( return M[i]; ) 9 void Add (T Data); 10 private: 11 T* M; // Elosztott memória címe 12 int N, n; // N - elosztott n - használt 13); 14 15 sablon void Array ::Add(T Data) 16 ( if (N-n) // Ha minden ki van osztva 17 ( int* P = new T; // hely használatban van, allokáljon több 18-at az (int i=0; i A; // Változó méretű egész számok tömbje 28 while (1) // Végtelen ciklus 29 ( int N; 30 cin >> N; // cin - standard input stream 31 if (cin.eof()) break; // Lépjen ki a ciklus a fájl végén 32 A.Add(N); // A beírt szám hozzáadása a tömbhöz 33 ) 34 for (int N=A.Count()-1; N>=0; --N) // Cikk a tömbön keresztül 35 if ( A[N]%2) 36 cout<, és szabadítson fel memóriát
  • 3-13. sor. A sablon osztály deklarálva van Sor paraméterrel T. Ez változó méretű objektumok tömbje T. Természetesen feladatunkban nincs szükség a sablon osztály használatára. Azonban azt akartuk bemutatni, hogy a C++ hogyan hoz létre olyan polimorf adatstruktúrát, amely bármilyen típusú elemmel működik.
  • 5. sor. Osztályépítő. Inicializálja az objektum reprezentációját. Például terepen M a művelet által elrendelt memóriablokk címét írjuk be új T.
  • 8. sor. Példa egy művelet túlterhelésére. Funkció operátor akkor lesz meghívva, amikor szögletes zárójelek jelennek meg az osztályobjektumtól jobbra sor.
  • 9. sor. Ez a funkció a legfontosabb a megvalósításban. Elemeket ad hozzá a tömbhöz, szükség szerint bővíti azt. Mivel összetettebb, mint a többi, definíciója kikerül az osztályleírásból. Az osztálytörzsben leírt függvények C++-ban nem hívással, hanem inline helyettesítéssel valósulnak meg. Ez felgyorsítja a programot, bár növeli a méretét.
  • 15-24. sor. Funkció meghatározása Tömb::Hozzáadás(T)(egyébként ez a teljes neve).
  • 27. sor. Hozzon létre egy típusú objektumot sor. Templom Aggau típus szerint paraméterezve int.

Miért C++?

A C++ jelenleg a kereskedelmi szoftvertermékek fejlesztésének domináns nyelve. Az elmúlt években ezt a dominanciát kissé megrendítették egy olyan programozási nyelv, mint a Java, hasonló állításai, de a közvélemény inga a másik irányba fordult, és sok programozó, aki elhagyta a C++-t Java számára, a közelmúltban visszarohant korábbi vonzalmához. Mindenesetre ez a két nyelv annyira hasonló, hogy az egyik nyelv megtanulásával automatikusan elsajátítod a másik 90%-át.

A C# egy új nyelv, amelyet a Microsoft fejlesztett ki a hálózati platformhoz. Lényegében a C# egyfajta C++, és számos alapvető különbség ellenére a C# és C++ nyelvek körülbelül 90%-ban egybeesnek. Valószínűleg hosszú időnek kell eltelnie, amíg a C# komoly versenytársa lesz a C++-nak; de még ha igen is, a C++ nyelv ismerete jelentős előnyt jelent.

A C++ egy általános célú programozási nyelv. Természetes hatóköre a rendszerprogramozás, a szó legtágabb értelmében értendő. Ezenkívül a C++-t számos alkalmazási területen sikeresen használják, amelyek messze túlmutatnak a megadott hatókörön. A C++ implementáció már minden gépen megtalálható, a legszerényebb mikroszámítógéptől a legnagyobb szuperszámítógépig, és gyakorlatilag minden operációs rendszerhez.

A C++ nyelv megjelenése és fejlődése

Bjorn Stroustrup a C++ nyelv fejlesztője és az első fordító megalkotója. Az AT&T Bell Laboratories Research Computing Center munkatársa Murray Hillben (New Jersey, USA). Master fokozatát matematikából és számítástechnikából az Aarus egyetemen (Dánia), PhD fokozatát számítástechnikából a Cambridge-i Egyetemen (Anglia) szerezte. Szakterülete az elosztott rendszerek, operációs rendszerek, modellezés és programozás. M. A. Ellis-szel együtt ő a szerzője egy teljes útmutatónak a C++ nyelvhez - "A Guide to C++ with Notes".

Természetesen a C++ sokat köszönhet a C nyelvnek, amelyet annak egy részhalmazaként őriznek meg. A C-ben rejlő összes alacsony szintű eszköz, amelyet a rendszerprogramozás legégetőbb problémáinak megoldására terveztek, szintén megmarad. A C pedig sokat köszönhet elődjének, a BCPL-nek. A BCPL nyelvű megjegyzés visszaállt C++ nyelvre. Az inspiráció másik forrása a SIMULA-67 nyelv volt; tőle kölcsönözték az osztályok fogalmát (a származtatott osztályokkal és virtuális függvényekkel együtt). Az Algol-68 nyelvre emlékeztet a C++ azon képessége, hogy túlterhelje az operátorokat, és a nyilatkozatok szabadon elhelyezhető bárhol, ahol egy operátor megjelenhet.

A nyelv korábbi változatai, a C with Classes, 1980 óta használatosak. Ez a nyelv azért jött létre, mert a szerzőnek megszakítás-vezérelt szimulációs programokat kellett írnia. A SIMULA-67 nyelv erre a hatékonyságon kívül ideális. A "C osztályokkal" nyelvet a nagy modellezési feladatokhoz használták. Akkoriban szigorú tesztelésnek vetették alá a rá programírási lehetőségeket, amelyekhez az idő- és memóriaerőforrások kritikusak. Ebből a nyelvből hiányzott az operátorok túlterhelése, a hivatkozások, a virtuális funkciók és sok egyéb szolgáltatás. A C++ először 1983 júliusában hagyta el azt a kutatócsoportot, ahol a szerző dolgozott, de akkor még sok C++ funkciót nem fejlesztettek ki.

A C++ (C plusz) nevet Rick Maschitti találta ki 1983 nyarán.Ez a név a C nyelv változásainak evolúciós jellegét tükrözi.A ++ jelölés a C növekményes műveletre utal. A valamivel rövidebb C+ név szintaktikai hiba. Ráadásul már egy teljesen más nyelv neveként is használták. A C szemantikusok úgy találják, hogy a C++ rosszabb, mint a ++C. A nyelvet nem D-nek hívják, mert ez a C kiterjesztése, és nem próbál problémákat megoldani a C jellemzők eldobásával A C++ név másik érdekes értelmezése a mellékletben található.

A C++ kezdetben úgy született meg, hogy a szerzőnek és barátainak ne kelljen assembly, C vagy más modern magas szintű nyelveken programozni. Fő célja a programozási folyamat egyszerűsítése és élvezetesebbé tétele az egyes programozók számára. Egészen a közelmúltig nem volt papíron C++ fejlesztési terv. A tervezés, a megvalósítás és a dokumentáció kéz a kézben haladt. Soha nem volt „C++ Project” vagy „C++ Design Committee”. Ezért a nyelv úgy fejlődött és fejlődik, hogy a felhasználók által tapasztalt összes problémát leküzdje. Az összes probléma szerzőjének barátaival, kollégáival folytatott megbeszélései is lendületet adnak a fejlődésnek.

A könyv első kiadásának megjelenése óta a C++ nyelv jelentős változásokon és finomításokon ment keresztül. Ez elsősorban a túlterhelés egyértelművé tételére, a linkelésre és a memóriakezelésre vonatkozik. A C nyelvvel való kompatibilitás növelése érdekében azonban kisebb változtatásokat hajtottak végre, néhány általánosítást és jelentős bővítést is bevezettek, például többszörös öröklődést, tagfüggvényeket statikus és const specifikációkkal, védett tagokat (védett), típussablonokat és speciális kezelést. helyzetekben. Mindezek a bővítmények és fejlesztések azt a célt szolgálták, hogy a C++ olyan nyelv legyen, amelyen könyvtárakat lehet létrehozni és használni. Minden változás leírása a.

Más, 1985 és 1991 között bevezetett kiterjesztések (mint például a többszörös öröklődés, a statikus tagfüggvények és a tisztán virtuális függvények) a C++ programozási tapasztalat általánosításaiból, nem pedig más nyelvekből származtak.

A hat év alatt készült nyelvi kiterjesztések elsősorban a C ++ mint adatabsztrakciós nyelv és általában az objektum-orientált programozás kifejezőképességének növelését célozták, különösen pedig a felhasználó által definiált adattípusokkal rendelkező, kiváló minőségű könyvtárak létrehozásának eszközeként.

1987 körül nyilvánvalóvá vált, hogy a C++ szabványosítási munka küszöbön áll, és azonnal meg kell kezdeni az alapozást.

Az AT&T Bell Laboratories volt a fő közreműködő ebben a munkában. Körülbelül 20 szervezet mintegy száz képviselője tanulmányozta és kommentálta, hogy mi lett az ANSI szabványosítási kézikönyv és forrásanyag modern változata. C++. Végül a Hewlett-Packard kezdeményezésére 1989 decemberében megalakult az X3J16 bizottság az ANSI-n belül. A C++ szabványosítási munka az ANSI-ban (amerikai szabvány) várhatóan az ISO (Nemzetközi Szabványügyi Szervezet) szabványosítási munkájának szerves részévé válik.

A C++ néhány alapvető osztály fejlődésével együtt fejlődött.

A teremtés története

A nyelv az 1980-as évek elején keletkezett, amikor a Bell Labs alkalmazottja, Björn Stroustrup számos fejlesztéssel állt elő a C nyelven saját igényei szerint. Amikor Stroustrup az 1970-es évek végén a Bell Labs-nál kezdett dolgozni a sorbanálláselmélet problémáin (a telefonhívások modellezésére alkalmazva), úgy találta, hogy az akkoriban létező modellezési nyelvek használatára tett kísérletek nem voltak hatékonyak, és a rendkívül hatékony gépi nyelvek használata. túl nehéz volt a korlátozott kifejezőképességük miatt. Például a Simula nyelv olyan tulajdonságokkal rendelkezik, amelyek nagy szoftverek fejlesztéséhez nagyon hasznosak lennének, de túl lassú, a BCPL nyelv pedig elég gyors, de túl közel áll az alacsony szintű nyelvekhez, és nem alkalmas nagy szoftverek fejlesztésére.

Felidézve a disszertáció tapasztalatait, Stroustrup úgy döntött, hogy a C nyelvet (a BCPL utódját) kiegészíti a Simula nyelvben elérhető képességekkel. A C nyelv, amely a UNIX rendszer alapnyelve, amelyen a Bell számítógépek futottak, gyors, funkciókban gazdag és hordozható. Stroustrup hozzáadta az osztályokkal és objektumokkal való munka képességét. Ennek eredményeként a gyakorlati modellezési feladatok elérhetőnek bizonyultak mind a fejlesztési idő (a Simula-szerű osztályok használata miatt), mind a számítási idő (a C sebessége miatt) tekintetében. A C első kiegészítései az osztályok (beágyazással), az osztályöröklődés, az erős típusellenőrzés, a soron belüli függvények és az alapértelmezett argumentumok voltak. A nyelv korai verziói, eredeti neve "C osztályokkal", 1980 óta elérhetők.

A C osztályokkal való fejlesztése során Stroustrup megírta a cfront programot, egy olyan fordítóprogramot, amely a C forráskódot osztályokkal sima C forráskóddá alakítja, így lehetővé vált egy új nyelven való munka és annak gyakorlati alkalmazása a UNIX-ban már elérhető infrastruktúra felhasználásával. a fejlesztéshez C. A szerző számára váratlanul új nyelv, nagy népszerűségre tett szert a kollégák körében, és hamarosan Stroustrup már nem tudta személyesen támogatni, több ezer kérdésre válaszolt.

A C++ létrehozásakor Bjorn Stroustrup akarta
  • Szerezzen egy univerzális nyelvet statikus adattípusokkal, a C hatékonyságával és hordozhatóságával.
  • Közvetlenül és átfogóan támogat számos programozási stílust, beleértve az eljárási programozást, az adatabsztrakciót, az objektum-orientált programozást és az általános programozást.
  • Adja meg a programozónak a választás szabadságát, még akkor is, ha ez lehetőséget ad a helytelen választásra.
  • A lehető legnagyobb mértékben tartsa fenn a C-vel való kompatibilitást, ezáltal lehetővé téve a programozásról a C-re való egyszerű váltást.
  • Kerülje a következetlenségeket a C és a C++ között: minden olyan konstrukciónak, amely mindkét nyelven érvényes, ugyanazt kell jelentenie mindegyikben, és ugyanazt a programviselkedést kell eredményeznie.
  • Kerülje a platformfüggő vagy nem univerzális funkciókat.
  • "Ne fizessen azért, amit nem használ" – Egyetlen nyelvi funkció sem okozhat teljesítménycsökkenést azoknál a programoknál, amelyek nem használják.
  • Nem igényel túl bonyolult programozási környezetet.

A C-t egy új programozási nyelv létrehozásának alapjául magyarázza, hogy a C nyelv:

1. többcélú, tömör és viszonylag alacsony szintű nyelv;
2. alkalmas a legtöbb rendszerprobléma megoldására;
3. mindenhol és mindenen kivégezték;
4. interfészek a UNIX programozási környezettel.

— B. Stroustrup. C++ programozási nyelv. 1.6

A C nyelv számos jól ismert hiányossága ellenére Stroustrup ezt választotta alapként, mert "a C-nek megvannak a maga problémái, de a nulláról tervezett nyelvnek megvannak ezek, és ismerjük a C problémáit." Ráadásul ez lehetővé tette egy olyan fordító prototípus (cfront) gyors beszerzését, amely csak a hozzáadott szintaktikai elemeket fordította le az eredeti C nyelvre.

Ahogy a C++ fejlődött, más, a C konstrukciók képességeit felülíró funkciókat is beépítettek, és többször is felmerült a nyelvi kompatibilitás megszüntetésének kérdése az elavult konstrukciók eltávolításával. A kompatibilitás azonban megmaradt a következő okok miatt:

  • az eredetileg C nyelven írt és közvetlenül C ++-ba portolt aktuális kód megőrzése;
  • a korábban C nyelvet tanult programozók átképzésének megszüntetése (csak új C++ eszközöket kell megtanulniuk);
  • a nyelvek összetévesztésének kiküszöbölése, amikor együtt használják őket ("ha két nyelvet együtt használnak, akkor a különbségek minimálisak vagy olyan nagyok, hogy a nyelveket ne lehessen összetéveszteni").

1983-ra új funkciókkal bővült a nyelv, mint például a virtuális függvények, a funkciók és operátorok túlterhelése, hivatkozások, konstansok, a szabad memóriakezelés felhasználói vezérlése, továbbfejlesztett típusellenőrzés és új megjegyzésstílus (//). Az eredményül kapott nyelv már nem csak a klasszikus C kiterjesztett változata, és C-ről osztályokkal átnevezték "C++"-ra. Első kereskedelmi forgalomba hozatalára 1985 októberében került sor.

Az eredményül kapott nyelvnév a C++ unary postfix increment operátorából származik (egy változó értékét eggyel növelve).

A hivatalos szabványosítás megkezdése előtt a nyelvet főleg a Stroustrup fejlesztette ki a programozói közösség kérésére. A szabványos nyelvi leírások funkcióját Stroustrup C ++ nyelvű nyomtatott munkái látták el (a nyelv leírása, kézikönyv stb.).

A szabványok története

1985-ben jelent meg a The C++ Programming Language első kiadása, amely a nyelv első leírását adta, ami a hivatalos szabvány hiánya miatt rendkívül fontos volt.


1989-ben adták ki a C++ 2.0-s verzióját. Új funkciói közé tartozik a többszörös öröklődés, az absztrakt osztályok, a statikus tagfüggvények, az állandó függvények és a védett tagok. 1990-ben jelent meg a "Commented Reference Guide to C++", amely később a szabvány alapja lett. A legutóbbi frissítések sablonokat, kivételeket, névtereket, új castokat és logikai típust tartalmaztak.

A C++ Standard Library is vele együtt fejlődött. A C++ szabványos könyvtár első kiegészítése az I/O adatfolyam volt, amely lehetőséget biztosított a hagyományos C printf és scanf funkciók helyettesítésére. Később a standard könyvtár legjelentősebb fejlesztése a Standard Template Library felvétele volt.

1998-ban a C++ Szabványügyi Bizottság (ISO/IEC JTC1/SC22/WG21 munkacsoport) közzétette az ISO/IEC 14882:1998 (C++98 néven ismert) nyelvi szabványt. A C++ szabvány nem írja le az objektumok elnevezését, néhány kivételkezelési részletet és egyéb implementációval kapcsolatos szolgáltatásokat, így a különböző fordítók által generált objektumkódok összeférhetetlenek. Azonban számos szabványt hoztak létre harmadik felek bizonyos architektúrákhoz és operációs rendszerekhez.

2005-ben megjelent a Library Technical Report 1 (rövidítve TR1). Bár hivatalosan nem része a szabványnak, a jelentés leírja a szabványos könyvtár kiterjesztéseit, amelyeket a szerzők elvártak a C++ nyelv következő verziójában. A TR1 támogatása szinte minden támogatott C++ fordítóban javul.

2009 óta folynak a munkálatok az előző szabvány frissítésén, az új szabvány előzetes verziója először C ++ 09, majd egy évvel később C ++ 0x, ma C ++ 11 volt, amely a nyelvi mag kiegészítését ill. a szabványos könyvtár kiterjesztése, beleértve a TR1 nagy részét is.

A C++ folyamatosan fejlődik, hogy megfeleljen a modern követelményeknek. Az egyik csoport, amely a C ++ nyelvet fejleszti és javaslatokat küld a C ++ szabványosítási bizottságnak a fejlesztésére, a Boost, amely szintén a nyelv képességeinek fejlesztésével foglalkozik metaprogramozási funkciók hozzáadásával.

A C++ nyelvhez senki nem rendelkezik jogokkal, az ingyenes. Maga a nyelvi szabványdokumentum azonban (a tervezetek kivételével) nem érhető el ingyen.