Ada é uma linguagem de programação de alto nível estruturada, de tipagem estática, imperativa e orientada a objetos, inspirada por Pascal e outras linguagens. Possui suporte integrado na linguagem para design por contrato (DbC), tipagem extremamente forte, concorrência explícita, tarefas (tasks), troca de mensagens síncrona, objetos protegidos e não determinismo. O Ada aprimora a segurança e a manutenibilidade do código ao utilizar o compilador para encontrar erros em vez de permitir erros em tempo de execução. O Ada é um padrão técnico internacional, definido conjuntamente pela Organização Internacional de Normalização (ISO) e pela Comissão Eletrotécnica Internacional (IEC). A partir de maio de 2023, a norma, ISO/IEC 8652:2023, é informalmente chamada de Ada 2022.https://nvlpubs.nist.gov/nistpubs/Legacy/FIPS/fipspub119.pdf Ada programming language
O Ada foi projetado originalmente por uma equipe liderada pelo cientista da computação francês Jean Ichbiah, da Honeywell, sob contrato com o Departamento de Defesa dos Estados Unidos (DoD) de 1977 a 1983 para substituir mais de 450 linguagens de programação utilizadas pelo DoD na época. O Ada recebeu esse nome em homenagem a Ada Lovelace (1815–1852), que é considerada a primeira programadora de computadores da história.
Características O Ada foi originalmente projetado para sistemas embarcados e de tempo real. A revisão Ada 95, projetada por S. Tucker Taft da Intermetrics entre 1992 e 1995, melhorou o suporte a sistemas, programação numérica, financeira e programação orientada a objetos (POO).
Os recursos do Ada incluem tipagem forte, mecanismos de programação modular (pacotes), verificação em tempo de execução, processamento paralelo (tarefas, troca de mensagens síncrona, objetos protegidos e instruções select não determinísticas), tratamento de exceções e genéricos. O Ada 95 adicionou suporte à programação orientada a objetos, incluindo despacho dinâmico (dynamic dispatch).
A sintaxe do Ada minimiza as opções de maneiras de executar operações básicas e prefere palavras-chave em inglês (como e ) a símbolos (como e ). O Ada usa os operadores aritméticos básicos , , e , mas evita o uso de outros símbolos. Blocos de código são delimitados por palavras como 'declare', 'begin' e 'end', onde o 'end' (na maioria dos casos) é seguido pela palavra-chave do bloco que ele fecha (por exemplo, ... , ... ). No caso de blocos condicionais, isso evita o problema do dangling else que poderia se associar à expressão 'if' aninhada incorreta em outras linguagens, como C ou Java.
O Ada foi projetado para o desenvolvimento de sistemas de software muito grandes. Os pacotes do Ada podem ser compilados separadamente. As especificações de pacotes Ada (a interface do pacote) também podem ser compiladas separadamente sem a implementação para verificar a consistência. Isso possibilita detectar problemas logo no início da fase de projeto, antes do início da implementação.
Um grande número de verificações em tempo de compilação é suportado para ajudar a evitar erros que não seriam detectáveis até o tempo de execução em algumas outras linguagens ou que exigiriam verificações explícitas a serem adicionadas ao código-fonte. Por exemplo, a sintaxe exige o fechamento explicitamente nomeado de blocos para evitar erros decorrentes de delimitadores de término incompatíveis. A adesão à tipagem forte permite detectar muitos erros comuns de software (parâmetros incorretos, violações de intervalo, referências inválidas, tipos incompatíveis, etc.) durante o tempo de compilação ou, de outro modo, durante o tempo de execução. Como a concorrência faz parte da especificação da linguagem, o compilador pode, em alguns casos, detectar potenciais impasses (deadlocks). Os compiladores também verificam comumente identificadores com grafia incorreta, visibilidade de pacotes, declarações redundantes, etc., podendo fornecer avisos e sugestões úteis sobre como corrigir o erro.
O Ada também suporta verificações em tempo de execução para proteger contra acesso a memória não alocada, erros de estouro de buffer, violações de intervalo, erros de deslocamento por um (off-by-one), erros de acesso a arranjos e outras falhas detectáveis. Essas verificações podem ser desativadas no interesse da eficiência em tempo de execução, mas frequentemente podem ser compiladas de maneira eficiente. A linguagem também inclui recursos para auxiliar na verificação de programas. Por essas razões, o Ada é utilizado em sistemas críticos, onde qualquer anomalia pode levar a consequências graves, como morte acidental, ferimentos ou perdas financeiras severas. Exemplos de sistemas onde o Ada é empregado incluem aviônica, controle de tráfego aéreo, ferrovias, bancos, setor militar e tecnologia espacial.
O gerenciamento de memória dinâmico do Ada é de alto nível e com segurança de tipos. O Ada não possui ponteiros genéricos ou não tipados, nem declara implicitamente qualquer tipo de ponteiro. Em vez disso, toda alocação e desalocação dinâmica de memória deve ocorrer por meio de tipos de acesso explicitamente declarados. Cada tipo de acesso possui um conjunto de armazenamento (storage pool) associado que lida com os detalhes de baixo nível do gerenciamento de memória; o programador pode usar o conjunto de armazenamento padrão ou definir novos (isso é particularmente relevante para arquiteturas NUMA). É até possível declarar vários tipos de acesso diferentes que designam o mesmo tipo, mas utilizam conjuntos de armazenamento distintos. Além disso, a linguagem fornece verificações de acessibilidade, tanto em tempo de compilação quanto em tempo de execução, que garantem que um valor de acesso não possa sobreviver ao tipo do objeto para o qual aponta.no safe dynamic memory management in ADA, em: Writing Linux Kernel Modules in Safe Rust – Geoffrey Thomas & Alex Gaynor, The Linux Foundation, 02-10-2019
Embora a semântica da linguagem permita a coleta de lixo automática de objetos inacessíveis, a maioria das implementações não a suporta por padrão, pois isso causaria comportamento imprevisível em sistemas de tempo real. O Ada suporta uma forma limitada de gerenciamento de memória baseado em região, e, no Ada, destruir um conjunto de armazenamento também destrói todos os objetos contidos nele.
Dois traços consecutivos (), assemelhando-se a um travessão, denotam texto de comentário. Os comentários terminam no final da linha; não há intencionalmente nenhuma maneira de fazer um comentário abranger várias linhas, para evitar que comentários não fechados anulem acidentalmente seções inteiras de código-fonte. Desativar um bloco inteiro de código requer, portanto, prefixar cada linha (ou coluna) individualmente com . Embora isso identifique claramente o código desativado criando uma coluna de '--' repetidos ao longo da página, também torna a desativação ou reativação experimental de grandes blocos um processo mais demorado em editores sem suporte a comentários em bloco.
O ponto e vírgula () é um terminador de instrução, e a instrução nula ou de não operação é . Um único sem uma instrução para terminar não é permitido.
Ao contrário da maioria dos padrões da ISO, a definição da linguagem Ada (conhecida como Ada Reference Manual ou ARM, ou às vezes como Language Reference Manual ou LRM) é conteúdo livre. Assim, é uma referência comum para programadores Ada, não apenas para programadores que implementam compiladores Ada. Além do manual de referência, há também um extenso documento de justificativa (rationale) que explica o projeto da linguagem e o uso de várias construções da linguagem. Esse documento também é amplamente utilizado por programadores. Quando a linguagem foi revisada, um novo documento de justificativa foi redigido.
Uma ferramenta notável de software livre utilizada por muitos programadores Ada para auxiliá-los na escrita de código-fonte é o GNAT Programming Studio e o GNAT, que faz parte da GNU Compiler Collection.
O Alire é uma ferramenta de gerenciamento de pacotes e cadeias de ferramentas para Ada.
História Na década de 1970, o Departamento de Defesa dos Estados Unidos (DoD) ficou preocupado com o número de diferentes linguagens de programação usadas para seus projetos de sistemas computacionais embarcados, muitas das quais eram obsoletas ou dependentes de hardware, e nenhuma das quais suportava programação modular segura. Em 1975, um grupo de trabalho, o High Order Language Working Group (HOLWG), foi formado com o intuito de reduzir esse número encontrando ou criando uma linguagem de programação geralmente adequada para os requisitos do departamento e do Ministério da Defesa do Reino Unido. Após muitas iterações iniciadas com uma proposta preliminar inicial, a linguagem de programação resultante foi batizada de Ada. O número total de linguagens de programação de alto nível em uso para tais projetos caiu de mais de 450 em 1983 para 37 em 1996.
O HOLWG elaborou os requisitos de linguagem Steelman, uma série de documentos estabelecendo os requisitos que eles consideravam necessários para uma linguagem de programação satisfazer. Muitas linguagens existentes foram formalmente revisadas, mas a equipe concluiu em 1977 que nenhuma linguagem existente atendia às especificações. Os requisitos foram criados pelo Departamento de Defesa dos Estados Unidos no programa The Department of Defense Common High Order Language em 1978. Os antecessores desse documento foram chamados, em ordem, de "Strawman", "Woodenman", "Tinman" e "Ironman".Department of Defense (junho de 1978), Requirements for High Order Computer Programming Languages: "Steelman" Os requisitos concentravam-se nas necessidades de aplicações computacionais embarcadas e enfatizavam confiabilidade, manutenibilidade e eficiência. Notavelmente, incluíam recursos de tratamento de exceções, verificação em tempo de execução e computação paralela.
Concluiu-se que nenhuma linguagem existente atendia a esses critérios em grau suficiente,SoftTech Inc. (1976), "Evaluation of ALGOL 68, Jovial J3B, Pascal, Simula 67, and TACPOL Versus TINMAN - Requirements for a Common High Order Programming Language." - Ver também: ALGOL 68, JOVIAL J3B, Pascal, Simula 67 e TACPOL (Defense Technical Information Center - DTIC ADA037637, Relatório Número 1021-14) de modo que um concurso foi aberto para criar uma linguagem que estivesse mais próxima de cumpri-los. O projeto que venceu essa concorrência tornou-se a linguagem de programação Ada. A linguagem resultante seguiu rigorosamente os requisitos Steelman, embora não de forma exata.
miniatura|225x225px|Pintura em aquarela de Ada Lovelace Solicitações de propostas para uma nova linguagem de programação foram emitidas e quatro empresas contratadas foram selecionadas para desenvolver suas propostas sob os nomes de Red (Intermetrics, liderada por Benjamin Brosgol), Green (Honeywell, liderada por Jean Ichbiah), Blue (SofTech, liderada por John Goodenough) e Yellow (SRI International, liderada por Jay Spitzen). Em abril de 1978, após análise pública, as propostas Red e Green passaram para a fase seguinte. Em maio de 1979, a proposta Green, projetada por Jean Ichbiah na Honeywell, foi escolhida e recebeu o nome de Ada — em homenagem a Augusta Ada King, Condessa de Lovelace, geralmente conhecida como Ada Lovelace. Essa proposta foi influenciada pela linguagem LIS que Ichbiah e seu grupo haviam desenvolvido na década de 1970. O manual de referência preliminar do Ada foi publicado no ACM SIGPLAN Notices em junho de 1979. O manual de referência do padrão militar foi aprovado em 10 de dezembro de 1980 (aniversário de Ada Lovelace) e recebeu o número MIL-STD-1815 em homenagem ao ano de nascimento de Ada Lovelace. Em 1981, Tony Hoare aproveitou seu discurso do Prêmio Turing para criticar o Ada por ser excessivamente complexo e, portanto, não confiável, mas posteriormente pareceu reconsiderar no prefácio que escreveu para um livro didático de Ada.