4 puan yazan GN⁺ 13 일 전 | 1 yorum | WhatsApp'ta paylaş
  • 1970’lerde ABD Savunma Bakanlığı’nın yazılım karmaşası içinde ortaya çıkan Ada, güçlü statik tip sistemi ve belirtim-uygulama ayrımını merkezine alan bir dildir
  • Paket yapısı ve temsili gizleme ile tam kapsülleme sağlar; daha sonra Java, C# ve Go gibi modern dillerin modül sistemlerini etkilemiştir
  • Anlamsal kısıt tipleri, generic’ler, eşzamanlılık (task), sözleşme tabanlı tasarım gibi kavramlar Ada’nın onlarca yıl önce sunduğu fikirlerdir; Haskell, Rust ve Swift bunları devralmıştır
  • SPARK Ada, biçimsel doğrulama yoluyla veri yarışı ve mantıksal hataları bile ortadan kaldırır; havacılık, demiryolu ve savunma sistemleri gibi yüksek güvenilirlik gerektiren alanlarda kullanılır
  • Ada popüler bir dil olmasa da, “sessizce doğru çalışan dil” olarak modern programlama dili tasarımının temel ilkelerini ortaya koyan bir temel niteliğindedir

Ada’nın doğuşu ve tasarım felsefesi

  • 1970’lerin başında ABD Savunma Bakanlığı (DoD), silah, lojistik ve iletişim sistemlerinde 450’den fazla dil ve lehçenin bir arada kullanıldığı durumu inceledi
    • Her sistem; birlikte çalışamama, bakımın yapılamaması ve özgün yazarların artık bulunmaması gibi sorunlara sahipti
    • Bunun sonucunda yazılım tedarik krizi ortaya çıktı
  • DoD, mevcut dillerden birini (COBOL, Fortran, PL/1 vb.) seçmek yerine, 5 yıllık bir gereksinim tanımlama süreci yürüttü
    • Belgeler Strawman → Woodenman → Tinman → Ironman → Steelman şeklinde evrildi
    • Steelman (1978), açık arayüz ayrımı, güçlü statik tip sistemi, yerleşik eşzamanlılık, tutarlı istisna işleme, makineden bağımsızlık, okunabilirlik ve doğrulanabilirlik talep ediyordu
  • 1979’da dört ekip (Green, Red, Blue, Yellow) arasındaki yarışta, Jean Ichbiah liderliğindeki Green ekibi seçildi ve dilin adı Ada oldu
    • İsim, Ada Lovelace anısına verildi ve dilin niyetini simgeliyordu

Paket yapısı ve kapsülleme

  • Ada’nın merkezi yapısı paket (package) kavramıdır; belirtim (specification) ve gövde (body) fiziksel olarak ayrıdır
    • Belirtim dışarıya açık sözleşmeyi, gövde ise uygulamayı tanımlar; derleyici bu ilişkiyi zorunlu kılar
    • İstemci kodu, belirtimde yer almayan öğelere erişemez
  • Bu yapı, modül sisteminin ilk örneği niteliğindedir ve sonraki diller bunu kısmen taklit etmiştir
    • Java, Python, JavaScript, C, Go ve Rust’ın hiçbiri Ada’daki tam yapısal ayrımı eksiksiz biçimde uygulamaz
  • private tipler yalnızca adlarını dışarıya açar; iç temsil tamamen opaktır
    • İstemci, tipin iç yapısını bilemez ve yalnızca izin verilen işlemleri kullanabilir
    • Bu, Java’daki private erişim denetiminden daha güçlü bir temsili gizleme (representational invisibility) sağlar
  • Java ve C#, onlarca yıl boyunca kademeli olarak Ada düzeyindeki kapsüllemeye yaklaşmıştır

Tip sistemi ve anlamsal kısıtlar

  • Ada, tip ile alt tip ayrımını matematiksel anlamda tanımlar
    • Örneğin, type Age is range 0 .. 150 aralık kısıtına sahip ayrı bir tip oluşturur
    • Uyumsuz tipler arasında yanlış aktarım, derleme zamanı hatası olarak yakalanır
  • 1983’te Ada’nın tip sistemi; C, Fortran ve Pascal’dan çok daha yüksek ifade gücüne sahipti
    • Anlamsal kısıt tipleri ile alan kaynaklı hatalar önlenir
  • Ayırt edicili kayıt (discriminated record), değere göre farklı alanlar taşıyan bir yapıdır
    • Bu, modern dillerdeki sum type ya da cebirsel veri tipi (ADT) ile aynıdır
    • Haskell, Rust, Swift, Kotlin ve TypeScript aynı kavramı onlarca yıl sonra benimsedi

Generic’ler ve çok biçimlilik

  • Ada’daki generic yapılar; tip, değer, alt program ve paketi parametre olarak alabilen birimlerdir
    • Derleme anında tip doğrulaması yapan statik çok biçimlilik (parametric polymorphism) sağlar
  • C++ (1990), Java (2004), C# (2005) ve Go (2022) gibi diller, benzer özellikleri Ada’dan onlarca yıl sonra ekledi
    • Java, type erasure nedeniyle çalışma zamanındaki tip bilgisini kaybeder
    • Ada ise çalışma zamanında tip korumasını ve paket parametreleştirmesini de destekler
  • Ada’nın generic yapısı, higher-kinded polymorphism düzeyinde ifade gücü sunar
    • Bu, Haskell’in type class’larına, Rust’ın trait’lerine ve C++20’deki concepts’e benzer bir anlayıştır

Eşzamanlılık modeli ve güvenlik

  • Ada, daha 1983’te dil seviyesinde eşzamanlılık (task) desteğini yerleşik olarak sunuyordu
    • task bildirimi ve rendezvous iletişim modeliyle paylaşımsız durum üzerinden mesajlaşma gerçekleştirir
    • Go’daki channel yapısı da aynı CSP (Communicating Sequential Processes) ailesine aittir
  • Ada 95, protected object kavramını getirdi
    • Veri erişimini korur ve procedure, function, entry olarak ayrılır
    • Otomatik bariyer koşulları ve kilitsiz senkronizasyon sağlar
  • SPARK Ada, biçimsel doğrulama ile veri yarışının, istisnaların, aralık hatalarının ve önkoşul/sonkoşul ihlallerinin olmadığını matematiksel olarak kanıtlar
    • Rust’ın borrow checker’ı yalnızca bellek güvenliğini garanti ederken, SPARK mantıksal tutarlılığı da kanıtlar

Sözleşme tabanlı tasarım ve null güvenliği

  • Ada 2012, sözleşmeleri (contracts) dili içine entegre etti
    • Önkoşul (precondition), sonkoşul (postcondition) ve tip değişmezi (invariant) açıkça belirtilebilir
    • SPARK araç zinciri bunları statik kanıtlama için kullanır
  • Eiffel’in (1986) Design by Contract kavramını dil düzeyinde resmileştirdi
    • C++, Java, Python ve Rust ise kısmi ya da kütüphane düzeyinde uygulamalarla sınırlı kaldı
  • Ada 2005, not null tipini getirerek derleme zamanında null dışlama desteği sundu
    • Varsayılan davranış, çalışma zamanında Constraint_Error istisnası vererek güvenli biçimde başarısız olmaktır
    • Bu yaklaşım, C# 8.0’daki nullable reference yapısına benzer

İstisna işleme yapısı

  • Ada 83, ilk kez yapısal istisna işleme (structured exception handling) sundu
    • İstisnalar tanımlanır, sonra kullanılır; kapsam bazında ele alınır ve yayılım kuralları nettir
  • Java’daki checked exception, Ada’dakinden daha gelişmiş bir biçimdir; çağıran tarafın istisnayı açıkça belirtmesini gerektirir
    • Ada ise istisna yayılımına daha serbest yaklaşır
  • Rust, istisnaları kaldırıp Result tipi tabanlı hata işleme modelini benimsemiştir
    • Ada’nın katkısı, istisna yayılımını yapısal ve öngörülebilir hale getirmiş olmasıdır

Annex ve standardizasyon yapısı

  • Ada standardı, Annex adı verilen isteğe bağlı bir genişletme yapısına sahiptir
    • Annex C~H; sistem, gerçek zamanlı, dağıtık, sayısal ve yüksek güvenilirlik alanlarına yönelik işlevleri tanımlar
    • Derleyicilerin her Annex için ayrı sertifikasyon alması gerekir
  • ACAA tarafından yürütülen ACATS testleri ile standarda uygunluk doğrulanır
    • DO-178C havacılık yazılım sertifikasyonu için Ada’nın standart yapısı doğrudan kullanılabilir
    • C/C++ ile de aynı sertifikasyon alınabilir, ancak Ada yapısal olarak daha uygundur

Ada’nın etkisi ve algı dengesizliği

  • Ada, devlet güdümlü bir dil olduğu için Silikon Vadisi kültüründe fazla ilgi görmedi
    • Bu durum, C tabanlı sade sözdizimini tercih eden kültürle tezat oluşturdu
  • Ada’nın başarı örnekleri (havacılık, demiryolu, savunma sistemleri) başarısızlık üretmediği için daha az görünürdür
    • Yüksek güvenilirlikli sistemler tartışma ya da olay üretmez
  • Modern dillerin evrildiği yön, Ada’nın çoktan ortaya koyduğu ilkelere yakınsıyor
    • Belirtim-uygulama ayrımı, statik tip doğrulama, dil seviyesinde eşzamanlılık, sözleşme tabanlı güvenlik gibi
  • Ada bugün hâlâ uçak, demiryolu ve uzay aracı gibi yüksek güvenilirlikli sistemlerde kullanılmaya devam ediyor ve “sessizce doğru çalışan dil” olarak varlığını sürdürüyor

1 yorum

 
GN⁺ 13 일 전
Hacker News yorumları
  • Ada'yı seviyorum. Ama tip işleme konuşulurken ML ailesi dillerin (ML, SML, CML, Caml, OCaml vb.) tamamen atlanmış olması şaşırtıcı
    Bu diller yapısal tipleri derleyici düzeyinde destekliyor. Ada'nın sorunu ise PL/I, PHP, Perl gibi dilin kendisinin fazla büyük ve sözdiziminin karmaşık olmasıydı. Yazı bunu bir avantaj gibi sunuyor ama bence Annex olarak ayrılmış standart genişletmeler çok daha iyiydi. Eğer çekirdek dil küçük tutulup Annex merkezli gidilseydi, daha yaygın kullanılmış olabilirdi

    • ML dillerinde kullanıcı doğrudan bounded Integer/Floating point tipleri tanımlayamaz. Ada'nın temel özelliklerinden biri tam da bu tip sistemi. Ada'nın tip sistemini deneyimleyince kod kalitesi ve güvenilirliğinin ne kadar arttığına insan şaşırıyor
  • Ada'nın göz ardı edilmesinin nedenlerinden biri derleyici fiyatlarının on binlerce dolar olmasıydı. Ücretsiz ya da açık kaynak derleyicilerin olmadığı dönemde, diğer diller bedavaya kullanılabiliyordu. Belirleyici etken buydu

    • Ada'nın niş alanın dışına çıkamamasının birkaç nedeni vardı. Dilin karmaşıklığı ve dönemin derleyici teknolojisi yüzünden 1980'lerin mikrobilgisayarlarında düzgün çalıştırmak zordu. Intel, Ada kavramlarını donanıma yansıtan i432'yi yaptı ama performansı berbattı. Sonrasında mikrobilgisayarlar dünyaya hakim olunca C ve assembly mirası 20 yıldan fazla sürdü
    • Birkaç yıl Ada kullandım; çalışma arkadaşlarımın hobi olarak başka diller kullanması Ada'nın yayılmasına yardımcı olmadı. String işleme de zayıftı, hızı da düşüktü. Özellikle eşzamanlılık işleme tarafı OS thread'lerini kullanmadığı için zahmetliydi. Sonunda HPUX'un gerçek zamanlı genişletmesini kullanıp çoklu süreçlerle çalıştırdık
    • 90'ların ortalarından itibaren GNAT vardı ve o dönemde ticari derleyiciler de yaygındı. Ada'nın önünün kesilme nedeni, "gereksiz overhead" algısıydı. Yani askeri ya da güvenlik kritik sistemler dışında kullanmak için bir sebep olmadığı yönünde bir itibarı vardı
    • GNU Ada Compiler(GNAT) ilk kez 1995'te yayımlandı
    • Aslında 80'lerde hangi dili alırsanız alın, derleyici kalitesi pek iyi değildi. GCC bile ancak sonlarına doğru işe yarar hale geldi. Yeni bir dil kullanınca derleyicinin olgunlaşmamış olması normaldi. C++ da o dönemde Ada'nın epey gerisindeydi ve "C++'ın killer feature'ı" aslında C gibi kullanılabilmesiydi. Ada bir Pascal uyumluluk modu sunmuş olsaydı tarih farklı ilerleyebilirdi
  • Yazıyı okurken hem Ada hem de yazının kendisi ilgimi çekti ama birkaç olgusal hata gözüme battı. Mesela yalnızca Ada'nın implementasyon ile belirtimi tamamen ayırdığını söylüyordu; oysa JavaScript de ES6 modüllerinde private öğeler tanımlayabiliyor. Java'nın private görünürlüğüne dair açıklama da yanlıştı. Bu hatalar yüzünden yazının güvenilirliği düştü

    • Ada'da private tip tanımlarsanız dışarıdan iç alanlara erişilemez. Buna karşılık JavaScript'te herhangi bir nesneye serbestçe özellik ekleyip çıkarabilirsiniz. Yani Ada'nın derleme zamanı koruması JS ile kıyaslanamaz
    • Java'da reflection ile private üyelere erişilebilir. setAccessible(true) ile String'in içi bile değiştirilebilir
    • LLM'lerin insan okurlar için yazı üretirken Gell-Mann amnezisi gibi çalıştığı yorumu dikkat çekiciydi
  • Yazının geneli iyiydi ama durmadan tekrarlanan “X dili bu özelliği Ada'dan daha geç aldı” cümlesi sıkıcıydı. Kod örnekleri olsaydı çok daha ikna edici olurdu

    • Aslında Ada'nın birçok özelliği mevcut dillerden (PASCAL, CLU, MODULA, CSP vb.) ödünç alınmıştı. Tamamen yeni kavramlar olmaktan çok, kendini kanıtlamış fikirlerin bir araya getirilmesiydi
    • Ada'nın önce getirdiği söylenen bazı kavramlar, gerçekte farklı biçimlerde uygulanmıştı. O yüzden karşılaştırmalı örneklere ihtiyaç vardı
    • Bu yazı "Ada en iyisidir" iddiası değil; Ada'nın güvenlik ve güvenilirlik için nasıl tasarlandığını gösteren bir yazı. Yıl karşılaştırmaları da bu bağlamda anlam taşıyor
    • Claude'dan Ada demo kodu istedim, oldukça iyiydi. Ada'yı uzun zamandır biliyordum ama doğrudan deneyince FOMO hissettim
    • Ada geliştiricileri açısından bu tür karşılaştırma kalıpları yıllardır tekrarlandığı için yorucu gelebilir
  • Bu Twitter hesabı 2026 Nisan'ında oluşturulmuş ve yazar belirtilmemiş. Kısa sürede muazzam bir üretkenlik göstermiş olması ve ismini açık etmemesi ilginç

    • Yazarın olmamasının nedeni bot olması olabilir diyenler de var
  • “Tüm diller son 20 yılda sum type ekledi ama Ada'da en başından beri vardı” iddiası doğru, ama kökeni Ada değil. Hope dili ya da NPL daha önce vardı

    • Aslında sum type'ın kökeni John McCarthy'nin 1964 tarihli “Definition of new data types in ALGOL X” makalesine gidiyor. Orada UNION anahtar sözcüğünü önerdi; sonrasında ALGOL 68, Hope, Miranda gibi dillerde gelişti. C'deki union ise bu kavramla aynı şey değil
  • Yazıyı o kadar beğendim ki AI tarafından yazılmamış olmasını umdum, ama Twitter'a gönderilme hızı fazla yüksek olduğu için şüphelendim

    • Yazı biraz uzatılmış ve tekrar eden bir tonda olduğu için AI hissi veriyordu
    • Bugünlerde blog yazılarını otomatik yeniden yazan çok sayıda AI aracı var; şüphe de buradan geliyor
    • Ben de yazıyı keyifle okudum ama 110 tane em dash gördükten sonra “acaba AI mı?” diye düşündüm. Artık blog yazılarını bile medya okuryazarlığı filtresiyle okumak üzücü
    • Ben de 3 yılda 50 yazı yazdım ama çoğu hâlâ yayımlanmadı. Belki bu yazarın da benzer bir durumu vardı ve ancak yakın zamanda cesaret buldu. AI sanılmanın ne kadar moral bozucu olabileceğini anlıyorum
    • Eğer AI bu seviyede yazı yazabiliyorsa, zamanımı alsa bile buna değer
  • ABD Hava Kuvvetleri başlangıçta Ada kullanmak istiyordu ama geliştirme gecikince JOVIAL kullandı. İlk projemi 1981'de JOVIAL ile yaptım; o sırada Ada hâlâ belirtim aşamasındaydı

    • JOVIAL, ALGOL 60'ın öncülü olan IAL'den türeyen bir dildi ve Ada'nın erken geliştirme gereksinimlerini (STRAWMAN~STEELMAN) etkiledi. Sonrasında Ada, JOVIAL'in özelliklerini geliştirip in/out parametre belirtimi gibi yenilikler getirdi. Bu sayede C++'taki karmaşık copy constructor veya move semantics gibi şeylere ihtiyaç kalmadı
  • Sitenin ana sayfasında “bu bir duruş değil, bir öneridir” ifadesi var; bunu gerekçe gösterip AI tarafından yazılmış bir site olduğu iddia ediliyor

    • Ama bu cümle AI yazarlığına kanıt değil
  • Yazıda “JavaScript'in modül sistemi Ada'daki gibi tipin iç temsilini gizleyemez” deniyordu, ama aslında JS modülünde export etmezseniz gayet iyi gizleyebilirsiniz. Ada'nın burada özel olarak daha iyi olduğu ne, emin olamadım

    • TypeScript açısından bakarsanız, JS nesnelerine dışarıdan hâlâ özellik eklenebilir ya da mevcut özellikler değiştirilebilir. Ada'da private tip örnekleri üzerinde tanımlı API dışı işlemler yapılamaz
    • Somut örnek için bu yoruma bakabilirsiniz