itthon / Böngészők / C programozási nyelv. A CC SIT fordítók és fejlesztői környezetek fő tevékenységeinek áttekintése

C programozási nyelv. A CC SIT fordítók és fejlesztői környezetek fő tevékenységeinek áttekintése

gyakorlati tanfolyam

Ami?

Egy időben (1991-1992) nyelvválasztás Si A matematikaórák fő programozási nyelveként a szerző azzal a problémával szembesült, hogy hiányoznak az iskolásoknak ajánlható normál tankönyvek. Ez arra kényszerítette, hogy megírja az előadási jegyzeteit, amit ún "Gyakorlati programozási tanfolyam Si» — tartalmazta azokat az információkat, amelyekre a szerzőnek a gyakorlatban valóban szüksége volt. Sok éves tanítási tapasztalat azt mutatja, hogy a jegyzetekre valóban van kereslet, és széles körben használják mind az iskolások, mind a diplomások.

A fejlesztői környezet egy ingyenes, nyílt forráskódú Dev-C++ shell, amely tartalmazza a GCC fordítót.

A szerző hálás lesz az anyagok tartalmával és kialakításával kapcsolatos visszajelzésekért és építő kritikákért. Ha hibát észlel, vagy javaslata, észrevétele, panasza, kérése vagy nyilatkozata van, írjon.

Licencszerződés

  1. 1) anyagok közzététele bármilyen formában, beleértve az anyagok közzétételét más webhelyeken;
  2. 2) hiányos vagy módosított anyagok forgalmazása;
  3. 3) anyagok felvétele a gyűjteményekbe bármilyen adathordozón;
  4. 4) kereskedelmi haszon megszerzése anyagok értékesítéséből vagy egyéb felhasználásából.

Az anyagok letöltése azt jelenti, hogy elfogadja a jelen licencszerződés feltételeit.

Letöltés

Az absztrakt formátumban szabadon terjeszthető PDF. Megtekintéséhez ingyenes Acrobat Reader szükséges. A tanfolyam vázlata 4 részre oszlik:

  1. Bevezetés a programozásba C nyelven (860 Kb) 29.03.2014
    A programírás alapvető nyelvi konstrukcióinak és technikáinak tanulmányozása.
  2. Adattárolás és feldolgozás (792 KB) 21.11.2013
    C nyelv: tömbök, mátrixok, struktúrák, karakterláncok, struktúrák, rekurzió.
  3. Programok fejlesztése C nyelven (937 Kb) 01.03.2014
    Programtervezési technikák, strukturált programozás, egészszámú algoritmusok, numerikus módszerek, modellezés.
  4. Dinamikus adatszerkezetek C nyelven (666 KB) 11.06.2009
    Listák, halmok, fák, grafikonok.

Előadások

A tanárok és a diákok számára hasznosak lehetnek az ezen az összefoglalón alapuló prezentációk. Letölthetők a Prezentációk oldalon.

Módszertan

A fő cél az, hogy a tanulókat megismertessük a nyelv alapvető szerkezeteivel Si: ciklusok, feltételes utasítások, eljárások. A grafikával és animációval kapcsolatos részek tanulmányozása nagyon sikeres.

8. osztály

A program a következő részeket tartalmazza (az összefoglaló egy része zárójelben van feltüntetve): Tömbök (II), Fájlokkal való munka (II), Karakterláncok (II), Forgó objektumok (III), Modellezés (III). Különös figyelmet fordítanak a tömbökkel végzett munka algoritmusainak tanulmányozására, beleértve a keresést, a rendezést stb. Adott a számítási módszerek hatékonyságának fogalma.

9. osztály

A fő hangsúly a tanuláson van szoftverfejlesztési módszerek a nyelvben Si. A tanulók egyéni feladatot hajtanak végre, melynek során megtanulnak grafikonokat készíteni a képernyőn, megismerkednek a koordináta-rendszerek transzformációival, egyenletmegoldási módszereket tanulnak, megismerkednek a numerikus módszerekkel, megtanulják a program helyes tervezését (rész 1-2. III). Az egyik feladat a használatnak van szentelve Monte Carlo módszer egy összetett ábra területének kiszámításához. Az új szekciókból mi is tanulunk Mátrixok (II), karakterlánc-tömbök (II). A koncepció bevezetésre kerül mutatókés a velük végzett legegyszerűbb műveleteket tanulmányozzák.

10-es fokozat

Nyelvtanulás Si komolyabb szintet ér el. Fő témák - Memóriakezelés (II), Rekurzió (II), Struktúrák (II). A tervek szerint a Pascalt második programozási nyelvként tanulmányozzák. Ettől a pillanattól kezdve az elméleti órákon az algoritmusokat felváltva két nyelven írják.

11. évfolyam

Nem annyira a nyelvek jellemzőit, mint inkább az algoritmusokat vizsgálják. Fő szakaszok - Numerikus módszerek (III), Modellezés (III), Dinamikus adatszerkezetek (IV).

Ismerje meg a hurkok működését. A ciklusok a programozás egyik legfontosabb szempontja, mert lehetővé teszik az egyes kódblokkok ismételt futtatását, amíg egy bizonyos feltétel teljesül. Ez megkönnyíti az ismétlődő műveletek programozott írását, és megóvja attól, hogy minden alkalommal új feltételeket kelljen írnia, amikor azt szeretné, hogy a program tegyen valamit.

  • A hurkok három fő típusa létezik: FOR, WHILE és DO...WHILE.
  • Használjon FOR hurkot. Ez a ciklusok közül a legnépszerűbb és leghasznosabb. Addig folytatja az adott funkció végrehajtását, amíg a FOR-ban megadott feltételek teljesülnek. A FOR ciklusokhoz három feltétel megadása szükséges: az inicializálandó változó, a teljesítendő feltétel és a változó értékének frissítése. Ha nincs szüksége mindhárom feltételre, akkor pontosvesszővel kell szóközt hagyni a helyükön, ebben az esetben a ciklus örökké tart.

    #beleértve int main () ( int y ; for ( y = 0 ; y< 15 ; y ++ ){ printf ( "%d \n " , y ); } getchar (); }

    • A fenti programban az y változó kezdeti értéke nulla, és a ciklus addig folytatódik, amíg a változó értéke 15-nél kisebb marad. Minden alkalommal, amikor y új értéke jelenik meg, az eggyel növekszik, és a ciklus megismétlődik. Amint az y változó 15-tel egyenlő, a ciklus véget ér.
  • Használjon WHILE hurkot. A WHILE hurkok egyszerűbbek, mint a FOR hurkok. Csak egy feltételt állítanak be, és a ciklus addig fut, amíg ez a feltétel teljesül. Itt nem kell inicializálni vagy frissíteni a változót, de ez megtehető magának a ciklus kódjának fő részében.

    #beleértve int main () ( int y ; while ( y<= 15 ){ printf ( "%d \n " , y ); y ++ ; } getchar (); }

    • Az y++ parancs minden alkalommal hozzáad egyet az y változó értékéhez, amikor a ciklus végrehajtódik. Amint az y változó 16 lesz (megjegyzendő, hogy a ciklust addig kell végrehajtani, amíg a változó kisebb vagy egyenlő 15), a ciklus leáll.
  • Alkalmazzon hurkot D.O...MÍG. Ez a ciklus nagyon hasznos olyan esetekben, amikor a ciklusműveleteket legalább egyszer végre kell hajtani. A FOR és a WHILE ciklusokban a feltétel ellenőrzése már a legelején megtörténik, vagyis ha hamis eredményt kapunk, akkor a feltétel által meghatározott műveletet kihagyjuk és nem hajtjuk végre. A DO...WHILE ciklus a legvégén ellenőrzi a feltételeket, ami lehetővé teszi a ciklus legalább egyszeri végrehajtását.

    #beleértve int main () ( int y ; y = 5 ; do ( printf ( "A ciklus fut! \n " ) ) while ( y != 5 ); getchar ( ; )

    • Ez a ciklus akkor is megjeleníti a kívánt üzenetet, ha az állapotteszt sikertelen. Az y változó ötre van állítva, és a ciklusnak meg kell ismételnie, ha a változó nem egyenlő öttel, ezért a ciklus kilép. Az üzenet egyszer jelenik meg a képernyőn, mivel a feltétel csak a legvégén kerül ellenőrzésre.
    • A WHILE záradéknak a DO...WHILE ciklusban pontosvesszővel kell végződnie. Ez az egyetlen ciklus, amelynek a végén pontosvessző kell.
  • Az RSPP Műszaki Szabályozási, Szabványügyi és Megfelelőségi Értékelési Bizottságának Információs Technológiák Szabványügyi Ágazatközi Tanácsa.

    Jelentkezzen be a régi TK-MTK-22 weboldalra

    Az ideiglenes hibákért elnézést kérünk. A portál fejlesztés alatt áll, ezért egyes részek átmenetileg le vannak tiltva.

    Az Információs Technológiák Szabványosítási Szakterületi Kompetencia Központ (CC SIT) az RSPP Műszaki Szabályozási, Szabványügyi és Megfelelőségi Értékelési Bizottsága (a továbbiakban: Tanács) Ágazatközi Tanácsa képességeinek fejlesztése érdekében jött létre. A gyakorlat azt mutatja, hogy a Tanács csupán tanácsadó testületként való működése már nem hozza meg a kívánt hatást az új feladatokkal szemben.

    A Digitális Gazdaság Program elfogadásával és megvalósításának megkezdésével új kihívások jelentek meg az informatikai szabványosítás területén. Mindenekelőtt kiderült az e téren a szakemberek rendelkezésére álló információk hiánya, számos döntés tudományos szempontból nem kellően indokolt, elavult vagy hiányzik a szükséges szabályozás és jogszabály, valamint nyilvánvalóvá vált a szakszemélyzet hiánya. . És ami a legfontosabb, az egységes információs tér kialakítása terén tárcaközi vagy ágazatközi megoldásokra van szükség, amelyeknek az új technológiai struktúrára való átállás jelentős tényezőjévé kell válniuk.

    A Tanács közjogi szervezeti státusza már nem elégítette ki a felmerülő feladatokat, és felmerült az igény egy jogi személy státuszú struktúra létrehozására, amely az informatikai szabványosítás területén felmerülő új feladatokkal ruházható fel.

    A SIT KB főbb tevékenységeinek áttekintése

    Szabványosítás

    Ami informatikai szabvány - legyen IT szabvány - ne legyen IT szabvány

    A C meglehetősen „ősi” programozási nyelv, a 70-es évek elején alakult. Ennek ellenére a C élő nyelv abban az értelemben, hogy ma aktívan használják. Ezt találták ki, használták és használják a Unix-szerű operációs rendszerek programkódjának jelentős részeinek megírására. Segédprogramok, fordítók és ritkábban alkalmazásprogramok írásához is használják. Ezért hívják a C-t rendszerprogramozási nyelvnek.

    Túlélhetősége azzal magyarázható, hogy az operációs rendszerek működési elvei viszonylag univerzálisak, nincsenek kitéve az asztali és mobil szoftverek, webes alkalmazások környezetében megfigyelhető fejlődésnek és sokszínűségnek. A C nem túl magas szintű nyelv, közelebb áll a számítógépes architektúrához. Ennek eredményeként a C programok kompaktok és gyorsak.

    A C nem támogatja az objektumorientált programozást. Az OOP támogatás C++ nyelven van megvalósítva. Ez utóbbi ugyan a C nyelvből keletkezett, de nem annak „folytatása”, hanem egy különálló nyelv, amely a C ismerete nélkül is megtanulható. A C tanulása azonban hasznos, mielőtt megismerné „haladó kistestvérét”, mert A nyelvek szintaxisa hasonló, a C nem terheli túl egy kezdő programozó agyát szuperképességekkel, és megtanítja megérteni a történések lényegét.

    A C alkalmas arra, hogy először kezdjen programozásba? Ha nem tanulsz egyetemen informatikához kapcsolódó szakon, akkor nem. A C megköveteli a hardver, különösen a memória felépítésének és működésének megértését. Ennek nagy része mutatókkal történik, kulcsszerepet játszanak; ezt a témát meglehetősen nehéz megérteni, és általában nem tanulják az iskolában.

    Természetesen a programozás alapjait megtanulhatod C-vel anélkül, hogy mutatókat kellene tanulnod. Azonban az ember azt hiszi, ismeri a C-t anélkül, hogy sokat tudna róla. A C nyelvet a hardverhez értő professzionális programozók hozták létre a UNIX operációs rendszer megírására. Nem kezdők tanítására szánt nyelvnek szánták.

    Környezetek és fordítók C programozáshoz

    Ha valamelyik GNU/Linux disztribúciót használod, bármelyik szintaktikai kiemeléssel rendelkező szövegszerkesztő megteszi, szükséged lesz GCC-re és terminálra is.

    Vannak olyan szerkesztők a programozók számára, amelyek különféle kiegészítőket tartalmaznak, beleértve a terminált, a címtárböngészést stb. Például a Geany vagy az Atom.

    A C egy lefordított programozási nyelv. A GNU/Linux rendszerben a végrehajtható fájlok beszerzéséhez a GCC-t használjuk – egy fordítókészletet, beleértve a C fordítót is. A futtatható fájl forrásfájlból való beszerzéséhez (általában az ilyen fájlok *.c kiterjesztésűek) futtatnia kell egy parancs a terminálban, ami valahogy így néz ki:

    gcc -o hello hello.c

    Ahol a gcc egy olyan parancs, amely fordítási és egyéb műveleteket végrehajtó programot indít el; -o – egy kapcsoló, amely jelzi, hogy kézzel adjuk meg a végrehajtható fájl nevét; hello – az eredményül kapott végrehajtható fájl neve; hello.c a forráskód fájl neve. A végrehajtható fájl neve elhagyható:

    gcc hello.c

    Ebben az esetben a végrehajtható fájl alapértelmezett neve a.out lesz.

    A Windowsnak saját fordítókészlete van - a MinGW. Önállóan is használható, de benne van az egyszerű Dev-C++ fejlesztőkörnyezetben, ami jó választás lehet a C és C++ nyelvű programozás megtanulásához.

    Mentéskor válassza ki a "C source files (*.c)" fájltípust. A program összeállítása és elindítása az F9 billentyű lenyomásával történik. A végrehajtás után a program azonnal bezár, és az eredmény nem látható. Ennek elkerülése érdekében írjon két további sort: #include és getch(). (Lehet, hogy ez nem releváns a Dev-C++ újabb verziója esetén.)

    „Hello World” GNU/Linux alatt:

    #beleértve \n") ; }

    „Hello World” Windows rendszeren:

    #beleértve #beleértve int main() (printf("Hello World \n") ; getch(); )

    Másrészt számos platformon átívelő fejlesztői környezet létezik. Például Eclipse + CDT modul, KDevelop, CLion. Utóbbi fizetős, az IDE-fejlesztésben vezető JetBrains gyártja, de 30 napos próbaidővel rendelkezik, ami elég lehet a képzéshez. A CLion kényelmesebb, mint a többi IDE.

    "Hello World" a C

    Egy egyszerű program példáján azonnal megjegyezzük a C programozási nyelv néhány jellemzőjét.

    A C nyelvben a main() függvény a program fő ágának szerepét tölti be. Ennek a függvénynek mindig jelen kell lennie egy teljes C programban, és ezzel kezdődik a program végrehajtása. A benne deklarált változók azonban nem globálisak, hatókörük csak a main()-ra terjed ki. A C programozási nyelvben azonban szinte az összes programkódot egy függvény tartalmazza, és a main() függvény a fő és kötelező.

    Alapértelmezés szerint a main() függvény int adattípust ad vissza, így nem kell visszatérési típust megadni. A fordító azonban ebben az esetben figyelmeztetést ad ki.

    A printf() függvény adatok nyomtatására szolgál. Célja hasonló a Pascal write() eljárásához és a Python print() függvényéhez. A printf() függvény nem törik új sorra a nyomtatás után. Ezért egy speciális karaktert használnak az átmenethez, amelyet a \n kombináció jelöl. A teljes C kifejezéseket pontosvessző választja el.

    C-ben az I/O funkciók nem részei a nyelvnek. Például a Pythonban nem kell egyetlen modult sem importálnunk a print() és input() függvények használatához. C-ben nem hívhatjuk meg egyszerűen a printf() függvényt, mert C-nek magának egyszerűen nincs meg. Ez a funkció, valamint számos más, az stdio.h fejlécfájl használatával engedélyezhető. Pontosan ezért van a sor a program elejére írva #beleértve . Az Include angolból „bekapcsolás”-nak van fordítva, az stdio pedig a „standard input-output” rövidítése.

    A fejlécfájlok (*.h-ra végződnek) általában bizonyos függvények deklarációit tartalmazzák. A deklaráció egyszerűen egy függvény leírása: milyen paramétereket vesz fel, és mit ad vissza. Maga a függvénykód (definíció) nem a fejlécfájlban található, hanem könyvtárakban (egyéb fájlok), amelyek már le vannak fordítva és rendszerkönyvtárban találhatók. A program összeállítása előtt elindul a C nyelvű előfeldolgozó, amely többek között a programfájl elején tartalmazza az abban megadott fejlécfájlok tartalmát.

    Praktikus munka

    Írd megjegyzésbe a HelloWorld kód első sorát. Próbáld meg lefordítani a programot. Sikerült megszerezni a futtatható fájlt? Milyen figyelmeztetést adott a fordító?

    1 // - egysoros megjegyzés C nyelven; /* … */ - többsoros megjegyzés C nyelven.

    Sajátosságok

    Felülvizsgálat

    A C programozási nyelvet a minimalizmus jellemzi. A nyelv készítői azt szerették volna, hogy a benne lévő programok egymenetes fordító segítségével könnyen lefordíthatóak legyenek, a fordítás után a program minden elemi komponense nagyon kis számú gépi utasításnak felelt meg, a nyelv alapelemeinek használata pedig nem. futásidejű könyvtárat foglal magában. Az egymenetes fordító anélkül fordít egy programot, hogy visszamenne a már lefordított szöveghez. Ezért egy függvény használatát meg kell előzni annak deklarációjával. A C kód könnyen írható alacsony absztrakciós szinten, szinte assembly nyelven. A C-t néha "univerzális assemblernek" vagy "magas szintű assemblernek" nevezik, ami tükrözi a különböző platformok assembly nyelveinek különbségeit és a C szabvány egységét, amelynek kódja szinte minden számítógépen változtatás nélkül lefordítható. modell. A C-t gyakran nyelvnek nevezik középszint vagy akár alacsony szint, figyelembe véve, hogy milyen közel működik a valódi eszközökhöz.

    A C fordítóprogramokat viszonylag könnyű fejleszteni a nyelv viszonylag alacsony szintje és szerény elemkészlete miatt. Ezért a nyelv sokféle platformon elérhető (esetleg több platformon, mint bármely más létező nyelven). Ezenkívül a nyelv alacsony szintű jellege ellenére lehetővé teszi hordozható programok létrehozását, és támogatja a programozót ebben. A nyelvi szabványnak megfelelő programok sokféle számítógépen lefordíthatók.

    Program "Helló, világ!"

    Ez az egyszerű program, amely Kernighan és Ritchie The C programozási nyelvének első kiadásában jelent meg, általában az első program a legtöbb C-tankönyvben. Beírja a "Hello World!" üzenetet. a szabványos kimeneti eszközön (ami általában egy monitor (megjelenítő), de lehet fájl, valamilyen eszköz vagy memóriaterület is, attól függően, hogy a szabványos kimeneti eszköz hogyan tükröződik egy adott platformon).

    Main() ( printf ("Hello, World! \n") ; }

    Bár ez a program a legtöbb modern fordítón megfelelően tud fordítani, számos figyelmeztetést generál az ANSI C fordítókon. Ezenkívül ez a kód nem fordítható le, ha a fordító szigorúan követi a szabványt

    #beleértve int main(void ) ( printf ("Hello, World! \n") ; return 0 ; )

    A program első sora tartalmazza az #include preprocessor direktívát; amikor találkozik vele, a fordító lecseréli annak a fájlnak a teljes szövegére, amelyre hivatkozik. Ebben az esetben ezt a sort a szabványos fejlécfájl váltja fel

    A következő sor a main nevű függvény deklarációja. Ez a funkció a C programban azért különleges, mert a program indulásakor először fut le, vagyis az ún. belépési pont a programba.

    A fő függvény utáni göndör kapcsos zárójelek jelzik annak meghatározását. Az int szó azt mondja, hogy a fő függvény egy egész számot ad vissza (kiszámít). A void szó azt jelzi, hogy a fő függvény nem igényel paramétereket vagy argumentumokat a hívótól.

    A következő sor „meghívja” vagy végrehajtja az stdio.h függvényt, és a függvény meghívásának módját leíró információkat tartalmaz. Ebben a példában egyetlen argumentum kerül átadásra ennek a függvénynek, amely tartalmazza a „Hello, World!\n” szöveges karakterláncot. A \n szekvencia „új sor” karakterré lesz lefordítva, amely, ha megjelenik, ennek megfelelően sortörést jelöl. A printf függvény egy int értéket ad vissza, ami ebben a példában teljesen el van vetve.

    A return utasítás hatására a program leállítja az adott (jelen esetben main) függvény végrehajtását, visszaadja a hívó függvénynek a return kulcsszó után megadott értéket (ebben az esetben 0). Mivel az aktuális függvény a main , a hívó az, aki elindította a programot. Az utolsó göndör kapcsos zárójel a fő funkciódefiníció végét jelzi.

    Hozzászólások

    Az ebben a sorrendben a /* és */ szimbólumok közé zárt szöveget a fordító teljesen figyelmen kívül hagyja. A C99-kompatibilis fordítók a // karakterrel kezdődő és újsorral végződő megjegyzéseket is lehetővé teszik.

    Típusok

    Adattárolás

    Minden programozási nyelv egyik legfontosabb funkciója, hogy lehetőséget biztosítson a memória és a benne tárolt objektumok kezelésére.

    Három különböző módja van a memória lefoglalásának a C-beli objektumok számára:

    • Statikus memóriafoglalás: a programkód adattárolási területén a fordításkor hely jön létre az objektumok számára; az ilyen objektumok élettartama egybeesik ennek a kódnak az élettartamával.
    • Automatikus memóriafoglalás: objektumok ideiglenesen tárolhatók a veremben; ez a memória automatikusan felszabadul, és újra használható, miután a program kilép a blokkból.
    • Dinamikus memóriafoglalás: A kívánt méretű memóriablokkok a program végrehajtása során érhetők el a malloc, realloc könyvtári függvényekkel, és mentesek a kupac nevű memóriaterülettől. Ezek a blokkok felszabadultak, és a free függvény meghívása után újra használhatók.

    Mindhárom adattárolási mód alkalmas különböző helyzetekben, és megvannak a maga előnyei és hátrányai. Például a statikus memóriafoglaláshoz nincs foglalási többletköltség, az automatikus kiosztásnak csak kismértékű foglalási többlete van, de a dinamikus lefoglalás esetén nagy többletköltséget okozhat mind az elosztás, mind a felosztás során. Másrészt a veremmemória sokkal korlátozottabb, mint a statikus vagy kupacmemória. Csak a dinamikus memória használható olyan esetekben, amikor a felhasznált objektumok mérete előre nem ismert. A legtöbb C program nagymértékben használja mindhárom módszert.

    Ahol lehetséges, az automatikus vagy statikus memóriafoglalást részesítik előnyben, mert az objektumok tárolásának ezt a módját a fordító vezérli, ami megszabadítja a programozót a kézi memóriafoglalás és -felszabadítás gondjaitól, ami általában a nehezen fellelhető programhibák forrása. Sajnos sok adatstruktúra futás közben változó méretű, így mivel az automatikusan és statikusan lefoglalt területeknek a fordítási időben ismert fix mérettel kell rendelkezniük, nagyon gyakori a dinamikus kiosztás használata. A változó méretű tömbök a leggyakoribb példák az ilyen típusú memóriahasználatra.

    Használt szimbólumok halmaza

    A C nyelvet a Fortran szabvány bevezetése után hozták létre; a Lisp és a Cobol csak zárójeleket (), de a C-ben van zárójel (), valamint négyzet és göndör (). Ezenkívül a C különbséget tesz a nagy- és kisbetűk között, míg a régebbi nyelvek csak nagybetűket használtak.

    Problémák

    Sok C elem potenciálisan veszélyes, és az ezekkel az elemekkel való visszaélés következményei gyakran megjósolhatatlanok. Kernighan azt mondja: A C egy borotvaéles eszköz: elegáns program és vérbeli kavarodás is készíthető vele" A nyelv viszonylag alacsony szintje miatt a veszélyes elemekkel való sok visszaélés nem észlelhető és nem is észlelhető sem fordításkor, sem futás közben. Ez gyakran a program kiszámíthatatlan viselkedéséhez vezet. Néha a nyelvi elemek írástudatlan használata következtében biztonsági rések jelennek meg. Meg kell jegyezni, hogy ezen elemek közül sok használata elkerülhető.

    A leggyakoribb hibaforrás egy nem létező tömbelem elérése. Bár a C közvetlenül támogatja a statikus tömböket, nem rendelkezik tömbindex-ellenőrzőkkel (határellenőrzőkkel). Például lehetséges egy öt elemből álló tömb hatodik elemére írni, ami természetesen megjósolhatatlan eredményekhez vezet. Az ilyen hiba speciális esetét puffertúlcsordulási hibának nevezzük. Az ilyen típusú hibák a legtöbb biztonsági problémához vezetnek.

    A veszélyes helyzetek másik lehetséges forrása a mutató mechanizmus. A mutató bármely objektumra hivatkozhat a memóriában, beleértve a végrehajtható programkódot is, és a mutatók helytelen használata előre nem látható hatásokhoz vezethet, és katasztrofális következményekhez vezethet. Például egy mutató inicializálatlan lehet, vagy helytelen mutató aritmetikai műveletek eredményeként tetszőleges memóriahelyre mutat; Egyes platformokon egy ilyen mutatóval való munkavégzés a program hardveres leállását okozhatja, a nem védett platformokon pedig tetszőleges adatok megsérüléséhez vezethet a memóriában, és ez a sérülés a legkényesebb időpontokban és sokkal később jelentkezhet, mint a program korrupció. Ezenkívül a dinamikus memória területe, amelyre a mutató hivatkozik, felszabadítható (és akár egy másik objektum számára is lefoglalható) - az ilyen mutatókat „lógónak” nevezik. Vagy fordítva, a dinamikus memóriaterületre mutató mutatók manipulálása után előfordulhat, hogy nem maradnak hivatkozások, és akkor ez a „szemétnek” nevezett terület soha nem szabadul fel, ami „memóriaszivárgáshoz” vezethet a programban. Más nyelvek hasonló problémákat próbálnak megoldani szigorúbb hivatkozási típusok bevezetésével.

    Egy másik probléma, hogy az automatikusan és dinamikusan létrehozott objektumok nem inicializálódnak, és előfordulhat, hogy a memóriában megmaradt értékeket tartalmazzák a korábban törölt objektumokból. Ez az érték teljesen kiszámíthatatlan, egyik gépről a másikra, futásról futásra, függvényhívásról hívásra változik. Ha egy program ilyen értéket használ, az eredmény megjósolhatatlan lesz, és nem feltétlenül jelenik meg azonnal. A modern fordítók a forráskód némi elemzésével próbálják diagnosztizálni ezt a problémát, bár ez általában nem oldható meg statikus elemzéssel.

    Egy másik gyakori probléma, hogy a memória nem használható újra, amíg a programozó fel nem szabadítja a free() függvény segítségével. Ennek eredményeként a programozó véletlenül elfelejtheti felszabadítani ezt a memóriát, de továbbra is lefoglalja, egyre több helyet foglalva el. Erre utal a kifejezés memória szivárgás. Ezzel szemben lehetséges, hogy a memória túl korán felszabadítható, de továbbra is használható. Mivel az allokációs rendszer különbözőképpen használhatja fel a felszabaduló memóriát, ez beláthatatlan következményekhez vezet. Ezeket a problémákat a szemétgyűjtő nyelveken oldják meg. Másrészt, ha egy függvényben memória van lefoglalva, és a függvény kilépése után fel kell szabadítani, akkor ezt a problémát a destruktorok automatikus meghívása oldja meg C++-ban, vagy helyi tömbök C99 kiterjesztéssel.

    A változó-argumentumú függvények szintén potenciális problémaforrások. A prototípussal rendelkező hagyományos függvényekkel ellentétben a szabvány nem szabályozza a változó számú argumentumú függvények tesztelését. Ha rossz adattípust adunk át, előre nem látható, ha nem végzetes eredmények születnek. Például a C Standard Library printf függvénycsaládja, amelyet formázott szöveg létrehozására használnak a kimenethez, jól ismert potenciálisan veszélyes változó-argumentumos interfészéről, amelyet egy formátum karakterlánc ír le. A variadic függvények típusellenőrzése az egyes variadic függvények megvalósításának feladata, de sok modern fordító kifejezetten ellenőrzi a típusokat minden printf hívásban, figyelmeztetést generálva, ha az argumentumlista nem egyezik a formátum karakterláncával. Megjegyzendő, hogy még a printf függvény összes hívását sem lehet statikusan vezérelni, mivel a formátum karakterlánc dinamikusan hozható létre a programban, így a fordító általában nem végez ellenőrzéseket a változó számú függvényekre. érvek.

    A C programozók ezen és sok más probléma megoldásának segítésére számos, a fordítóktól elkülönülő eszközt hoztak létre. Az ilyen eszközök közé tartoznak a forráskód kiegészítő ellenőrzésére és a gyakori hibák észlelésére szolgáló programok, valamint a nyelvi szabványban nem szereplő további funkciókat biztosító könyvtárak, például a tömbhatárok ellenőrzése vagy a szemétgyűjtés korlátozott formája.

    Sztori

    Korai fejlesztések

    A C programozási nyelvet a Bell Labs fejlesztette ki 1973 és 1973 között. Ritchie szerint a kreativitás legaktívabb időszaka 1972-ben volt. A nyelvet "C"-nek (C a latin ábécé harmadik betűje) nevezték el, mert sok jellemzője a régi "B" nyelvből származik (B a latin ábécé második betűje). A Bi név eredetének többféle változata létezik. Ken Thompson egy programozási nyelvre mutat rá

    Számos legenda kering a C fejlesztésének okairól és az operációs rendszerrel való kapcsolatáról, például a grafikus kijelzőkről;

  • egyes fordítók alapértelmezés szerint nem követik az ANSI C szabványt vagy annak utódját; vagy
  • úgy lettek kialakítva, hogy bizonyos típusú adatok meghatározott méretéhez vagy az adatok memóriában való tárolásának egy meghatározott módjához illeszkedjenek egy adott platformon.
  • C99

    fő cikk: 1995-ben elkészítették a C szabvány első szabályozási módosítását, de szinte senki sem ismerte el). Az 1990-es évek végén azonban a szabványt felülvizsgálták, ami a közzétételhez vezetett ISO 9899:1999 1999-ben. Ezt a szabványt általában "C99"-nek hívják. 2000 márciusában az ANSI elfogadta és adaptálta.

    Íme a C99 néhány új funkciója:

    • inline függvények (inline);
    • nincs korlátozás a helyi változók deklarálására (mint a C++-ban);
    • új adattípusok, például long long int (a 32 bites számokról 64 bitesre való átmenet megkönnyítésére), egy explicit logikai adattípus és egy komplex típus a komplex számok megjelenítésére;
    • változó hosszúságú tömbök;
    • korlátozott mutatók támogatása (restrict);
    • struktúrák elnevezett inicializálása: struct ( int x, y, z; ) pont = ( .y=10, .z=20, .x=30 );
    • a // kezdetű egysoros megjegyzések támogatása, C++-ból kölcsönözve (sok C fordító korábban kiegészítésként támogatta őket);
    • számos új könyvtári funkció, például az snprintf;
    • több új fejlécfájl, például az stdint.h.

    Az új C99 funkciók támogatása iránt jelenleg vegyes az érdeklődés. Míg a GCC, a Sun Microsystems C fordítója és számos más fordító jelenleg támogatja a legtöbb új C99 szolgáltatást, a Microsoft fordítói nem, és úgy tűnik, hogy a két cég nem is adja hozzá őket.

    Csatlakozás C++-szal

    A műveletek prioritása a C-ben

    Az alábbiakban felsoroljuk a műveleteket prioritásuk csökkenő sorrendjében. Az ugyanabban a sorban felsorolt ​​műveleteknek ugyanaz a prioritása. Az R->L jelű műveletek jobbra asszociatívak (azaz egyenlő prioritású műveletek zárójelek nélküli kombinálásakor jobbról balra kerülnek kiértékelésre; azonban a legtöbb művelet argumentumainak kiértékelési sorrendje nincs megadva, és az implementációktól függ ):

    Postfix műveletek () . -> ++ --
    Unáris műveletek (R->L) ++ -- & * + - ~ ! mérete (típus)
    Multiplikatív * / %
    Adalékanyag + -
    Nyírás << >>
    Műveletek összehasonlítása < > <= >=
    Egyenlőségi vizsgálati műveletek == !=
    Bitenként & ^ |
    összerakós játékaik && ||
    Feltételes működés (R->L) ?:
    Hozzárendelési műveletek (R->L) = *= /= %= += -= <<= >>= &= ^= |=
    Szekvenciális számítás ,

    Híres C-fordítók

    • OpenWatcom

    Fordítóprogramok dinamikus nyelvekhez és platformokhoz

    Néha ahhoz, hogy bizonyos C nyelven írt könyvtárakat, függvényeket és eszközöket átvigyenek egy másik környezetbe, szükség van a C kód lefordítására egy magasabb szintű nyelvre vagy egy ilyen nyelvre tervezett virtuális gépi kódra.

    A következő projekteket szánják erre a célra:

    • Az Alchemy egy C/C++ fordító Flash és Adobe AIR alkalmazásokhoz.
    • AMPC – C fordító virtuális géphez

      Megjegyzések

      Lásd még

      • Cyclone (programozási nyelv) - a C nyelv biztonságos dialektusa
      • Kategória:C fordítók

      Linkek

      • ISO/IEC JTC1/SC22/WG14 hivatalos honlapja (angol) . - A C programozási nyelv szabványosításával foglalkozó nemzetközi munkacsoport hivatalos oldala. Letöltve: 2009. február 20.