Ada (programlama dili) - Ada (programming language)

Ada
paradigma Çoklu paradigma : yapılandırılmış , zorunlu , nesne yönelimli
Aile paskal
Tarafından tasarlandı
  • MIL-STD-1815, Ada 83: Jean Ichbiah
  • Ada 95: Tucker Taft
  • Ada 2005: Tucker Taft
  • Ada 2012: Tucker Taft
İlk ortaya çıktı Şubat 1980 ; 41 yıl önce ( 1980-02 )
kararlı sürüm
Ada 2012 TC1
Yazma disiplini statik , güçlü , güvenli , yalın
işletim sistemi Çoklu veya çapraz platform
Dosya adı uzantıları .adb, .ads
İnternet sitesi www .adaic .org
Başlıca uygulamalar
AdaCore TBMM (ücretsiz indirme: https://www.adacore.com/download ),
Green Hills Software Optimize Edici Ada 95 derleyicisi,
PTC, Inc. PTC ApexAda ve PTC ObjectAda,
"MapuSoft Ada-C/C++ değiştirici" ., eskiden "C Intermediate ile AdaMagic" olarak bilinen,
DDC-I Skoru
lehçeler
SPARK , Ravenscar profili
Tarafından etkilenmiş
ALGOL 68 , Pascal , Simula 67 , C++ (Ada 95), Smalltalk (Ada 95), Modula-2 (Ada 95) Java (Ada 2005), Eiffel (Ada 2012)
Etkilenen
C++ , Şapel , Drago , D , Eiffel , Griffin, Java , Nim , ParaSail , PL/SQL , PL/pgSQL , Python , Ruby , Seed7 , SPARforte, Sparkel , SQL/PSM , VHDL

Ada , Pascal ve diğer dillerden genişletilmiş, yapılandırılmış , statik olarak yazılmış , zorunlu ve nesne yönelimli üst düzey bir programlama dilidir. Sözleşmeye göre tasarım (DbC), son derece güçlü yazma , açık eşzamanlılık, görevler, senkronize mesaj geçişi, korumalı nesneler ve determinizm için yerleşik dil desteğine sahiptir . Ada , çalışma zamanı hataları lehine hataları bulmak için derleyiciyi kullanarak kod güvenliğini ve sürdürülebilirliğini geliştirir . Ada, Uluslararası Standardizasyon Örgütü (ISO) ve Uluslararası Elektroteknik Komisyonu (IEC) tarafından ortaklaşa tanımlanan uluslararası bir teknik standarttır . 2020 itibariyle, gayri resmi olarak Ada 2012 olarak adlandırılan standart, ISO/IEC 8652:2012'dir.

Ada aslen Fransız liderliğindeki bir ekip tarafından tasarlanan bilgisayar bilimcisi Jean Ichbiah ait CII Honeywell Bull için sözleşme altında Amerika Birleşik Devletleri Savunma Departmanı o zaman Savunma Bakanlığı tarafından kullanılan üzerinde 450 programlama dilleri yerini alacak 1977 ve 1983 den (DoD). Ada, adını ilk bilgisayar programcısı olarak kabul edilen Ada Lovelace'den (1815-1852) almıştır.

Özellikleri

Ada aslında gömülü ve gerçek zamanlı sistemler için tasarlandı . 1992 ve 1995 yılları arasında Intermetrics'ten S. Tucker Taft tarafından tasarlanan Ada 95 revizyonu, sistemler, sayısal, finansal ve nesne yönelimli programlama (OOP) için geliştirilmiş destek .

Ada'nın özellikleri şunları içerir: güçlü yazma , modüler programlama mekanizmaları (paketler), çalışma zamanı denetimi , paralel işleme ( görevler , senkronize mesaj geçişi , korumalı nesneler ve deterministik olmayan seçme ifadeleri ), istisna işleme ve jenerikler . Ada 95 , dinamik gönderme de dahil olmak üzere nesne yönelimli programlama desteği ekledi .

Ada'nın sözdizimi, temel işlemleri gerçekleştirme yollarının seçeneklerini en aza indirir ve İngilizce anahtar kelimeleri ("veya başka" ve "ve sonra" gibi) sembollere ("||" ve "&&" gibi) tercih eder. Ada, "+", "-", "*" ve "/" temel aritmetik operatörlerini kullanır, ancak diğer sembolleri kullanmaktan kaçınır. Kod blokları "declare", "begin" ve "end" gibi kelimelerle sınırlandırılır; burada "end" (çoğu durumda) ardından kapattığı bloğun tanımlayıcısı gelir (örneğin, if ... end if , döngü ... döngüyü sonlandır ). Koşullu bloklar söz konusu olduğunda, bu, C veya Java gibi diğer dillerdeki yanlış iç içe if-ifadesiyle eşleşebilecek sarkan başka bir şeyi önler .

Ada, çok büyük yazılım sistemleri geliştirmek için tasarlanmıştır. Ada paketleri ayrı ayrı derlenebilir. Ada paketi özellikleri (paket arayüzü), tutarlılığı kontrol etmek için uygulama olmadan ayrı olarak derlenebilir. Bu, uygulama başlamadan önce, tasarım aşamasında sorunları erken tespit etmeyi mümkün kılar.

Diğer bazı dillerde çalışma zamanına kadar algılanamayacak veya kaynak koduna açık denetimlerin eklenmesini gerektirecek hataların önlenmesine yardımcı olmak için çok sayıda derleme zamanı denetimi desteklenir. Örneğin, sözdizimi, eşleşmeyen bitiş belirteçlerinden kaynaklanan hataları önlemek için blokların açıkça adlandırılmış kapanmasını gerektirir. Güçlü yazmaya bağlılık, derleme sırasında veya çalışma zamanında birçok yaygın yazılım hatasını (yanlış parametreler, aralık ihlalleri, geçersiz referanslar, uyumsuz türler vb.) algılamaya olanak tanır. Eşzamanlılık dil belirtiminin bir parçası olduğundan, derleyici bazı durumlarda olası kilitlenmeleri algılayabilir. Derleyiciler ayrıca genellikle yanlış yazılmış tanımlayıcıları, paketlerin görünürlüğünü, gereksiz bildirimleri vb. denetler ve hatanın nasıl düzeltileceği konusunda uyarılar ve faydalı öneriler sağlayabilir.

Ada ayrıca, ayrılmamış belleğe erişime, arabellek taşma hatalarına, aralık ihlallerine, tek tek hatalara , dizi erişim hatalarına ve diğer algılanabilir hatalara karşı koruma sağlamak için çalışma zamanı denetimlerini destekler . Bu kontroller, çalışma zamanı verimliliği açısından devre dışı bırakılabilir, ancak çoğu zaman verimli bir şekilde derlenebilir. Ayrıca program doğrulamaya yardımcı olacak tesisler içerir . Bu nedenlerden dolayı Ada, herhangi bir anormalliğin kaza sonucu ölüm, yaralanma veya ciddi mali kayıp gibi çok ciddi sonuçlara yol açabileceği kritik sistemlerde yaygın olarak kullanılmaktadır . Ada'nın kullanıldığı sistemlere örnek olarak aviyonik , hava trafik kontrolü , demiryolları, bankacılık, askeri ve uzay teknolojisi verilebilir .

Ada'nın dinamik bellek yönetimi üst düzey ve güvenlidir. Ada'nın genel veya türlenmemiş işaretçileri yoktur ; ne de dolaylı olarak herhangi bir işaretçi türü bildirmez. Bunun yerine, tüm dinamik bellek ayırma ve ayırma, açıkça bildirilen erişim türleri aracılığıyla gerçekleşmelidir . Her erişim türünün, bellek yönetiminin alt düzey ayrıntılarını işleyen ilişkili bir depolama havuzu vardır; programcı ya varsayılan depolama havuzunu kullanabilir ya da yenilerini tanımlayabilir (bu özellikle Tekdüzen Olmayan Bellek Erişimi için geçerlidir ). Hepsi aynı türü belirten ancak farklı depolama havuzları kullanan birkaç farklı erişim türü bildirmek bile mümkündür. Ayrıca dil , hem derleme zamanında hem de çalışma zamanında bir erişim değerinin işaret ettiği nesnenin türünden daha uzun yaşamamasını sağlayan erişilebilirlik kontrolleri sağlar .

Dilin semantiği, erişilemeyen nesnelerin otomatik çöp toplamasına izin verse de, gerçek zamanlı sistemlerde öngörülemeyen davranışlara neden olacağından, çoğu uygulama varsayılan olarak onu desteklemez. Ada, sınırlı bir bölge tabanlı bellek yönetimi biçimini destekler ; ayrıca, bir depolama havuzunun yok edilmesi havuzdaki tüm nesneleri de yok ettiğinden, depolama havuzlarının yaratıcı kullanımı sınırlı bir otomatik çöp toplama biçimi sağlayabilir.

Bir çift çizgi ( "-"), bir benzeyen uzun tire , açıklama metni ifade eder. Kapatılmamış yorumların yanlışlıkla kaynak kodunun tüm bölümlerini geçersiz kılmasını önlemek için yorumlar satırın sonunda durur. Tüm bir kod bloğunu devre dışı bırakmak artık her satırın (veya sütunun) ön ekinin "--" ile ayrı ayrı yapılmasını gerektirir. Devre dışı bırakılmış kodu sayfanın altında tekrarlanan bir "--" sütunu ile açıkça belirtirken, bu, büyük blokların deneysel olarak devre dışı bırakılmasını/yeniden etkinleştirilmesini daha ayrıntılı bir süreç haline getirir.

Noktalı virgül (";") bir ifade sonlandırıcıdır ve boş veya işlem yok ifadesidir null;. Tek ;sonlandırmak için bir açıklama yapılmadıkça izin verilmez.

Çoğu ISO standardının aksine , Ada dili tanımı ( Ada Referans Kılavuzu veya ARM veya bazen Dil Referans Kılavuzu veya LRM olarak bilinir ) ücretsiz içeriktir . Bu nedenle, yalnızca Ada derleyicilerini uygulayan programcılar için değil, Ada programcıları için ortak bir referanstır. Başvuru kılavuzunun yanı sıra, dil tasarımını ve çeşitli dil yapılarının kullanımını açıklayan kapsamlı bir gerekçe belgesi de bulunmaktadır. Bu belge aynı zamanda programcılar tarafından da yaygın olarak kullanılmaktadır. Dil revize edildiğinde, yeni bir gerekçe belgesi yazılmıştır.

Birçok Ada programcısı tarafından Ada kaynak kodunu yazmalarına yardımcı olmak için kullanılan dikkate değer bir ücretsiz yazılım aracı , GNU Derleyici Koleksiyonunun bir parçası olan GNAT Programlama Stüdyosu'dur .

Tarih

1970'lerde ABD Savunma Bakanlığı (DoD), gömülü bilgisayar sistemi projeleri için kullanılan, birçoğu eski veya donanıma bağlı olan ve hiçbiri güvenli modüler programlamayı desteklemeyen farklı programlama dillerinin sayısından endişe duymaya başladı. 1975 yılında, bir çalışma grubu , Yüksek Sıra Dil Çalışma Grubu (HOLWG), bulma veya departmanın ve için genellikle uygun bir programlama dili oluşturarak bu sayıyı azaltmak için niyet ile kuruldu Savunma İngiltere Bakanlığı'ndan 'in gereklerine. Orijinal bir Straw man önerisiyle başlayan birçok yinelemeden 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'den 1996'da 37'ye düştü.

HOLWG çalışma grubu , bir programlama dilinin karşılaması gerektiğini düşündükleri gereksinimleri belirten bir dizi belge olan Steelman dil gereksinimlerini hazırladı . Birçok mevcut dil resmi olarak gözden geçirildi, ancak ekip 1977'de mevcut hiçbir dilin spesifikasyonları karşılamadığı sonucuna vardı.

Augusta Ada King , Lovelace Kontesi.

Yeni bir programlama dili için teklif talepleri basıldı ve dört müteahhitler Red isimler altında önerilerini (geliştirmeyi tutulduk Intermetrics Benjamin Brosgol öncülüğünde), Yeşil ( CII Honeywell Bull öncülüğünde, Jean Ichbiah ), Mavi ( SOFTECH liderliğindeki John Goodenough) ve Sarı ( SRI International , Jay Spitzen liderliğinde). Nisan 1978'de, kamuoyunun incelemesinden sonra, Kırmızı ve Yeşil öneriler bir sonraki aşamaya geçti. Mayıs 1979'da Jean Ichbiah tarafından CII Honeywell Bull'da tasarlanan Green önerisi seçildi ve Lovelace Kontesi Augusta Ada'dan sonra Ada adını aldı . Bu öneri, Ichbiah ve grubunun 1970'lerde geliştirdiği LIS dilinden etkilenmiştir . İlk Ada referans kılavuzu, Haziran 1979'da ACM SIGPLAN Notices'de yayınlandı. Askeri Standart referans kılavuzu, 10 Aralık 1980'de ( Ada Lovelace'in doğum günü) onaylandı ve Ada Lovelace'in doğumunun onuruna MIL-STD-1815 numarası verildi. yıl. 1981'de CAR Hoare , Ada'yı aşırı karmaşık ve dolayısıyla güvenilmez olmakla eleştirmek için Turing Ödülü konuşmasından yararlandı, ancak daha sonra bir Ada ders kitabı için yazdığı önsözden vazgeçmiş görünüyordu.

Ada, ilk günlerinde bir bütün olarak programlama topluluğundan büyük ilgi gördü. Destekçileri ve diğerleri, yalnızca savunma ile ilgili işler için değil, genel amaçlı programlama için de baskın bir dil olabileceğini tahmin ettiler. Ichbiah, on yıl içinde yalnızca iki programlama dilinin kalacağını açıkça belirtti: Ada ve Lisp . İlk Ada derleyicileri, büyük, karmaşık dili uygulamak için mücadele etti ve hem derleme zamanı hem de çalışma zamanı performansı yavaş ve araçlar ilkel olma eğilimindeydi. Derleyici satıcıları çabalarının çoğunu Ada dili çabasının bir başka yeni özelliğinde gerekli olan devasa, dil uygunluk testi, devlet tarafından gerekli "ACVC" doğrulama paketini geçmek için harcadılar. Bilgisayar korsanı argosunun 1975-1983 tarihli bir sözlüğü olan Jargon Dosyası , Ada ile ilgili bir girişte, "fiat tarafından bu tür bir onay verildiğinde tam olarak beklenebilecek bir şey olduğunu; komite tarafından tasarlandı ... genel olarak feci, multi-milyar dolarlık bir boondoggle...Ada Lovelace... adının son zamanlarda kullanıldığını neredeyse kesinlikle ağartacaktı; bu konuda söylenen en iyi şey, muhtemelen iyi bir küçük engin, filimsi kütlesinin içinden çıkmak için çığlık atan bir dil."

İlk doğrulanmış Ada uygulaması, 11 Nisan 1983'te onaylanan NYU Ada/Ed tercümanıydı. NYU Ada/Ed, üst düzey ayar dili SETL'de uygulanmaktadır . Alsys , TeleSoft , DDC-I , Advanced Computer Techniques , Tartan Laboratories , TLD Systems ve Verdix dahil olmak üzere birçok ticari şirket Ada derleyicileri ve ilgili geliştirme araçlarını sunmaya başladı .

1991 yılında, ABD Savunma Bakanlığı tüm yazılımlar için Ada'nın ( Ada yetkisi ) kullanılmasını talep etmeye başladı , ancak bu kuralın istisnaları sıklıkla kabul edildi. Savunma Bakanlığı'nın Ada görevi, Savunma Bakanlığı'nın ticari kullanıma hazır ( COTS ) teknolojiyi benimsemeye başlamasıyla 1997'de etkin bir şekilde kaldırıldı . Diğer NATO ülkelerinde de benzer gereksinimler vardı : Ada, komuta ve kontrol ve diğer işlevleri içeren NATO sistemleri için gerekliydi ve Ada, İsveç, Almanya ve Kanada gibi ülkelerde savunmayla ilgili uygulamalar için zorunlu veya tercih edilen dildi.

1980'lerin sonunda ve 1990'ların başında, Ada derleyicilerinin performansı arttı, ancak Ada'nın yeteneklerini tam olarak kullanmanın önünde hala engeller vardı, buna çoğu gerçek zamanlı programcının alışkın olduğundan farklı bir görevlendirme modeli de dahildi.

Ada'nın güvenlik açısından kritik destek özellikleri nedeniyle, artık yalnızca askeri uygulamalar için değil, aynı zamanda bir yazılım hatasının ciddi sonuçlara yol açabileceği ticari projelerde de kullanılmaktadır, örneğin aviyonik ve hava trafik kontrolü , Ariane 4 ve 5 gibi ticari roketler , uydular ve diğer uzay sistemleri, demiryolu taşımacılığı ve bankacılık. Örneğin, Uçak Bilgi Yönetim Sistemi , fly-by-wire sistem yazılımı Boeing 777 , Ada yazılmış. Honeywell Air Transport Systems tarafından DDC-I danışmanlarıyla işbirliği içinde geliştirilen bu proje, sivil veya askeri herhangi bir Ada projesinin tartışmasız en iyi bilineni oldu. Kanada Otomatik Hava Trafik Sistemi Ada'nın 1 milyon satırında yazılmıştır ( SLOC sayısı). Gelişmiş dağıtılmış işleme , dağıtılmış bir Ada veritabanı ve nesne yönelimli tasarıma sahipti . Ada ayrıca diğer hava trafik sistemlerinde de kullanılmaktadır, örneğin Birleşik Krallık'ın yeni nesil Geçici Gelecek Alan Kontrol Araçları Desteği (iFACTS) hava trafik kontrol sistemi SPARK Ada kullanılarak tasarlanmakta ve uygulanmaktadır . Ayrıca kullanılan Fransız TVM in kabin sinyal sisteme TGV hızlı tren sistemi ve metro Paris, Londra, Hong Kong ve New York'ta banliyö trenleri.

Standardizasyon

Dil 1983'te bir ANSI standardı oldu ( ANSI/MIL-STD 1815A ) ve Fransızca'ya çevrildikten sonra ve İngilizce'de başka bir değişiklik yapılmadan 1987'de bir ISO standardı oldu (ISO-8652:1987). Dilin bu sürümü, ANSI tarafından kabul edildiği tarihten itibaren genellikle Ada 83 olarak bilinir, ancak bazen ISO tarafından kabul edildiği tarihten itibaren Ada 87 olarak da anılır.

Ortak ISO/ANSI standardı olan Ada 95 ( ISO-8652:1995 ) Şubat 1995'te yayınlandı ve Ada 95'i ilk ISO standardı nesne yönelimli programlama dili haline getirdi. Standart revizyona ve gelecekteki kabule yardımcı olmak için ABD Hava Kuvvetleri , TBMM Derleyicisinin geliştirilmesini finanse etti . Şu anda, TBMM Derleyicisi, GNU Derleyici Koleksiyonunun bir parçasıdır .

Ada dilinin teknik içeriğinin geliştirilmesi ve güncellenmesi çalışmaları devam etmiştir. Ada 95 için bir Teknik Düzeltme Ekim 2001'de yayınlandı ve büyük bir Değişiklik, ISO/IEC 8652:1995/Amd 1:2007 9 Mart 2007'de yayınlandı. Stockholm'deki Ada-Europe 2012 konferansında, Ada Resource Association (ARA) ve Ada-Europe, Ada dilinin en son sürümünün tasarımının tamamlandığını ve referans kılavuzun onay için Uluslararası Standardizasyon Örgütü'ne (ISO) sunulduğunu duyurdu. ISO/IEC 8652:2012, Aralık 2012'de yayınlandı.

Diğer ilgili standartlar şunları içerir: ISO 8651 -3:1988 Bilgi işleme sistemleri—Bilgisayar grafikleri—Graphical Kernel System (GKS) dil bağlamaları—Bölüm 3: Ada .

Dil yapıları

Ada, if , then , else , while , for vb. gibi ayrılmış sözcüklere sahip kontrol yapılarını içeren ALGOL benzeri bir programlama dilidir . Ancak Ada'da ayrıca birçok veri yapılandırma olanağı ve tür tanımları , kayıtlar , işaretçiler , numaralandırmalar gibi orijinal ALGOL 60'ta yer almayan diğer soyutlamalar vardır . Bu tür yapılar kısmen Pascal'dan miras alınmış veya esinlenmiştir .

"Selam Dünya!" Ada'da

Bir dilin sözdiziminin yaygın bir örneği , Merhaba dünya programıdır : (hello.adb)

with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
begin
   Put_Line ("Hello, world!");
end Hello;

Bu program, ücretsiz olarak kullanılabilen açık kaynak derleyici GNAT kullanılarak , yürütülerek derlenebilir.

gnatmake hello.adb

Veri tipleri

Ada'nın tür sistemi, önceden tanımlanmış bir dizi ilkel türe dayalı değildir, ancak kullanıcıların kendi türlerini bildirmelerine olanak tanır. Bu beyan, türün içsel temsiline değil, ulaşılması gereken hedefi tanımlamaya dayanmaktadır. Bu, derleyicinin tür için uygun bir bellek boyutu belirlemesine ve derleme zamanında ve çalışma zamanında tür tanımı ihlallerini (yani aralık ihlalleri, arabellek taşmaları, tür tutarlılığı vb.) kontrol etmesine olanak tanır. Ada, bir aralık, modulo türleri, toplama türleri (kayıtlar ve diziler) ve numaralandırma türleri tarafından tanımlanan sayısal türleri destekler. Erişim türleri, belirtilen bir tür örneğine bir başvuru tanımlar; yazılmamış işaretçilere izin verilmez. Dil tarafından sağlanan özel türler, görev türleri ve korumalı türlerdir.

Örneğin, bir tarih şu şekilde temsil edilebilir:

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ürler bildirilerek iyileştirilebilir :

subtype Working_Hours is Hours range 0 .. 12;            -- at most 12 Hours to work a day
subtype Working_Day is Weekday range Monday .. Friday;   -- Days to work

Work_Load: constant array(Working_Day) of Working_Hours  -- implicit type declaration
   := (Friday => 6, Monday => 4, others => 10);           -- lookup table for working hours with initialization

Türlerin sınırlı, soyut, özel vb. değiştiricileri olabilir . Private türlere yalnızca erişilebilir ve sınırlı türler yalnızca kendilerini tanımlayan paket kapsamında değiştirilebilir veya kopyalanabilir. Ada 95, türlerin nesne yönelimli uzantısı için başka özellikler ekler.

Kontrol Yapıları

Ada yapılandırılmış bir programlama dilidir, yani kontrol akışının standart ifadeler halinde yapılandırıldığı anlamına gelir. Tüm standart yapılar ve derin düzeyde erken çıkış desteklenir, bu nedenle de desteklenen " git " komutlarının kullanımına nadiren ihtiyaç duyulur.

-- while a is not equal to b, loop.
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");
  -- case statements have to cover all possible cases:
  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;

Paketler, prosedürler ve fonksiyonlar

Ada programının parçaları arasında paketler, prosedürler ve işlevler bulunur.

Örnek: Paket spesifikasyonu (example.ads)

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

Paket gövdesi (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 program, örneğin, ücretsiz olarak kullanılabilen açık kaynaklı derleyici GNAT kullanılarak , yürütülerek derlenebilir.

gnatmake -z example.adb

Paketler, prosedürler ve işlevler herhangi bir derinliğe yuvalanabilir ve her biri aynı zamanda mantıksal en dıştaki blok olabilir.

Her paket, yordam veya işlev, herhangi bir sırada bildirilebilen kendi sabitler, türler, değişkenler ve diğer yordamlar, işlevler ve paketler bildirimlerine sahip olabilir.

eşzamanlılık

Ada, görev tabanlı eşzamanlılık için dil desteğine sahiptir. Ada'daki temel eşzamanlı birim, yerleşik bir sınırlı tür olan bir görevdir . Görevler iki bölümde belirtilir - görev bildirimi görev arabirimini tanımlar (bir tür bildirimine benzer şekilde), görev gövdesi görevin uygulanmasını belirtir. Uygulamaya bağlı olarak, Ada görevleri ya işletim sistemi iş parçacıklarına veya süreçlerine eşlenir ya da Ada çalışma zamanı tarafından dahili olarak zamanlanır.

Görevler, senkronizasyon için girişlere sahip olabilir (bir tür senkronize mesaj geçişi ). Görev girişleri, görev belirtiminde bildirilir. Her görev girdisi , görev gövdesi içinde bir veya daha fazla kabul deyimine sahip olabilir . Görevin kontrol akışı bir kabul deyimine ulaşırsa, görev, karşılık gelen giriş başka bir görev tarafından çağrılana kadar engellenir (benzer şekilde, çağrılan görev ilgili kabul deyimine ulaşana kadar çağıran bir görev engellenir). Görev girişleri, görevlerin eşzamanlı olarak veri alışverişine izin veren prosedürlere benzer parametrelere sahip olabilir. Select deyimleri ile birlikte kabul deyimlerinde korumalar tanımlamak mümkündür (Dijkstra'nın korumalı komutlarına benzer ).

Ada ayrıca karşılıklı dışlama için korunan nesneler sunar . Korumalı nesneler monitör benzeri bir yapıdır, ancak sinyalleme için koşullu değişkenler yerine korumalar kullanın (koşullu kritik bölgelere benzer). Korunan nesneler, veri kapsüllemeyi ve monitörlerden güvenli karşılıklı dışlamayı ve koşullu kritik bölgelerden giriş korumalarını birleştirir. Klasik monitörlere göre ana avantajı, sinyalleme için koşullu değişkenlerin gerekli olmaması ve yanlış kilitleme semantiği nedeniyle olası kilitlenmelerin önlenmesidir. Görevler gibi, korunan nesne de yerleşik bir sınırlı türdür ve ayrıca bir bildirim bölümü ve bir gövdesi vardır.

Korunan bir nesne, kapsüllenmiş özel verilerden (yalnızca korunan nesnenin içinden erişilebilen) ve birbirini dışlaması garanti edilen prosedürlerden, işlevlerden ve girdilerden (yalnızca yan etkisi olmaması gereken işlevler hariç) oluşur. ve bu nedenle diğer işlevlerle aynı anda çalışabilir). Korunan bir nesneyi çağıran bir görev, aynı korunan nesnenin içinde başka bir görev yürütülüyorsa engellenir ve bu diğer görev korunan nesneden ayrıldığında serbest bırakılır. Engellenen görevler, varış zamanına göre sıralanan korunan nesne üzerinde sıraya alınır.

Korunan nesne girişleri prosedürlere benzer, ancak ek olarak korumaları vardır . Bir bekçi yanlış olarak değerlendirirse, çağıran bir görev engellenir ve bu girişin kuyruğuna eklenir; şimdi, korunan nesnenin içinde şu anda hiçbir görev yürütülmediğinden, korunan nesneye başka bir görev kabul edilebilir. Korumaların değerlendirmesinin değişebileceği tek zaman bu olduğundan, bir görev korunan nesneden ayrıldığında korumalar yeniden değerlendirilir.

Girişlere yapılan çağrılar , aynı imzaya sahip diğer girişlere yeniden sıralanabilir . Yeniden sıralanan bir görev engellenir ve hedef girdinin kuyruğuna eklenir; bu, korunan nesnenin serbest bırakıldığı ve başka bir görevin kabulüne izin verdiği anlamına gelir.

Select Ada deyimi engellenmeyen giriş aramaları ve kabul eder (ayrıca korumaları ile) girişlerinin olmayan deterministik seçimi, zaman aşımlarını ve iptal eder uygulamak için kullanılabilir.

Aşağıdaki örnek, Ada'daki bazı eşzamanlı programlama kavramlarını göstermektedir.

with Ada.Text_IO; use Ada.Text_IO;

procedure Traffic is

   type Airplane_ID is range 1..10;             -- 10 airplanes

   task type Airplane (ID: Airplane_ID);        -- task representing airplanes, with ID as initialisation parameter
   type Airplane_Access is access Airplane;     -- reference type to Airplane

   protected type Runway is                     -- the shared runway (protected to allow concurrent access)
      entry Assign_Aircraft (ID: Airplane_ID);  -- all entries are guaranteed mutually exclusive
      entry Cleared_Runway (ID: Airplane_ID);
      entry Wait_For_Clear;
   private
      Clear: Boolean := True;                   -- protected private data - generally more than only a flag...
   end Runway;
   type Runway_Access is access all Runway;

   -- the air traffic controller task takes requests for takeoff and landing
   task type Controller (My_Runway: Runway_Access) is
      -- task entries for synchronous message passing
      entry Request_Takeoff (ID: in Airplane_ID; Takeoff: out Runway_Access);
      entry Request_Approach(ID: in Airplane_ID; Approach: out Runway_Access);
   end Controller;

   --  allocation of instances
   Runway1    : aliased Runway;              -- instantiate a runway
   Controller1: Controller (Runway1'Access); -- and a controller to manage it

   ------ the implementations of the above types ------
   protected body Runway is
      entry Assign_Aircraft (ID: Airplane_ID)
 when Clear is   -- the entry guard - calling tasks are blocked until the condition is true
      begin
       Clear := False;
       Put_Line (Airplane_ID'Image (ID) & " on runway ");
      end;

      entry Cleared_Runway (ID: Airplane_ID)
 when not Clear is
      begin
         Clear := True;
         Put_Line (Airplane_ID'Image (ID) & " cleared runway ");
      end;

      entry Wait_For_Clear
 when Clear is
      begin
         null;      -- no need to do anything here - a task can only enter if "Clear" is true
      end;
   end Runway;

   task body Controller is
   begin
      loop
         My_Runway.Wait_For_Clear;   -- wait until runway is available (blocking call)
         select                      -- wait for two types of requests (whichever is runnable first)
            when Request_Approach'count = 0 =>  -- guard statement - only accept if there are no tasks queuing on Request_Approach
             accept Request_Takeoff (ID: in Airplane_ID; Takeoff: out Runway_Access)
             do                                 -- start of synchronized part
               My_Runway.Assign_Aircraft (ID);  -- reserve runway (potentially blocking call if protected object busy or entry guard false)
               Takeoff := My_Runway;            -- assign "out" parameter value to tell airplane which runway
             end Request_Takeoff;               -- end of the synchronised part
         or
            accept Request_Approach (ID: in Airplane_ID; Approach: out Runway_Access) do
               My_Runway.Assign_Aircraft (ID);
               Approach := My_Runway;
            end Request_Approach;
         or                          -- terminate if no tasks left who could call
            terminate;
         end select;
      end loop;
   end;

   task body Airplane is
      Rwy : Runway_Access;
   begin
      Controller1.Request_Takeoff (ID, Rwy); -- This call blocks until Controller task accepts and completes the accept block
      Put_Line (Airplane_ID'Image (ID) & "  taking off...");
      delay 2.0;
      Rwy.Cleared_Runway (ID);               -- call will not block as "Clear" in Rwy is now false and no other tasks should be inside protected object
      delay 5.0; -- fly around a bit...
      loop
         select   -- try to request a runway
            Controller1.Request_Approach (ID, Rwy); -- this is a blocking call - will run on controller reaching accept block and return on completion
            exit; -- if call returned we're clear for landing - leave select block and proceed...
         or
            delay 3.0;  -- timeout - if no answer in 3 seconds, do something else (everything in following block)
            Put_Line (Airplane_ID'Image (ID) & "   in holding pattern");  -- simply print a message
         end select;
      end loop;
      delay 4.0;  -- do landing approach...
      Put_Line (Airplane_ID'Image (ID) & "            touched down!");
      Rwy.Cleared_Runway (ID);  -- notify runway that we're done here.
   end;

   New_Airplane: Airplane_Access;

begin
   for I in Airplane_ID'Range loop  -- create a few airplane tasks
      New_Airplane := new Airplane (I); -- will start running directly after creation
      delay 4.0;
   end loop;
end Traffic;

pragmalar

Pragma, derlenmiş çıktının belirli bir şekilde manipüle edilmesine izin vermek için bilgileri derleyiciye ileten bir derleyici yönergesidir . Bazı pragmalar dilde yerleşiktir, diğerleri ise uygulamaya özeldir.

Derleyici pragmalarının yaygın kullanımına örnek olarak, çalışma zamanı türü denetimi veya dizi alt simge sınır denetimi gibi belirli özellikleri devre dışı bırakmak veya derleyiciye bir işlev çağrısı yerine nesne kodu eklemesini söylemek (C/C++'ın satır içi işlevlerde yaptığı gibi) verilebilir. ).

jenerik

Ada, ilk kez 1977-1980'de tasarlandığından beri jenerik ilaçlara sahiptir. Standart kitaplık, birçok hizmeti sağlamak için jenerikleri kullanır. Ada 2005, C++'ın standart şablon kitaplığından esinlenerek standart kitaplığa kapsamlı bir genel konteyner kitaplığı ekler .

Bir jenerik ünite bir paket veya bir ya da daha fazla süren bir alt program olan jenerik biçimsel parametreleri .

Bir genel biçimsel parametre değeri, bir değişken, bir sabit, bir tür, bir alt program veya başka bir hatta bir örneği, belirlenen, genel bir birimdir. Genel biçimsel türler için sözdizimi, ayrık, kayan nokta, sabit nokta, erişim (işaretçi) türleri vb. arasında ayrım yapar. Bazı biçimsel parametrelerin varsayılan değerleri olabilir.

To örneğini jenerik birimi, programcı geçer fiili her resmi için parametreleri. Genel örnek daha sonra diğer herhangi bir birim gibi davranır. Örneğin bir döngü içinde, çalışma zamanında genel birimleri başlatmak mümkündür .

Ayrıca bakınız

  • APSE – Ada'da yazılım geliştirmeyi desteklemek için bir programlama ortamı belirtimi
  • Ravenscar profili - güvenlik açısından kritik zor gerçek zamanlı bilgi işlem için tasarlanmış Ada görev özelliklerinin bir alt kümesi
  • SPARK (programlama dili) – istenen bileşen davranışını ve bireysel çalışma zamanı gereksinimlerini açıklayan meta bilgilerle açıklamalı, oldukça kısıtlı bir Ada alt kümesinden oluşan bir programlama dili

Referanslar

Uluslararası standartlar

Gerekçe

Bu belgeler, basılı da dahil olmak üzere çeşitli biçimlerde yayınlanmıştır.

Kitabın

Arşivler

Dış bağlantılar