C (programmeertaal)

Van Wikipedia, de gratis encyclopedie
Spring naar navigatie Spring naar zoeken
C.
De C-programmeertaal logo.svg
Basis data
paradigma's : imperatief , gestructureerd
Jaar van uitgave: 1972
Ontwerper: Dennis Ritchie
Ontwikkelaar: Dennis Ritchie & Bell Labs
Belangrijke implementaties : GCC , MSVC , Borland C , Portland Group, Intel , Clang
Beïnvloed door: B , BCPL , Algol 68 [1]
Aangedaan: awk , C ++ , C-- , C # , Objective-C , D , Go , Java , JavaScript , PHP , Perl , Python , Vala , Seed7
Besturingssysteem : Microsoft Windows , Unix-achtig systeem

C is een imperatieve en procedurele programmeertaal die computerwetenschapper Dennis Ritchie begin jaren zeventig ontwikkelde bij Bell Laboratories . Sindsdien is het een van de meest gebruikte programmeertalen.

De toepassingsgebieden van C zijn zeer verschillend. Het wordt gebruikt voor systeem- en applicatieprogrammering . De basisprogramma 's van alle Unix- systemen en de systeemkernels van veel besturingssystemen zijn geprogrammeerd in C. Talloze talen, zoals C++ , Objective-C , C# , D , Java , JavaScript , LSL , PHP , Vala of Perl , zijn gebaseerd op de syntaxis en andere eigenschappen van C.

verhaal

Ken Thompson (links) en Dennis Ritchie (rechts)

Verschijning

C werd in 1969-1973 ontwikkeld door Dennis Ritchie [2] bij Bell Laboratories voor het programmeren van het toen nieuwe Unix- besturingssysteem. Hij vertrouwde op de programmeertaal B , die Ken Thompson en Dennis Ritchie in 1969/70 hadden geschreven - de naam C werd ontwikkeld als een verdere ontwikkeling van B. B gaat op zijn beurt terug naar de programmeertaal BCPL die Martin Richards halverwege jaren 60. [3] Oorspronkelijk was de naam NB ("New B") bedoeld, het werd uiteindelijk C. [4] Ritchie schreef ook de eerste compiler voor C. In 1973 was de taal zo volwassen dat men nu de Unix-kernel kon gebruiken voor de PDP-11 kon herschrijven in C.

Verdere ontwikkeling

K&R C breidde de taal uit met nieuwe trefwoorden zoals long of unsigned en introduceerde de I/O-standaardbibliotheek ontwikkeld door Mike Lesk en, op aanbeveling van Alan Snyder, de preprocessor .

normen

C is een programmeertaal die op bijna alle computersystemen beschikbaar is. Om de wildgroei van talrijke dialecten in te dammen, werd C verschillende keren gestandaardiseerd ( C89 / C90 , C99 , C11 ). Afgezien van de microcontroller gebied , die zijn eigen dialecten heeft, de meeste huidige PC / server -implementaties zijn nauw gebaseerd op de standaard; volledige implementatie van de huidige normen is zeldzaam. In de meeste C-systemen met een runtime-omgeving is ook de gestandaardiseerde C-standaardbibliotheek beschikbaar. Dit betekent dat C-programma's die geen programmering bevatten die zeer dicht bij de hardware ligt, meestal gemakkelijk kunnen worden overgezet naar andere doelsystemen.

De eerste editie van The C Programming Language , gepubliceerd in 1978, bevat de voormalige onofficiële standaard K&R C

K&R C

Tot 1989 was er geen officiële standaard van de taal. Sinds 1978 werd het boek The C Programming Language echter beschouwd als een informele de facto standaard, die Brian W. Kernighan en Dennis Ritchie in hetzelfde jaar hadden gepubliceerd. [5] Deze specificatie wordt K&R C genoemd.

Omdat het aantal uitbreidingen van de taal in de daaropvolgende jaren gestaag groeide, was het niet mogelijk om overeenstemming te bereiken over een gemeenschappelijke standaardbibliotheek en zelfs de UNIX-compilers K&R C niet volledig geïmplementeerd, werd besloten om een ​​officiële standaard te definiëren. Nadat dit uiteindelijk in 1989 werd gepubliceerd, bleef K&R C een paar jaar de de facto standaard voor veel programmeurs, maar verloor al snel zijn belang.

ANSI C

In 1983 richtte hetAmerican National Standards Institute (ANSI) een commissie op genaamd X3J11, die haar werk in 1989 voltooide en de ANSI X3.159-1989 Programming Language C- norm doorstond . Deze versie van de C-taal staat ook bekend als ANSI C, Standard C of kortweg C89.

Een jaar later nam de International Organization for Standardization (ISO) de tot dan toe puur Amerikaanse norm over als internationale norm, ISO/IEC 9899: 1990 , ook wel kortweg C90 genoemd. Dus de namen C89 en C90 verwijzen naar dezelfde versie van C.

Na de eerste ontwikkeling door ANSI en ISO is de taalstandaard een paar jaar nauwelijks veranderd. Het normatieve amendement 1 op C90 werd pas in 1995 gepubliceerd. Het heette ISO / IEC 9899 / AMD1: 1995 en wordt ook wel afgekort als C95. Naast de correctie van enkele details, werden internationale lettertypen beter ondersteund met C95.

C99

Na een paar kleine herzieningen verscheen in 1999 de nieuwe norm ISO/IEC 9899:1999 , of kortweg C99. Het was grotendeels compatibel met C90 en introduceerde een aantal nieuwe functies, waarvan sommige overgenomen waren van C ++, waarvan sommige eerder waren geïmplementeerd door verschillende compilers. C99 is in de loop der jaren aangevuld met drie technische correcties .

C11

In 2007 begon de ontwikkeling van een nieuwe standaard met de onofficiële werktitel C1X . Het werd uitgebracht in december 2011 en staat in het kort bekend als C11. Naast een betere compatibiliteit met C++ zijn er nieuwe features aan de taal toegevoegd. [6] [7]

Sinds de eerste internationale norm C90 is C verder ontwikkeld door de internationale werkgroep ISO / IEC JTC1 / SC22 / WG14. De nationale normalisatieorganisaties nemen de publicaties van de internationale norm over in een aan hun behoeften aangepaste vorm.

C18

Deze standaard komt overeen met die van C11 met uitzondering van foutcorrecties en een nieuwe waarde van __STDC_VERSION__ en wordt daarom in dezelfde mate ondersteund als C11. [8] De norm is in juni 2018 vrijgegeven onder de ISO/IEC 9899:2018- norm. [9]

gebruik maken van

Ondanks zijn vrij hoge leeftijd, is de C-taal vandaag de dag nog steeds wijdverbreid en wordt deze zowel in universiteiten als in de industrie en in het open source- gebied gebruikt. [10]

Systeem- en applicatieprogrammering

Het belangrijkste toepassingsgebied van C is in systeemprogrammering , met name van embedded systemen , stuurprogramma's en kernels van besturingssystemen . De reden ligt in de combinatie van gewenste eigenschappen zoals draagbaarheid en efficiëntie met de mogelijkheid om hardware direct aan te spreken en daardoor lage eisen te stellen aan een runtime-omgeving.

Applicatiesoftware wordt ook vaak in C gemaakt, waarbij de relevantie van de taal hier achterop raakte, wat vooral op mobiele platforms duidelijk is. Veel programmeerinterfaces voor applicatieprogramma's en besturingssysteem- API's zijn geïmplementeerd in de vorm van C-interfaces, bijvoorbeeld Win32 . [11]

Implementatie van andere talen

Vanwege de hoge uitvoeringssnelheid en kleine codegrootte worden compilers , programmabibliotheken en interpreters van andere programmeertalen op hoog niveau (zoals de Java Virtual Machine ) vaak geïmplementeerd in C.

C wordt gebruikt als de tussencode van sommige implementaties van programmeertalen op hoog niveau. Dit wordt eerst vertaald in C-code, die vervolgens wordt gecompileerd. Deze aanpak wordt gebruikt om de portabiliteit te vergroten zonder machinespecifieke ontwikkeling voor de codegenerator (C-compilers bestaan ​​voor bijna elk platform). Sommige compilers die C op deze manier gebruiken zijn Chicken , EiffelStudio , Esterel , PyPy , Sather , Squeak en Vala .

C is echter ontworpen als programmeertaal en niet als doeltaal voor compilers. Het is daarom nogal slecht geschikt als tussentaal. Dat leidde tot op C gebaseerde tussentalen zoals C-- .

C wordt vaak (Engl. Bindings) voor het maken van verbindingen gebruikt (bijvoorbeeld Java Native Interface ). Met deze verbindingen kunnen programma's die in een andere taal op hoog niveau zijn geschreven, functies aanroepen die in C zijn geïmplementeerd. Het omgekeerde is vaak ook mogelijk en kan worden gebruikt om programma's die in C zijn geschreven uit te breiden met een andere taal (bijvoorbeeld mod perl ).

syntaxis

C is hoofdlettergevoelig .

Daarnaast heeft C een zeer klein aantal trefwoorden . Het aantal trefwoorden is zo laag omdat bijna alle taken die in andere talen worden geïmplementeerd met behulp van hun eigen trefwoorden, worden geïmplementeerd met behulp van functies van de C-standaardbibliotheek (bijvoorbeeld invoer en uitvoer via console of bestanden, dynamisch geheugenbeheer, enz.) .

Er zijn 32 trefwoorden in C89:

auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while

Met de C99 waren er nog vijf:

_Bool
_Complex
_Imaginary
inline
restrict

Met C11 zijn er nog zeven toegevoegd:

_Alignas
_Alignof
_Atomic
_Generic
_Noreturn
_Static_assert
_Thread_local

Hallo wereld programma

Een eenvoudige versie van het Hello World-programma in C is degene die Ritchie en Kernighan zelf gebruikten in de tweede editie van hun boek The C Programming Language . [12] Opgemerkt moet worden dat in de oudere ANSI C-standaard geen retourtype hoeft te worden gespecificeerd, aangezien de compiler een impliciete int als retourtype aanneemt.

 #include <stdio.h>
hoofd ()
{
  printf ( "hallo wereld \ n " );
}

Gegevenstypen

char

Om een ​​karakter (evenals kleine getallen) op te slaan, gebruikt men meestal het datatype karakter in C, geschreven als char .

De computer slaat niet het teken op (zoals "A"), maar een equivalent binair getal dat ten minste acht bits lang is (bijvoorbeeld 01000001). Dit binaire getal bevindt zich in het geheugen en kan op elk moment automatisch worden omgezet in de bijbehorende letter met behulp van een tabel, waarbij de huidige tekenset of de codepagina van de systeemomgeving bepalend is. 01000001 staat bijvoorbeeld voor het teken "A" volgens de ASCII-tabel .

Om tekens uit tekensets te kunnen opnemen die meer tekens bevatten dan de relatief kleine ASCII-tekenset, werd met wchar_t al snel een tweede gegevenstype voor tekens geïntroduceerd.

 // Het teken "A" wordt niet opgeslagen, maar meestal een byte ("01000001")
char- teken = 'A' ;

// voert het teken uit met het rangtelwoord 65 (in ASCII een "A")
printf ( "% c" , 65 );

int

Om een geheel getal (zoals 3) op te slaan, gebruikt men een variabele van het gegevenstype integer , geschreven als int . Tegenwoordig is de grootte van een geheel getal (afhankelijk van de processorarchitectuur en het besturingssysteem) meestal 32 bits, maar vaak 64 en soms 16 bits. 65536 verschillende waarden kunnen worden opgeslagen in 16 bits. Om het gebruik van negatieve getallen mogelijk te maken, is het waardebereik voor 16 bits meestal van -32768 tot 32767. Als negatieve getallen niet vereist zijn, kan de programmeur een unsigned int met unsigned int . Bij 16-bits gehele getallen resulteert dit in een waardebereik van 0 tot 65535.

Om het waardebereik van een geheel getal te verkleinen of te vergroten, gaat een van de kwalificaties short , long of long long eraan vooraf. Het trefwoord int kan dan ook weggelaten worden, dus long synoniem met long int . Om tussen ondertekende en niet-ondertekende gehele getallen te schakelen, zijn er twee kwalificaties, signed en unsigned . De kwalificatie kan ook worden weggelaten voor een geheel getal met teken, dus signed int gelijk aan int . De C-standaardbibliotheek vult deze datatypes aan via het platformonafhankelijke headerbestand <stdint.h> waarin een set integer-types met een vaste lengte is gedefinieerd.

 char geheel getal = 1 ; // minimaal 8 bits, d.w.z. 256 mogelijke waarden
kort geheel getal = 2 ; // minimaal 16 bits, d.w.z. 65536 mogelijke waarden
int geheel getal = 3 ; // minimaal 16 bits, d.w.z. 65536 mogelijke waarden
lang geheel getal = 4 ; // minimaal 32 bits, d.w.z. 4294967296 mogelijke waarden
lang lang geheel getal = 5 ; // minimaal 64 bit, d.w.z. 18446744073709551616 mogelijke waarden

zweven en dubbel

Getallen met decimalen worden opgeslagen in een van de drie datatypes float , double en long double . In de meeste C-implementaties komen de datatypes float en double overeen met de internationaal geldende standaard voor binaire floating point rekenkunde (IEC 559, die in 1989 voortkwam uit de oudere Amerikaanse standaard IEEE 754 ). Een float implementeert het " enkele lange formaat ", een dubbele het " dubbele lange formaat ". Een float is 32 bits en een double is 64 bits. dus dubbels zijn nauwkeuriger. Vanwege dit feit worden drijvers alleen in speciale gevallen gebruikt. De grootte van long doubles is afhankelijk van de uitvoering, maar een long double mag nooit kleiner zijn dan een double. De exacte eigenschappen en waardebereiken van de gebruikte architectuur kunnen worden bepaald via het headerbestand <float.h> .

 // Nauwkeurigheid hangt af van de implementatie

drijvende punt nummer = 0.000001f ;
dubbele punt nummer = 0,0000000000000002 ;
lange dubbelpunt getal = 0.3l;

leegte

Het datatype void wordt in de C-standaard "incomplete type" genoemd. U kunt geen variabelen van dit type maken. void ten eerste void wanneer een functie geen waarde mag retourneren, ten tweede wanneer een lege parameterlijst expliciet vereist is voor een functie en ten derde wanneer een aanwijzer moet verwijzen naar "objecten van elk type".

 // Verklaring van een functie die geen waarde retourneert
void functienaam ();

// Verklaring van een functie die int retourneert en geen parameters accepteert
int functienaam ( ongeldig );

// Aanwijzer naar een object van elk type
void * pointernaam ;

wijzer

Net als in andere programmeertalen zijn pointers in C variabelen die een geheugenadres opslaan (zoals adres 170234) in plaats van een direct bruikbare waarde (zoals het teken "A" of het getal 5). De adressen in het geheugen zijn genummerd. De waarde 00000001 kan bijvoorbeeld worden opgeslagen op het geheugenadres 170234 (binaire waarde van het decimale getal 1). Pointers maken het mogelijk om toegang te krijgen tot de waarde die zich op een geheugenadres bevindt. Deze waarde kan op zijn beurt een adres zijn dat verwijst naar een ander geheugenadres. Bij het declareren van een aanwijzer wordt eerst het gegevenstype van het object waarnaar wordt verwezen, gespecificeerd, vervolgens een asterisk en vervolgens de gewenste naam van de aanwijzer.

 char * aanwijzer ; // kan het adres van een karakter opslaan
dubbele * aanwijzer ; // kan het adres van een dubbele opslaan

velden

Net als in andere programmeertalen gebruik je velden (arrays) in C door meerdere waarden van hetzelfde datatype op te slaan. De waarden van een array hebben opeenvolgende geheugenadressen. Het aantal verschillende waarden in een array wordt gedefinieerd als de index van het veld. Omdat er geen apart gegevenstype is voor strings in C, worden arrays ook gebruikt om strings op te slaan.

 // Definitie van een array met 3 gehele waarden
int getallen [] = { 17 , 0 , 3 };

// array gebruikt om een ​​string op te slaan
char string [] = "Hallo wereld! \ n " ;

structureren

Structuren, geschreven als struct , worden gebruikt om verschillende soorten gegevens in een variabele op te slaan. Op deze manier kunnen variabelen van verschillende datatypes worden gecombineerd.

 structeur persoon {
    char * voornaam;
    char achternaam [ 20 ];
    int leeftijd ;
    dubbele grootte ;
};

opsomming

Net als in andere programmeertalen wordt een opsomming in C gebruikt om meerdere constante waarden in één type te combineren.

 enum temperatuur { WARM , KOUD , MEDIUM };

enum temperatuur todays_temperature = WARM ;

if (de temperatuur van vandaag == KOUD )
    printf ( "Kleed je warm aan!" ); // wordt niet weergegeven omdat het vandaag "WARM" is

typedef

Het sleutelwoord typedef wordt gebruikt om een alias te maken voor een gebruikt gegevenstype .

 // maakt de alias "integer" voor het gegevenstype "int"
typedef int geheel getal ;

// is nu gelijk aan: int a, b;
Geheel getal a , b ;

_Bool

Tot de C99-standaard was er geen datatype voor het opslaan van een logische waarde . Pas sinds 1999 kunnen variabelen worden gedeclareerd als _Bool en een van de twee waarden 0 (false) of 1 (true) _Bool .

 _Bool a = 1 ; // sinds C99

Door expliciet de header stdbool.h , is het wijdverbreide gebruik van het logische gegevenstype bool met de twee mogelijke waarden true of false mogelijk:

 #include <stdbool.h>

bool a = waar ; // sinds C99

_Complex en _Imaginair

Sinds C99 zijn er drie drijvende-komma-gegevenstypen voor complexe getallen , die zijn afgeleid van de drie drijvende- float _Complex : float _Complex , double _Complex en long double _Complex . float _Imaginary gegevenstypen voor puur denkbeeldige getallen werden ook geïntroduceerd in C99: float _Imaginary , double _Imaginary en long double _Imaginary .

Functies

Een C programma bestaat uit de main functie en eventueel andere functies. Verdere functies kunnen naar keuze door uzelf worden gedefinieerd of geprefabriceerd uit de C-standaardbibliotheek worden gehaald.

Voornaamst

Elk C-programma moet een functie hebben met de naam main , anders wordt het programma niet gecompileerd. De main functie is het ingangspunt van een C-programma dat op waardoor programmamiddelen altijd begint met deze functie.

 // het kortst mogelijke standaardconforme C89-programma
hoofd () { retourneer 0 ;}
 // het kortst mogelijke standaardconforme C99-programma
int hoofd () {}

Afgezien van de main functie, hebben geen andere functies worden opgenomen in een C-programma. Als andere functies moeten worden uitgevoerd, moeten deze in de main worden aangeroepen. De main functie is daarom ook aangeduid als het hoofdprogramma, alle andere functies als subprogramma .

Zelf gedefinieerde functies

In C kan een willekeurig aantal functies worden gedefinieerd. Een functiedefinitie bestaat ten eerste uit het datatype van de retourwaarde , ten tweede de naam van de functie, ten derde een lijst met parameters tussen haakjes en ten vierde een tussen haakjes geplaatste functietekst waarin is geprogrammeerd wat de functie moet doen.

 // Gegevenstype van de geretourneerde waarde, functienaam en twee parameters
int som ( int x , int y ) {
    // Functie body, de som wordt hier berekend en geretourneerd
    keer x + y terug ;
}

int hoofd () {
    // de functie wordt aangeroepen met de waarden 2 en 3, de retourwaarde
    // wordt opgeslagen in de "resultaat" variabele
    int resultaat = som ( 2 , 3 );

    // main retourneert de waarde van "result"
    resultaat teruggeven ;
}

Het sleutelwoord void wordt gebruikt om een ​​functie te definiëren die niets zou moeten retourneren. Evenzo als er geen parameters aan de functie moeten worden doorgegeven.

 #include <stdio.h>

ongeldige begroeting () {
    zet ( "Hallo!" );

    retour ;
}

Functies van de C-standaardbibliotheek

De functies van de standaardbibliotheek maken geen deel uit van de programmeertaal C. Ze worden geleverd bij elke normconforme compiler in de gehoste omgeving en kunnen worden gebruikt zodra het betreffende headerbestand is geïntegreerd. De functie printf wordt bijvoorbeeld gebruikt om tekst uit te voeren. Het kan worden gebruikt nadat het headerbestand stdio.h .

 #include <stdio.h>

int hoofd () {
    printf ( "hallo wereld! \ n " );

    retourneer 0 ;
}

instructies

Een functie bestaat uit instructies . Zoals in de meeste programmeertalen zijn de belangrijkste instructies: declaraties en definities, toewijzingen ,voorwaardelijke instructies , instructies die lussen implementeren en functieaanroepen. In het volgende, nogal zinloze programma staan ​​voorbeelden.

 // subroutines
void function_die_nicht_tut () { // definition
    retour ; // retourstatement
}

int plus_one_function ( int argument ) { // definition
    return argument + 1; // retourstatement
}

// hoofdprogramma
int main () { // definitie
    int nummer ; // definitie
    function_does_not_do (); // functieaanroep
    getal = 5 ; // opdracht
    getal = plus_een_functie ( getal ); // Functie-aanroep en toewijzing

    if ( getal > 5 ) // voorwaardelijke instructie
        getal - = 1 ; // Opdracht: de waarde van "nummer" is weer "5"

    retourneer 0 ; // retourstatement
}

naamgeving

Bij het benoemen van uw eigen variabelen, constanten, functies en datatypes moet u zich aan enkele naamgevingsregels houden. Ten eerste moet het eerste teken van een identifier een letter of een onderstrepingsteken zijn. Ten tweede kunnen de volgende tekens alleen de letters A tot en met Z en a tot en met z zijn, cijfers en het onderstrepingsteken. Ten derde kan de naam geen van de trefwoorden zijn.

Sinds C95 zijn tekens uit de Universal Coded Character Set ook toegestaan ​​in identifiers, op voorwaarde dat de implementatie dit ondersteunt. De toegestane karakters staan ​​vermeld in Bijlage D van de ISO-C norm. Simpel gezegd, het zijn al die karakters die in elke taal worden gebruikt als letters of letterachtige karakters.

Vanaf C99 kunnen deze tekens worden vervangen, ongeacht het platform, met behulp van een ontsnappingsreeks als volgt:

  • \uXXXX (waarbij X staat voor een hexadecimaal \uXXXX ) voor tekens met een code van 00A0 hex tot FFFF hex .
  • \UXXXXXXXX voor alle tekens met een code ≥00A0 hex .

Bepaalde identifiers zijn ook gereserveerd voor implementatie :

  • ID's die beginnen met twee opeenvolgende onderstrepingstekens
  • Identifiers die beginnen met een underscore gevolgd door een hoofdletter.

Uitbreidingen van de taalkern, die nieuwe trefwoorden vereisen, gebruiken ook namen uit dit gereserveerde gebied om te voorkomen dat ze botsen met identifiers in bestaande C-programma's, b.v. B. _Complex , _Generic , _Thread_local .

Standaard bibliotheek

De C-standaardbibliotheek is een integraal onderdeel van een gehoste ( Engl. Hosted) C-implementatie. Het bevat onder andere macro's en functies die beschikbaar worden gesteld met behulp van het standaard headerbestand . In vrijstaande (Engl. Vrijstaande) implementaties kan de reikwijdte van de standaardbibliotheek echter beperkt zijn.

De standaardbibliotheek is verdeeld in verschillende standaard headerbestanden, maar de gekoppelde bibliotheek is vaak één groot bestand.

  • "Hosted": De C-compiler en het programma bevinden zich in een besturingssysteemomgeving die de gebruikelijke services biedt (bijvoorbeeld een bestandssysteem, tekstuele invoer- en uitvoerkanalen, geheugenbeheer).
  • "Vrijstaand": Het C-programma draait niet onder een besturingssysteem, maar moet alle apparaatfuncties zelf uitvoeren. Vaak zijn echter ten minste enkele bibliotheken vooraf beschikbaar. Cross-compilers (ook bekend als "target-compilers") worden hier vaak gebruikt.

Modules

Een modularisering in C vindt plaats op dossierniveau. Een bestand vormt een vertaaleenheid; Intern benodigde functies en variabelen kunnen zo worden verborgen voor andere bestanden. De publieke functionele interfaces worden aangekondigd met zogenaamde headerfiles . Dit betekent dat C een zwak modulair concept heeft. [13] [14]

Het globale taalontwerp bepaalt dat een programma uit meerdere modules kan bestaan. Voor elke module is er een broncodebestand (met de extensie .c) en een headerbestand (met de extensie .h). Het broncodebestand bevat in wezen de implementatie, het headerbestand de interface naar de buitenwereld. Beide bestanden consistent houden is de taak van de programmeur in C (zoals in C++ , maar niet meer in C# ).

Modules die functies uit andere modules gebruiken, bevatten hun header-bestanden en geven de compiler dus de nodige informatie over de bestaande functies, aanroepconventies, typen en constanten.

Elke module kan afzonderlijk worden vertaald en creëert een objectbestand . Verschillende objectbestanden kunnen in een bibliotheek worden gecombineerd of afzonderlijk worden gebruikt.

Verschillende objectbestanden en bibliotheken (die ook gewoon een verzameling objectbestanden zijn) kunnen door Left (Duits: Binder) worden gekoppeld aan een uitvoerbaar programma.

Compiler

De meest voorkomende is de gratis C-compiler van de GNU Compiler Collection , die al sinds 1987 bestaat. De Visual C++ compiler, die sinds 1993 is ontwikkeld, is ook wijdverbreid onder Windows. Naast deze twee zijn er nog tal van andere compilers beschikbaar.

Aangezien er relatief weinig trefwoorden in C zijn, is er het voordeel van een zeer eenvoudige, kleine compiler. C is dan ook vaak de eerste beschikbare programmeertaal op nieuwe computersystemen (na machinecode en assembler ).

Relatie met assembler, draagbaarheid

De programmeertaal C is ontwikkeld met als doel een echte taalabstractie van de assembleertaal te implementeren. Er moet een directe toewijzing zijn aan een paar machine-instructies om de afhankelijkheid van een runtime-omgeving te minimaliseren. Door dit ontwerp is het mogelijk om C-code te schrijven op een zeer hardware-gerelateerd niveau, analoog aan montage-instructies. Het porten van een C-compiler naar een nieuw processorplatform is niet erg ingewikkeld in vergelijking met andere talen. Zo is de gratis GNU C-compiler (gcc) beschikbaar voor een groot aantal verschillende processors en besturingssystemen. Voor de ontwikkelaar betekent dit dat er bijna altijd een C-compiler is, ongeacht het doelplatform. C ondersteunt dus aanzienlijk de portabiliteit van programma's, op voorwaarde dat de programmeur het zonder assembler-onderdelen in de broncode en/of hardware-specifieke C-constructies kan stellen. Bij het programmeren van microcontrollers is C verreweg de meest gebruikte taal op hoog niveau.

veiligheid

Conceptueel is C zo ontworpen dat de bronteksten eenvoudig kunnen worden gecompileerd en de programmacode snel kan worden uitgevoerd. In de regel genereren de compilers echter slechts een kleine hoeveelheid code om de gegevensbeveiliging en operationele betrouwbaarheid tijdens de looptijd van de programma's te waarborgen. Daarom wordt er in toenemende mate getracht deze tekortkomingen te ontdekken en te corrigeren door middel van formele verificatie of deze te verhelpen door aanvullende bronteksten aan te maken door de programmeur. [15] [16] [17]

C beperkt de directe geheugentoegang nauwelijks. Dit betekent dat de compiler (in tegenstelling tot bijvoorbeeld Pascal ) slechts in zeer beperkte mate kan helpen bij het oplossen van problemen. Om deze reden is C minder geschikt voor veiligheidskritische toepassingen (medische techniek, verkeersregeltechniek, ruimtevaart). Als C toch in deze gebieden wordt gebruikt, wordt meestal geprobeerd om de kwaliteit van de gemaakte programma's te verhogen door aanvullende tests zoals softwaretests met een hoge testdekking .

C bevat enkele veiligheidskritieke functies; gets() , een functie van de standaardbibliotheek in de oude standaarden, bijvoorbeeld, overschrijft externe geheugengebieden ( bufferoverloop ) als het een ongeschikte (te lange) invoer tegenkomt. De fout is niet merkbaar of te vangen binnen C. Om het grote voordeel van C - het bestaan ​​van talrijke oudere broncodes - niet te verliezen, blijven huidige implementaties deze en soortgelijke functies ondersteunen, maar geven ze meestal een waarschuwing als ze in de broncode worden gebruikt bij het vertalen. gets() werd uiteindelijk verwijderd uit de taalspecificatie met C11 . [18]

C ist nicht typsicher , [19] da verschiedene Datentypen zuweisungskompatibel gehandhabt werden können. [20]

Literatur

Einführungen

Fortgeschritten

  • Andrew Koenig: Der C-Experte: Programmieren ohne Pannen. Addison-Wesley, 1989, ISBN 978-3-89319-233-5 (deutsche Übersetzung von: C Traps and Pitfalls. Addison-Wesley, 1989.)
  • Peter van der Linden: Expert-C-Programmierung. Verlag Heinz Heise, 1995, ISBN 978-3-88229-047-9 (deutsche Übersetzung von: Expert C Programming. Prentice Hall, 1994.)

Handbücher

  • Rolf Isernhagen, Hartmut Helmke: Softwaretechnik in C und C++. Das Kompendium. Modulare, objektorientierte und generische Programmierung. ISO-C90, ISO-C99, ISO-C++98, MS-C++.NET . 4., vollständig überarbeitete Auflage, Hanser, München/Wien 2004, ISBN 3-446-22715-6 .
  • Jürgen Wolf: C von A bis Z. Das umfassende Handbuch . 3. aktualisierte und erweiterte Auflage 2009, 4., korrigierter Nachdruck 2015, Rheinwerk, Bonn 2015, ISBN 978-3-8362-1411-7 .

K&R C

  • Brian Kernighan, Dennis Ritchie: The C Programming Language . Prentice Hall, Englewood Cliffs (NJ) 1978, ISBN 0-13-110163-3 . (Deutsche Übersetzung: Brian Kernighan, Dennis Ritchie: Programmieren in C. Mit dem reference manual in deutscher Sprache . Hanser, München/Wien 1983)

K&R2

  • Brian Kernighan, Dennis Ritchie: The C Programming Language . 2. Auflage, Prentice Hall, Englewood Cliffs (NJ) 1988, ISBN 0-13-110362-8 . (Deutsche Übersetzung: Brian Kernighan, Dennis Ritchie: Programmieren in C. Mit dem C-Reference Manual in deutscher Sprache . 2. Auflage, Hanser, München/Wien 1990, ISBN 978-3-446-15497-1 )

Weblinks

Wikibooks: C-Programmierung – Lern- und Lehrmaterialien

Einzelnachweise

  1. Dennis M. Ritchie: The Development of the C Language. Lucent Technologies, Januar 1993, abgerufen am 10. September 2015 : „The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of.“
  2. Dennis M. Ritchie: The Development of the C Language. Lucent Technologies, Januar 1993, abgerufen am 10. September 2015 .
  3. Ken Thompson: Users' Reference to B. Abgerufen am 30. Mai 2015 .
  4. Die Unix-Story. Geschichtliches Sachbuch über das Computerbetriebssystem Unix von Autor Brian W. Kernighan , 254 Seiten, Oktober 2020, dpunkt.verlag GmbH, Heidelberg, S. 97
  5. Brian W. Kernighan, Dennis M. Ritchie: The C Programming Language , Prentice Hall, Englewood Cliffs (NJ) 1978, ISBN 0-13-110163-3 .
  6. Sprachdefinition von C11 als ISO-Standard ISO/IEC 9899:2011 , veröffentlicht am 8. Dezember 2011.
  7. ISO aktualisiert C-Standard , Artikel auf heise online, vom 22. Dezember 2011.
  8. Options Controlling C Dialect. Abgerufen am 8. September 2018 .
  9. ISO/IEC 9899:2018 Programming languages C. Abgerufen am 8. September 2018 .
  10. Rolf Isernhagen, Hartmut Helmke: Softwaretechnik in C und C++. Das Kompendium. Modulare, objektorientierte und generische Programmierung. ISO-C90, ISO-C99, ISO-C++98, MS-C++.NET . 4., vollständig überarbeitete Auflage, Hanser, München/Wien 2004, ISBN 3-446-22715-6 , Seite 4.
  11. Walkthrough: Creating Windows Desktop Applications (C++) Microsoft Docs, abgerufen am 5. Dezember 2019.
  12. Brian Kernighan, Dennis Ritchie: The C Programming Language . 2. Auflage, Prentice Hall, Englewood Cliffs (NJ) 1988, ISBN 0-13-110362-8 , Seite 6.
  13. Scheler, Stilkerich, Schröder-Preikschat: Komponenten/Module (PDF; 1,1 MB)
  14. Bertrand Meyer: Objektorientierte Softwareentwicklung . Hanser, Wien, München; Prentice Hall Internat. 1990, S. 406 ISBN 3-446-15773-5 .
  15. Junan Qian, Baowen Xu: Formal Verification for C Program , Informatica, Volume 18, Number 2 (2007), pages 289–304, abgerufen am 5. Juli 2016
  16. Harvey Tuch: Formal verification of C systems code , Sydney Research Lab., National ICT Australia (2009), abgerufen am 5. Juli 2016
  17. Jay Abraham: Improving Software Quality with Static Code Analysis , MathWorks (2012), abgerufen am 5. Juli 2016
  18. gets - C++ Reference. Abgerufen am 12. März 2020 .
  19. Markus Bautsch: Cycles of Software Crises – How to avoid insecure and uneconomic software , ENISA Quartely, Vol. 3, No. 4, Oct–Dec 2007, p. 3–5
  20. Lambert Kenneth Louden: Programming Languages: Principles and Practices , Ch. 8.6.1 Type Compatibility / 8.7 Type Conversion , Cengage Learning, 2011, ISBN 978-1-133-38749-7 .