# Ada (llenguatge de programació)

Ada és un llenguatge de programació estructurat i fortament tipat que fou dissenyat per Jean Ichbiah de CII Honeywell Bull per encàrrec del Departament de Defensa dels Estats Units. És un llenguatge d'ús general, orientat a objectes i concurrent, podent arribar des de la facilitat de Pascal fins a la flexibilitat de C++. El seu nom prové d'Ada Lovelace sovint considerada la primera escriptora de programes d'ordinador.
Fou dissenyat pensant en la seguretat i amb una filosofia orientada a la reducció d'errors comuns i difícils de descobrir. Per això es basa en el tipat fort i en verificacions en temps d'execució (desactivables en benefici del rendiment). La sincronització de tasques es realitza mitjançant la primitiva de comunicació síncrona rendez-vouz (cat.: trobada).
Ada es fa servir principalment en entorns en què es necessita una gran seguretat i fiabilitat, com pot ser la defensa, l'aeronàutica (Boeing o Airbus), la gestió del trànsit aeri (com Indra a l'Estat espanyol) i la indústria aeroespacial (ESA) entre d'altres, en estreta relació amb els Sistemes operatius de Temps Real.

## Programa d'exemple

Aquest programa escriu "Hola, món!" al dispositiu de sortida per defecte (habitualment la línia d'ordres).
Compilació i execució a Linux

## Compiladors

Des del Març de 2008 es disposa d'una versió experimental sobre el sistema LLVM.
* GNAT en anglès (GNU NewYorkUniv. Ada Translator) Compilador d'Ada de la sèrie GNU GCC
* Com construir el frontal ADA sobre LLVM Arxivat 2010-06-12 a Wayback Machine. en anglès Frontal ADA per al sistema de compiladors LLVM.

## Característiques

Especificació i API biblioteca estàndard aquí.

### Lèxic

* Tots els identificadors són independents de caixa de lletra (majúscula/minúscula). Abc equival a abc i també a ABC.

### Tipus

Vegeu refs.
Si no s'especifica un tipus predefinit, es dedueix el tipus base per les clàusules de restricció:
* clàusula range : sencer -- restricció de rang
* clàusula mod : "modulars" (naturals) -- restricció pel valor del mòdul
* clàusula dígits : coma flotant -- precisió
* clàusula delta : coma-fixa (binari si no s'especifica precisió);
** cas de clàusula dígits addicional a la clàusula delta, llavors és coma-fixa decimal
* range <> -- <> : restricció indefinida:
** o bé abstracte (paràmetre formal d'un genèric)
** o bé indica "rang per defecte"
** o bé "rang segons implementació".

#### sencers

Predefinits:
* sencers: Integer (mínim 16 bits)
* subtipus Long_Integer (mínim 32 bits), opcionalment Long_Long_Integer (64 bits), Short_Integer (16 bits)
* subtipus restringits: Natural [0..), Positive[1..)

#### aritmètica sense signe (modulars)

* sense signe: rang definit per l'operació mòdul, anomenats modulars.

#### enumerats (discrets)

* discrets: (enumeració d'identificadors o de caràcters). Predefinits: Boolean, Character

#### coma-flotant

* predefinits: Float (precisió simple de 6 dígits), Long_Float (precisió doble de 15 dígits), ...

#### coma-fixa

* coma-fixa binaris o bé decimals quan s'especifica la precisió.
* la clàusula delta precisa el valor incremental (el factor per al valor emmagatzemat), és a dir, la resolució del tipus.
* les operacions entre coma-fixes de delta diferents són més ràpides si les deltes són potència de la base.

#### Entrada / Sortida específica per tipus

Els mòduls d'entrada sortida són genèrics. Per imprimir o llegir valors, cal obtenir una instància del genèric adequat per al tipus específic.

#### Atributs

* atributs dels tipus, després d'un apòstrof com el genitiu de l'idioma anglès (per ex.: John's car)

#### Tipus derivats i subtipus

* tipus derivats: amb new el compilador els discrimina
* categories: subtipus (acceptats en paràmetres del tipus)

#### Registres i punters

* registres
* punters (amb access)
* Per assignar un nou valor a l'objecte apuntat cal desreferenciar el punter amb .all (equival en C a prefixar un punter amb l'asterisc: * punter)
* limited: per al cas d'estructures amb punters, prohibeix les operacions d'assignació (:=) i comparació (=) que ho fan bit a bit (superficials). (Per exemple, la comparació estructural de nodes encadenats no estaria garantida amb (=) doncs només compara bit-a-bit les primeres cel·les)

#### Vectors, Tipus paramètrics, Variants

* vectors
* tipus indexats (dependents de valors)
* registres variants (per codificar tipus de dades algebraic anomenats també tipus suma)

#### Genèrics - Parametrització de tipus en mòduls, procediments i funcions

* Cal precedir l'element a parametritzar amb la clàusula generic seguida dels paràmetres de tipus.
* Tipus formals: paràmetres formals de tipus en un genèric.
Vegeu exemple #Composició. Mòduls genèrics i Functors.

### Depuració, Assercions i Contractes
#### Assercions

Des de l'Ada2005.
havent afegit la següent pragma de configuració a l'inici del fitxer o al fitxer de configuració del projecte gnat.adc
pragma Assertion_Policy(Check) ;

#### Precondicions i Postcondicions

Des de l'Ada2012.

### API estàndard i predefinits

* API biblioteca estàndard.
* Atributs dels tipus estàndard.
* Elements predefinits (mòdul Ada.Standard)

### Gestió de memòria

Ada permet a l'usuari un control fi de la gestió de memòria així com definir els seus propis gestors.

#### Tipus de gestors

Gestors d'allotjament de mem. dinàmica (Storage_Pool) assignables a diferents tipus de dades

##### Munt d'allotjament (ang: heap) principal de vida il·limitada

Amb el tipus de gestor Unbounded_No_Reclaim de System.Pool_Global
Segons la ref. el recol·lector de brossa no hi passa. Al codi, però no a l'estàndard, hi diu: Allotjament per defecte dels tipus de punters declarats globalment. GNAT de GNU permet associar-hi un recol·lector de brossa recompilant GCC amb --enable-objc-gc incorporant la biblio. libobjc-gc.a si l'arquitectura la suporta.

##### Munt d'allotjament amb vida associada a un àmbit

Amb el tipus de gestor Unbounded_Reclaim_Pool de System.Pool_Local.
Quan l'execució surt de l'àmbit on el munt (Storage Pool) està definit, se'n reclama la memòria. Al codi, però no a l'estàndard, hi diu: Allotjament per defecte dels tipus de punters declarats localment. Sembla que era una pràctica en alguns compiladors de l'Ada83. AdaCore parla d'associació explícita. Vegeu exemple #Allotjament dinàmic i Memòria d'àmbit.

##### Munt d'allotjament a la pila

Amb tipus de gestor Stack_Bounded_Pool de System.Pool_Size, per reservar memòria dinàmica a la pila de manera acotada.
Allotja elements d'un únic tipus. El manual de AdaCore diu que aquest mòdul no està pensat per un ús directe per l'usuari, i que és el que es fa servir automàticament quan s'especifica el nombre d'elements per al tipus de punter.

#### Tipus de punters

* Punters (clàusula access) restringits a apuntar només a elements de l'Storage_Pool associat al seu tipus.
* Punters no restringits (clàusula: access all): permet apuntar a elements de qualsevol Storage_Pool
* Punters amb accés de només lectura (clàusula: access constant)

##### aliased

    Qualificador per indicar que un element d'una estructura pot ser accedit per punter i evitar que l'optimitzador del compilador l'empaqueti.

#### Registres amb membres punters i restricció de còpia/comparació superficials

* Les operacions d'assignació (:=) i comparació (=) són superficials (bit a bit), no tenen en compte si el registre conté punters.
* Es pot retornar un registre (tipus compost) com a resultat d'una funció.
* El qualificador limited: prohibeix assignacions i comparacions superficials (bit a bit) per a tipus que designin estructures de més profunditat (per quan hi ha punters, per ex. llistes encadenades).

#### Allotjament i desallotjament de dades referides per punters
##### new

    allotjament amb new Punter_A_Tipus,

##### Unchecked_Deallocation

    alliberament amb Unchecked_Deallocation similar al Free del C/C++ Vegeu exemple #Allotjament dinàmic i Memòria d'àmbit

#### Directives de compilació (Pragma) relacionades amb la memòria
##### Pragma Controlled

    Pragma per evitar que el recol·lector de memòria brossa (si l'habilitem), gestioni un determinat tipus

##### Volatile

    Pragma per indicar que un element de memòria pot ser modificat externament i cal llegir-lo a memòria cada vegada evitant optimitzacions.

##### Atomic

    Pragma per forçar la lectura i escriptura de manera atòmica (no interrompible i respectant l'ordre a les CPU's de procés especulatiu(ang
    out-of-order CPU))

### Orientació a objectes

* Classes d'objectes formades per
* # un tipus tagged (etiquetat), descrit a la implementació com a registre amb els camps de l'objecte.
* # procediments i funcions de la instància quan el primer paràmetre és la instància del tipus definit.
* # procediments i funcions estàtiques (de la classe) quan no duen la instància com a primer paràmetre.
* Els procediments i funcions a nivell de paquet són heretables (virtuals).
* Per definir generadors i altres funcions com a no-heretables cal fer-ho en un submòdul.
Vegeu exemple.

#### herència

* qualificatiu overriding per redefinir un procediment o funció
* per referir-se al mètode homònim de la classe base, cal caracteritzar la instància amb el tipus del pare, mitjançant una conversió de tipus: Tipus_del_pare(This).

#### Constructors, Destructors i Clonadors

Per fer una gestió fina de la memòria cal que els tipus implementin les classes Controlled o bé Limited_Controlled, que proporcionen mètodes per intervenir en les ops. de lligar un objecte a una variable i en deslligar-lo.
Sobre aquestes classes abstractes s'hi pot implementar, si hom vol, un mecanisme d'alliberament per comptador de referències. Com a l'exemple més avall.
El mòdul Ada.Finalization incorpora les classes abstractes Controlled i Limited_Controlled que ofereixen mètodes cridats automàticament en inicialitzar, en assignar, i en sortir de l'àmbit les variables dels tipus de les classes que se'n derivin. Vegeu refs.
   * Classe Controlled: amb mètodes abstractes Initialize, Adjust i Finalize (cridats respectivament de manera automàtica,
      * Initialize, cridat en la declaració de variables del tipus quan no s'inicialitzen.
      * Finalize, cridat en deslligar l'objecte de la variable, perquè, o bé se li ha assignat un altre valor a la variable, o bé la variable surt de l'àmbit.
      * Adjust, cridat en lligar un objecte a una variable en les assignacions, per quan hi ha punters, poder completar la clonació d'una estructura després de la còpia superficial (bit a bit) de la primera ceŀla que el compilador genera.
   * Classe Limited_Controlled: Inclou Initialize, i Finalize però no Adjust.
   * En els mètodes Adjust i Finalize s'hi pot implementar un comptador de referències com a l'exemple proposat.

#### Tipus definits per signatures (Interface)

Des de l'Ada2005.

### Concurrència

* Fils d'execució:
** La clàusula task designa un fil d'execució que engega tot just en acabar d'inicialitzar la construcció que l'enclou. (exemple).
** La seva definició inclourà els canals d'entrada (Entry) del fil d'execució.
* Exclusió mútua i espera condicionada (POSIX condition variables): La construcció Protected incorpora un monitor a l'estructura. (exemple)
* Transferència de control asíncrona: La clàusula select {esdeveniment} then-abort procediment pot incloure un procediment que es cancel·larà en el moment que s'esdevingui algun dels esdeveniments especificats al select.(exemple)

### Compilació

* Compilació: compila l'arbre de paquets obtingut de les clàusules d'importació with Nom_Paquet;
* Compilació separada:

#### Fitxer de configuració del projecte

* El fitxer gnat.adc es pot establir per contenir Pragmes de Configuració del projecte del directori. El compilador cercarà el fitxer de configuració al directori de treball.

#### L'ordre d'inicialització dels mòduls

El mòdul autogenerat ada_main inclou els procediments d'inicialització adainit i de tancament adafinal. El procediment adainit executa la inicialització de cada mòdul en l'ordre deduït de les clàusules with i les pragmes Elaborate.
Vegeu ref.
* gnatbind: genera els fitxers .ads i .adb que conté el mòdul ada_main, amb nom de fitxer obtingut prefixant amb b~ el nom del mòdul principal.
L'ordre d'inicialització es pot alterar quan a un mòdul li convé que un altre s'inicialitzi abans, especificant-ho amb la pragma Elaborate o Elaborate_All.

#### Generació de biblioteques

En cas de voler generar una biblioteca en comptes d'un executable, caldrà fer un programa principal de pega que cridi a les rutines de la biblioteca i extreure'n del mòdul principal generat (ada_main) els processos d'inicialització i tancament adainit i adafinal que inclourem a les rutines d'inicialització i finalització de la biblioteca de relligat dinàmic (.dll o bé .so), nom_biblioinit i nom_bibliofinal.

## JGNAT a la Màquina Virtual Java

AdaCore, mantenidor del compilador GNAT, disposa a la pàgina de descàrregues de codi obert d'una versió per a "jvm-windows" que també funciona sobre Linux mitjançant l'emulador Wine excepte pels caràcters no anglosaxons (la codif. de caràcters és Latin-1 a Windows i UTF-8 a GNU/Linux).
Compilació a GNU/Linux:
Execució (a la consola Unix):

## Exemples
### Composició. Mòduls genèrics i Functors

* La biblio paramètrica en tipus i operacions (funció d'un tipus T i d'una op. formal Producte) :
* Un Functor (mòdul amb un mòdul abstracte com a paràmetre formal). Transformarà instàncies que implementin La_Meva_Biblio.
* El principal:
Compila i executa:
dona el resultat:

### Composició en O.O. - Parametritzant per tipus d'objecte

Parametritzant per tipus d'objecte amb requeriments de superclasse i interfaces
* Les constants de configuració de l'aplicació
* L'interface :
* La biblio paramètrica en un tipus descendent d'un tipus d'objecte i amb requeriment d'interface
* La classe arrel Persona (incorpora un constructor i un mètode Put_To_String(obj))
* La classe derivada Programador: implementa l'interface i, a banda, incorpora un constructor i sobrescriu el mètode Put_To_String(obj).
* Principal:
Compila i executa:

### Comunicació síncrona (rendez-vous)

Vegeu ref.

#### Activació de tasques
### Transferència de control asíncrona

Càlculs abortables per venciment de terminis o altres esdeveniments esmentats a la clàusula select. Detalls a la documentació.

### protected - Exclusió mútua i accés condicionat

La construcció protected aporta coherència al manteniment d'estructures compartides per diferents fils d'execució.
Aporta un monitor a l'estructura per garantir l'exclusió mútua dels fils d'execució que executin els membres exportats de l'estructura.
Les clàusules Entry permeten condicionar el desblocatge d'execució (monitor) a una condició expressada en la clàusula when.

### Allotjament dinàmic i Memòria d'àmbit

Vegeu #Gestió de memòria

### O.O. - Finalització controlada - Estructura amb component allotjat dinàmicament i comptador de referències

Classe d'objectes amb Finalització controlada, derivats de la classe abstracta Ada.Finalization.Controlled. Mètodes cridats automàticament:
* Initialize: cridat en les declaracions sense inicialització
* Finalize: cridat en deslligar l'objecte de la variable, perquè, o bé se li ha assignat un altre valor a la variable, o bé la variable surt de l'àmbit
* Adjust: cridat en lligar un objecte a una variable a les assignacions, després de la còpia superficial (bit a bit) de l'objecte, per si cal clonar els membres referits per punters o si cal portar un comptador de referències.
Vegeu #Constructors, Destructors i Clonadors.
* La càrrega
* Provatura:
Compila i executa:
dona:

## Vegeu també

* Perfil Ravenscar

## Referències

* ↑ Fuegi,, J.; Francis,, J. «Lovelace & Babbage and the creation of the 1843 'notes'». IEEE Annals of the History of Computing, V.25, n.4, Octubre-desembre 2003, p.16-26.
* ↑ Concurrència en Ada Arxivat 2010-09-30 a Wayback Machine.(castellà)
* ↑ La trobada en Ada Arxivat 2010-04-01 a Wayback Machine.(castellà)
* ↑ Burns, Alan; Wellings, Andrew J. Concurrent and real-time programming in Ada 2005 (en anglès). Cambridge University Press, 2007. ISBN 0521866979.
* ↑ GNAT portat al sistema de compiladors LLVM Arxivat 2008-05-05 a Wayback Machine. en anglès
* 1 2 3 Especificació i API estàndard de l'Ada 2005 en anglès Firefox mostra pàgines en blanc. Cal refrescar un parell de cops i surten o fer servir un navegador basat en Webkit com ara Chrome o Safari
* ↑ «Fundamental data types». Arxivat de l'original el 2012-03-11. [Consulta: 22 octubre 2010].
* ↑ Tipus en anglès
* 1 2 Atributs dels tipus estàndard en Ada2005 en anglès
* ↑ Tipus access en anglès
* ↑ Assercions
* ↑ Precondicions i Postcondicions(anglès)
* ↑ Ada2005 Elements predefinits al mòdul Ada.Standard en anglès
* 1 2 Access i mecanismes de gestió de memòria en anglès
* ↑ Gestors d'allotjament en anglès
* 1 2 3 4 Adacore - Memory management Arxivat 2011-07-03 a Wayback Machine. en anglès
* ↑ Big Book of Ada - Advanced - Packages en anglès Vegeu apartats "Dynamic Allocation" i "Storage Pools".
* ↑ Gestor d'allotjament Unbounded_No_Reclaim Arxivat 2015-11-25 a Wayback Machine. en anglès
* ↑ Garbage Collection a GNAT de GNU en anglès
* ↑ Gestor d'allotjament Unbounded_Reclaim_Pool Arxivat 2015-11-25 a Wayback Machine. en anglès
* ↑ Gestor d'allotjament Stack_Bounded_Pool en anglès
* ↑ Ada programming - Access_to_Constant
* ↑ Qualificador Aliased en anglès
* ↑ Tipus limitats en anglès
* ↑ Eliminar un objecte d'un Storage_Pool en anglès
* ↑ Unchecked_Deallocation
* ↑ Pragma Controlled en anglès
* ↑ Pragma Volatile en anglès
* ↑ Pragma Atomic en anglès
* ↑ AdaCore - Gem #97: Reference Counting in Ada - Part 1(anglès)
* ↑ Constructors, clonadors i destructors Arxivat 2011-03-04 a Wayback Machine. en anglès
* ↑ Viquillibre: prog. en Ada - Orientació a Objectes per a programadors de C++ en anglès
* ↑ Expansion of Rendez-vous Arxivat 2012-02-13 a Wayback Machine.(anglès) 10.3 Asynchronous Transfer of Control
* ↑ Pragmes de Configuració en anglès
* 1 2 Elaboration Order Handling in GNAT
* ↑ GNAT i Creació de biblioteques Arxivat 2011-05-23 a Wayback Machine. en anglès
* ↑ Descàrrega de GNAT per a JVM en anglès
* ↑ Manual de JGNAT Arxivat 2010-12-01 a Wayback Machine. en anglès
* ↑ Viquillibre Ada programming - Tasking en anglès
* ↑ Ada2005 - clàusules Entry en anglès
* ↑ Activació de tasques en anglès
* ↑ Asynchronous Transfer of Control
* ↑ Protected objects Arxivat 2010-10-01 a Wayback Machine. en anglès

## Bibliografia

* Embedded.com - Programació d'aplicacions de temps-real amb Ada 2005 en anglès

## Enllaços externs

* Estàndards sobre Ada en anglès Ada95, Ada2005, ..
* Univ. de Saragossa - Introduccción a Ada (castellà)
* Viquillibre - Programació en Ada en anglès
* Univ. Rovira i Virgili - Pascal i Ada Arxivat 2010-06-30 a Wayback Machine. (castellà)
Viccionari