Programski jezik C

Iz Wikipedije, proste enciklopedije
Skoči na: navigacija, iskanje

Prográmski jêzik C ali kar C (izgovorjava [cé] ali po izvirniku [sí], /ˈs/) je nizkonivojski standardizirani računalniški programski jezik tretje generacije (3GL) za splošno rabo, ki ga je prvotno razvil Dennis Ritchie med letoma 1969 in 1973 v AT&T Bellovih laboratorijih.[1][2][3] Ritchie in Ken Thompson sta najprej razvila prevajalnik za operacijski sistem Unix, ki je bil v osnovi napisan v zbirnem jeziku. Unixovo jedro je bilo tako prvo napisano v drugem jeziku in ne v zbirnem. Kasneje se je C hitro pojavil tudi na drugih operacijskih sistemih. Kot večina imperativnih jezikov v tradiciji ALGOLa je C zmožen struktruiranega programiranja in omogoča leksično območje spremenljivk ter rekurzijo, statični sistem tipov pa preprečuje mnogo nenameravanih operacij. Njegova konstrukcija omogoča konstrukte, ki se učinkovito preslikujejo v tipične strojne ukaze, in zaradi tega se je C začel rabiti v aplikacijah, ki so bile prej razvite v zbirnem jeziku, še posebej v sistemskem programju, kot je npr. računalniški operacijski sistem Unix.[4]

C velja za učinkovit jezik in je primeren za sistemska opravila, ni pa najprimernejši za učenje programiranja, čeprav se pogosto pojavlja v izobraževanju. Je tudi eden od najbolj razširjenih programskih jezikov, skupaj z javo, C++ ali PHP, od leta 2008 pa mu priljubljenost celo rahlo narašča.[5][6] Obstaja zelo malo arhitektur in operacijskih sistemov za katere ni na voljo prevajalnika za C. C se veliko rabi tudi za razvoj prenosljive uporabniške programske opreme.[4]

Razvoj jezika C je zelo vplival na druge programske jezike, še posebej na C++, ki se je razvil kot razširitev C-ja. Mnogo kasnejših jezikov si je neposredno ali posredno sposodilo določene značilnosti C-ja, na primer: D, Go, Rust, java, JavaScript, Limbo, LPC, C#, Objective-C, Perl, PHP, Python, Verilog (strojni opisni jezik),[7] in Unixova C shell. Ti jeziki so dobili mnogo svojih kontrolnih struktur in drugih osnovnih značilnosti od C-ja. Večina od njih, kjer je Python največja izjema, je tudi skladenjsko podobnih C-ju v splošnem in so usmerjeni na združevanje razpoznavnih izrazov in stavkov skladnje jezika C z osnovo sistemov tipa, podatkovnih modelov in semantiko, ki je lahko popolnoma drugačna. C++ in Objective-C sta bila na začetku jezika prevajalnikov, ki so tvorila kodo v C. C++ je trenutno skoraj supermnožica jezika C,[8] Objective-C pa je stroga supermnožica C.[9][10][11]

Pred uradnim standardom za C se je mnogo uporabnikov in izvršiteljev opiralo na neuradno specifikacijo, opisano v knjigi Programski jezik C Ritchieja in Briana Kernighana. Ta različica je v splošnem znana kot »K&R« C. Leta 1989 je Ameriški državni inštitut za standarde (ANSI) objavil standard za C (v splošnem imenovan »ANSI C« ali »C89«). Naslednje leto je to specifikacijo potrdila Mednarodna organizacija za standardizacijo (ISO) kot mednarodni standard (v splošnem imenovan »C90«). ISO je kasneje izdala razširitev standarda za podporo internacionalizacije leta 1995 in popravljeni standard (znan kot »C99«) leta 1999. Ta standard je najbolj razširjen. Trenutna različica standarda (sedaj imenovana »C11«) je ISO kot ISO/IEC 9899:2011 potrdila 8. decembra 2011.[12]

Osnovne značilnosti jezika[uredi | uredi kodo]

C je dokaj skop programski jezik, ki deluje blizu strojne opreme, in je z razliko od večine programskih jezikov bolj podoben zbirniku. Včasih ga imenujejo »prenosljivi zbirnik«, kar tudi označuje njegovo pomembno razliko od zbirniškega jezika. Izvorno kodo, napisano v C, se da prevesti in pognati na skoraj vsakem stroju. Tega ne zmore skoraj noben obstoječ programski jezik in tudi kodo, zapisano v zbirniku, lahko poženemo le na določenih vrstah strojev. C po navadi imenujejo nizkonivojski ali srednjenivojski jezik, kar označuje kako blizu strojne opreme lahko deluje.

C so naredili zaradi enega samega pomembnega namena, kar ni slučajnost, da bi bilo moč pisati velike programe z manj napakami v proceduralnem programiranju in, da pisec programov ne bi nosil bremena tvorjenja prevajalnika za C, ki ga otežujejo zapletene značilnosti jezika. V tem smislu ima C naslednje pomembne značilnosti:

Razvoj[uredi | uredi kodo]

Zgodnji razvoj[uredi | uredi kodo]

Ken Thompson in Dennis Ritchie, avtorja programskega jezika C

Izvor jezika C je tesno povezan z razvojem operacijskega sistema Unix, ki sta ga izvirno razvila v zbirnem jeziku na računalniku PDP-7 Ritchie in Thompson, in vključila več zamisli svojih kolegov. Pisanje v zbirnem jeziku je bilo nerodno, več časa se je porabilo za pisanje programskih struktur in težje je bilo razhroščevati kodo in jo razumeti.[13] Thomson je želel imeti prednosti visokonivojskega jezika vendar ne v smislu operacijskega sistema Multics, napisanega v PL/I in zbirnem jeziku. Najprej je neuspešno hotel uporabiti Fortran, nato pa je ustvaril jezik B s poenostavitvijo raziskovalnega jezika BCPL, tako da je lahko njegov tolmač šel v 8 K besedni pomnilnik računalnika PDP-7. B se je izkazal za zelo počasnega in nezmožnega za sistemsko programiranje v samem Unixu. Bil je brez tipov tako kot BCPL. Pri novem zmogljivejšem računalniku PDP-11 je bil jezik brez tipov neizvršljiv. Njegov procesor je podpiral podatkovne tipe različnih velikosti in z jezikom B tega ni bilo moč izraziti. Problem je bilo tudi izvajanje. Thompson in Ritchie sta se odločila prenesti operacijski sistem na PDP-11. Tudi njegov operacijski sistem je bil napisan v zbirnem jeziku. Želela sta napisati operacijski sistem v jeziku B. Najprej je zaradi nezmožnosti rabe nekaterih prednosti računalnika PDP-11, še posebej bajtno naslovljivost, v letu 1971 nastal »novi B«, ki je rešil te probleme. Jezik se je kmalu razvil v C in je postal prevajani in ne tolmačeni jezik.

Začetni razvoj jezika C je po Ritchiejevih besedah potekal v AT&T Bellovih laboratorijih med letoma 1969 in 1973[2]. Najbolj kreativno obdobje je bilo leta 1972. Tedaj je bila večina Unixa ponovno napisana v C-ju.[14] Do leta 1973 z dodatkom podatkovnega tipa zapisov struct je C postal dovolj močan za prevod Unixovega jedra. Nov jezik je dobil ime »C«, ker so bile njegove značilnosti izvedene iz jezika »B«, ta pa je bil po Thompsonovih besedah okleščena različica jezika BCPL.[15]

Tako je bilo Unixovo jedro prvo jedro kakšnega operacijskega sistem napisano v drugem jeziku od zbirnega. Pred tem sta bila na primer še opareacijska sistema Multics (napisan v PL/I) in MCP (Master Control Program) za sistem Burroughs B5000 (napisan v ALGOLu leta 1961.) Leta 1977 sta Ritchie in Stephen Curtis Johnson dodatno spremenila jezik C za pospešitev prenosljivosti operacijskega sistema Unix. Johnsonov Portable C Compiler je služil kot osnova za več izvedb C-ja na novih platformah.[16]

Oblika programa v C[uredi | uredi kodo]

Osnovni gradnik programa v C je funkcija.[17] Vsak program v C je zbirka ene ali več funkcij. Funkcije sestavljajo deklaracije spremenljivk and stavki, ali zapleteni ukazi, obkrožata pa jih zavita oklepaja ({ in }).

Zgleda programov[uredi | uredi kodo]

Program PozdravljenSvet[uredi | uredi kodo]

Spodnji zgled izpiše znakovni niz »Pozdravljen svet!« na standardni izhod. Navadno je standardni izhod povezan z zaslonom monitorja, lahko pa je tudi datoteka ali kakšna druga strojna naprava. Program je napisan v skladu s standardom ANSI C.

#include <stdio.h>
 
int main(void)
{
   printf("Pozdravljen svet!\r\n");
   return 0;
}

Sledi analiza programa po vrsticah:

#include <stdio.h>

Prva vrstica v programu je predprocesorski ukaz (navodilo, direktiva) #include. Pred samim prevajanjem programa predprocesor pregleda izvorno kodo in izvrši vse predprocesorske ukaze. Ti ukazi se vedno začnejo z znakom #. Ukaz #include povzroči, da se na njegovo mesto v izvorno kodo vključi datoteka stdio.h, ki vsebuje standardne vhodno izhodne funkcije.

int main(void)

V naslednji vrstici se definira funkcija z imenom main. Ta funkcija ima poseben pomen v C programih. Pri začetku izvajanja programa se najprej kliče ta funkcija. Ključna beseda int na začetku vrstice pove, da funkcija main() vrne celo število, ključna beseda void pa, da funkcija ne sprejme nobenih parametrov. Funkcija main po standardu ANSI C vedno vrača vrednost, čeprav nekateri prevajalniki prevedejo kodo uspešno, četudi temu ni tako. Tudi v jeziku C++ je ta funkcija še vedno C-jevska. Funkcija main je lahko definirana s pomočjo naslednjih štirih oblik ob deklaraciji:[18][a][b]

int main() { /* ... */ }
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }
int main(int argc, char **argv) { /* ... */ }

oziroma prototipno:

int main();
int main(void);
int main(int, char *[]);
int main(int, char **);

Prvi dve definiciji sta enakovredni (in združljivi s C++).

{

Odprti zaviti oklepaj pomeni začetek definicije main funkcije.

printf("Pozdravljen svet!\r\n");

V tej vrstici se kliče funkcija printf, ki je deklarirana v datoteki stdio.h. Pri tem klicu se funkciji printf poda en parameter v obliki znakovnega niza. Na koncu znakovnega niza je še posebni dvoznakovni niz \n, ki se prevede v znak EOL (end of line). Znak je namenjen kot ukaz izhodni napravi, da postavi trenutno lego na začetek naslednje vrstice.

return 0;

Vrstica zaključi izvajanje main funkcije in vrne celo število 0.

}

Zaprti zaviti oklepaj pomeni zaključek definicije funkcije main.

Minimalni program[uredi | uredi kodo]

Katera definicija funkcije main se uporabi v programu, je verjetno odvisno od posamezne izbire. Trenutni standard C vsebuje dva zgleda rabe main() in dva main(void), standard C++ pa rabi main(). Vrednost, ki jo main vrača (in mora biti tipa int), služi kot status prekinitve. Tega program vrne gostiteljevemu okolju.

Standard C definira vrnitveni vrednosti 0 (»nič napak« (zero errors)) in EXIT_SUCCESS, ki označujeta uspeh, ter EXIT_FAILURE za označevanje neuspešnega zagona programa. (EXIT_SUCCESS in EXIT_FAILURE sta definirani v standardni zaglavni datoteki <stdlib.h>). Druge vrnitvene vrednosti služijo kot izvedbeni definicijski pomeni. V Linuxu na primer program, ki ga je prekinil ukaz signal, vrne kodo številske vrednosti signala plus 128.

Minimalen pravilen program v C vsebuje prazno funkcijo main brez parametrov:

int main(void){}

Lahko se zapiše tudi v več vrsticah:

int main (void)
{          /* začetek telesa funkcije v prvem stolpcu vrstice */
}

ali redkeje sicer v skladu z dobrim slogom:

int
main (void) /* ime funkcije v prvem stolpcu vrstice */
{           /* začetek telesa funkcije v prvem stolpcu vrstice */
}

Sploh pa je slaba praksa pisati neporavnano, kot npr:

int
   main
      /*
        ** 
* *   * **/ (
    void
   )
{ }

ali:

    int
   main/*
 ** * *  * 
**/(void){ }

oziroma poravnano brez reda:

int   main   /*
**    *      *
***/  (      void
)     {      }

Preveden program bo sicer deloval, izvorna koda pa je že v preprostem zgledu nepregledna.

Okrogla oklepaja (), ki sledita imenu funkcije, morata biti vključena, saj na ta način C razlikuje funkcije od navadnih spremenljivk.

Ker nista navedena return ali exit, funkcija main ob izhodu vrne 0.[19] To je poseben primer predstavljen v standardu C99, ki velja le za funkcijo main.

Funkcija main bo za uspešno delovanje programa po navadi klicala druge funkcije. Ni treba, da je na vrhu programa, tako da se program v C ne začne v prvi vrstici, ampak tam kjer je navedena funkcija main.[17] Funkcije main ni možno klicati ali jo zagnati s kakšno drugo funkcijo v programu. Kliče jo lahko le operacijski sistem in na ta način se zažene program v C.

Nekatere izvedbe niso izvedljive, po navadi zaradi tega, ker niso mišljene za rabo z operacijskim sistemom. Takšne izvedbe se v standardu C imenujejo prostostoječe (free-standing). V prostostoječi izvedbi ni podrobnega opisa kako naj obravnava zagon programa. V programu še posebej ni treba definirati funkcije main.

Druge funkcije se lahko imenujejo poljubno v skladu s skladnjo jezika. Lahko jih napiše programer sam ali pa se rabijo obstoječe iz knjižnic. Vmesniki za knjižniške funkcije so običajno navedeni z vključitvijo zaglavnih datotek s preprocesorsko direktivo #include, objekti knjižnice pa se povežejo v končno izvršno sliko. Določene knjižniške funkcije, kot sta na primer printf ali scanf, so definirane s standardom C, in se imenujejo standardne knjižniške funkcije.

Funkcija lahko vrne vrednost klicatelju - po navadi drugi funkciji C, ali gostiteljevemu okolju za funkcijo main. Zgoraj omenjena funkcija printf vrne koliko znakov je bilo izpisano, vendar se ta vrednost običajno prezre.

Skladnja jezika C[uredi | uredi kodo]

Glavni članek: skladnja jezika C.

Nabor znakov[uredi | uredi kodo]

Osnovni nabor znakov izvorne kode jezika C vsebuje:

Nova vrstica označuje konec vrstice besedila. Ni treba da odgovarja dejanskemu posameznemu znaku, čeprav je v C zaradi prikladnosti to posamezen znak.

Lahko se rabijo tudi dodatni mnogobitno zakodirani znaki v prikazu znankovnih nizov, vendar niso povsem prenosljivi. Zadnji standard za C (C11) dovoljuje mnogonacionalne znake kodirnega standarda Unicode, ki so prenosljivo lahko del besedila izvoirne kode C s pomočjo kodiranj \uXXXX ali \UXXXXXXXX, kjer X označuje šestnajstiško zapisan znak. Ta možnost še ni v široki rabi.

Osnovni izvršni nabor znakov C obsega enake znake, skupaj s prikazom opozorila (alert), povratnega znaka (backspace) in pomika na začetek vrstice (carriage return). Podpora izvajalnemu času za razširjene nabore znakov se je z vsako različico standarda za C povečevala.

Rezervirane besede[uredi | uredi kodo]

Naslednje besede (keywords; reserved words) so v jeziku C rezervirane in imajo strog pomen kot posamezni znaki (tokens).[20][12] Ne smejo se na novo opredeliti ali se rabiti kot identifikatorji v drugih kontekstih:

_Alignas
_Alignof
_Atomic
auto
_Bool
break
case
char
_Complex
const
continue
default
do
double
else
enum
entry
extern
float
for
_Generic
goto
if
_Imaginary
inline
int
long
_Noreturn
register
restrict
return
short
signed
sizeof
static
_Static_assert
struct
switch
_Thread_local
typedef
union
unsigned
void
volatile
while[21]

Besede so občutljive na male ali velike črke. INT, INt, InT, Int, iNT, iNt ali inT na primer ni enako kot int. V različnih izvedbah prevajalnikov za C se lahko pojavijo tudi druge rezervirane besede, npr. ada, asm, fortran, pascal, čeprav se tam običajno nestandardne besede začnejo z enim ali dvema podčrtajema, npr. __asm, _Cdecl ipd.[21] V primerjavi z drugimi velikimi jeziki ima C majhno število rezerviranih besed. Ada jih ima na primer 62. Ena od značilnosti jezika C je, da lahko naredi veliko z relativno malo posebnimi simboli in rezerviranimi besedami.[20] Na začetku je imel C manj rezerviranih besed, na primer 29, sedaj pa jih pozna 44. Kasneje so bile dodane rezervirane besede, kot so: _Bool, _Complex, const, _Imaginary, inline, restrict, signed in volatile. Beseda entry se ni nikoli rabila in sedaj ni več rezervirana.

Glej tudi[uredi | uredi kodo]

Opombe[uredi | uredi kodo]

  1. ^ Standard ISO C (razdelek 5.1.2.2.1) zahteva veljavnost obeh oblik funkcije main, brez parametrov: int main() oziroma: int main(void), ali z dvema parametroma: int main(int argc, char *argv[]), kar je izjema le za to funkcijo.
  2. ^ V nekaterih operacijskih sistemih, še posebej v starejših različicah Unixa, ima lahko funkcija main tri parametre v obliki:
    int main(int argc, char *argv[], char *envp[]) { /* ... */ }
    

    kjer je tretji parameter kazalec na vektor predvsem imen spremenljivk okolja. Tretji parameter envp v funkciji main pa ni v skladu s standardom POSIX in se podatki o obstoječih spremenljivkah okolja pridobivajo z drugo funkcijo. Prevajalnik gcc za Linux na primer to možnost podpira.

Sklici[uredi | uredi kodo]

  1. ^ Stewart (2000).
  2. ^ 2,0 2,1 Ritchie (1993).
  3. ^ Giannini; Code Fighter, Inc.; Univerza Columbia (2004), str. 164.
  4. ^ 4,0 4,1 Lawlis (1997).
  5. ^ "Programming Language Popularity" (v angleščini). 2009. Pridobljeno dne 2009-01-16. 
  6. ^ "TIOBE Programming Community Index" (v angleščini). 2009. Pridobljeno dne 2009-05-06. 
  7. ^ "Verilog HDL (and C)". The Research School of Computer Science at the Australian National University. 2010-06-03. Pridobljeno dne 2013-08-19. "1980s: ; Verilog first introduced ; Verilog inspired by the C programming language" 
  8. ^ Stroustrup (1993).
  9. ^ "Write Objective-C Code" (v angleščini). apple.com. 2013-04-23. Pridobljeno dne 2013-12-22. 
  10. ^ Dawkins (2006).
  11. ^ Lee (2013).
  12. ^ 12,0 12,1 "WG14 N1570 Committee Draft — April 12, 2011" (v angleščini). Pridobljeno dne 2014-10-13. 
  13. ^ Van der Linden (1994).
  14. ^ Stallings (2012), str. 91.
  15. ^ "A Brief History of C" (v angleščini). 
  16. ^ Johnson; Ritchie (1978.)
  17. ^ 17,0 17,1 "The form of a C program". The GNU C Programming Tutorial (v angleščini). Pridobljeno dne 2014-10-10. 
  18. ^ "WG14 N1256 Committee Draft — September 7, 2007: 5.1.2.2.1 Program startup" (v angleščini). Pridobljeno dne 2014-10-13. 
  19. ^ Klemens (2012).
  20. ^ 20,0 20,1 Kelley; Pohl (1984), str. 61.
  21. ^ 21,0 21,1 "C Language Reference" (PDF). openwatcom.org (v angleščini). Pridobljeno dne 2010-12-31. 

Viri[uredi | uredi kodo]

Zunanje povezave[uredi | uredi kodo]


Glavni programski jeziki (več)

Industrijski: ABAP | Ada | C | C++ | C# | COBOL | Delphi | Fortran | java | JavaScript | Lisp | Objective-C | Perl | PHP | PL/SQL | Python | SAS | sh | SQL | Visual Basic | zbirnik

Akademski: Eiffel | Haskell | Logo | ML | paskal | prolog | Scheme | Smalltalk

Zgodovinski: ALGOL | APL | AWK | BASIC | Clipper | PL/I | Simula