Ada (programlama dili)

**Ada**, yapısal, statik tipli, zorunlu, geniş spektrumlu ve nesne yönelimli bir üst düzey bilgisayar programlama dilidir. Pascal ve diğer dillerin genişletilmiş halidir. Gömülü design-by-contract (DbC), güçlü yazımı, açık eşzamanlı, senkronize mesaj geçişi, korunmuş objeli ve belirsiz bir dildir. Ada kod güvenliğini ve sürdürebilirliğini derleyicide hataları bularak geliştirdi.

Ada Fransız bilgisayar bilimcisi Jean Ichbiah ve ekibi tarafından Amerika Birleşik Devletleri Savunma Bakanlığı ile sözleşmeli olarak geliştirildi. Ordudaki çeşitli donanımları çalıştıracak ortak bir yazılım olarak düşünülmüştür. Temel alınan diller arasında ALGOL, Pascal ve PL/1 vardı ama C yoktu.

İngiliz şairi Lord Byron'ın 1834'te ilk bilgisayar makinesi sayılacak Charles Babbage'in analitik makinesini destekleyen kızı Lady Ada Lovelace (1815-1852)'ın ismini taşır. 95'te dinamik iletimi içeren nesne yönelimli programlama desteği dahil edildi.

## Özellikler
Ada çok gelişmiş yazılım sistemlerinin gelişimi için oluşturulmuştur. Ada paketleri ayrı ayrı derlenebilir ve dahası, tutarlılık kontrolü için yürütme olmadan Ada paket tayini ayrı ayrı derlenebilir. Bu yürütme başlamadan önce kurulum safhasındaki problemlerin bulunmasına imkân sağlar. Derleme zamanındaki kontroller, farklı dillerdeki oluşabilecek fark edilmeyen hataları azaltmak için desteklendi.

Ada'nın özellikleri Güçlü yazımı, modüler programlama mekanikleri (paketler), paralel işleme (görev ve mesaj senkronizasyonu), hata işleme ve genel programlamayı kapsar.

Ada'nın sözdizimi, temel işlemleri gerçekleştirme yöntemlerinin yolunu en aza indirir ve İngilizce anahtar kelimelerini tercih eder (mesela "or else" ve "and then") veya sembolleri tercih eder ("||" ve "&&"). Ada basit "+", "-", "*","/" matematik operatörleri kullanır ancak diğer sembolleri kullanmaktan kaçınır. Kod blokları "declare","begin", "and" ve "end" ile sınırlıdır ve ancak döngülerle (*if ... end if*, *loop ... end loop) birlikte kullanılır.*

Ada çok geniş uygulamalar geliştirilmek için tasarlanmıştır. Ada'nın paketleri ayrı ayrı şekilde derlenebilir. Ada'nın paket özellikleri aynı zamanda tutarlılığı kontrol etmek için gerekli uygulamalar olmadan da derlenebilir. Bu da geliştirilen uygulamanın erken safhasında hatayı tespit etme imkânı sağlar.

Çok sayıda derleyici kontrolcüsü çalıştırılana kadar tespit edilemeyen hataları tespit edebilmesi için gereken komutların projeye eklenmesi dışında kendisi hataları tespit edebilir. Güçlü yazımlara bağlılığı birçok sıradan kod hatalarını (yanlış parametre, dizi ihlalleri, geçersiz referanslar, eşleşmeyen tipler, vb.) derleme sırasında veya çalışma sırasında tespit etmede yarar sağlar. Eşzamanlı çalışma dilin bir parçası olduğu için derleyeci bazı durumlarda potansiyel sorunları tespit edebilir.

## Tarihçesi
1970'lerde Amerika Birleşik Devletleri Savunma Bakanlığı gömülü bilgisayar sistemlerinde farklı programlama dillerinin kullanılmasından endişelendi. Çoğu eski veya donanıma bağlı idi ve hiçbiri modüler programlamayı desteklemiyordu. 1975'te Yüksek Derece Dil Çalışma Grubu Amerika Birşelik Devletleri Savunma Bakanlığı ve Birleşik Krallık Savunma Bakanlığı gereksinimlerine uygun olan programlama dilini bulmak için veya oluşturmak için kuruldu. Birçok denemelerden sonra nihai programlama dili Ada olarak adlandırıldı. Bu tür projeler için kullanılan üst düzey programlama dillerinin toplam sayısı 1983'te 450'ye 1996'da 37'ye düştü. HOLFG Grubu Steelman dil gereksinimlerini oluşturdu. Bir programlama dilinin karşılaması gerektiğini düşündükleri gereksinimleri belirten bir dizi belge yayınlamışlardı. Mevcut olan birçok dil resmi olarak yeniden gözden geçirildi, ancak 1977'de takım hiçbir dilin gereksinimlerini karşılayamadıkları kanısına vardı. 1978 Nisan'ında, kamu incelemesinden geçtikten sonra yeni bir programlama dili için tasarı talepleri belirtildi ve dört yazılımcı istenilen talepleri karşılamak için Kırmızı (Benjamin Brosgol liderliğinde Intermetrics) Yeşil (Jean Ichbiah liderliğinde CII Honeywell Bull) Mavi John Goodenough liderliğinde SofTech) ve Sarı (Jay Spitzen liderliğinde SRI International) isimleri verilen yazılımcılar işe alındı. Nisan 1978'de kamu denetiminden sonra, Kırmızı ve Yeşil tasarılar sonraki aşamaya geçti. Mayıs 1979'da Jean Ichbiah tarafından CII Honeywell Bull'da tasarlanan proje seçildi ve Ada ismi verildi. Ada dilinden sonra, bu teklif Ichibah ve ekibinin 1970 lerde geliştirdiği LIS dilinden etkilendi. Ada'nın ilk kitabı Haziran 1979'da ACM SIGPLAN Notices'da yayınlandı. 10 Aralık 1980'de (Ada Lovelace'in doğum günü) kitap askeri standartlarını karşıladığını onayladı ve Ada Lovelace'in doğum günü şerefine MIL-STD-1815 ismi verildi. 1981'de Tony Hoare Turing Ödülü konuşmasında Ada'yı aşırı karmaşık ve dolayısıyla güvenilmez olduğunu eleştirmek için fırsat kolladı. ancak sonrasında önsözünde bu fikrinden geri adım attığını ve Ada için ders kitabı hazırladığı görüldü. 
Ada yayınlandığı ilk zamanlarda programlama topluluğu tarafından büyük ilgi gördü. Dilin destekçileri sadece savunma ile alakalı işler değil, aynı zamanda genel programlama dili dünyasında baskın dil olabileceğini öngördüler. Ichbiah resmi olarak on yıl içerisinde sadece iki programlama dilinin varolacağını belirttli. Bunlar: Ada ve Lisp idi. İlk Ada derleyicileri geniş, karmaşık dili derlemede zorluk çekti ve hem derleme hem de çalışma performansı yavaş ve araçları ilkel olmaya yatkındı. Derleyici satıcıları emeklerinin çoğunu dilin uyum sağlama testlerini geçebilmek için harcadı. Bilgisayar korsanlarının 1975-1983 arası argo sözlüğü olan Jargon Dosyası Ada'nın girişinde "para ile bu tür bir onay verildiğinde tam olarak beklenebilecek şeydir; komite için geliştirildi... kullanımı zor ve tam bir felaket. Milyar dolardan fazla tamamen gereksiz bir iş... Ada Loverace... isminin sonradan kullanılmaya başlanmasıyla kesin olarak bembeyaz olurdu; onun hakkında söylenen en nazik şey, büyük olasılıkla genişliğinin içinden çıkmak için çığlık atan güzel bir küçük dil olduğudur."

Ada'nın doğrulanan ilk uygulaması NYU Ada/Ed translator idi. 11 Nisan 1989'da onaylandı. Bir takım ticari şirketler (Alsys, TeleSoft, DDC-I, Advanced Computer Techniques, Tartan Laboratories, TLD Systems ve Verdix) Ada derleyicilerini ve geliştirme araçlarını önermeye başladılar.

1991'de Amerika Birleşik Devletleri Savunma Bakanlığı tüm yazılımlarında Ada'yı kullanma şartı getirmişti, ancak bu kurala genel istisnalar verilmişti. Savunma Bakanlığı DoD'un ticari kullanıma hazır olmasıyla 1997'de Ada'yı etkin bir şekilde kullanımdan kaldırdı. Benzer gereksinimler diğer NATO ülkelerinde de baş gösterdi: Komuta, kontrol ve diğer fonksiyonlar için Ada'ya gereksinim duyuldu. Aynı zamanda Ada; İsveç, Almanya ve Kanada için savunma ile ilgili uygulamalar yazılmak için tercih edildi.

80'li yılların sonu 90'ların başlarında Ada derleyicileri performanslarını arttırmışlardı ancak gerçek zamanlı programcıların alıştığı farklı görev modeli dahil Ada'nın tüm gücünü açığa çıkarmak için daha hâlâ engeller vardı. Ada'nın kritik güvenliği destekleyen özellikleri sayesinde günümüzde sadece askeri uygulamalarda değil aynı zamanda yazılım hatalarının ağır sonuçlar doğurabileceği havacılık, hava trafik kontrolü, Ariane 4, Ariane 5, Yapay uydu ve diğer uzay sistemleri, demiryolu ulaşımı, bankacılık uygulamaları için de kullanıldı. Mesela uçak bilgi yönetim sistemi, Fly-by-wire ve Boeing 777'deki sistem yazılımı Ada ile yazıldı. DDC-I danışmanları işbirliğinde Honeywell Air Transport Systems geliştirildi. Bu proje sivil veya askeri tartışmasız en iyi Ada projesiydi. Kanada Otomatik Hava Kontrol Sistemi 1 milyon Ada satır koduyla yazıldı. ileri seviye dağıtık hesaplama, dağınık veritabanı, nesne yönelim içeriyordu. Ada aynı zamanda diğer hava trafik sistemleri için de kullanıldı, örneğin Birleşik Krallık gelecek nesil Geçici Gelecek Bölge Kontrol Araç Desteği (IFACTS) SPARK Ada ile tasarlandı ve uygulandı.

## Standartlaşması
Dil 1983'te ANSI standartlarına uygun kabul edildi ve Fransızcaya çevrildi ardından İngilizce sürümünde herhangi bir değişikliğe uğramadan 1987'de ISO standartlarına kabul edildi. ANSI'in benimsemesi ile birlikte dilin bu versiyonu Ada 83 olarak bilindi, ancak ISO'nun da benimsemesi ardından Ada 87 olarak da anıldı.

Ada'nın ISO/ANSI standartlarına uygun olmasının ardından Şubat 1995'te Ada 95 yayınlandı. Ada 95 ilk ISO standartlarına uygun nesne yönelimli programlama dili olmuştu. Yeniden düzenlemelere yardım etmek ve gelecek onaylamalar için Amerika Birleşik Devletleri Hava Kuvvetleri GNAT derleyicinin geliştirilmesi adına yatırım yaptı. Günümüzde GNAT derleyicisi GNU Derleyici Koleksiyonu'nun bir parçası.

Çalışmalar Adanın teknik içeriğini geliştirmek ve güncellemek için devam edildi. Ada 95'e tekniksel düzenleme Ekim 2001'de yayınlandı ve önemli değişiklik ISO/IEC 8652:1995/Amd 1:2007  9 Mart 2007'de yayınlandı. Stockholm'deki 2012 Ada-Avrupa konferansında Ada Kaynak Bağlantısı (ARA) ve Ada-Avrupa Ada dilinin son versiyonunu bitirdiklerini duyurdu.

## Dil Yapısı
Ada "if, then else, while, for" kontrol yapıları içeren ALGOL benzeri bir dil. Ancak, Ada aynı zamanda orijinal ALGOL 60'ta içermeyen tür tanımları, kayıtlar, işaretçiler, numaralandırılmış türler gibi bir sürü veri yapısı kolaylıkları ve soyutları içeren bir dildi. Bu yapılar aynı zamada Pascal'dan miras almış veya esinlenmiştir.

### Ada'da "Merhaba Dünya"
Kod yazımında yaygın örneği olan Merhaba dünya programı: (Merhaba.adb)
```ada
with Ada.Text_IO; use Ada.Text_IO;
procedure Merhaba is
begin
   Put_Line ("Merhaba Dünya!");
end Merhaba;
```
Bu uygulama ücretsiz ve açık kaynak kodlu derleyici GNAT ile derlenebilir.
```ada
gnatmake Merhaba.adb
```


### Veri Tipleri
Ada'nın veri tipleri önceden tanımlanmış ilkel türlere bağlı değildir, ancak kullanıcılara kendi türlerini bildirmelerine izin verir. Bu bildiri, sırayla türün dahili temsiline değil, ulaşılması gereken hedefi açıklamaya dayanmaktadır. Bu da derleyicinin tür için uygun hafıza boyutunu belirlemeye olanak sağlar ve derleme veya çalışma sırasında tür tanımı ihlallerini (dizi ihlalleri, arabellek taşmaları, tür tutarlılığını" kontrol eder. Ada bir dizi tarafından tanımlanmış sayısal türleri modül türleri, toplama türleri, (kayıtlar ve diziler) numaralandırılmış türleri destekler. Türsüz işaretçilerin kullanılmasına izin vermez. Dil tarafından özel türler görev türleri ve korunmuş türlerdir.

Örneğin, bir tarih böyle gösterilebilir: 
```ada
type Day_type   is range    1 ..  31;         
type Month_type is range    1 ..  12;          
type Year_type  is range 1800 .. 2100;          
type Hours is mod 24;                           
type Weekday is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

type Date is
   record
     Day   : Day_type;
     Month : Month_type;
     Year  : Year_type;
   end record;
```
Türler, alt türlere bildirilerek işlenebilir:
```ada
subtype Working_Hours is Hours range 0 .. 12;            -- Günde en fazla 12 saat çalışılır
subtype Working_Day is Weekday range Monday .. Friday;   -- Çalışılacak Gün sayısı

Work_Load: constant array(Working_Day) of Working_Hours  -- Veri Bildirilmiş
   := (Friday => 6, Monday => 4, others => 10);           -- başlatma ile çalışma saatleri için arama tablosu
```
Türlerin sınırlı, soyut, özel vb. Değiştiricileri olabilir. Özel türler yalnızca erişilebilir ve sınırlı türler yalnızca onları tanımlayan paket kapsamında değiştirilebilir veya kopyalanabilir. Ada 95, türlerin nesne yönelimi için daha fazla özellik ekler

## Kontrol Yapıları
Ada Yapısal programlama dilidir. Kontrol akışı standart ifadelerle yapılandırılmıştır. Tüm standart yapılar desteklenmiştir. Bu yüzden, "go to" komutu kullanımı nadiren ihtiyaç duyulmuştur. 
```ada
-- a b'ye eşit değilken döngüsü.
while a /= b loop
  Ada.Text_IO.Put_Line ("Waiting");
end loop;

if a > b then
  Ada.Text_IO.Put_Line ("Condition met");
else
  Ada.Text_IO.Put_Line ("Condition not met");
end if;

for i in 1 .. 10 loop
  Ada.Text_IO.Put ("Iteration: ");
  Ada.Text_IO.Put (i);
  Ada.Text_IO.Put_Line;
end loop;

loop
  a := a + 1;
  exit when a = 10;
end loop;

case i is
  when 0 => Ada.Text_IO.Put ("zero");
  when 1 => Ada.Text_IO.Put ("one");
  when 2 => Ada.Text_IO.Put ("two");
  -- durum ifadeleri tüm muhtemel durumları kapsamalıdır:
 
  when others => Ada.Text_IO.Put ("none of the above");
end case;

for aWeekday in Weekday'Range loop               -- loop over an enumeration
   Put_Line ( Weekday'Image(aWeekday) );         -- output string representation of an enumeration
   if aWeekday in Working_Day then               -- check of a subtype of an enumeration
      Put_Line ( " to work for " &
               Working_Hours'Image (Work_Load(aWeekday)) ); -- access into a lookup table
   end if;
end loop;
Packages, procedures and functions
Among the parts of an Ada program are packages, procedures and functions.

Example: Package specification (example.ads)

package Example is
     type Number is range 1 .. 11;
     procedure Print_and_Increment (j: in out Number);
end Example;
Package body (example.adb)

with Ada.Text_IO;
package body Example is

  i : Number := Number'First;

  procedure Print_and_Increment (j: in out Number) is

    function Next (k: in Number) return Number is
    begin
      return k + 1;
    end Next;

  begin
    Ada.Text_IO.Put_Line ( "The total is: " & Number'Image(j) );
    j := Next (j);
  end Print_and_Increment;

-- package initialization executed when the package is elaborated
begin
  while i < Number'Last loop
    Print_and_Increment (i);
  end loop;
end Example;
```
Bu uygulama ücretsiz ve açık kaynak kodlu derleyici GNAT ile derlenebilir.
```ada
gnatmake -z example.adb
```


## Ayrıca Bakınız

* APSE – a specification for a programming environment to support software development in Ada
* Ravenscar profile – a subset of the Ada tasking features designed for safety-critical hard real-time computing
* SPARK (programming language) – a programming language consisting of a highly restricted subset of Ada, annotated with meta information describing desired component behavior and individual runtime requirements

## Uluslararası Standartlar

* ISO/IEC 8652: Information technology-Programming languages-Ada
* ISO/IEC 15291: Information technology-Programming languages-Ada Semantic Interface Specification (ASIS)
* ISO/IEC 18009: Information technology-Programming languages-Ada: Conformity assessment of a language processor (ACATS)
* IEEE Standard 1003.5b-1996, the POSIX Ada binding
* Ada Language Mapping Specification, the CORBA interface description language (IDL) to Ada mapping

## Kaynakça