C

A HupWiki-ből...

A C programozási nyelvet Dennis M. Ritchie az 1970-es évek elején fejlesztette ki, a UNIX operációs rendszereken való használat céljából. Ma már gyakorlatilag minden operációs rendszerben megtalálható és a legnépszerűbb programozási nyelvek egyike, rendszerprogramozáshoz és felhasználói program készítéséhez egyaránt jól használható. Az oktatásban és a számítógépes tudományokban is jelentős szerepe van.

A népszerű C++ és Objective-C programozási nyelv e nyelv alapjaira épül.

Tartalomjegyzék

Jellegzetességek

C viszonylag "minimalista" programozási nyelv. Lényegesen alacsonyabb szintű, mint más programozási nyelvek, bár néha magas szintű nyelvnek hívják, de igazából csak az assembly alacsonyabb nála. A C-nek alapvetően két nagy előnye van az assembly-vel szemben. Az első, hogy a forráskód általában könnyebben olvasható és kevésbé nehéz annak írása, főleg a hosszabb programok esetében. A második, hogy az assembly kód, kötött az adott számítógép architektúrájához (x86, RISC, stb.), míg a C programok átvihetők (a forrás módosítása nélkül), természetesen az adott típuson léteznie kell egy C-fordítónak (compiler) és az esetlegesen használt függvények itt használható változatainak. A C nyelv egy ún. lefordított nyelv, nem pedig értelmezett, mint pl. a shell script vagy a BASIC. Ezért tehát a program hatásfoka nagyban függ, az alkalmazott fordító-programtól (angol nevén compiler), amely a C-ben megírt kódot, számítógépes kódra "fordítja" és optimalizálja. Ez a folyamat a programozótól jórészt függetlenül zajlik. Ezzel ellentétben az assembly hatásfoka pontosan meghatározható, hiszen nem más, mint az ember által is olvasható számítógépes nyelv. Ezért aztán bár az operációs rendszerek belső magjai (kernel) C-ben íródnak, a különösen kritikus szakaszok továbbra is "kézzel finomhangolt" részekből áll, mégpedig assembly nyelven. Hasonló előnyök és hátrányok különböztetik meg a C nyelvet a magasabb szintű programozási nyelvektől, a C-kód hatékonysága jól kontrollálható, míg az olvashatósága ill. írása lényegesen bonyolultabb. Fontos tudni, hogy a C legalább annyira hordozható, mint a magasabb szintű nyelvek, mivel manapság, szinte minden számítógépes rendszerben van C fordító és C függvények. A fordítók, függvények még a magasabb szintű nyelvek értelmezői is gyakran C-ben íródnak!

A C egyik legfontosabb jellemzője, hogy a programozó kezében van a memóriakezelés. A szabvány C nem ismer olyan definíciókat, hogy tömb "vége vizsgálat", vagy automatikus memóriakezelés . Ezzel szemben, pl. a JAVA és a C# nyelvek, mindkettő C alapú, rendelkeznek automatikus memóriakezeléssel. Míg a "kézi" memóriakezelés több lehetőséget ad a programozónak a program "finomhangolására", ugyanúgy megnövekedik a hibák lehetősége is (bug), mint pl. a "túlcsordulás" (buffer owerflow). Ezek a hibák felhasználhatók, számítógépes rendszerekbe való betörésekhez. Segédeszközök, mint függvények ill. könyvtárak (library) valamint automatikus kódellenőrző programok (pl. Lint) készültek, hogy átsegítsék a programozókat ezeken a buktatókon.

Történet

Korai fejlesztések

A kezdeti fejlesztések az AT&T keretein belül történtek 1969 és 1973 között. A legkreatívabb időszak, Ritchie-nek köszönhetően 1972-ben volt. Azért lett "C" a nyelv neve, mert egy korábbi, "B" nevű programozási nyelv sok tulajdonságát "örökölte", melyet Ken Thompson írt, (de írt egy Bon nevűt is, a feleségéről (Bonnie-ról) elnevezve), és mindkettő a BCPL "leánynyelve", melynek a nevében a "B"-t a "C" követi.

Az 1973-as évben a C nyelv elég hatékonnyá vált, így a UNIX kernel legnagyobb részét, melyek PDP-11/20 assembly nyelven íródtak, újraírták C-ben. Ez volt az egyik első operációs rendszer kernel, mely nem assembly nyelven íródott, korábbiak, a MULTICS PL/I-ben íródott, a Tripos BCPL-ben.

K&R C

1978-ban megjelent Ritchie és Brian Kerninghan nevével fémjelzett A C programozási nyelv c. könyv első kiadása. Ez a könyv, melyet a C programozók csak K&R néven emlegettek, sokáig szolgált a nyelv formai leírásának forrásaként. A C nyelvnek az a verziója, melyet leírt, az a "K&R C" nyelv. (A könyv második kiadása az "ANSI C" szabványt írta le, lásd alább.)

K&R a nyelv következő tulajdonságait vezette be:

  • struct adattípus
  • long int adattípus
  • unsigned int adattípus
  • =+ operátort megváltoztatták +=-re, stb. (=+ zavaros volt a C fordító számára)

A K&R C a nyelv legalapvetőbb részének tekinthető, melyet egy C fordítónak mindenképpen ismernie kell. Sok éven keresztül, még az ANSI C bevezetése után is, a "legkisebb közös nevező" volt a K&R, melyet a C programozók használtak, ha a legnagyobb mértékű (forrás szintű) kompatibilitásra volt szükség, hiszen nem minden C fordító támogatta a teljes ANSI C-t és a megfelelően megírt K&R C (forrás) kód megfelelt az ANSI C szabványnak is.

A K&R C megjelenése utáni években, sok "nem hivatalos" kiegészítés látott napvilágot, melyet az AT&T és néhány másik cég fordítói is támogattak.

Ilyen változtatások voltak többek közt:

  • void típusú függvény és void *adattípus
  • függvények, melyek struct vagy union típusokat voltak képesek "visszaadni" (return)
  • const definíció, az érték írásvédettségéhez
  • szabvány függvény-gyűjtemény (un. library) mely a különböző cégek leggyakrabban támogatott függvényeit tartalmazta.
  • felsorolások
  • az un. "single-precision" (egyes pontosságú) float adattípus

ANSI C és ISO C

Az 1970-es évek vége felé, a C kezdte felváltani a BASIC nyelvet a személyi számítógépeken. IBM PC számítógépekre is átültették az 1980-as években, így a C nyelv népszerűsége ugrásszerűen emelkedni kezdett. Ugyanebben az időben Bjarne Stroustrup és társai a Bell Labs-nál elkezdtek dolgozni objektum orientált nyelvi elemek hozzáadásán a C nyelvhez. A nyelv, amit készítettek a C++ nevet kapta, ez ma a legelterjedtebb programozási nyelv a Microsoft Windows operációs rendszereken, míg a C a UNIX világban megőrizte népszerűségét.

1983-ban az Amerikai Nemzeti Szabványügyi Hivatal (angolul: American National Standards Institute, röviden ANSI) megalakította az X3J11 bizottságot, hogy létrehozzanak egy egységes (szabvány) C definíciót. A hosszú és fáradságos folyamat végén 1989-ben elkészült a szabvány (egy évvel az első C++ ANSI szabvány után!) és jóváhagyásra került, mint: ANSI X3.159-1989 "A C programozási nyelv". A nyelv eme verziója nevezik ANSI C-nek. 1990-ben az ANSI C szabványt (néhány apróbb módosítással) átvette a Nemzetközi Szabványügyi Szervezet (angolul: International Standards Organization, röviden ISO), mint ISO/EC 9899:1990.

Az ANSI C szabványosítás egyik célja az volt, hogy a K&R C-ből és a nemhivatalos bővítésekből egy egységet alakítson ki. Belevettek azonban számos új megoldást is, mint pl. függvény prototípust (a C++ nyelvből) valamint egy jobban alkalmazható (fejlettebb) előfordítót (preprocessor).

ANSI C-t szinte minden használt fordító támogat. A legtöbb C kód, mely manapság íródott, az ANSI C-n alapul. Bármilyen program, amely a szabvány C-ben íródott, helyesen működik bármely platformon, amelyen szabványos C létezik. Vannak azonban programok, melyek csak adott platformon vagy adott fordítóval fordíthatók le, a használt nem szabvány függvénygyűjtemények miatt (pl. grafikus függvények) és vannak olyan fordítók, melyek nem támogatják alapértelmezésben az ANSI C szabványt.

C99

ANSI szabványosítási folyamatot követően, a C nyelv viszonylag állandó maradt, míg a C++ fejlődött. Új C verzió, 1995-ben az első normatív kiegészítéssel jött létre, de ez a változat ritkán használt). Akárhogyan is, de a szabványt átdolgozták az 1990-es években és ebből lett az ISO 9899:1999 1999-ben. Ez a szabvány "C99" néven vált ismertté, majd 2000 márciusában bekerült az ANSI szabványok közé is.

C99 új tulajdonságai, többek közt:

  • inline függvények
  • változók definiálási helyének szabályai enyhítése (hasonlóképpen, mint C++-ban)
  • új adattípusok pl.: long long int, hogy a 32bitről a 64bitre való átállást megkönnyítsék, explicit boolean és a complex típus.
  • változó méretű tömbök
  • hivatalosan is bevezették az egysoros kommentár jelölést // (a C++-ból)
  • több új függvény, mint pl.: snprintf()
  • több új "header" állomány, mint pl.: stdint.h

Érdeklődés, a C99 új tulajdonságainak támogatásával kapcsolatban eléggé vegyes. Míg GCC (GNU C Compiler) és más fordítók támogatják a C99 újdonságait, addig a Microsoft és Borland által forgalmazottak nem és ez a két cég nem is foglalkozik a C99 jövőbeli támogatásának lehetőségével jelenleg.

A klasszikus "Hello, World!" C-ben

A következő egyszerű program kiírja azt, hogy "Hello, World!" az alapértelmezett kimeneti eszközre (ami általában a képernyő, de lehet egy állomány, vagy bármi más is). Először a K&R-ben jelent meg egy verziója ennek a programnak.


#include <stdio.h>
int main(void)
{
    printf("Hello, World!\n");
    return 0;
}

Kapcsolódó cikkek

Forrás