C (programmeertaal)

programmeertaal van Bell Labs

De programmeertaal C is een imperatieve programmeertaal, gebaseerd op de programmeertaal B, die zelf weer op BCPL was gebaseerd. Beide programmeertalen zijn ontworpen door Dennis Ritchie. Het is een zeer praktische programmeertaal die meer op Algol lijkt dan op andere voorlopers, zoals - in historische volgorde - Fortran, Lisp, COBOL en BASIC.

C
C
Paradigma Imperatief
Verschenen 1972
Ontwerper Dennis Ritchie
Ontwikkelaar Dennis Ritchie en Bell Labs
Typesysteem statisch, zwak
Implementaties GCC, MS Visual C++,
Beïnvloed door B, BCPL, Algol 68, PL/1 [1]
Invloed op AWK, C++, Objective-C, D, Perl
Besturings­systeem Multiplatform
Bestands­extensies .h, .c
Website https://www.iso.org/standard/74528.html
Portaal  Portaalicoon   Informatica

Ook Pascal is een versimpeling van Algol, maar dan in een andere richting. Terwijl Pascal meer afstand neemt van de machine waar het op moet werken, ligt C juist dicht tegen de machine aan; het is betrekkelijk 'low-level'.

De invloed van C is zo groot dat sindsdien de meeste nieuwe talen zoals C++, Objective-C, Java, JavaScript, C# en PHP grotendeels de syntaxis van C gebruiken.

Kenmerken in vogelvlucht

bewerken

Datatype

bewerken

C heeft getypeerde data, maar maakt conversie wel mogelijk. Conversie kan door middel van zogenaamde casts, de datatypes hoeven niet van dezelfde grootte te zijn, hoewel dit wel aan te raden is. De datarepresentatie van een type op de machine wordt niet door de taal voorgeschreven; een variabele van het type int (een verkorting van het Engelse integer, hetgeen "geheel getal" betekent) kan dus tussen verschillende machines verschillen en bijvoorbeeld 16 of 32 bits lang zijn.

Programmastructuur

bewerken

De taal C is procedureel. Alle code is onderdeel van een functie. Het hoofdprogramma dat 'main' heet, is zelf ook een functie.

De lusconstructies zijn de for-, while- en do-while-statements. Een goto-statement is ook beschikbaar, maar gebruik hiervan wordt ontraden, tenzij voor fout-exitconstructies. Ook werkt C met logische operatoren als and (&&), or (||) en not (!) en het if-statement, waarvan de if-else-versie verkort als condition?statement:statement; geschreven kan worden.

Er is een aantal verhogings- en verlagingsoperatoren die bij veel processors als machinetaalinstructies aan arraybewerkingen kunnen worden gekoppeld (bijvoorbeeld a = b[x++]; betekent: a krijgt de waarde in b[x] en x wordt daarna 1 opgehoogd). Voor veel processoren (de Intel 80x86-familie, de Motorola 68000-familie) is dit een enkele machinetaalinstructie.

Statements worden door een puntkomma afgesloten. Indices van arrays beginnen bij nul.

Pointers

bewerken
  Zie Pointer (programmeerconcept) voor het hoofdartikel over dit onderwerp.

C geeft directe toegang tot het geheugen met behulp van pointers. Een pointer is een variabele die een geheugenadres bevat. Op dit geheugenadres bevindt zich de feitelijke data. Dit kan weer een pointer zijn. Het gebruik hiervan heeft een aantal voordelen. Men kan bijvoorbeeld een pointer doorgeven aan een functie, zodat deze de variabele waarnaar de pointer wijst direct kan wijzigen. Dit is voordelig qua geheugengebruik, want er hoeft geen kopie van de variabele gemaakt te worden en er hoeven geen globale variabelen gedefinieerd te worden door de programmeur. Er zijn echter ook valkuilen: als men een pointer voortijdig wijzigt, dat wil zeggen voordat de geheugenplaats is vrijgegeven, kan het programma niet langer de geheugenplaats waarnaar de pointer wees, aanspreken. In zo'n geval spreekt men van een geheugenlek (memory leak). Het omgekeerde kan ook gebeuren: men geeft een geheugenlocatie vrij terwijl er nog pointers naar verwijzen. Het gebruik van zo'n pointer geeft dan meestal een crash.

Omdat pointers geheugenadressen bevatten, en deze geheugenadressen gewoon getallen zijn, kan men met pointers rekenen:

#include <stdio.h>
// Dit is een alternatief van het "hello world"-programma.

int main(void) {
    const char* statement = "hello world!\n";

    while (*statement) {
        putchar(*statement++); // gewoon 1 bij optellen
    }

    return 0;
}

De syntaxis van de taal is tamelijk beperkt, maar er is een grote bibliotheek van standaardfuncties beschikbaar voor bijvoorbeeld stringbewerkingen (tekst wordt in C beschouwd als een array van karakters (type char, afgeleid van het Engelse character) met een nullbyte ter afsluiting). Arrays zijn in C te benaderen als pointers.

Hello world

bewerken

Als voorbeeld het klassieke hello world-programma in C.

#include <stdio.h>
// laad de bibliotheek met functies voor standaardin- en uitvoer (stdio.h)

/* begin de main()-functie en vermeld dat deze functie een waarde teruggeeft als
 * geheel getal (int), maar geen argumenten heeft (void). De waarde die
 * teruggegeven wordt door de main()-functie is de exitcode van het programma. */

int main(void) {
    /* gebruik de printfunctie "printf()" om "hello world!" af te drukken op het
     * scherm. De '\n' staat voor newline ("nieuwe regel"). De definitie van
     * printf komt uit stdio.h. */
    printf("Hello, world!\n");

    return 0; // Stop het programma met exitcode 0.
};

Voor- en nadelen van C

bewerken

Zoals gezegd is C een taal die tamelijk dicht aansluit bij de hardware. Dat heeft zowel voor- als nadelen. Voordelen zijn dat C voor van alles gebruikt kan worden en relatief snel is.

Nadelen zijn dat de taal niet erg vergevingsgezind is met betrekking tot fouten en dat de C-compiler weinig controles uitvoert (hoewel die controles met diverse tools alsnog uitgevoerd kunnen worden). Een C-programma dat door de C-compiler correct wordt bevonden, hoeft niet per definitie goed te functioneren. Een oorzaak van vele problemen hier is het gebruik van pointers; dit is dan ook de reden waarom deze in afgeleide talen zoals Java en C# achterwege gelaten zijn.

Een bekend gezegde over C is "C provides all the rope you need to hang yourself" ("C levert al het touw dat je nodig hebt om jezelf op te hangen"). Er kan veel met C, maar alleen als men weet wat men doet. Daarom wordt deze taal veel in de technische wereld gebruikt.

Besturingssystemen als Unix en Windows worden grotendeels in C geschreven. Vaak wordt er een combinatie gebruikt van C en C++, zoals bij Windows, waarbij C wordt gebruikt voor de kernel en C++ voor de overige componenten. Een ander veelgebruikt alternatief is een combinatie van C en (ingebedde) assembler, dit komt dan terug voor bij de Linux-kernel, deze is quasi volledig in C geschreven met enkele lowlevelzaken in assembler. Voor vrijwel iedere processor en microcontroller is een C-compiler beschikbaar. Dientengevolge kent de taal C een hoog percentage professionele programmeurs.

Hashtag

bewerken

De zogenaamde hashtag (#sleutelwoord) werd in de computerwereld voor het eerst gebruikt in programmeren met C om bepaalde segmenten en macro's te onderscheiden.[1][2]

Zie ook

bewerken

Literatuur

bewerken
  • Brian Kernighan en Dennis Ritchie The C programming language, 2nd ed. (ANSI-C) Prentice-Hall, 1988, ISBN 0-13-110362-8.
    Ook in het Nederlands (vert. Maarten J Van Vreumingen): Kernighan, M. en D. Ritchie (1990), C Handboek (reeks Prentice-Hall/Academic Service). Schoonhoven: Academic Service. XII, 367 p. ISBN 90-6233-488-1 (pb) EAN 978-90-6233-488-9.
Wikibooks heeft meer over dit onderwerp: Cursus programmeren in C.