C (programmeringsspråk)

C


Enkel C-kode]
Utvikler(e)
Dennis Ritchie og Bell Laboratories
Generell informasjon
Vanlige utvidelser .c, .h
Paradigme Imperativ ( prosedyremessig ), strukturert
Dukket opp i 1972
Designet av Dennis Richie
Siste stabile versjon C18 (juni 2018)
Siste versjon i tester C2x
type system svak, statisk
implementeringer GCC , Intel C , blant mange flere.
dialekter Cyclone , Unified Parallel C , Split-C, Cilk , C*
påvirket av

B ( BCPL , CPL ), ALGOL 68 , [ 1 ] :  201-208

Assembler , PL/I , Fortran
har påvirket Vala , C# , Objective-C , C++ , AWK , bc , Java , JavaScript , PHP , Perl , NXC , D , Go , Rust , Python
Operativsystem Multiplattform

C er et programmeringsspråk for generell bruk [ 2 ] : 1  opprinnelig utviklet av Dennis Ritchie mellom 1969 og 1972 ved Bell Laboratories , [ 1 ] som en utvikling av det tidligere B -språket , selv basert på BCPL . [ 2 ] ​: 1  [ 3 ]​ [ 4 ]

Som B er det et språk orientert mot implementering av operativsystemer , spesielt Unix . C er verdsatt for effektiviteten til koden den produserer og er det mest populære programmeringsspråket for å lage system- og applikasjonsprogramvare.

Det er et språk med statiske datatyper, svakt skrevet, på middels nivå, som har de typiske strukturene til høynivåspråk, men i sin tur har språkkonstruksjoner som tillater kontroll på lavt nivå . Kompilatorer tilbyr ofte utvidelser til språket som gjør det mulig å blande sammenstillingskode med C-kode eller å få direkte tilgang til minne eller perifere enheter .

Den første standardiseringen av C-språket var i ANSI , med X3.159-1989-standarden. Språket som definerer denne standarden var kjent som ANSI C. Senere, i 1990, ble den ratifisert som en ISO-standard ( ISO/IEC 9899:1990). Bruken av denne standarden er veldig bred, så hvis programmene som er opprettet følger den, er koden portabel mellom plattformer og/eller arkitekturer.

Filosofi

Et av designmålene til C-språket er at bare noen få maskinspråkinstruksjoner er nødvendige for å oversette hvert språkelement, uten å kreve omfattende kjøretidsstøtte. Det er fullt mulig å skrive C på et lavt abstraksjonsnivå; faktisk ble C brukt som et mellomledd mellom forskjellige språk.

Delvis, fordi det er relativt lavt nivå og har et beskjedent funksjonssett, kan C-kompilatorer enkelt utvikles. Følgelig er C-språket tilgjengelig på et bredt spekter av plattformer (mer enn noe annet språk). Videre, til tross for dets lave nivå, ble språket utviklet for å oppmuntre til maskinuavhengig programmering. Et program skrevet til standarder og ment å være bærbart kan kompileres på mange datamaskiner.

C ble opprinnelig utviklet (i forbindelse med Unix -operativsystemet , som det lenge har vært assosiert med) av programmerere for programmerere. Imidlertid har den oppnådd enorm popularitet, og har blitt brukt i sammenhenger langt unna systemprogramvareprogrammering , som den opprinnelig ble designet for.

Egenskaper

Forholdsregler som må tas som et lavnivåspråk

Nybegynnere bør være forsiktige med minnebehandling; i C må programmereren tildele og frigjøre minne eksplisitt. På andre språk (som C# eller Java) administreres minnet transparent for programmereren. Dette avlaster arbeidsbelastningen og forhindrer feil, men det tar bort fra språkfleksibiliteten å skrive maskinvaredrivere.

Av denne grunn er det svært viktig at nykommere tar i bruk god praksis når de skriver i C og håndterer minne, for eksempel intensiv bruk av innrykk og en grundig forståelse av alt som er involvert i håndtering av minnepekere og adresser.

Noen funksjoner som C mangler

Selv om listen over nyttige funksjoner som C mangler er lang, har denne faktoren vært viktig for dens aksept, fordi raskt å skrive nye kompilatorer for nye plattformer holder det programmet faktisk gjør under direkte kontroll av programmereren, og lar deg implementere det meste naturlig løsning for hver plattform. Dette er grunnen til at C ofte er mer effektivt enn andre språk. Vanligvis produserer bare forsiktig programmering i assembly-språk raskere kode, noe som gir full kontroll over maskinen, selv om fremskritt innen C-kompilatorer og den økende kompleksiteten til moderne mikroprosessorer gradvis har redusert denne forskjellen.

Språket kan utvides med biblioteker og makroer. For eksempel besto den opprinnelige implementeringen av C++ av en forprosessor som oversatte C++-kildekoden til C.

Historikk

Innledende utvikling

Den første utviklingen av C fant sted ved AT&Ts Bell Laboratories mellom 1969 og 1973; ifølge Dennis Ritchie fant den mest kreative perioden sted i 1972. [ 1 ] Den fikk navnet "C" fordi mange av dens funksjoner ble hentet fra et tidligere språk kalt " B ".

Det er mange legender om opprinnelsen til C og operativsystemet som det er nært beslektet med, Unix. Noen av dem er:

I 1973 var C-språket blitt så kraftig at det meste av Unix -kjernen , opprinnelig skrevet i assembly-språket PDP-11, ble skrevet om i C. [ 1 ] Dette var en av de første operativsystemkjernene implementert på et annet språk enn montering. (Tidligere tilfeller er Multics -systemet , skrevet i PL/I , og Master Control Program for Burroughs B5000 , skrevet i ALGOL i 1961).

Kernighan og Ritchies C

I 1978 publiserte Ritchie og Brian Kernighan den første utgaven av The C Programming Language , også kjent som The Bible of C. Denne boken var i årevis den uformelle spesifikasjonen av språket. [ 2 ] ​: 2  Språket som er beskrevet i denne boken blir ofte referert til som "Kernighan og Ritchies C" eller ganske enkelt "K&R C" (den andre utgaven av boken dekker ANSI C -standarden , beskrevet nedenfor).

Kernighan og Ritchie introduserte følgende funksjoner til språket:

Kernighan og Ritchies C er den mest grunnleggende undergruppen av språket som en kompilator må støtte. I mange år, selv etter introduksjonen av ANSI C, ble det ansett som "den laveste fellesnevneren" der programmerere skulle programmere når de ønsket at programmene deres skulle være bærbare, siden ikke alle kompilatorer fullt ut støttet ANSI, og rimelig velskrevet kode i K&R C er også gyldig ANSI C-kode.

I de første versjonene av språket ble definisjonen av funksjoner gjort gjennom en 'funksjonsprototype' (funksjonsprototype), som indikerte for kompilatoren returtypen til funksjonen. Selv om denne metoden har en stor ulempe sammenlignet med den nye, fordi den ikke sjekker antall og type i argumentlisten; med andre ord, det er mye lettere å gjøre feil ved å kalle en funksjon med feil argumenter.

Eksempel på "gammel stil":

inpower ( ); /* Denne prototypen kan brukes til å kalle funksjonen. Bare makt(); eller utelat den siden standardtypen er int */ makt ( a , b ) int a , b ; { int n ; for ( n = 1 ; b > 0 ; -- b ) n *= a ; returnere n ; }

Eksempel på den nye definisjonen:

int potens ( int a , int b ) { for ( int n = 1 ; b > 0 ; -- b ) n *= a ; returnere n ; }

(*) Som standard er returtypen i C int, så hele deklarasjonen int power();kunne vært utelatt.

I årene etter utgivelsen av Kernighan og Ritchies C ble mange uoffisielle funksjoner lagt til språket, som ble støttet av kompilatorer fra blant annet AT&T. Noen av disse funksjonene var:

  • Funksjoner voidog datatype void *.
  • Funksjoner som returnerte datatyper structeller union(i stedet for pekere).
  • Kartlegging av datatyper struct.
  • Kvalifisering const, som gjør et objekt skrivebeskyttet.
  • Et standardbibliotek , som inkorporerte det meste av funksjonaliteten implementert av forskjellige kompilatorutviklere.
  • Oppregninger.

ANSI C og ISO C

På slutten av 1970-tallet begynte C å erstatte BASIC som det dominerende programmeringsspråket for mikrodatamaskiner. I løpet av 1980-tallet ble den tatt i bruk på IBM-PCer , noe som økte populariteten betydelig. Samtidig begynte Bjarne Stroustrup å samarbeide med noen kolleger ved Bell Labs for å legge til objektorienterte programmeringsmuligheter i C. Språket de laget, kalt C++ , er i dag det vanligste applikasjonsprogrammeringsspråket på operativsystemet MicrosoftWindows ; mens C fortsatt er mer populær i Unix-miljøet. Et annet språk som ble utviklet rundt denne tiden, Objective C , la også objektorienterte programmeringsfunksjoner til C. Selv om det ikke er så populært som C++ i dag, brukes det til å utvikle Cocoa -applikasjoner for Mac OS X .

I 1983 organiserte American National Standards Institute (ANSI) en komité, X3j11, for å etablere en standardspesifikasjon av C. Etter en lang og møysommelig prosess ble standarden fullført i 1989 og ratifisert som "C Programming Language." ANSI X3 .159-1989. Denne versjonen av språket er ofte kjent som ANSI C , eller noen ganger som C89 (for å skille det fra C99).

I 1990 ble ANSI-standarden (med noen mindre modifikasjoner) vedtatt av International Organization for Standardization (ISO) i ISO/IEC 9899:1990-standarden. Denne versjonen er noen ganger kjent som C90. Imidlertid refererer "C89" og "C90" i hovedsak til det samme språket.

Et av målene med ANSI C-standardiseringsprosessen var å produsere en utvidelse til Kernighan og Ritchies C, med mange uoffisielle funksjoner. Standardiseringskomiteen inkluderte imidlertid også mange nye funksjoner, som funksjonsprototyper og en forbedret forprosessor. Syntaksen til parameterdeklarasjonen er også endret for å gjøre den lik den som vanligvis brukes i C++:

main ( argc , argv ) int argc ; røye ** argv ; { ... }

ble til:

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

ANSI C støttes i dag av nesten alle kompilatorer. Det meste av C-koden som er skrevet i dag, er basert på ANSI C. Ethvert program skrevet kun i standard C uten maskinvareavhengig kode fungerer fint på alle plattformer som har en kompatibel C-implementering. Imidlertid er mange programmer skrevet på en slik måte at de bare kan kompileres på en bestemt plattform, eller med en bestemt kompilator, dette kan skyldes flere årsaker:

  • Bruk av ikke-standardiserte biblioteker, for eksempel grafiske brukergrensesnitt.
  • Bruk av kompilatorer som ikke oppfyller spesifikasjonene til standarden.
  • Bruk av datatyper forutsatt at de vil ha samme størrelse eller rekkefølge av biter på alle plattformer.

Makroen __STDC__ kan brukes til å dele kode inn i ANSI- og K&R-seksjoner for kompilatoren.

# if __STDC__ ekstern int getopt ( int , char * const * , const char * ); # annet ekstern int getopt (); #slutt om

Noen programmerere anbefaler å bruke "#if __STDC__", som i eksemplet, i stedet for "#ifdef __STDC__" fordi noen kompilatorer setter __STDC__ til null for å indikere ikke-ANSI-samsvar.

I følgende eksempel ber programmet brukeren om å taste inn et tall. Programmet deler det tallet med 2 og skriver ut resultatet så lenge det er partall, og det avsluttes når tallet er oddetall:

#include <stdio.h> int main () { int nummer ; fputs ( "Skriv inn et partall: " , stdout ); if ( scanf ( "%d" og tall ) ! = 1 ) { fputs ( "Feil: ugyldig nummer. \n " , stderr ); returnere -1 ; } for ( int i = 1 ; tall % 2 == 0 ; ++ i ) { printf ( "%.3d| %d/2 = " , i , tall ); tall /= 2 ; printf ( "%d \n " , tall ); } printf ( "Kan ikke fortsette å dele: Tallet %d er oddetall. \n " , tall ); getchar (); returner 0 ; } ANSI-C reserverte ord auto dobbel int struct break ellers lang bryter case enum register typedef char ekstern retur union const float kort usignert fortsette for signert ugyldig standard goto- størrelse på volatile gjør hvis statisk mens

C99

Etter ANSI-standardiseringsprosessen forble C-språkspesifikasjonen relativt stabil i noen tid, mens C++ fortsatte å utvikle seg. Standarden forble imidlertid under revisjon på slutten av 1990-tallet , noe som førte til utgivelsen av ISO 9899:1999 i 1999. [ 5 ] Denne standarden blir ofte referert til som "C99". Den ble vedtatt som en ANSI-standard i mars 2000.

Nye funksjoner i C99 inkluderer: [ 6 ] ​: xi–xii 

  • innebygde funksjoner .
  • Variabler kan deklareres hvor som helst (som i C++), i stedet for like etter en annen erklæring eller i begynnelsen av en sammensatt setning.
  • Mange datatyper, inkludert long int(for å redusere bryet med å gå fra 32-bit til 64-bit), en boolsk datatype og en type complexsom representerer komplekse tall .
  • Variabel lengde arrays .
  • Støtte for enkeltlinjekommentarer som starter med //, som i BCPL eller C++, en funksjon mange kompilatorer hadde gitt støtte for på egen hånd.
  • Mange nye funksjoner, som f.ekssnprintf()
  • Noen nye overskrifter , som stdint.h.

GCC-kompilatoren, blant mange andre, støtter for tiden de fleste av de nye funksjonene til C99. Imidlertid har denne nye standarden møtt dårlig mottakelse fra noen kompilatorutviklere, som Microsoft og Borland , som har fokusert på C++. Microsofts Brandon Bray hadde dette å si:

"Samlet sett har vi sett liten etterspørsel etter mange C99-funksjoner. Noen funksjoner er mer etterspurt enn andre, og vi vil vurdere å inkludere dem i fremtidige utgivelser så lenge de er kompatible med C++." [ 7 ]

C11

C11 (tidligere kjent som C1X ) er et uformelt navn for ISO/IEC 9899:2011 [ 8 ] . Det endelige utkastet, N1570, ble publisert i april 2011. [ 9 ] Den nye standarden vedtok sin siste revisjon 10. oktober 2011 og ble offisielt ratifisert av ISO og publisert 8. desember 2011.

C innebygd

Innebygd C-programmering har historisk sett krevd ikke-standard utvidelser til C-språket for å implementere uoffisielle funksjoner som aritmetikk med fast punkt og grunnleggende inn- og utdataoperasjoner.

I 2008 publiserte C Standardization Committee, for å implementere disse uoffisielle funksjonene, en teknisk rapport som utvidet C-språket ved å tilby en felles standard som alle implementeringer kunne følge. Den inkluderte flere funksjoner som ikke er tilgjengelige i normal C, for eksempel aritmetikk med fast punkt, navngitte adresserom og grunnleggende maskinvareadressering for inngang og utgang.

C18

Den siste publiserte standarden for C ISO/IEC 9899:2018 . [ 10 ]

Språk avledet fra C

Siden begynnelsen av språket har flere grener av evolusjon dukket opp som har generert flere språk:

Det er også laget en rekke språk som er inspirert av C-syntaksen, men som ikke er kompatible med den:

Kompileringsprosess

Sammenstillingen av et C-program gjøres i flere faser som vanligvis er automatisert og skjult av utviklingsmiljøer:

  1. Forbehandling består av å modifisere C -kildekoden i henhold til en rekke instruksjoner (kalt forbehandlingsdirektiver ) og dermed forenkle arbeidet til kompilatoren . For eksempel er en av de viktigste handlingene endringen av inkluderer (#include) av de faktiske erklæringene som finnes i den angitte filen.
  2. Kompilering som genererer objektkoden fra den allerede forhåndsbehandlede koden.
  3. Kobling som forbinder objektkodene til de ulike modulene og eksterne bibliotekene (som systembiblioteker ) med objektkoden generert i forrige trinn for å generere det endelige kjørbare programmet.

Kodeeksempel

Følgende program skriver ut setningen "Hello World" (C99) på skjermen.

// nødvendig for å bruke printf() # include <stdio.h> int main ( void ) { printf ( "Hei verden \n " ); returner 0 ; }

Følgende skriver "Hello World" i C89

/* kommentarer med '//' ikke tillatt i C89, tillatt i C99 */ # include <stdio.h> /* nødvendig for å bruke printf */ main () /* implisitt returtype 'int' */ { printf ( "Hei verden \n " ) ; returner 0 ; }

"annet hvis" kontrollstruktur

if ( betingelse 1 ) { setning 1 } else if ( betingelse 2 ) { setning 2 } else if ( betingelse n ) { setning n } annet { standardutsagn _ _ }

Programmeringsverktøy

Når du programmerer i C, er det vanlig å bruke noen mye brukte programmeringsverktøy, spesielt i et Unix -lignende miljø :

  • make : automatiserer kompilerings- og koblingsprosessen;
  • lo : detektor for mistenkelig, forvirrende eller inkompatibel kode mellom ulike arkitekturer;
  • valgrind : minnelekkasjedetektor ;
  • gdb : debugger brukt i GNU;
  • dbx : forhåndsinstallert debugger på Unix;
  • ddd : grafisk grensesnitt til gdb- eller dbx -feilsøkerne .

Anvendbarhet

Hovedsakelig laget for flytende programmeringUnix- systemer . Den brukes også til utvikling av andre operativsystemer som Windows eller GNU/Linux . På samme måte for skrivebordsapplikasjoner som GIMP , hvis hovedprogrammeringsspråk er C.

På samme måte er det mye brukt i vitenskapelige applikasjoner (for data-, fysiske , kjemiske , matematiske eksperimenter , blant annet, en del av dem kjent som modeller og simulatorer ), industrielle ( robotikkindustri , kybernetikk , informasjonssystemer og databaser for oljen ) og petrokjemisk industri . Alt som refererer til simulering av produksjonsmaskiner dominerer også ), flysimuleringer (det er den mest delikate, siden for mange maskinvare- og programvareressurser må brukes til å utvikle applikasjoner som tillater simulering av den faktiske flyvningen til et fly ). . Den brukes derfor på forskjellige områder som er ukjente for de fleste nybegynnere .

Datamaskinene på slutten av 1990-tallet er størrelsesordener kraftigere enn maskinene som C opprinnelig ble utviklet på. Programmer skrevet på dynamisk skrevet, lett kodede språk ( Ruby , Python , Perl ...) som en gang ville vært for trege er raske nok til å fortrenge C i bruk. Likevel kan du fortsatt finne C-kode i stor utvikling av animasjoner , modeller og 3D-scener i filmer og andre multimedieapplikasjoner .

For tiden er store programvareprosjekter delt inn i deler, innenfor et utviklingsteam. De delene som er mer "byråkratiske" eller "administrasjon" med systemressurser, utføres vanligvis i dynamiske språk eller skripttypespråk , mens de "kritiske" delene, på grunn av deres behov for utførelseshastighet, gjøres i en kompilert type språk, for eksempel C eller C++. Hvis de kritiske delene ikke overstiger en viss prosentandel av totalen (omtrent 10%) etter å ha utført divisjonen, skjer all utvikling med dynamiske språk. Hvis den kritiske delen ikke oppfyller forventningene til prosjektet, sammenlignes alternativene med en investering i ny maskinvare med å investere i kostnadene for en programmerer for å omskrive den kritiske delen.

Innebygde applikasjoner

C er det vanlige språket for programmering av innebygde systemer . [ referanse nødvendig ] Den lette koden som en C-kompilator genererer, kombinert med muligheten til å få tilgang til programvarelag nær maskinvaren, er årsaken til dens popularitet i disse applikasjonene.

En funksjon der C demonstrerer spesielt verdifull brukervennlighet i innebygde systemer er bitmanipulasjon. Systemer inneholder minnetilordnede registre (MMR) som periferiutstyr konfigureres gjennom. Disse registrene blander flere konfigurasjoner i samme minneadresse, men i forskjellige biter. Med C er det mulig å enkelt endre en av disse bitene uten å endre resten. For eksempel:

int * mmr ; /* peker til posten vi ønsker å endre */ mmr = 0x40008ABC ; /* register minneadresse */ * mmr |= 1 << 7 ; /* sett bit 8 til 1 uten å endre de andre */ * mmr &= ~ ( 1 << 12 ) /* setter bit 13 til 0 uten å endre de andre */

Denne typen manipulering er veldig kjedelig eller rett og slett umulig i andre høynivåspråk, siden vanlige assembly- språkoperasjoner som bitvise OR-, AND-, SHL- og CPL-operasjoner brukes, men er tilgjengelige på C-språket.

Andre funksjoner ved C som anses som ulemper i PC-programmering - som mangelen på automatisk minnekontroll - blir fordeler når innebygde systemer trenger liten, optimalisert kode. Det er tilfellet for laveffekts mikrokontrollerbaserte systemer som intel 8051 eller mange ARM -systemer .

C-biblioteker

Et C-bibliotek er en samling funksjoner som brukes i programmeringsspråket C. De vanligste bibliotekene er C-standardbiblioteket og ANSI C-standardbiblioteket , som gir standardspesifikasjoner som deles mye mellom bibliotekene. ANSI C-standardbiblioteket inkluderer funksjoner for filinndata og -utgang, minneallokering og vanlige dataoperasjoner: matematiske funksjoner, strenghåndteringsfunksjoner og dato- og klokkeslettfunksjoner.

Andre C-biblioteker er de som brukes til å utvikle Unix -systemer , som gir grensesnitt til kjernen . Disse funksjonene er beskrevet i ulike standarder som POSIX og Single UNIX-spesifikasjonen .

Siden mange programmer er skrevet på C-språket, er det et bredt utvalg av biblioteker tilgjengelig. Mange biblioteker er skrevet i C fordi C genererer objektkode raskt; programmererne genererer deretter grensesnitt til biblioteket slik at rutinene kan brukes fra språk på høyere nivå, som Java , Perl og Python .

Se også

  • Tillegg: C og C++ operatører
  • C++

Referanser

  1. abcdRitchie , Dennis ( 1993) . "Utviklingen av C-språket" . ACM SIGPLAN Notices ( ACM Press) 28 (3): 201-208. doi : 10.1145/155360.155580 . Hentet 10. mars 2019 . 
  2. ^ abc Kernighan , Brian W .; Ritchie, Dennis M. (1991). Programmeringsspråket C (2. utgave). Prentice Hall latinamerikansk amerikansk. ISBN  968-880-205-0 . 
  3. ^ Raymond, Eric S. (2003). Kunsten med Unix- programmering . Addison-Wesley. ISBN  0-13-142901-9 . 
  4. ^ Raymond, Eric S. (2003). "Evolusjon av C" . Kunsten med Unix- programmering . Hentet 7. mai 2019 . 
  5. ^ "ISO/IEC 9899:1999" . International Organization for Standardization . Hentet 10. mars 2019 . 
  6. ^ "WG14/N1256-komitéutkast - 7. september 2007 ISO/IEC 9899:TC3" (PDF) . International Organization for Standardization . 7. september 2007 . Hentet 7. mai 2019 . 
  7. ^ "Innhold ikke funnet" . Hentet 2009 . 
  8. ^ "ISO/IEC 9899:2011" . International Organization for Standardization . Hentet 10. mars 2019 . 
  9. ^ "N1570-komitéutkast - 12. april 2011 ISO/IEC 9899:201x" (PDF) . International Organization for Standardization . 12. april 2011 . Hentet 7. mai 2019 . 
  10. 14:00-17:00. «ISO/IEC 9899:2018» . ISO (på engelsk) . Hentet 18. mai 2019 . 

Eksterne lenker