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).Concurrència en Ada La trobada en Ada
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). -- fitxer hola.adb
-- mòduls dels quals depèn with Ada.Text_IO;
procedure Hola is
use Ada.Text_IO; -- importa espai de noms
begin Put_Line("Hola, món!"); end Hola; Compilació i execució a Linux gnatmake hola.adb
./hola
Compiladors Des del Març de 2008 es disposa d'una versió experimental sobre el sistema LLVM.GNAT portat al sistema de compiladors LLVM en anglès
GNAT en anglès (GNU NewYorkUniv. Ada Translator) Compilador d'Ada de la sèrie GNU GCC Com construir el frontal ADA sobre LLVM en anglès Frontal ADA per al sistema de compiladors LLVM.
Característiques Especificació i API biblioteca estàndard aquí.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
Lèxic Tots els identificadors són independents de caixa de lletra (majúscula/minúscula). Abc equival a abc i també a ABC.
Sintaxi dels blocs de codi function | procedure | declare -- declaracions begin -- instruccions exception -- gestors d'excepcions: when E: TipusExcepcio => -- tractament
when E: others => -- tracta altres excepcions
end NomDelBloc ;
Tipus Vegeu refs.Tipus en anglès
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..) type Recompte is range 0 .. 999 -- restricció de rang sobre sencers
aritmètica sense signe (modulars) sense signe: rang definit per l'operació mòdul, anomenats modulars. type Byte is mod 2**8
enumerats (discrets) discrets: (enumeració d'identificadors o de caràcters). Predefinits: Boolean, Character type Hexa is ('0', '9', 'A', 'B', 'C', 'D', 'E', 'F'); type Boolean is (False, True) ; type Opcions is (OpcioA, OpcioB, OpcioC)
coma-flotant predefinits: Float (precisió simple de 6 dígits), Long_Float (precisió doble de 15 dígits), ... type Percentatge is digits 4 range 0.0 .. 1.0 -- coma-flotant precisió amb restricció de rang
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. type Durada is delta Resolució_rellotge -- coma-fixa binari
type Centim_DEuro is delta 0.01 digits 14 -- coma-fixa decimal quan incorpora precisió en dígits, -- pels coma-fixa decimals la delta (resolució) ha d'ésser obligatòriament potència de deu.
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.
-- instància del genèric 'Integer_IO' per a la precisió Long_Integer package Long_Integer_IO is new Ada.Text_IO.Integer_IO (Long_Integer)
-- instància del genèric 'Float_IO' per a la precisió Long_Float package Long_Float_IO is new Ada.Text_IO.Float_IO (Long_Float)
-- instància del genèric 'Fixed_IO' (coma-fixa) per al tipus específic type Kilo_Octet is delta 2.0**10 ; package Kilo_Octet_IO is new Ada.Text_IO.Fixed_IO (Kilo_Octet) ;
-- instància del genèric 'Enumeration_IO' per al tipus específic type Discret is (OPCIO_A, OPCIO_B) ; package Discret_IO is new Ada.Text_IO.Enumeration_IO (Discret) ;
-- instància del genèric 'Modular_IO' per al tipus específic type Byte is mod 2**8 ; package Byte_IO is new Ada.Text_IO.Modular_IO (Byte) ;
Atributs atributs dels tipus, després d'un apòstrof com el genitiu de l'idioma anglès (per ex.: John's car)Atributs dels tipus estàndard en Ada2005 en anglès
-- lectura Positive'First -- el primer del tipus
-- escriptura for Tipus'Atribut use ValorNouDeLAtribut -- modificació d'atributs actualitzables
Constructor del tipus i conversions -- constructor i components especificant '(x ,..) l'atribut per defecte: el constructor K: Positive := Positive'(10)
-- conversió amb NomDelTipus(expressió) Percentatge(Valor/100.0)
Tipus derivats i subtipus tipus derivats: amb new el compilador els discrimina categories: subtipus (acceptats en paràmetres del tipus) type Poma is new Recompte range 0 .. 100
subtype OuDeLaDotzena is OuDelGalliner range 0 .. 12
Registres i punters registres type Registre is record A, B : Boolean; Mida : Positive; end record; VarR : Registre := (A => False, B => True, Mida => 10) ;
punters (amb access)Tipus access en anglès -- Amb ''access''/''access constant'' només poden apuntar dins el propi dipòsit de dades (''storage pool'') type PunterARegistre is [not_null] access Registre -- accés RW (només pot apuntar dins el dipòsit de dades del tipus) type PunterARegistre is [not_null] access constant Registre -- accés RO
-- Amb ''access all'' els punters no tenen restriccions d'apuntament. type PunterARegistre is [not_null] access all Registre -- accés RW (all: sense restricció de dipòsit d'apuntament) 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) punterARegistreTal.all := (A => False, B => True, Mida => 10) ;
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)
type Tupla is record -- no limitat, admet assignació (:=) i comparació bit a bit (=) del registre A, B : Boolean; end record;
type Llista is limited record -- limitat, assignació (:=) i comparació bit a bit (=) prohibides -- la comparació estructural, quan hi ha punters, no es pot basar -- en la igualtat bit a bit de la primera cel·la. Cap: Integer ; Cua: access constant Llista -- PunterALlista end record ;
Vectors, Tipus paramètrics, Variants vectors type VectorDeSencers is array (1 .. 10) of Integer -- exemple d'ús amb inicialització -- (el d'índex 1 => 15, el segon 16, altres => valor_per_defecte) VA: VectorDeSencers := (1 => 15, 2 => 16, others => 0) tipus indexats (dependents de valors) type BUFFER(MIDA : BUFFER_SIZE := 100) is record Posicio : BUFFER_SIZE := 0; Valor : STRING(1 .. MIDA); end record; registres variants (per codificar tipus de dades algebraic anomenats també tipus suma) type TIP_ARBRE is (FULLA, BRANCA) ;
type ARBRE_DE_SENCERS(Constructor: TIP_ARBRE) is record -- registre variant case Constructor is when FULLA => dadaFulla: Integer ; when BRANCA => dadaNus: Integer ; esquerre,dreta: access ARBRE_DE_SENCERS; -- punters a arbres end case ; end record ;
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. generic type Item is private; -- paràmetre de tipus opac type Poma is range <>; -- paràmetre de tipus enter, <>: abstracte en el rang type Mass is digits <>; -- paràmetre de tipus coma flotant, <>: abstracte en la precisió type Angle is delta <>; -- paràmetre de tipus coma fixa binari, <>: abstracte en la resolució (valor mínim) type Esdeveniment is (<>); -- paràmetre de tipus enumerable (pels parèntesis) <>: abstracte en els valors
type Buffer(Length : Natural) is limited private; -- paràmetre de tipus indexat -- (limited: assig. i comparació superficials prohibides (quan hi ha punters)) (private: opac)
type Table is array (Esdeveniment) of Item; -- paràmetre de tipus vector amb tipus d'elements i d'índex declarats prèviament
Depuració, Assercions i Contractes Assercions Des de l'Ada2005.Assercions
pragma Assert([Check =>] boolean_expression[, [Message =>] string_expression]);
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.Precondicions i Postcondicions generic type Elem is private;
package Piles is type Pila is private;
function Es_Buit(S: Pila) return Boolean; function Es_Ple(S: Pila) return Boolean;
procedure Apila(S: in out Pila; X: in Elem) with Pre => not Es_Ple(S), Post => not Es_Buit(S);
procedure Desapila(S: in out Pila; X: out Elem) with Pre => not Es_Buit(S), Post => not Es_Ple(S); private ... end Stacks;
API estàndard i predefinits API biblioteca estàndard. Atributs dels tipus estàndard. Elements predefinits (mòdul Ada.Standard)Ada2005 Elements predefinits al mòdul Ada.Standard en anglès
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.Access i mecanismes de gestió de memòria en anglès
Tipus de gestors Gestors d'allotjament de mem. dinàmica (Storage_Pool) assignables a diferents tipus de dadesGestors d'allotjament en anglèsAdacore - Memory management en anglès
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.Big Book of Ada - Advanced - Packages en anglès Vegeu apartats "Dynamic Allocation" i "Storage Pools". Al codi, però no a l'estàndard, hi diu: Allotjament per defecte dels tipus de punters declarats globalment.Gestor d'allotjament Unbounded_No_Reclaim en anglès 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.Garbage Collection a GNAT de GNU en anglès
Munt d'allotjament amb vida associada a un àmbit Amb el tipus de gestor Unbounded_Reclaim_Pool de System.Pool_Local.