Llenguatge C

El llenguatge de programació C, llenguatge C o llenguatge de programació de sistemes, va ser creat per Dennis Ritchie i Ken Thompson als Laboratoris Bell d'AT&T, a principis de la dècada dels 70. C està basat en un llenguatge que havia creat Ken Thompson anomenat llenguatge B el 1970. El llenguatge C es va crear per la necessitat de tenir-ne un que fos més flexible que l'assemblador a l'hora de programar, però que mantingués la característica de ser un llenguatge proper a la màquina. En la seva absència, el llenguatge C es va fer per a poder crear el sistema operatiu Unix. Actualment, C és el llenguatge més utilitzat per a desenvolupar sistemes operatius i altres tipus de programari bàsic, i també per aplicacions en general. El llenguatge C++ es va desenvolupar a partir de C.

C és apreciat per l'eficiència del codi que produeix i és el llenguatge de programació més popular per crear programari de sistemes, tot i que també s'utilitza per crear aplicacions.

Es tracta d'un llenguatge dèbilment tipat de mig nivell però amb moltes característiques de baix nivell. Disposa de les estructures típiques dels llenguatges d'alt nivell però, també disposa de construccions del llenguatge que permeten un control a molt baix nivell. Els compiladors solen oferir extensions al llenguatge que possibiliten barrejar codi en assemblador amb codi C o accedir directament a memòria o a dispositius perifèrics. Algunes de les seves instruccions són molt semblants a altres llenguatges, incloent sentències com if, else, for, do, while...

La primera estandardització del llenguatge C fou en ANSI, amb l'estàndard X3.159-1989. El llenguatge que defineix aquest estàndard fou conegut vulgarment com a ANSI C. Posteriorment, el 1990, fou ratificat com a estàndard ISO (ISO/IEC 9899:1990). L'adopció d'aquest estàndard és molt àmplia, així que, si els programes creats el segueixen, el codi és portable entre plataformes i/o arquitectures. En la pràctica, els programadors solen utilitzar elements no-portables dependents del compilador o del sistema operatiu.

Característiques 
Les principals característiques del llenguatge C són:

 És un llenguatge de programació de propòsit general associat al sistema operatiu UNIX.
 És un llenguatge de baix o mitjà nivell (si es busca un llenguatge d'alt nivell és recomanable utilitzar el llenguatge C++). Tracta amb elements bàsics com caràcters o números, i també amb bits i adreces de memòria.
 Posseeix una gran portabilitat.
 És utilitzat per a la programació de sistemes; per exemple, per a la construcció d'editors de text.
 Aquest llenguatge consta del llenguatge C pròpiament dit (tipus de dades, expressions i estructures de control) i d'extensions en forma de macros i un ampli conjunt de llibreries predefinides.

Estructura 
Un programador consta d'un o més mòduls, és a dir, fitxers fonts.

Cada mòdul pot contenir:

 Directives del precompilador; per exemple, amb la finalitat d'incloure altres fitxers (#include) i definir constants i macros (#define).
 Declaracions de variables i prototips de funcions.
 Una o més funcions.
 Comentaris.

Cada funció pot incloure:

 Directives del precompilador.
 Declaracions.
 Un o més blocs.
 Comentaris.

Cada bloc pot tenir:

 Directives del precompilador.
 Declaracions.
 Una o més sentències
 Comentaris.

Cada sentència està determinada per ;

Cada bloc de sentències es tanca entre claus {. . . }.

La funció denominada main és la primera en ser executada.

Els comentaris poden aparèixer en qualsevol lloc del codi font i es poden insertar:

 Entre /*x*/. Per exemple, /*aquí dins s'insereix el text del comentari*/.
 Entre // i el final de la línia. Per exemple, //aquí dins s'insereix el text del comentari.

Versions de C 
Existeixen 3 versions principals de C:
 Kernighan and Ritchie (K & R), basat en el llibre The C Programming Language (el llenguatge de programació C), de Kernighan i Ritchie
 ANSI C / ISO C, és la versió que es va estandarditzar el 1990
 C99, adoptat com a estàndard per l'ANSI el 2000

Programa d'exemple 
Aquest programa escriu "Hola món" al dispositiu de sortida de defecte (habitualment el monitor).
 #include <stdio.h>

 int main(void)
 {
 printf("Hola, món!\n");
 return 0;
 }

La primera línia del programa consisteix en una directiva del preprocesador, indicada per #include. Això provoca que el preprocessador -la primera eina a examinar el codi durant la compilació- substitueixi tota la línia pel contingut complet del fitxer de capçalera stdio.h que conté les declaracions de les funcions estàndards d'entrada i sortida com printf.

La següent línia indica que s'està definint una funció amb el nom de main que retornarà un valor de tipus enter i que no accepta cap paràmetre.

Els claudàtors delimiten un bloc de codi, en aquest cas a l'anar precedits de la declaració de la funció main, correspon a la seva definició.

La primera línia del bloc de definició de main és printf("Hola, món!\n"); Aquesta línia indica que s'ha de cridar una funció printf i s'ha de passar com argument a aquesta funció la cadena "Hola, món!\n". La funció printf forma part de la llibreria de funcions estàndard de C i s'encarrega d'imprimir la cadena que se li passa com argument, per la sortida estàndard que sol ser la pantalla. El caràcter \n indica que s'ha de fer un salt de línia i retorn de carro després d'imprimir la cadena.

Per últim la línia següent indica que s'ha de retornar el valor 0. Aquest valor es retorna al procés que ha cridat el programa -sol ser el sistema operatiu- indicant en aquest cas absència d'errors en l'execució.

Història

Desenvolupament inicial 

El desenvolupament inicial de C es va dur a terme en els Laboratoris Bell d'AT&T entre 1969 i 1973; segons Dennis Ritchie, el període més creatiu va tenir lloc el 1972. Se li va donar el nom "C" perquè moltes de les seves característiques van ser preses d'un llenguatge anterior anomenat
"B".

Hi ha moltes llegendes sobre l'origen de C i el sistema operatiu amb què està íntimament relacionat, Unix. Algunes són:
 El desenvolupament de C va ser el resultat del desig dels programadors de jugar amb Space Travel. Havien estat jugant al mainframe de la seva companyia, però a causa de la seva poca capacitat de procés i en haver de suportar 100 usuaris, Ken Thompson i Dennis Ritchie no tenien prou control sobre la nau per evitar col·lisions amb els asteroides, per aquest motiu van decidir portar el joc a un PDP-7 de l'oficina que no s'utilitzava; però aquesta màquina no tenia sistema operatiu, així que van decidir escriure un. Finalment van decidir portar el sistema operatiu del PDP-11 que hi havia a la seva oficina, però era molt costós, doncs tot el codi estava escrit en llenguatge assemblador. Aleshores van decidir utilitzar un llenguatge d'alt nivell i portàtil perquè el sistema operatiu es pogués portar fàcilment d'un ordinador a un altre, van considerar usar B però mancava de les funcionalitats necessàries per aprofitar algunes característiques avançades del PDP-11 llavors van començar a crear un nou llenguatge : C.
 La justificació per obtenir l'ordinador original que es va fer servir per desenvolupar Unix va ser crear un sistema que automatitzés l'arxiu de patents. La versió original d'Unix es va desenvolupar en llenguatge assemblador. Més tard, el llenguatge C es va desenvolupar per poder reescriure el sistema operatiu.

El 1973, el llenguatge C s'havia tornat tan potent que la major part del kernel Unix, originalment escrit en el llenguatge assemblador PDP-11, va ser reescrita a C. Aquest va ser un dels primers nuclis de sistema operatiu implementats en un llenguatge diferent de l'assemblador. (Alguns casos anteriors són el sistema Multics, escrit a PL/I, i Master Control Program per al B5000 de Burroughs, escrit en ALGOL el 1961 ).

Aplicabilitat 

Fet principalment per a la fluïdesa de programació en sistemes Unix. Es pot fer servir també per al desenvolupament d'altres sistemes operatius com ara Windows o GNU/Linux. Igualment per a aplicacions d'escriptori com a GIMP, el principal llenguatge de programació del qual és C.

De la mateixa manera, és molt usat en aplicacions científiques (per a experiments informàtics, físics, químics, matemàtics, entre d'altres, part d'ells coneguts com a models i simuladors), industrials (indústria robòtica, cibernètica, sistemes d'informació i base de dades per a la indústria petroliera i petroquímica, predominen també tot el que es refereix a simulació de màquines de manufactura), simulacions de vol (és la més delicada, ja que s'han d'usar massa recursos tant de hardware com de software per desenvolupar aplicacions que permetin simular el vol real d'una aeronau). S'aplica per tant, en diverses àrees desconegudes per gran part dels usuaris novells.

Els ordinadors de finals dels 90 són diversos ordres de magnitud més potents que les màquines en què C es va desenvolupar originalment. Programes escrits en llenguatges de tipus dinàmic i fàcil codificació (Ruby, Python, Perl...) que antany haguessin resultat massa lents, són prou ràpids com per desplaçar en ús a C Tot i així, es pot seguir trobant codi C en grans desenvolupaments d'animacions, modelats i escenes en 3D a pel·lícules i altres aplicacions multimèdia.

Actualment, els grans projectes de programari es divideixen en parts dins d'un equip de desenvolupament. Aquelles parts que són més "burocràtiques" o "de gestió" amb els recursos del sistema, se solen realitzar en llenguatges de tipus dinàmic o de guió (script), mentre que aquelles parts "crítiques", per la seva necessitat de rapidesa d'execució, es realitzen en un llenguatge de tipus compilat, com C o C++. Si, després de fer la divisió, les parts crítiques no superen un cert percentatge del total (aproximadament el 10%) llavors tot el desenvolupament es fa amb llenguatges dinàmics. Si la part crítica no arriba a complir les expectatives del projecte, es comparen les alternatives d'una inversió en nou maquinari davant d'invertir en el cost d'un programador perquè reescrigui aquesta part crítica.

Aplicacions integrats 
C és el llenguatge comú per programar sistemes integrat. El codi lleuger que un compilador C genera, combinat amb la capacitat d'accés a capes del programari properes al maquinari són la causa de la seva popularitat en aquestes aplicacions.

Una característica on C demostra comoditat dús particularment valuosa en sistemes embeguts és la manipulació de bits. Els sistemes contenen registres mapejats en memòria (en anglès, MMR) a través dels quals els perifèrics es configuren. Aquests registres barregen diverses configuracions a la mateixa adreça de memòria, encara que en bits diferents. Amb C és possible modificar fàcilment un d'aquests bits sense alterar la resta. Per exemple:
int *mmr; /* punter al registre que volem modificar */
mmr = 0x40008ABC; /* adreça de memòria del registre */

* mmr |= 1 << 7; /* posa a 1 el bit 8 sense modificar els altres */
* mmr &= ~(1 << 12) /* posa a 0 el bit 13 sense modificar els altres */
Aquest tipus de manipulació és molt tediosa o senzillament impossible en altres llenguatges d'alt nivell, atès que s'utilitzen operacions comunes del llenguatge assemblador com les bitwise operacions a nivell bit OR, AND, SHL i CPL però que estan disponibles al llenguatge C.

Altres característiques de C considerades desavantatges en la programació per a PC -com l'absència de control de memòria automàtic- es converteixen en avantatges quan els sistemes encastats necessiten codi petit i optimitzat. Aquest és el cas dels sistemes basats en microcontroladors de poca potència com l'intel 8051 o molts sistemes ARM.

Biblioteca C 
El llenguatge de programació C és molt petit. No obstant això, moltes de les tasques es poden desenvolupar mitjançant la biblioteca C. Es pot utilitzar per:

 Assignar i desassignar memòria.
 El manipulat de cadenes i caràcters.
 Funcions matemàtiques.
 Entrades i sortides.
 ...

En els sistemes UNIX la informació sobre les diverses funcions de la biblioteca es troba disponible en la documentació en línia.

Documentació en línia 
La documentació en línia d'una funció indica, a part de la sintaxis d'aquesta funció, si és necessari algun tipus de fitxer include o cal indicar alguna llibreria addicional.

Assignació de memòria 
Per tal d'assignar memòria s'utilitza void *malloc(size_t size):

 L'usuari li passa com a argument la quantitat de bytes que vol reservar (s'acostuma a utilitzar sizeof per determinar-ho).
 A continuació, aquest retorna una direcció de memòria on hi ha dsponible aquesta quantitat de bytes.

Quan ja no es necessita la memòria assignada amb malloc, es pot desassignar a partir de void free (void *ptr).

Llenguatges derivats 
 C++
 Cyclone
 C#
 D
 Java
 PHP

Vegeu també 
 Labwindows.
 Turbo C.
 Signum Framework.
 Nagios

Referències

Enllaços externs 

 Web de l'estàndard C més recent 
 Draft ANSI C Rationale (ANSI X3J11/88-151)  de 18 de novembre de 1988.
 GNU Compilers collection  Compilador de codi obert per a C, C++, Objective-C i d'altres per a diversos entorns incloent Linux.
 LLVM - CLang  Frontal de C per al compilador de codi obert LLVM.
 Borland C   Compilador de C i C++ per a Windows.