
A linguagem de programação Ada nasceu em meados da década de 1970, quando o Departamento de Defesa dos EUA e o Departamento de Defesa britânico decidiram substituir centenas de linguagens de programação especializadas por sistemas de computação embarcados, cada vez mais utilizados em projetos militares. A linguagem Ada foi desenvolvida de tal forma que era a única linguagem capaz de trabalhar em todos esses sistemas embarcados e, ao mesmo tempo, garantir confiabilidade e desempenho em um nível não inferior aos especializados.
Após a atualização de 1995, a linguagem foi adaptada para sistemas de uso geral, adicionando programação orientada a objetos, sem perder de vista os valores principais - confiabilidade, facilidade de suporte e eficiência. Hoje, o software escrito em Ada forma a base não apenas de equipamentos militares, mas também de projetos comerciais na área de aviônicos e sistemas de controle de tráfego aéreo. O código para Ada controla mísseis como
Arian-4 e 5, muitos satélites e inúmeros outros sistemas nos quais pequenos defeitos podem ter sérias conseqüências.
Talvez o Ada seja adequado para uso em seu próximo projeto incorporado.
Planejamento Militar da Qualidade
Para selecionar uma nova linguagem de programação, o Ministério da Defesa reuniu um “
Grupo de Trabalho sobre Idiomas de Alta Ordem (HOLWG)], composto por especialistas militares e científicos cuja tarefa era compilar uma lista de consultas e selecionar idiomas candidatos. Como resultado, o chamado "
Pedidos de Stillman ":
Os principais pontos dos pedidos foram:
- Um fluxo de trabalho flexível de uso geral que se adapta às necessidades de aplicativos de computação incorporados.
- Confiabilidade A linguagem deve facilitar o design e desenvolvimento de programas confiáveis.
- Facilidade de suporte. O código deve ser legível e as soluções de software claras.
- Facilidade de produzir código eficiente. Deve ser possível identificar facilmente projetos ineficientes.
- Sem complexidade desnecessária. A estrutura semântica deve ser consistente e minimizar o número de conceitos.
- Independência do carro. O idioma não deve estar associado a nenhum detalhe do sistema operacional ou hardware.
- Definição completa. Todas as partes do idioma devem ser definidas total e explicitamente.
O relatório concluiu com a opinião de que a primeira linha de defesa contra problemas de software é impedir que os programadores cometam erros. Ao eliminar a possibilidade de cometer um erro sutil, por exemplo, por meio de conversões implícitas de tipo ou outras construções perigosas, automaticamente tornamos o código mais seguro e facilitamos seu suporte.
O grupo concluiu que, embora nenhum dos idiomas existentes na época fosse adequado às necessidades do Ministério da Defesa, era bastante realista criar um novo idioma que atendesse a todas essas questões. Quatro designers fizeram isso. O processo de seleção intermediária selecionou os dois métodos de trabalho mais adequados e, como resultado, apenas um idioma venceu o concurso e recebeu o nome "
Ada ".

Proteção padrão incorporada
O sistema de tipos no Inferno não é apenas estrito - às vezes é chamado de super-estrito porque não permite nenhuma conversão implícita de tipo. Pegue, por exemplo, este trecho de código C:
typedef uint32_t myInt; myInt foo = 42; uint32_t bar = foo;
Este é um código válido; ele irá compilar, iniciar e produzir um resultado óbvio, indicando a resposta para a principal questão da vida, do universo e tudo isso. No inferno, isso não vai funcionar:
type MyInt is Integer; foo: MyInt; bar: Integer; foo := 42; bar := foo;
O compilador gerará um erro, porque Integer e MyInt não são a mesma coisa. A principal vantagem dessa abordagem é que, se o programador alterar a definição de tipo, milhares de conversões implícitas de tipo em toda a base de código não explodirão o programa. Em vez disso, os tipos devem ser explicitamente convertidos - isso promove um bom código, evitando a confusão de tipos "bastante semelhantes".
Qualquer programador preso em um pântano a partir de uma mistura de definições padrão dos tipos C, Linux e Win32 pode apreciar a falta de necessidade de vasculhar inúmeras páginas de documentação e código mal formatado para entender qual typedef ou macro contém uma definição real de algo que apenas que impedia a compilação ou rastreava durante a depuração.

O Ada adiciona camadas adicionais de proteção nas verificações nos estágios de compilação e lançamento. No Ada, o programador deve especificar explicitamente as instruções de fechamento dos blocos e os limites nos quais o valor da variável deve caber. O Ada não define tipos padrão como int ou float, mas exige que o programador crie tipos com um intervalo específico desde o início. Isso também se aplica a cadeias de caracteres - com exceção de cadeias ilimitadas, todas as cadeias têm um comprimento fixo.
No estágio da operação, você pode verificar erros como acesso incorreto à memória, estouros de buffer, exceder os limites definidos, erros ± 1, acesso ao array. Eles podem ser processados com segurança, em vez de descartar o aplicativo inteiro.
Ada implementa um modelo de tipos de referência em vez de ponteiros de baixo nível. Cada tipo de referência é processado pelo conjunto de memórias, por padrão, ou por um programador específico, se necessário, para trabalhar com implementações de memória NUMA mais exóticas. Um programador nunca precisa acessar a memória diretamente, ele deve usar um manipulador de pool de memória.
Finalmente, o compilador ou programa em tempo de execução decide como passar dados para ou da função. E embora seja necessário indicar a direção da transmissão de cada parâmetro ('in', 'out' ou 'in out'), a decisão final sobre se os dados são transmitidos através de registros, pilhas ou por referência é tomada pelo compilador ou programa em tempo de execução, mas não é um programador. Isso evita problemas de estouro de pilha.
O perfil de Ravenscar e o dialeto
SPARK são subconjuntos de Ada, com o último focado em contratos. Com o tempo, os recursos desses subconjuntos foram
transferidos para a especificação do idioma principal.
Ada programação hoje
A ANSI estabeleceu a especificação Ada 83 em 1983. Em seguida, o Intel 80286 acabou de ser lançado e o Motorola 68000 tinha apenas quatro anos de idade. Era o início dos computadores domésticos, bem como uma transição desajeitada dos anos 1970 para os anos 80, quando a popularidade dos microcontroladores começou a crescer. Imagine o microcontrolador
Intel 8051 e sua impressionante EPROM de 4kb e 128B de RAM.

Os microcontroladores populares hoje em dia são muitas vezes mais poderosos do que aqueles que foram em 1983. Você pode usar qualquer ARM, AVR, RISC-V, etc. (ou kit Lego Mindstorms NXT) e comece a desenvolver para ele usando as mesmas ferramentas baseadas em C. Não é de surpreender que o popular
compilador GNAT Ada seja baseado no GCC. Também em desenvolvimento no projeto
DragonEgg estão ferramentas baseadas no LLVM.
Existem duas versões das Ada Tools baseadas no GCC. A opção AdaCore é suportada comercialmente, mas tem suas próprias características. A opção Free Software Foundation é naturalmente gratuita e tem funcionalidade comparável ao AdaCore.
Para começar com facilidade, use o
GNAT Programming Studio IDE (GPS), fornecido com o
AdaCore (uma
cópia no Github ), ou escreva o código em um editor de texto e compile-o manualmente ou usando Makefiles. O kit de ferramentas aqui é um pouco mais complicado que o de C ou C ++, mas o desenvolvimento é facilitado pelo utilitário gnatmake, que inclui todas as ferramentas e funciona aproximadamente como o GCC.
Um exemplo de um projeto pequeno mas não trivial em Ada, escrito por seu humilde servidor como um analisador de argumentos da linha de comando. Lá você encontrará o Makefile localizado na pasta ada / project, onde as pastas são definidas onde você pode encontrar os arquivos de especificação de pacotes (.ads) e os próprios pacotes (.adb).
Esses arquivos correspondem aproximadamente aos arquivos com cabeçalhos e códigos de C e C ++; no entanto, eles também têm diferenças importantes. Ao contrário de C, Ada não possui um pré-processador e não combina código e cabeçalhos para criar arquivos compilados. Em vez disso, há um link para o nome do pacote especificado na especificação. O nome do arquivo .ads também não precisa corresponder ao nome do pacote. Isso oferece grande flexibilidade e evita problemas comuns em C com dependência cíclica ou a necessidade de vincular cabeçalhos em uma ordem específica.
Para onde ir a seguir
Depois de baixar o kit de ferramentas GNAT, iniciando o GPS ou Vim / Emacs, e por um tempo olhando o cursor piscando em uma página em branco, você pode pensar sobre por onde começar. Felizmente, recentemente
cobrimos um
projeto baseado em Ada usando o núcleo PicoRV32 RISC-V. Ele usa o popular ICE40LP8K CPLD, que é suportado por FPGAs de código aberto, como o Yosys.

Em termos de documentação, existem
artigos introdutórios para iniciantes voltados para desenvolvedores de Java e C ++, a
referência AdaCore , a referência WikiBooks e, é claro, a documentação
Programming in Ada 2012 . Essas talvez sejam as referências mais abrangentes, com exceção do LRM (945 páginas).
A linguagem Ada, embora seja bastante rara para os amantes da programação, é uma linguagem completamente aberta com ferramentas de desenvolvimento confiáveis com suporte comercial e é usada para criar software para tudo, desde mísseis balísticos intercontinentais e F-15 até o firmware de dispositivos médicos. Embora essa seja uma linguagem bastante complicada, se você ultrapassar os limites básicos, ela definitivamente deve ser incluída na lista de idiomas que você já usou em seus projetos - até mesmo para tornar seu currículo mais interessante.