C (språk)

C
programmeringsspråk
ForfatterDennis Ritchie
Opprinnelsesdato1972
Siste versjonC17 (juni 2018)
BrukGenerisk (høy effektivitet)
Paradigmer prosedyremessig imperativ
SkrivingStatisk
Vanlige utvidelser.c for kilder og .h for overskrifter
Påvirket avBCPL , B , ALGOL
Det påvirketTallrike, inkludert C ++ , Objective-C , C # , Swift , D

I informatikk er C et imperativt programmeringsspråk av prosessuell karakter ; Programmer skrevet på dette språket er sammensatt av matematiske uttrykk og imperative instruksjoner gruppert i parameteriserte prosedyrer som er i stand til å manipulere ulike typer data .

Den integrerer kjennetegn ved lavnivåspråk , dvs. tegn , tall og adresser , som kan angis av de aritmetiske og logiske operatorene som brukes av ekte maskiner [1] . C-en ble skapt for å være slank og ytende, den bruker også en rekke biblioteker for å møte alle typer krav, spesielt standard C-biblioteket . Slike biblioteker, i form av overskriftsfiler eller filer med suffikset -h, kan lastes ved å bruke preprocessor include - direktivet .

Historie

Språket ble opprinnelig utviklet av Dennis Ritchie [2] ved AT&T Bell Labs mellom 1969 og 1973, med sikte på å bruke det til å utarbeide UNIX - operativsystemet , tidligere utviklet av Ken Thompson og Ritchie selv i PDP montering- . I 1972 debuterte det første UNIX-systemet på en DEC PDP-11 , skrevet utelukkende med det nye programmeringsspråket C. [3] I 1978 fikk utgivelsen av boken The C language det til å vokse raskt, noe som førte til fødselen av flere dialekter og derav behovet for å definere en standard.

Den første standardiseringen av C ble laget av ANSI i 1989 (ANSI X3.159-1989), kjent som C89. Den samme versjonen, med bare minimale formateringsendringer, ble senere standardisert av ISO i 1990 (ISO / IEC 9899: 1990), kjent som C90. ISO ga deretter ut fire flere versjoner av C-språket, kjent som C95 (ISO / IEC 9899 / AMD1: 1995), C99 (ISO / IEC 9899: 1999), C11 (ISO / IEC 9899: 2011 / Cor 1: 2012) og C18 (ISO / IEC 9899: 2018). Av disse brakte C99 store forbedringer til programmeringsspråket, og introduserte nye datatyper, utpekte initialisatorer for arrays, variabel størrelse arrays og andre forbedringer lånt fra C ++ .

Beskrivelse

Født sammen med Unix , støttes C av alle de mye brukte operativsystemene som brukes og brukes hovedsakelig til å lage operativsystemer , programmeringsspråk , biblioteker , spill og for applikasjoner med høy ytelse ; det er kjent for sin effektivitet og har etablert seg som referansespråket for å bygge systemprogramvare på de fleste moderne maskinvareplattformer . Standardiseringen av språket (av ANSI først og deretter av ISO ) garanterer portabiliteten til programmer skrevet i C (standard, ofte kalt ANSI C) på enhver plattform; i tillegg til systemprogramvare, har det lenge vært det dominerende språket i en rekke andre applikasjonsdomener preget av effektivitet. Typiske eksempler er telekommunikasjon , industriell prosesskontroll og sanntids systemprogramvare . Dominansen til C i disse sammenhengene har delvis avtatt etter fremkomsten av signifikante alternativer, først og fremst C ++ .

C har også en betydelig didaktisk betydning, selv om det, på grunn av sin semantiske kompleksitet og de sterke relasjonene mellom denne semantikken og funksjonen til maskinvare , ikke er et spesielt intuitivt språk for nybegynnere og spesielt for de som ikke har tilstrekkelig forberedelse angående dataelektronikk . . Hvis videregående skoler og universitetskurs på en gang tok i bruk C som referansespråk på grunn av dets tekniske betydning, er dette valget i dag ytterligere motivert av den økende betydningen av språk avledet fra C (for eksempel C ++ , Java og C # og , for å gi studenten en raskere og mer intuitiv innledende tilnærming, høynivåspråk som Python ).

Generelle egenskaper

C er et relativt minimalistisk programmeringsspråk; dens semantikk bruker et begrenset sett med relativt enkle konsepter nær funksjonen til maskinvare. Mange C - instruksjoner kan oversettes direkte med en enkelt maskinspråkinstruksjon (for eksempel operatørene for selvinkrement og selvreduksjon ). I språket spilles en sentral rolle av begrepet peker , som er generalisert til det punktet at det faller sammen med indirekte adressering, en måte å få tilgang til maskinvareminnet som er karakteristisk for alle moderne CPUer . Dette gjør C til et spesielt effektivt språk. I tillegg, sammenlignet med assemblerspråk, har C også en definert og lesbar logisk struktur, funksjoner i Pascal - stil og fremfor alt kontroll over typer (på kompileringstidspunktet), noe som mangler fullstendig på assemblerspråk.

Syntaksen til C er ganske allsidig og språket er i fri form , slik at du kan skrive komplekse instruksjoner i noen få linjer med kode eller lage kryptiske og uleselige programmer ( kodeobfuskasjon ). Til syvende og sist ble suksessen til C diktert av å være et språk skapt av erfarne programmerere, for å brukes av erfarne programmerere.

Denne store friheten, den syntaktiske kompleksiteten til språket (som som vi har sett inneholder få grunnleggende instruksjoner) og den sentrale rollen til pekere, som det er nødvendig å bruke praktisk talt fra de aller første programmene, gjør det derfor til et vanskelig språk og urådelig for neofytter, som nesten umiddelbart faller i en rekke feller som, selv om de er åpenbare for en ekspert, er svært vanskelige å få øye på for en nybegynner.

Takket være den spesielle effektiviteten til koden produsert av kompilatorene, ble C brukt til å omskrive mesteparten av koden til UNIX -systemet , noe som reduserte bruken av assemblerspråk til en liten gruppe funksjoner. Dens betydning vokste imidlertid først etter 1978 med utgivelsen, av Brian Kernighan og Dennis Ritchie , av boken The C Programming Language , der språket ble definert nøyaktig.

Den påfølgende utbredte bruken førte til fødselen av forskjellige dialekter og derfor til behovet for å definere en standard. For dette formål, sommeren 1983 , ble det nedsatt en komité med oppgaven å lage en ANSI-standard ( American National Standards Institute ) som definerte C-språket en gang for alle. Standardiseringsprosessen, som tok seks år (mye lenger enn forventet), ble avsluttet i desember 1989 og de første eksemplarene ble tilgjengelige på begynnelsen av 1990- tallet . Denne versjonen av C kalles normalt C89. Standarden ble også vedtatt av International Organization for Standardization ( ISO ) i 1999 under navnet C Standard ANSI/ISO. I 1995 ble endring 1 til C-standarden vedtatt som blant annet tilførte nye funksjoner til språkets standardbibliotek . Ved å bruke C89 med Amendment 1 som basisdokument og kombinere bruken av Simula -klasser med det , begynte Bjarne Stroustrup å utvikle C++ .

Sluttresultatet av den fortsatte utviklingen av C var standarden som ble publisert i 1999 , kjent som ISO C99 (ISO-kode 9899).

Med versjon C11 (2011) er noen kommandoer litt revidert, mens versjon C18 (2018) har korrigert noen kritiske problemer med C11, uten imidlertid å introdusere noen nye funksjoner.

Funksjoner i noen versjoner

C99 C11

C11-standarden introduserte fem nye overskriftsfiler, nemlig,,, og <stdalign.h>, <stdatomic.h>samt flere funksjoner som bidro til å forbedre språket: <stdnoreturn.h><threads.h><uchar.h>

Nøkkelord

C-språket, som alle andre programmeringsspråk, gjør det mulig å lage programmer ved å bruke et sett med "søkeord".

ANSI-standarden definerte følgende sett med nøkkelord: 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.

Eksempelprogram

Hei Verden!

Følgende eksempel skriver ut teksten " Hallo verden! " på standard utgang (som normalt faller sammen med terminalskjermbildet som brukes av programmets eksekutør). I dataundervisning, bruken av å introdusere det grunnleggende i et programmeringsspråk med et program som skriver ut "Hello world!" stammer fra dette berømte eksemplet, hentet fra boken The C language av Kernighan og Ritchie.

#include <stdio.h> int main () { printf ( "Hei verden! \ n " ); returner 0 ; }

Følgende er en linje-for-linje-analyse av programmet som vises; denne typen skriving er bare kjørbar på UNIX-baserte systemer.

#include <stdio.h>

Denne linjen er et forprosessordirektiv . Forprosessoren er et program (eller en modul i et integrert miljø ) som utfører noen foreløpige transformasjoner av kildekoden , før den leveres til selve kompilatoren . I dette tilfellet er den nødvendige transformasjonen å erstatte den aktuelle linjen med hele innholdet i overskriftsfilen ("hodefil") " stdio.h". Tilstedeværelsen av vinkelparenteser indikerer at filen er i en standardkatalog kjent for forprosessoren . For å inkludere en header (vanligvis opprettet av programmereren) i samme mappe der filen som skal kompileres er, bruk en syntaks som:

#include "headername.h"

Med overskriftsnavn i stedet for ønsket overskriftsnavn . En header-fil , i C, er en fil som inneholder deklarasjoner av datatyper og funksjoner ; i det spesifikke tilfellet er det inkludert å introdusere i kilden erklæringen om standard bibliotekfunksjonprintf. Denne erklæringen spesifiserer hvilke typer parametere den er obligatorisk og tillatt å levere til printfog av hvilken type dens returnerte verdi er. Begge disse opplysningene vil deretter bli brukt av kompilatoren for å verifisere at bruken "Hello world!" gjør denne funksjonen riktig.

I stedet for printfkan du også bruke funksjonen puts, skrevet som

setter ( "Hei verden!" ); int main ()

En slik linje er begynnelsen på en funksjonsdefinisjon, i dette tilfellet funksjonenmain . Funksjonen mainer inngangspunktet til et C-program: programkjøring begynner med den første del - setningenmain og slutter med den siste. Eventuelle andre funksjoner vil bare spille inn hvis og når de kalles (direkte eller indirekte) fra main. I fravær av en funksjon mainkan ikke kompilatoren produsere et kjørbart program (men det kan produsere et bibliotek ).

Det innledende nøkkelordetint representerer typen verdi som returneres av funksjonen. I det spesielle tilfellet maintolkes det som en verdi som returneres av hele programmet til operativsystemet . I samsvar med en universell konvensjon om verdiene som returneres av programmer til systemet, mainreturnerer den alltid et heltall, selv om noen tekster også feilaktig rapporterer erklæringer om funksjonen mainmed returtype void(se ANSI C ).

{

Klammer brukes i C for å indikere begynnelsen og slutten av en blokk, en programenhet; i dette tilfellet funksjonen main.

printf ( "Hei verden! \ n " );

Denne linjen utgjør et funksjonskall; med andre ord, det krever at funksjonen utføres. printfer en standard C-biblioteksfunksjon som skriver ut en melding til standardutdata . Derfor , Hei, verden! Vil vises på skjermen . (uten doble anførselstegn, som brukes i kildekoden for å indikere begynnelsen og slutten av strengen ).

" \ n " er en escape-sekvens , det vil si en sekvens av tegn (som i C alltid begynner med tegnet " \ ") som vil bli oversatt til et enkelt tegn under kompilering (vanligvis ikke utskrivbar eller tolket på annen måte). Spesielt vil " \ n " bli oversatt til nylinjetegnet som, når det brukes med standard tekstmodusbiblioteker (som med printf), indikerer linjeskift og vognretur for teksten. Så hvis programmet brukes interaktivt, vanligvis en markørforskyvning .

Det siste semikolonet på linjen indikerer slutten av setningen (funksjonskallet).

returner 0 ;

En setning startet med nøkkelordet return, i en funksjon, avslutter selve funksjonen og lar deg spesifisere en returverdi (hvis funksjonen kan returnere en). I det spesielle tilfellet main, som nevnt ovenfor, vil denne verdien bli returnert til operativsystemet ( 0det er verdien for retur til system som konvensjonelt indikerer vellykket avslutning av et program).

Eksempel på kalkulator

Eksempel på kalkulator som utfører summen, produktet, differansen og kvotienten av to heltall:

#include <stdio.h> // Spesifiser biblioteket som brukes av programmet int main () { int a ; // Første verdi int b ; // Andre verdi int sum ; // Summen av de to verdiene int produkt ; // Produkt av de to verdiene int forskjell ; // Forskjellen mellom de to verdiene int quoto ; // Kvotient av de to verdiene printf ( "Skriv inn det første tallet:" ); // Skriv ut til konsollen scanf ( "% d" & a ); // Les en heltallsverdi og "sett inn" den i variabelen "a" printf ( "Skriv inn det andre tallet:" ); // Skriv ut til konsollen scanf ( "% d" , & b ); // Les en heltallsverdi og "sett inn" den i variabelen "b" sum = a + b ; // Regn ut summen av innholdet i variabelen "a" og det av "b" og "sett inn" den i variabelen "sum" produkt = a * b ; // Beregner produktet av innholdet i variabelen "a" og det av "b" og "setter inn" det i variabelen "produkt" forskjell = a - b ; // Beregn forskjellen mellom innholdet i variabelen "a" og innholdet i "b" og "sett inn" i variabelen "difference" if ( b ! = 0 ) { // Sjekk at variabel "b" inneholder en annen verdi enn 0 quoto = a / b ; // Beregn kvotienten av innholdet i variabelen "a" og det til "b" og "sett inn" den i variabelen "quoto" } printf ( "Summen er:% d \ n " , sum ); // Skriv ut på konsollen en streng med verdien av "sum"-variabelen printf ( "Produktet er:% d \ n " , produkt ); // Skriv ut en streng på konsollen med verdien av "produkt"-variabelen printf ( "Forskjellen er:% d \ n " , forskjell ); // Skriv ut en streng på konsollen med verdien av "difference"-variabelen if ( b ! = 0 ) { // Sjekk at variabel "b" inneholder en annen verdi enn 0 printf ( "Kvoten er:% d \ n " , quoto ); // Skriv ut en streng på konsollen med verdien av "quoto"-variabelen } returner 0 ; // Returner 0 og avslutt programmet }

Forklaring

  • "int" definerer variabler som heltall (a, b, sum, produkt, differanse og quoto er variabler)
  • "printf" er instruksjonen som vil skrive ut det som står i anførselstegnene på skjermen
  • "scanf" leser inndata og plasserer det i variabelen ("& a"). I dette tilfellet i desimaltall ("% d")
  • "+", "*", "-", "/" er henholdsvis sum-, produkt-, differanse- og dimensjonsoperatorer
  • "Hvis ()"-syntaksen sjekker om innholdet innenfor de runde parentesene er sant. I så fall utfører den funksjonene innenfor de krøllede parentesene (i dette tilfellet: "quoto = a / b")
  • Syntaksen "! =" Betyr "annerledes". I denne oppgaven sjekkes det om "b" er forskjellig fra 0; hvis en divisjon utføres med en divisor lik 0, vil programmet gå i feil.
  • "Summen er:"% d ", sum I stedet for"% d vil "innholdet av" sum "skrives ut (% d betyr at et heltall vil bli skrevet ut)
  • "return" er nøkkelordet som indikerer avslutningen av funksjonen, og returnerer verdien 0. Avslutningen av hovedfunksjonen () forårsaker også avslutningen av programmet.

Escape-sekvenser

Sekvens Skriftnavn
\til pip
\b backspace
\f FF - skjemafeed (sidehopp)
\ n LF - linjemating eller nylinje
\ r CR - vognretur
\t horisontal fane
\ v vertikal fane
\\ \ (omvendt skråstrek)
\ ' '(overskrift)
\ " "(doble anførselstegn)
\ 0 NULL (null eller slutten av strengen)

Beslektede språk

Mange av de store moderne programmeringsspråkene er inspirert av C og arver noe av syntaksen. Noen språk (som Java , C ++ , C # og Objective C ) beholder mye av syntaksen til C og utvider den til bedre å støtte forskjellige programmeringsparadigmer, mens andre språk moderniserer syntaksen, men prøver å opprettholde den samme paradigmer og applikasjonsdomener for C, for eksempel systemprogrammering (f.eks. Go ) eller integrerte systemer (f.eks. Zig ).

C ++

Programmeringsspråket C ++ ble opprinnelig avledet fra C. Imidlertid er ikke alle C-programmer gyldige i C ++. Etter hvert som C og C++ utviklet seg uavhengig, økte deres inkompatibiliteter [4] . C99-versjonen skapte en rekke flere konflikter. Forskjellene gjør det vanskelig å skrive programmer og biblioteker som fungerer i både C og C++, og skaper forvirring for de som programmerer på begge språk. Ulikheten gjør det vanskelig for begge språk å adoptere funksjoner fra det andre.

Bjarne Stroustrup , skaperen av C ++, har gjentatte ganger foreslått [5] at inkompatibiliteter mellom C og C ++ bør reduseres så mye som mulig for å maksimere interoperabilitet mellom de to språkene. Andre har hevdet at siden C og C ++ er forskjellige språk, er kompatibilitet mellom de to nyttig, men ikke avgjørende. I følge denne posisjonen må ikke forsøk på å redusere inkompatibilitet hindre forsøk på autonomt å forbedre språk.

I dag er de store forskjellene (bortsett fra tillegg i C ++ av klasser, maler, navnerom, overbelastning) mellom de to språkene:

  • inline- innebygde funksjoner har globalt omfang i C ++,
  • Typen booli C99 er definert i <stdbool.h>. Tidligere C-standarder definerte ikke en boolsk type , og forskjellige (inkompatible) metoder ble brukt for å simulere den boolske typen.
  • Individuelle tegnkonstanter er størrelsen på én inti C og én chari C++.
  • Ytterligere nøkkelord er introdusert i C ++, og kan derfor ikke brukes som identifikatorer som var tillatt i C ( for eksempel try,,,,, ... catch)templatenewdelete
  • I C ++ oppretter kompilatoren automatisk en tag for hver struct, unioneller enum, så struct S {};i C ++, i C tilsvarer det typedef struct S {} S;.

Objective-C

Objektiv C-språket skylder sin popularitet til Apple som valgte det som grunnlag for operativsystemene macOS , iOS , watchOS og tvOS . Det er et objektorientert språk, og i motsetning til C++ opprettholder det full kompatibilitet med C.

I 2014 introduserte Apple et nytt språk, Swift som erstattet Objective C i programmering på de nevnte operativsystemene.

Merknader

  1. ^ C Language - Programmeringsprinsipper og referansehåndbok (andre utgave) - Brian W. Kernighan, Dennis M. Ritchie , Pearson Prentice Hall, s. Innledning - XIV.
  2. ^ Dennis Ritchie og Brian Kernighan, XI , i The C Language. Programming Principles and Reference Manual , Prentice Hall, 2004, s. 320.
    "C ble designet og skrevet for UNIX-operativsystemet, på DEC PDP-11, av Dennis Ritchie"
  3. ^ Dennis Ritchie, The Development of the C Language ( PDF ) , på Bell Labs / Lucent Technologies , 1993. Hentet 1. mai 2017 .
    «C ble til i årene 1969-1973, parallelt med den tidlige utviklingen av Unix-operativsystemet; den mest kreative perioden skjedde i løpet av 1972 "
  4. ^ Inkompatibiliteter mellom ISO C og ISO C++ , på david.tribble.com .
  5. ^ Søskenrivalisering: C og C ++ ( PDF ), på research.att.com .

Bibliografi

  • Dennis M. Ritchie og Brian W. Kernighan, Language C , Jackson Publishing Group, 1985, ISBN  88-7056-211-5 .
  • Steve Oualline, Practical C Programming , Milan, O'Reilly Media, Inc., 1997, ISBN  978-1-56592-306-5 .
  • Stephen G. Kochan, Programmering in C , Sams Publishing, 2004, ISBN  978-0-672-33141-1 .
  • Harvey M. Deitel, Paul J. Deitel, C. Complete Programming Course , Milan, Apogeo Editore, 2007, ISBN  978-88-503-2633-4 .
  • Stephen G. Kochan, Programmering i C. Introduction to Language , Pearson, 2011, s. 336, ISBN  978-88-7192-660-5 .
  • Luciano M. Barone, Enzo Marinari, Giovanni Organtini og Federico Ricci-Terseng, vitenskapelig programmering. C-språk, algoritmer og modeller i vitenskap , Pearson Education Italia, 2006, s. 656, ISBN  978-88-7192-242-3 .

Relaterte elementer

Andre prosjekter

Eksterne lenker

  • ( EN ) Standard C arbeidsgruppe, JTC1 / SC22 / WG14 - C , på open-std.org . Hentet 16. mai 2017 .
  • Politecnico di Torino, Programmeringskurs i C , på staff.polito.it , 2010. Hentet 16. mai 2017 .
  • ( EN ) Jens Gustedt, ModernC ( PDF ), på icube-icps.unistra.fr , 11. april 2017. Hentet 16. mai 2017 (arkivert fra originalen 30. juni 2017) .
  • cppreference, C reference , på it.cppreference.com . Hentet 16. mai 2017 .
  • ( NO ) GeeksforGeeks, C Programmeringsspråk , på geeksforgeeks.org . Hentet 16. mai 2017 .
  • ( EN ) Den internasjonale obfuscated C Code Contest , på www0.us.ioccc.org . Hentet 16. mai 2017 (arkivert fra originalen 3. mai 2017) .
  • Steve Summit, comp.lang.c Frequently Asked Questions , på c-faq.com , 2005. Hentet 16. mai 2017 .
  • Alessandro Rubini, Insights on the C language , på linux.it , 2010. Hentet 16. mai 2017 .
  • StackOverflow C språk , på stackoverflow.com . Hentet 16. mai 2017 .
  • ( NO ) Leo, C Programmeringsspråk , på leotutorials.com . Hentet 16. mai 2017 .
  • Samling av C-programmeringsspørsmål - Plasseringsmater