C (idioma)

De la Viquipèdia, l'enciclopèdia lliure.
Saltar a la navegació Saltar a la cerca
C.
llenguatge de programació
C Logo.png
Autor Dennis Ritchie
Data d’origen 1972
Última versió C18
Ús Genèric (alta eficiència)
Paradigmes imperatiu processal
Escrivint Estàtic
Extensions comunes .c per a fonts i .h per a capçaleres
Influenciat per BCPL , B , ALGOL
Va influir Nombrosos, inclosos C ++ , Objective-C , C # , Swift , D

En informàtica , C és un llenguatge de programació imperatiu de tipus procedimental ; Els programes escrits en aquest llenguatge estan formats per expressions matemàtiques i instruccions imperatives agrupades en procediments parametritzats capaços de manipular diversos tipus de dades .

Es defineix com un llenguatge de programació d'alt nivell [1] [2] [3] i les característiques de integra baix nivell d' idiomes, és a dir, caràcters , números i adreces , que pot ser indicada per mitjà dels aritmètiques i lògiques operadors utilitzats pel màquines reals [4] . El C va ser concebut per ser magre i performant, també fa ús de nombroses biblioteques per satisfer tots els tipus de requisits, en particular la biblioteca C estàndard . Aquestes biblioteques, en forma de fitxers de capçalera o fitxers amb el sufix -h, es poden carregar mitjançant la directiva include del preprocessador .

Història

El llenguatge va ser desenvolupat originalment per Dennis Ritchie [5] a AT&T Bell Labs entre 1969 i 1973, amb l'objectiu d'utilitzar-lo per a la redacció del sistema operatiu UNIX , desenvolupat anteriorment per Ken Thompson i el mateix Ritchie en l' assemblea PDP . El 1972 es va estrenar el primer sistema UNIX amb un DEC PDP-11 , escrit completament amb el nou llenguatge de programació C. [6] El 1978 , la publicació del llibre The language C va fer créixer ràpidament, cosa que va provocar el naixement de diversos dialectes i d’aquí la necessitat de definir un estàndard.

La primera estandardització de C la va ferANSI el 1989 (ANSI X3.159-1989), coneguda com a C89. La mateixa versió, amb només canvis mínims de format, va ser posteriorment estandarditzada per ISO el 1990 (ISO / IEC 9899: 1990), coneguda com C90. Posteriorment, la ISO va llançar quatre versions més del llenguatge C, conegudes com C95 (ISO / IEC 9899 / AMD1: 1995), C99 (ISO / IEC 9899: 1999), C11 (ISO / IEC 9899: 2011 / Cor 1: 2012) i C18 (ISO / IEC 9899: 2018). D’aquests, C99 va aportar importants millores al llenguatge de programació, introduint nous tipus de dades, inicialitzadors designats per a matrius, matrius de mida variable i altres millores prestades de C ++ .

Descripció

Nascut juntament amb Unix , C és compatible amb tots els sistemes operatius àmpliament utilitzats i s’utilitza principalment per a la creació de sistemes operatius ,llenguatges de programació , biblioteques , jocs i aplicacions d’alt rendiment; és coneguda per la seva eficiència i s’ha consolidat com el llenguatge de referència per al desenvolupament de programari de sistemes a la majoria de plataformes de maquinari modernes. La normalització del llenguatge (per ANSI primer i després per la ISO ) garanteix la portabilitat dels programes escrits en C (estàndard, sovint anomenat ANSI C) en qualsevol plataforma; a més del programari del sistema, ha estat durant molt de temps l'idioma dominant en diversos dominis d'aplicacions caracteritzats per l'eficiència. Exemples típics són les telecomunicacions , el control de processos industrials i el programari de sistemes en temps real . El domini de C en aquests contextos ha disminuït en part després de l’aparició d’alternatives significatives, en primer lloc de C ++ .

C també té una importància didàctica considerable, tot i que, per la seva complexitat semàntica i les fortes relacions d’aquesta semàntica amb el funcionament del maquinari de l’ ordinador , no és un llenguatge especialment intuïtiu per a principiants i, especialment, per a aquells que no tenen una preparació adequada quant a l’ electrònica informàtica. . Si en el seu moment les escoles secundàries i els cursos universitaris van adoptar C com a llenguatge de referència a causa de la seva importància tècnica, avui aquesta elecció es veu motivada per la creixent importància dels llenguatges que deriven de C (per exemple, C ++ , Java i C # i, per permetre a l'estudiant un enfocament inicial més ràpid i intuïtiu, llenguatges d'alt nivell com Python ).

Característiques generals

C és un llenguatge de programació relativament minimalista; la seva semàntica utilitza un conjunt restringit de conceptes relativament simples i propers al funcionament del maquinari de l'ordinador. Moltes instruccions C es poden traduir directament amb una sola instrucció de llenguatge automàtic (per exemple, els operadors d’ autoincrement i autodescreixement ). En el llenguatge, té un paper central el concepte de punter , que es generalitza coincidint amb l'adreçament indirecte, una manera d'accedir a la memòria de maquinari característica de totes les CPU modernes. Això fa que C sigui un llenguatge especialment eficient. A més, en comparació amb el llenguatge ensamblador, C també té una estructura lògica definida i llegible, funcions d’estil Pascal i sobretot control sobre els tipus (en temps de compilació), que manca completament en llenguatge ensamblador.

La sintaxi de C és bastant versàtil i el llenguatge és de forma lliure , cosa que us permet escriure instruccions complexes en poques línies de codi o crear programes críptics i il·legibles ( ofuscació del codi ). En última instància, l'èxit de C va ser dictat per ser un llenguatge creat per programadors experimentats, per ser utilitzat per programadors experimentats.

Aquesta gran llibertat, la complexitat sintàctica del llenguatge (que, com hem vist, conté poques instruccions bàsiques) i el paper central dels indicadors, que cal utilitzar pràcticament des dels primers programes, el converteixen en un llenguatge difícil i desaconsellable per a neòfits, que cauen gairebé immediatament en una sèrie de trampes que, tot i que són evidents per a un expert, són molt difícils de detectar per a un principiant.

Gràcies a l'eficiència particular del codi produït pels seus compiladors, C es va utilitzar per reescriure la majoria del codi del sistema UNIX , reduint l'ús del llenguatge d'ensamblatge a un petit grup de funcions. La seva importància, però, només va créixer després del 1978 amb la publicació, per Brian Kernighan i Dennis Ritchie , del llibre The C Programming Language , en què es definia amb precisió el llenguatge.

El seu posterior ús generalitzat va provocar el naixement de diferents dialectes i, per tant, la necessitat de definir un estàndard. Amb aquesta finalitat, a l’estiu de 1983 , es va nomenar un comitè amb la tasca de crear un estàndard ANSI ( American National Standards Institute ) que definís el llenguatge C d’una vegada per totes. El procés d’estandardització, que va durar sis anys (molt més del que s’esperava), va finalitzar el desembre de 1989 i els primers exemplars van estar disponibles a principis dels anys noranta . Aquesta versió de C es denomina normalment C89. La norma també va ser adoptada per l' Organització Internacional per a l'Estandardització ( ISO ) el 1999 amb el nom de la norma C ANSI / ISO. El 1995 es va adoptar l’esmena 1 a la norma C que, entre altres coses, va afegir noves funcions a la biblioteca estàndard de la llengua. Utilitzant C89 amb l'esmena 1 com a document base i combinant l'ús de les classes Simula amb ell, Bjarne Stroustrup va començar a desenvolupar C ++ .

El resultat final del desenvolupament continuat de C va ser la norma promulgada el 1999 , coneguda com ISO C99 (codi ISO 9899).

Amb la versió C11 (2011), algunes ordres es revisen lleugerament, mentre que la versió C18 (2018) ha corregit alguns aspectes crítics del C11, sense introduir, però, cap característica nova.

Funcions d'algunes versions

C99

  • El _Bool dades _Bool , que permet emmagatzemar booleans false i true ;
  • El _Complex dades _Complex per a la representació de nombres complexos;
  • El _Imaginary dades _Imaginary per a la representació de nombres imaginaris;
  • El tipus de dades long long int ;
  • El tipus booleà a <stdbool.h> ;
  • Les funcions addicionals de coma flotant de <float.h> ;
  • Comentaris d'una sola línia introduïts per //;
  • Funcions inline ;
  • El qualificador de tipus de restrict , admès només en punteres restringits;
  • El retorn implícita int s'elimina;
  • La matriu de longitud variable (VLA);
  • Literals compostos;
  • Inicialitzadors designats
  • Es permet declarar variables en qualsevol lloc que vulgueu dins d'un bloc de codi, així com interposar altres instruccions entre elles;
  • Les funcions de la família vscanf;
  • Les regles per a constants de tipus enter;
  • Les regles per a la promoció de enters (promoció de nombres enters);
  • Les macros matemàtiques genèriques de <tgmath.it> ;
  • Macros amb un nombre variable d'arguments;
  • La macro va_copy ;
  • L'especificador de conversió% lf a la funció printf ();
  • Suport per a l'aritmètica de punt flotant IEEE (IEC 559);
  • L'operador de preprocessament _Pragma .

C11

L'estàndard c11 va introduir cinc fitxers de capçalera nous, <stdalign.h> , <stdatomic.h> , <stdnoreturn.h> , <threads.h> i <uchar.h> , a més de diverses funcions que van ajudar a millorar el llenguatge :

  • Les macros relatives a les especificacions d'alineació de memòria amb el fitxer de capçalera relatiu <stdalign.h> , incloses les _Alignas i _Alignof , així com la aligned_alloc (Memory Alignment Control);
  • S'ha afegit suport per a múltiples fils. Les noves funcions les proporciona la biblioteca de fils declarada al fitxer de capçalera <threads.h> . També s'ha afegit el qualificador de tipus _Atomic al fitxer de capçalera <stdatomic.h> ;
  • Les estructures ( struct ) i unions ( union ) anònimes;
  • Expressions de tipus genèriques que utilitzen la paraula clau _Generic (expressions de tipus genèric);
  • char16_t millorat la compatibilitat unicode amb els tipus de dades char16_t (UTF-16) i char32_t (UTF-32) amb les seves funcions de conversió declarades a <uchar.h> ;
  • S'ha eliminat la funció <stdio.h> gets() declarada a <stdio.h> ;
  • L'especificador _Noreturn aplicable a les funcions;
  • Afirmacions estàtiques mitjançant la paraula clau _Static_assert (afirmacions estàtiques);
  • La funció quick_exit per finalitzar un programa;
  • Interfícies de comprovació de límits (annex K);
  • Característiques d'anàlisi (annex L);
  • El mode exclusiu " x " Obertura i creació de fitxers (mode exclusiu de creació i obertura):
  • Macros per crear nombres complexos a <complex.h> .

Paraula clau

El llenguatge C, com qualsevol altre llenguatge de programació, permet la creació de programes mitjançant un conjunt de "paraules clau".

L'estàndard ANSI definia el conjunt de paraules clau següent: auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, curt, signat, sizeof, estàtic, struct, commutador, typedef , unió, sense signar, buit, volàtil, mentre que.

Exemple de programa

Hola món!

Icona de la lupa mgx2.svg El mateix tema en detall: Hola món .

L'exemple següent imprimeix el text " Hola món! " A la sortida estàndard (que normalment coincideix amb la pantalla del terminal que utilitza el corredor del programa). En educació informàtica, l’ús d’introduir els fonaments d’un llenguatge de programació amb un programa que imprimeix "Hello world!" deriva d’aquest famós exemple, extret del llibre El llenguatge C de Kernighan i Ritchie.

 #include <stdio.h>
    
int main ()
{ 
   printf ( "Hola món! \ n " );
   retorn 0 ;
}

El següent és un anàlisi línia per línia del programa que es mostra; aquest tipus d'escriptura només és executable en sistemes basats en UNIX.

 #include <stdio.h>

Aquesta línia és una directiva de preprocessador . El preprocessador és un programa (o un mòdul d'un entorn integrat ) que realitza algunes transformacions preliminars del codi font , abans que aquest últim es lliuri al compilador real. En aquest cas, la transformació necessària consisteix a substituir la línia en qüestió per tot el contingut del fitxer de capçalera (" fitxer de capçalera ") " stdio.h ". La presència de claudàtors indica que el fitxer es troba en un directori estàndard conegut pel preprocessador. Per incloure una capçalera (normalment creada pel programador) present a la mateixa carpeta on es troba el fitxer a compilar, utilitzeu una sintaxi com:

 #include "headername.h"

Amb el nom en lloc de nomeheader, la capçalera desitjada. Un fitxer de capçalera , en C, és un fitxer que conté declaracions de tipus de dades i funcions ; en el cas concret, s'inclou introduir a la font la declaració de la funció de biblioteca estàndard printf. Aquesta declaració especifica quins tipus de paràmetres es requereixen i se li permet proporcionar a printf i quin tipus és el seu valor retornat. Totes dues dades seran utilitzades pel compilador per verificar que l'ús que fa "Hola món!" fa que aquesta funció sigui correcta.

En lloc de printf , també podeu utilitzar la funció puts , escrita com

 put ( "Hola món!" );
 int main ()

Aquesta línia és el començament d'una definició de funció, en aquest cas la funció main . La funció main és el punt d'entrada d' un programa C: l'execució d'un programa comença a partir de la primera instrucció del programa main i acaba amb l'última. Qualsevol altra funció només entrarà en joc si i quan es crida (directa o indirectament) des de main . En absència d'una funció main , el compilador no pot produir un programa executable (però sí que podria produir una biblioteca ).

La paraula clau int inicial representa el tipus de valor que retorna la funció. En el cas especial de main , s’interpreta com un valor retornat per tot el programa al sistema operatiu . De conformitat amb una convenció universal sobre els valors retornats pels programes al sistema, main sempre retorna un enter, tot i que alguns textos també informen incorrectament de les declaracions de la funció main amb tipus de retorn void (vegeu ANSI C ).

 {

Les claus s’utilitzen en C per indicar el començament i el final d’un bloc, una unitat de programa; en aquest cas, la funció main .

 printf ( "Hola, món! \ n " );

Aquesta línia constitueix una trucada de funció; en altres paraules, requereix que es faci la funció. printf és una funció de biblioteca C estàndard que imprimeix un missatge a la sortida estàndard . Per tant , Hola, món, apareixerà a la pantalla . (sense cometes dobles, que s'utilitzen al codi font per indicar el començament i el final de la cadena ).

" \ n " és una seqüència d'escapament , és a dir, una seqüència de caràcters (que en C sempre comencen amb el caràcter " \ ") que es traduirà en un sol caràcter durant la compilació (normalment no es pot imprimir ni interpretar d'una altra manera). En particular, " \ n " es traduirà al caràcter de línia nova que, quan s'utilitza amb les biblioteques de mode de text estàndard (igual que amb printf ), indica l'alimentació de línia i el retorn del carro del text. Per tant, si el programa s’utilitza de manera interactiva, normalment es fa un desplaçament del cursor .

El punt i coma final de la línia indica el final de la sentència (la trucada a la funció).

 retorn 0 ;

Una sentència iniciada amb la paraula clau return , dins d’una funció, finalitza la funció mateixa i us permet especificar un valor de retorn (si la funció en pot retornar una). En el cas particular de main , com s'ha esmentat anteriorment, aquest valor es retornarà al sistema operatiu ( 0 és el retorn al valor del sistema que, convencionalment, indica la finalització correcta d'un programa).

Exemple de calculadora

Exemple de calculadora que realitza la suma, el producte, la diferència i la quota de dos enters:

 #include <stdio.h> // Especifiqueu la biblioteca que utilitza el programa

int main () {
int a ; // Primer valor
int b ; // Segon valor
int suma ; // Suma dels dos valors
producte int ; // Producte dels dos valors
int diferència ; // Diferència dels dos valors
int quoto ; // Quoto dels dos valors
    
printf ( "Introduïu el primer número:" ); // Imprimeix a la consola
scanf ( "% d" , & a ); // Llegiu un valor enter i "inseriu-lo" a la variable "a"
    
printf ( "Introduïu el segon número:" ); // Imprimeix a la consola
scanf ( "% d" , & b ); // Llegiu un valor enter i "inseriu-lo" a la variable "b"
    
suma = a + b ; // Calculeu la suma del contingut de la variable "a" i la de "b" i "inseriu-la" a la variable "suma"
producte = a * b ; // Calcula el producte del contingut de la variable "a" i el de "b" i "insereix" a la variable "producte"
diferència = a - b ; // Calculeu la diferència entre el contingut de la variable "a" i el de "b" i "inseriu-la" a la variable "diferència"
    
if ( b ! = 0 ) { // Comproveu que la variable "b" contingui un valor diferent de 0
quoto = a / b ; // Calculeu el quocient del contingut de la variable "a" i el de "b" i "inseriu-lo" a la variable "quoto"
}
    
printf ( "La suma és:% d \ n " , suma ); // Imprimiu a la consola una cadena amb el valor de la variable "suma"
printf ( "El producte és:% d \ n " , producte ); // Imprimiu a la consola una cadena amb el valor de la variable "producte"
printf ( "La diferència és:% d \ n " , diferència ); // Imprimiu a la consola una cadena amb el valor de la variable "diferència"
if ( b ! = 0 ) { // Comproveu que la variable "b" contingui un valor diferent de 0
printf ( "Quoto és:% d \ n " , quoto ); // Imprimiu una cadena a la consola amb el valor de la variable "quoto"
}
    
retorn 0 ; // Torneu 0 i finalitzeu el programa
}

Explicació

  • "int" defineix les variables com a enters (a, b, suma, producte, diferència i quoto són variables)
  • "printf" és la instrucció que imprimirà el contingut de les cometes a la pantalla
  • "scanf" llegeix l'entrada i la col·loca a la variable ("& a"). En aquest cas, en nombres decimals ("% d")
  • "+", "*", "-", "/" són, respectivament, els operadors de suma, producte, diferència i dimensió
  • La sintaxi "if ()" comprova si el contingut dins dels claudàtors és cert. Si és així, executa les funcions dins dels claudàtors (en aquest cas: "quoto = a / b")
  • La sintaxi "! =" Significa "diferent". En aquest exercici es comprova si "b" és diferent de 0; si es realitza una divisió amb un divisor igual a 0, el programa entrarà en error.
  • "La suma és:"% d ", suma En lloc de"% d "s'imprimirà el contingut de" suma "(% d significa que s'imprimirà un nombre enter)
  • "retorn" és la paraula clau que indica la finalització de la funció, retornant el valor 0. La finalització de la funció main () també provoca la finalització del programa.

Seqüències d'escapament

Seqüència Nom del tipus de lletra
\ a bip
\ b retrocés
\ f FF: feed de formularis (salt de pàgina)
\ n LF: feed de línia o nova línia
\ r CR - retorn de carro
\ t pestanya horitzontal
\ v pestanya vertical
\\ \ (barra invertida)
\ ' '(superíndex)
\ " "(cometes dobles)
\ 0 NULL (caràcter nul o de final de cadena)

Idiomes relacionats

Molts dels principals llenguatges de programació moderns s’inspiren en C i hereten part de la seva sintaxi. Alguns llenguatges (com Java , C ++ , C # i Objective C ) conserven gran part de la sintaxi de C i l’amplien per donar suport millor a diferents paradigmes de programació, mentre que altres llenguatges modernitzen la sintaxi però intenten mantenir la mateixa paradigmes i dominis d’aplicació de C. com ara la programació de sistemes (per exemple, Go ) o sistemes integrats (per exemple, Zig ).

C ++

Icona de la lupa mgx2.svg El mateix tema en detall: C ++ .

El llenguatge de programació C ++ es va derivar originalment de C. Tot i això, no tots els programes C són vàlids a C ++. A mesura que C i C ++ van evolucionar de forma independent, les seves incompatibilitats van augmentar [7] . La versió C99 va crear una sèrie de conflictes més. Les diferències dificulten l'escriptura de programes i biblioteques que funcionen tant en C com en C ++, i creen confusió per a aquells que programen en ambdós idiomes. La disparitat fa que sigui difícil per a ambdues llengües adoptar característiques de l’altra.

Bjarne Stroustrup , el creador de C ++, ha suggerit repetidament [8] que les incompatibilitats entre C i C ++ haurien de reduir-se tant com sigui possible per maximitzar la interoperabilitat entre els dos idiomes. Altres han argumentat que, atès que C i C ++ són llenguatges diferents, la compatibilitat entre els dos és útil, però no és vital. Segons aquesta posició, els esforços per reduir la incompatibilitat no haurien de dificultar els intents de millorar les llengües de manera autònoma.

Avui en dia, les diferències principals (a part de l’addició en C ++ de classes, plantilles, espais de noms, sobrecàrrega) entre els dos idiomes són:

  • inline : les funcions inline tenen un abast global en C ++,
  • El bool tipus a C99 es defineix en <stdbool.h> . L'estàndard C anterior no definia un tipus booleà i es van utilitzar diversos mètodes (incompatibles) per simular el tipus booleà.
  • Les constants de caràcter individuals tenen la mida d’un int en C i un char en C ++.
  • S'introdueixen paraules clau addicionals a C ++ i, per tant, no es poden utilitzar com a identificadors tal com es permetia a C (per exemple, try , catch , template , new , delete , ...)
  • A C ++, el compilador crea automàticament una etiqueta per a cada struct , union o enum , i després struct S {}; a C ++, a C equival a typedef struct S {} S; .

Objectiu-C

Icona de la lupa mgx2.svg El mateix tema en detall: Objectiu C.

El llenguatge Objective C deu la seva popularitat a Apple, que el va triar com a base per als seus sistemes operatius macOS , iOS , watchOS i tvOS . És un llenguatge orientat a objectes i, a diferència de C ++ , manté una plena compatibilitat amb C.

El 2014, Apple introdueix un nou llenguatge, Swift , que va substituir l’objectiu C en la programació dels sistemes operatius esmentats anteriorment.

Nota

  1. Oualline , pàg. 8.
  2. Kochan , pàg. 1.
  3. Deitel , pàg. 7 .
  4. El llenguatge C: principis de programació i manual de referència (segona edició) - Brian W. Kernighan, Dennis M. Ritchie , Pearson Prentice Hall, pàg. Introducció - XIV.
  5. Dennis Ritchie i Brian Kernighan, XI , a El llenguatge C. Principis de programació i manual de referència , Prentice Hall, 2004, p. 320.
    "C va ser dissenyat i escrit per al sistema operatiu UNIX, al DEC PDP-11, per Dennis Ritchie . "
  6. ^ (EN) Dennis Ritchie, The Development of the C Language (PDF), de Bell Labs / Lucent Technologies, 1993. Obtingut l'1 de maig de 2017.
    "C va sorgir els anys 1969-1973, en paral·lel al primer desenvolupament del sistema operatiu Unix; el període més creatiu es va produir durant el 1972 " .
  7. ^ Incompatibilitats entre ISO C i ISO C ++ , a david.tribble.com .
  8. ^ Rivalitat entre germans: C i C ++ ( PDF ), a research.att.com .

Bibliografia

Articles relacionats

Altres projectes

Enllaços externs

Controllo di autorità LCCN ( EN ) sh85018532 · GND ( DE ) 4113195-2 · BNF ( FR ) cb119665180 (data)
Informatica Portale Informatica : accedi alle voci di Wikipedia che trattano di informatica