Ada
Ada — це статично типізована мова програмування, створена для надійних, довгоживучих, критично важливих і вбудованих систем. Вона відома сильною типізацією, читабельним синтаксисом, підтримкою modular programming, concurrency, real-time programming, contracts і високою придатністю для safety-critical software.
Ada використовується в авіації, космічній галузі, оборонних системах, залізничній інфраструктурі, медичних пристроях, промисловій автоматизації, embedded systems і системах, де помилка програмного забезпечення може мати серйозні наслідки.
Основна ідея: Ada створена для програм, які мають бути зрозумілими, перевірюваними, надійними й підтримуваними протягом багатьох років.
Загальний опис
Ada — це мова з фокусом на correctness, maintainability і safety. Вона не намагається бути найкоротшою мовою для швидких скриптів, а пропонує інструменти для створення великих систем, де важливі чіткі типи, явні інтерфейси, перевірки, обмеження, модульність і контроль паралельного виконання.
Ada використовується для:
- safety-critical systems;
- avionics;
- aerospace software;
- defense systems;
- embedded systems;
- real-time systems;
- railway signaling;
- industrial control;
- medical devices;
- high-integrity software;
- long-lived enterprise systems;
- mission-critical infrastructure;
- систем із жорсткими вимогами до надійності;
- систем, які мають проходити сертифікацію.
Перевага: Ada допомагає знаходити багато помилок ще на етапі компіляції, а не під час виконання в production або на реальному пристрої.
Історія Ada
Ada була створена на замовлення Міністерства оборони США як універсальна мова для складних і критичних систем. Названа на честь Ади Лавлейс, яку часто вважають однією з перших програмісток в історії.
Основні етапи розвитку:
- Ada 83 — перший стандартизований варіант мови;
- Ada 95 — додала об’єктно-орієнтовані можливості й покращену concurrency-модель;
- Ada 2005 — покращення для real-time, containers і interfaces;
- Ada 2012 — contracts, preconditions, postconditions, type invariants;
- Ada 2022 — подальші покращення виразності, контрактів і безпечного програмування.
Важливо: Ada розвивалася як мова для інженерних систем, де на першому місці не модність, а довгострокова надійність і контроль складності.
Для чого використовується Ada
Типові сценарії використання Ada:
- авіаційне програмне забезпечення;
- системи керування польотом;
- embedded controllers;
- real-time control systems;
- defense applications;
- radar systems;
- railway signaling;
- industrial automation;
- high-integrity applications;
- медичні пристрої;
- космічне програмне забезпечення;
- сертифіковані системи;
- firmware;
- safety-critical backend components;
- довгоживучі системи з високою вартістю помилки.
Практична роль: Ada часто обирають не для швидкого прототипу, а для систем, які мають працювати правильно, передбачувано й дуже довго.
Перша програма на Ada
Простий приклад:
with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
begin
Put_Line ("Hello, world!");
end Hello;
У цьому прикладі:
- `with Ada.Text_IO;` підключає пакет для введення-виведення;
- `use Ada.Text_IO;` дозволяє викликати `Put_Line` без повного імені;
- `procedure Hello is` оголошує процедуру;
- `begin ... end Hello;` містить тіло процедури;
- `Put_Line` виводить рядок.
Суть прикладу: Ada-код читається структуровано й явно: підключення, оголошення, тіло, завершення.
Синтаксис
Ada має читабельний синтаксис із ключовими словами, які явно позначають структуру програми.
Приклад:
procedure Example is
Count : Integer := 10;
begin
if Count > 0 then
Count := Count + 1;
end if;
end Example;
Особливості синтаксису:
- явне завершення блоків;
- сильна типізація;
- окремі `procedure` і `function`;
- packages;
- records;
- generics;
- exceptions;
- tasking;
- contracts;
- розділення specification і body;
- читабельність для code review.
Перевага синтаксису: Ada надає перевагу явності й структурі, що важливо для великих команд і сертифікованих систем.
Типізація
Ada має сильну статичну типізацію. Це означає, що компілятор суворо контролює сумісність типів.
Приклад:
type Meters is new Float;
type Feet is new Float;
Distance_M : Meters := 10.0;
Distance_F : Feet := 30.0;
Хоча `Meters` і `Feet` базуються на `Float`, це різні типи.
Головна перевага strong typing: Ada допомагає не змішувати різні сутності лише тому, що вони мають однакове машинне представлення.
Scalar types
Ada підтримує числові й логічні типи.
Приклад:
Count : Integer := 10;
Price : Float := 19.99;
Active : Boolean := True;
Letter : Character := 'A';
Поширені типи:
- `Integer`;
- `Natural`;
- `Positive`;
- `Float`;
- `Boolean`;
- `Character`;
- `String`;
- власні числові типи;
- enumeration types;
- range types.
Практична роль: Ada заохочує створювати власні типи для доменних понять, а не використовувати один загальний тип для всього.
Range types
Ada дозволяє створювати типи з обмеженим діапазоном.
Приклад:
type Percent is range 0 .. 100;
Progress : Percent := 75;
Якщо значення виходить за межі діапазону, це може бути виявлено під час перевірок.
Практична роль: range types дозволяють перенести частину бізнес-правил або фізичних обмежень у саму систему типів.
Enumeration types
Enumeration type описує набір допустимих значень.
Приклад:
type Status is (New, Active, Blocked, Closed);
Current_Status : Status := Active;
Enumeration types корисні для:
- статусів;
- режимів роботи;
- станів автомата;
- команд;
- результатів операцій;
- рівнів доступу.
Перевага: enumeration types роблять стани системи явними й обмеженими відомим набором значень.
Records
Record — структура даних із полями.
Приклад:
type User is record
Name : String (1 .. 30);
Age : Natural;
Active : Boolean;
end record;
Records використовуються для:
- доменних об’єктів;
- повідомлень;
- конфігурацій;
- структур датчиків;
- протоколів;
- даних embedded-систем;
- записів у файлах;
- станів системи.
Практична роль: records дозволяють об’єднати пов’язані дані в одну структуровану сутність.
Arrays
Ada підтримує масиви з явно заданими межами.
Приклад:
type Int_Array is array (1 .. 5) of Integer;
Numbers : Int_Array := (1, 2, 3, 4, 5);
Доступ:
Numbers (1) := 10;
Важливо: в Ada межі масиву є частиною його опису. Це допомагає уникати багатьох помилок індексації.
Strings
У Ada `String` — це масив символів із фіксованими межами.
Приклад:
Name : String (1 .. 5) := "Alice";
Для гнучкішої роботи з текстом можуть використовуватися стандартні пакети, наприклад `Ada.Strings.Unbounded`.
Приклад:
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
Name : Unbounded_String := To_Unbounded_String ("Alice");
Увага: робота з рядками в Ada більш формальна, ніж у багатьох скриптових мовах, бо мова орієнтована на контроль і передбачуваність.
Constants
Константи оголошуються з ключовим словом `constant`.
Приклад:
Max_Users : constant Integer := 100;
Pi : constant Float := 3.14159;
Практична роль: константи роблять код зрозумілішим і допомагають уникати магічних чисел.
Procedures
Procedure виконує дію, але не повертає значення як результат функції.
Приклад:
procedure Print_Message (Message : String) is
begin
Put_Line (Message);
end Print_Message;
Виклик:
Print_Message ("System started");
Суть procedure: процедура використовується для дії: виводу, зміни стану, обробки події або виконання кроку алгоритму.
Functions
Function повертає значення.
Приклад:
function Add (A, B : Integer) return Integer is
begin
return A + B;
end Add;
Виклик:
Result : Integer := Add (2, 3);
Практична роль: function підходить для обчислень, перевірок і логіки, яка має повернути результат.
Parameters
Параметри в Ada можуть мати режими:
- `in`;
- `out`;
- `in out`.
Приклад:
procedure Increment (Value : in out Integer) is
begin
Value := Value + 1;
end Increment;
`in` — вхідний параметр.
`out` — вихідний параметр.
`in out` — параметр і читається, і змінюється.
Важливо: явні режими параметрів допомагають розуміти, чи функція лише читає значення, чи може його змінити.
If
Умови пишуться через `if`, `elsif`, `else`.
Приклад:
if Age >= 18 then
Put_Line ("Adult");
elsif Age > 0 then
Put_Line ("Minor");
else
Put_Line ("Invalid age");
end if;
Практична роль: if використовується для перевірки станів, обмежень, режимів і бізнес-правил.
Case
`case` використовується для вибору між варіантами.
Приклад:
case Current_Status is
when New =>
Put_Line ("New");
when Active =>
Put_Line ("Active");
when Blocked =>
Put_Line ("Blocked");
when Closed =>
Put_Line ("Closed");
end case;
Перевага: case добре працює з enumeration types і робить обробку станів явно структурованою.
Loops
Ada має кілька типів циклів.
Простий цикл:
loop
Put_Line ("Running");
exit;
end loop;
Цикл `for`:
for I in 1 .. 5 loop
Put_Line (Integer'Image (I));
end loop;
Цикл `while`:
while Count > 0 loop
Count := Count - 1;
end loop;
Практична роль: цикли використовуються для обробки масивів, черг, сенсорних даних, станів і повторюваних процедур.
Packages
Package — один із головних механізмів модульності в Ada.
Package зазвичай має:
- specification;
- body.
Specification описує публічний інтерфейс.
Body містить реалізацію.
Приклад specification:
package Math_Utils is
function Add (A, B : Integer) return Integer;
end Math_Utils;
Приклад body:
package body Math_Utils is
function Add (A, B : Integer) return Integer is
begin
return A + B;
end Add;
end Math_Utils;
Головна роль packages: вони дозволяють відокремити інтерфейс від реалізації й будувати великі системи з чіткими межами.
Private types
Ada дозволяє приховувати реалізацію типу через `private`.
Приклад:
package Accounts is
type Account is private;
procedure Deposit (A : in out Account; Amount : Integer);
function Balance (A : Account) return Integer;
private
type Account is record
Current_Balance : Integer := 0;
end record;
end Accounts;
Практична роль: private types дозволяють користувачу пакета працювати з типом через контрольований API, не знаючи внутрішньої структури.
Generics
Generics дозволяють писати узагальнений код.
Приклад:
generic
type Element_Type is private;
package Stack_Package is
procedure Push (Item : Element_Type);
function Pop return Element_Type;
end Stack_Package;
Generics використовуються для:
- контейнерів;
- алгоритмів;
- reusable modules;
- типобезпечних структур;
- абстракцій над типами;
- бібліотек.
Практична роль: generics дозволяють повторно використовувати код без втрати типобезпеки.
Exceptions
Ada має механізм exceptions.
Приклад:
begin
-- risky operation
null;
exception
when Constraint_Error =>
Put_Line ("Constraint error");
when others =>
Put_Line ("Unknown error");
end;
Exceptions використовуються для:
- помилок меж;
- неправильних значень;
- помилок вводу-виводу;
- непередбачених станів;
- захищеного завершення операцій.
Важливо: у safety-critical системах exceptions потрібно використовувати дисципліновано й відповідно до стандартів проєкту.
Contracts
У сучасній Ada підтримуються контракти, зокрема preconditions і postconditions.
Приклад:
function Divide (A, B : Integer) return Integer
with Pre => B /= 0;
Precondition описує, що має бути істинним перед викликом.
Postcondition описує, що має бути істинним після виконання.
Практична роль: contracts роблять припущення й гарантії коду явними, що допомагає тестуванню, review і формальній перевірці.
Type invariants
Type invariant описує умову, яка має залишатися істинною для значень певного типу.
Приклад ідеї:
type Account is private
with Type_Invariant => Balance (Account) >= 0;
Type invariants корисні для:
- фінансових об’єктів;
- станів системи;
- фізичних обмежень;
- безпечних структур;
- критичних правил домену.
Практична роль: invariant дозволяє формально закріпити правило, яке не повинно порушуватися протягом життя об’єкта.
SPARK
SPARK — це підмножина й інструментальна екосистема Ada, орієнтована на формальну верифікацію й high-integrity software.
SPARK використовується для:
- формального доведення властивостей коду;
- доведення відсутності runtime errors;
- перевірки contracts;
- safety-critical systems;
- security-critical systems;
- сертифікованого ПЗ;
- embedded software;
- авіації й оборонних систем.
Суть SPARK: це підхід, який дозволяє не лише тестувати код, а й математично доводити частину його властивостей.
Tasking
Ada має вбудовану підтримку concurrency через tasks.
Приклад:
task Hello_Task;
task body Hello_Task is
begin
Put_Line ("Hello from task");
end Hello_Task;
Tasks використовуються для:
- паралельних процесів;
- real-time systems;
- control loops;
- sensor polling;
- communication handlers;
- embedded tasks;
- конкурентних операцій.
Головна перевага: concurrency у Ada є частиною мови, а не лише зовнішньою бібліотекою.
Protected objects
Protected object забезпечує безпечний доступ до спільних даних між tasks.
Приклад ідеї:
protected Counter is
procedure Increment;
function Value return Integer;
private
Count : Integer := 0;
end Counter;
Protected objects використовуються для:
- синхронізації;
- counters;
- shared buffers;
- protected state;
- coordination between tasks;
- real-time safe access patterns.
Практична роль: protected objects допомагають уникати неконтрольованого shared state і race conditions.
Real-time systems
Ada добре підходить для real-time systems, де важлива передбачуваність виконання.
Real-time Ada може включати:
- task priorities;
- protected objects;
- timing events;
- delays;
- Ravenscar profile;
- deterministic behavior;
- scheduling policies;
- bounded resources;
- embedded runtime restrictions.
Важливо: real-time означає не просто “швидко”, а “вчасно й передбачувано”.
Ravenscar profile
Ravenscar profile — обмежений профіль Ada tasking для високонадійних real-time систем.
Він використовується для:
- safety-critical embedded systems;
- передбачуваної concurrency;
- спрощеного аналізу;
- обмеження небезпечної динаміки;
- сертифікації;
- real-time scheduling.
Практична роль: Ravenscar profile допомагає зробити concurrency більш передбачуваною й придатною для аналізу.
Embedded systems
Ada часто використовується у вбудованих системах.
Типові задачі:
- control loops;
- device drivers;
- sensor processing;
- actuator control;
- flight control;
- industrial controllers;
- firmware;
- communication protocols;
- safety monitors;
- hardware abstraction.
Практична роль: Ada підходить для embedded-систем, де важливі контроль пам’яті, типобезпека, часові обмеження й надійність.
Avionics
Ada історично має сильну роль в авіаційному ПЗ.
В авіації важливі:
- сертифікація;
- traceability;
- deterministic behavior;
- safety analysis;
- formal requirements;
- fault handling;
- real-time execution;
- long-term maintainability.
Важливо: в авіації мова програмування має підтримувати процеси верифікації, документації, контролю змін і аналізу ризиків.
Defense systems
Ada часто асоціюється з оборонними й військовими системами.
Можливі напрями:
- command and control;
- radar;
- communication systems;
- mission systems;
- navigation;
- embedded controllers;
- simulation;
- high-integrity software;
- secure systems.
Практична роль: Ada використовується там, де важлива не лише функціональність, а й довіра до поведінки системи.
Object-oriented programming
Ada підтримує об’єктно-орієнтоване програмування, але її OOP-модель відрізняється від Java або C++.
Ada має:
- tagged types;
- type extension;
- dispatching;
- interfaces;
- private types;
- packages as modular boundaries.
Приклад tagged type:
type Shape is tagged record
X : Float;
Y : Float;
end record;
Практична роль: Ada підтримує OOP, але не змушує будувати всю систему навколо класів.
Standard library
Ada має стандартну бібліотеку, яка включає пакети для:
- введення-виведення;
- рядків;
- контейнерів;
- календаря;
- числових операцій;
- tasking;
- real-time;
- exceptions;
- streams;
- command line;
- text processing.
Приклад:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Calendar;
Практична роль: стандартні пакети Ada дають основу для portable й структурованого коду.
GNAT
GNAT — популярний компілятор Ada, частина GCC-екосистеми.
GNAT використовується для:
- компіляції Ada;
- розробки Ada-проєктів;
- SPARK;
- embedded targets;
- cross-compilation;
- static analysis;
- integration з build systems;
- навчання й production.
Практична роль: GNAT є одним із ключових інструментів сучасної Ada-екосистеми.
Alire
Alire — package manager і build tool для Ada-екосистеми.
Alire використовується для:
- керування залежностями;
- створення проєктів;
- пошуку бібліотек;
- стандартизації workflow;
- спрощення старту;
- open-source Ada development.
Практична роль: Alire робить сучасну Ada-розробку зручнішою й ближчою до звичних package manager workflow.
Ada і C
Ada часто порівнюють із C, особливо в embedded і systems programming.
| Критерій | Ada | C |
|---|---|---|
| Типізація | Дуже сильна | Слабша |
| Безпека | Більше перевірок на рівні мови | Більше відповідальності на програмісті |
| Embedded | Сильна ніша | Дуже сильна ніша |
| Низькорівневий контроль | Є, але структурованіший | Дуже прямий |
| Safety-critical | Дуже придатна | Потребує суворих стандартів і аналізу |
Висновок: C дає максимальну простоту й контроль, а Ada додає сильнішу типізацію, модульність і механізми для safety-critical коду.
Ada і C++
Ada і C++ можуть використовуватися для складних систем, але мають різну філософію.
| Критерій | Ada | C++ |
|---|---|---|
| Основний фокус | Надійність, safety, long-lived systems | Systems programming, performance, general-purpose |
| Складність мови | Висока, але орієнтована на явність | Дуже висока, багато стилів |
| Типізація | Сильна, доменно-орієнтована | Сильна, але з великою кількістю низькорівневих можливостей |
| Concurrency | Вбудовані tasking-механізми | Бібліотеки, threads, modern concurrency |
| Safety-critical | Сильна історична ніша | Використовується, але потребує суворих правил |
Висновок: C++ ширший і популярніший, а Ada більш спеціалізована для надійних і критичних систем.
Ada і Rust
Ada і Rust обидві можуть розглядатися для безпечнішого systems programming, але мають різний фокус.
| Критерій | Ada | Rust |
|---|---|---|
| Історична ніша | Safety-critical, defense, avionics, embedded | Memory-safe systems programming, modern infrastructure |
| Memory safety | Сильні перевірки й контроль, але інша модель | Ownership і borrow checker |
| Concurrency | Tasking, protected objects, real-time профілі | Ownership-based safety, async, threads |
| Екосистема | Нішевіша, safety-oriented | Швидко зростає |
| Сертифікація | Сильна історія в критичних системах | Активно розвивається в цьому напрямі |
Висновок: Rust є сучасним вибором для memory-safe systems programming, а Ada має зрілу історію в safety-critical і сертифікованих системах.
Ada і Java
| Критерій | Ada | Java |
|---|---|---|
| Основна ніша | Critical, embedded, real-time systems | Enterprise backend, JVM applications |
| Runtime | Може бути дуже контрольованим | JVM |
| Типізація | Сильна, з range і domain-specific types | Статична, object-oriented |
| Real-time | Сильні можливості в мові | Потребує спеціальних підходів |
| Deployment | Часто embedded/native | JVM-based |
Висновок: Java сильна в enterprise, а Ada — у системах, де потрібні low-level контроль, predictability і high integrity.
Ada і Python
Ada і Python мають майже протилежні ніші.
| Критерій | Ada | Python |
|---|---|---|
| Типізація | Статична й сильна | Динамічна |
| Основна ніша | Critical systems, embedded, real-time | Automation, data science, web, scripting, AI |
| Швидкість прототипування | Нижча | Вища |
| Надійність компіляції | Дуже сильна | Значно менше compile-time перевірок |
| Runtime | Контрольований native/embedded сценарій | Інтерпретований runtime |
Висновок: Python зручний для швидкої автоматизації й аналізу, а Ada — для систем, де потрібні суворі гарантії й контроль.
Переваги Ada
Основні переваги Ada:
- сильна статична типізація;
- range types;
- contracts;
- packages;
- private types;
- generics;
- вбудована concurrency-модель;
- protected objects;
- real-time support;
- висока читабельність;
- придатність для safety-critical systems;
- SPARK і formal verification;
- контроль меж масивів;
- явні інтерфейси;
- довгострокова підтримуваність;
- хороша придатність для сертифікації.
Головна перевага: Ada допомагає будувати системи, де правильність, контроль і підтримуваність важливіші за мінімальну кількість символів у коді.
Обмеження Ada
Ada має обмеження.
Можливі проблеми:
- менша популярність, ніж у C, C++, Java або Python;
- менша кількість розробників;
- вищий поріг входу;
- більш формальний синтаксис;
- менша ecosystem для web і AI;
- не найкращий вибір для швидких прототипів;
- обмеженість сучасних бібліотек порівняно з масовими мовами;
- складність hiring;
- потреба в інженерній дисципліні;
- іноді консервативне середовище використання.
Помилка: обирати Ada для задач, де потрібна швидка web-розробка або широка бібліотечна екосистема. Її сила — в іншому класі систем.
Коли варто використовувати Ada
Ada добре підходить для:
- safety-critical systems;
- embedded systems;
- avionics;
- aerospace;
- defense;
- railway signaling;
- industrial control;
- real-time systems;
- high-integrity applications;
- систем із довгим життєвим циклом;
- систем із високою вартістю помилки;
- формальної верифікації через SPARK;
- проєктів із суворими вимогами до якості.
Практична порада: Ada варто обирати тоді, коли важливі надійність, аналізованість, типобезпека, real-time поведінка й довгострокова підтримка.
Коли Ada може бути невдалим вибором
Ada може бути не найкращим вибором для:
- frontend;
- web CRUD-застосунків;
- data science;
- AI/ML;
- одноразових скриптів;
- стартап-прототипів;
- mobile apps;
- команд без досвіду critical systems;
- проєктів, де важлива максимальна кількість готових бібліотек;
- задач, де Python, JavaScript, Go або Java простіше вписуються в стек.
Важливо: Ada не є мовою “для всього”. Вона особливо цінна там, де помилки дорогі, а система має бути передбачуваною.
Безпека Ada-коду
Ada допомагає зменшити частину класичних помилок, але безпека системи залежить не лише від мови.
Потрібно контролювати:
- некоректні вимоги;
- помилки бізнес-логіки;
- небезпечну інтеграцію з C;
- доступ до пам’яті в низькорівневому коді;
- concurrency bugs;
- race conditions;
- exception handling;
- input validation;
- secure boot;
- firmware updates;
- cryptography;
- physical access;
- supply chain;
- compiler і runtime configuration.
Критично: сильна типізація не замінює threat modeling, security review, тестування, аудит і контроль середовища виконання.
Приватність даних
Ada може використовуватися в системах, які працюють із чутливими даними, telemetry, медичними записами, військовими даними або промисловою інформацією.
Потрібно контролювати:
- логування;
- telemetry;
- error reports;
- конфігураційні файли;
- debug interfaces;
- embedded storage;
- network protocols;
- access control;
- encryption;
- firmware dumps;
- test data;
- maintenance tools.
Правило: у критичних системах приватність і безпека даних мають проектуватися разом із архітектурою, а не додаватися наприкінці.
Хороші практики Ada
Рекомендовано:
- створювати доменні типи замість загальних `Integer` або `Float`;
- використовувати range constraints;
- розділяти specification і body;
- робити пакети малими й зрозумілими;
- використовувати contracts;
- явно описувати preconditions і postconditions;
- уникати зайвої глобальної змінності;
- документувати інтерфейси;
- тестувати граничні значення;
- аналізувати concurrency;
- застосовувати SPARK там, де потрібні формальні гарантії;
- уникати непотрібної складності;
- контролювати exceptions;
- дотримуватися coding standards для critical systems.
Головне правило: хороший Ada-код має бути явним, типобезпечним, модульним і придатним для аналізу.
Типові помилки початківців
Поширені помилки:
- використовувати занадто загальні типи;
- ігнорувати range constraints;
- не розуміти різницю між procedure і function;
- створювати великі packages без чіткої відповідальності;
- недооцінювати specification/body separation;
- неправильно працювати з fixed-size strings;
- не перевіряти граничні значення;
- зловживати exceptions;
- не враховувати task synchronization;
- думати про Ada як про C із іншим синтаксисом;
- не використовувати contracts там, де вони доречні;
- писати занадто складний generic-код без потреби.
Небезпека: Ada дає багато механізмів безпеки, але неправильна архітектура або нечіткі вимоги все одно можуть призвести до помилок.
Приклади задач на Ada
Обчислення суми
with Ada.Text_IO; use Ada.Text_IO;
procedure Sum_Example is
A : Integer := 10;
B : Integer := 20;
Result : Integer;
begin
Result := A + B;
Put_Line ("Result:" & Integer'Image (Result));
end Sum_Example;
Власний тип із діапазоном
procedure Percent_Example is
type Percent is range 0 .. 100;
Progress : Percent := 75;
begin
null;
end Percent_Example;
Enumeration для статусу
with Ada.Text_IO; use Ada.Text_IO;
procedure Status_Example is
type Status is (New, Active, Blocked, Closed);
Current : Status := Active;
begin
case Current is
when New =>
Put_Line ("New");
when Active =>
Put_Line ("Active");
when Blocked =>
Put_Line ("Blocked");
when Closed =>
Put_Line ("Closed");
end case;
end Status_Example;
Record
procedure User_Example is
type User is record
Age : Natural;
Active : Boolean;
end record;
Current_User : User := (Age => 25, Active => True);
begin
null;
end User_Example;
Procedure з параметром in out
procedure Increment_Example is
procedure Increment (Value : in out Integer) is
begin
Value := Value + 1;
end Increment;
Count : Integer := 0;
begin
Increment (Count);
end Increment_Example;
Підказка: в Ada-прикладах важливо дивитися не лише на синтаксис, а й на типи, межі, контракти й явність інтерфейсів.
Джерела
- Ada Reference Manual.
- AdaCore Documentation.
- GNAT User’s Guide.
- SPARK User’s Guide.
- Ada 2012 і Ada 2022 матеріали.
- Документація Ravenscar profile.
- Матеріали щодо safety-critical software, embedded systems, real-time systems і formal verification.
- Coding standards для high-integrity і сертифікованого програмного забезпечення.
Висновок
Ada — це мова програмування для надійних, довгоживучих, embedded, real-time і safety-critical систем. Вона пропонує сильну типізацію, range constraints, packages, private types, generics, contracts, exceptions, tasking, protected objects і підтримку формальної верифікації через SPARK.
Ada не є типовим вибором для web, AI або швидких скриптів. Її головна цінність — у системах, де помилки дорогі, поведінка має бути передбачуваною, а код повинен залишатися підтримуваним протягом багатьох років.
Головна думка: Ada — це мова інженерної дисципліни. Вона допомагає будувати програмне забезпечення, яке можна аналізувати, перевіряти, сертифікувати й підтримувати в критичних умовах.
Див. також
- Програмування
- Мова програмування
- Мова програмування C
- C++
- Rust
- Java
- Python
- SPARK
- Embedded systems
- Real-time systems
- Safety-critical systems
- Avionics
- Aerospace
- Defense software
- Formal verification
- High-integrity software
- Concurrency
- Налагодження коду
- Логування
- Безпека застосунків
- Приватність даних