4 poin oleh GN⁺ 3 hari lalu | 1 komentar | Bagikan ke WhatsApp
  • Lahir di tengah kekacauan perangkat lunak Departemen Pertahanan AS pada 1970-an, Ada adalah bahasa yang berpusat pada pengetikan statis yang kuat dan pemisahan spesifikasi-implementasi
  • Melalui struktur package dan penyembunyian representasi`, Ada mewujudkan enkapsulasi penuh dan kemudian memengaruhi sistem modul bahasa modern seperti Java, C#, dan Go
  • Tipe dengan kendala semantik, generic, konkurensi (task), dan design by contract adalah konsep yang diajukan Ada puluhan tahun lebih awal, lalu diwarisi oleh Haskell, Rust, Swift, dan lainnya
  • SPARK Ada menghapus bahkan race condition data dan kesalahan logika melalui verifikasi formal, dan digunakan di bidang berkeandalan tinggi seperti penerbangan, perkeretaapian, dan sistem pertahanan
  • Ada bukan bahasa yang populer di arus utama, tetapi menjadi fondasi yang mengajukan prinsip-prinsip dasar desain bahasa pemrograman modern sebagai “bahasa yang diam-diam bekerja dengan benar”

Latar kelahiran Ada dan filosofi desainnya

  • Pada awal 1970-an, Departemen Pertahanan AS (DoD) menyelidiki situasi di mana lebih dari 450 bahasa dan dialek bercampur dalam sistem persenjataan, logistik, dan komunikasi
    • Tiap sistem memiliki masalah seperti tidak bisa saling beroperasi, tidak dapat dipelihara, dan penulis asli yang sudah tidak ada
    • Akibatnya timbul krisis pengadaan perangkat lunak
  • DoD tidak mengadopsi bahasa yang sudah ada seperti COBOL, Fortran, atau PL/1, melainkan menjalani proses perumusan kebutuhan selama lima tahun
    • Dokumennya berkembang dari Strawman → Woodenman → Tinman → Ironman → Steelman
    • Steelman (1978) menuntut pemisahan antarmuka yang eksplisit, pengetikan statis yang kuat, konkurensi bawaan, penanganan eksepsi yang konsisten, kemandirian dari mesin, keterbacaan, dan kemudahan verifikasi
  • Dalam kompetisi antara empat tim pada 1979 (Green, Red, Blue, Yellow), tim Green yang dipimpin Jean Ichbiah terpilih, dan bahasanya diberi nama Ada
    • Nama itu diberikan untuk menghormati Ada Lovelace dan melambangkan tujuan bahasa tersebut

Struktur package dan enkapsulasi

  • Struktur inti Ada adalah package, dengan specification dan body yang dipisahkan secara fisik
    • Specification adalah kontrak yang dipublikasikan ke luar, sedangkan body adalah implementasi, dan kompiler memaksa hubungan keduanya
    • Kode klien tidak dapat mengakses elemen yang tidak ada dalam specification
  • Struktur ini adalah cikal bakal sistem modul, yang kemudian ditiru sebagian oleh bahasa-bahasa lain
    • Java, Python, JavaScript, C, Go, dan Rust semuanya belum mewujudkan pemisahan struktural yang sepenuhnya lengkap seperti Ada
  • Tipe private hanya mengekspos nama, sementara representasi internalnya sepenuhnya opak
    • Klien tidak dapat mengetahui struktur internal tipe tersebut dan hanya bisa memakai operasi yang diizinkan
    • Ini adalah penyembunyian representasi (representational invisibility) yang lebih kuat daripada kontrol akses private di Java
  • Java dan C# berkembang secara bertahap selama puluhan tahun menuju tingkat enkapsulasi ala Ada

Sistem tipe dan kendala semantik

  • Ada mendefinisikan perbedaan antara type dan subtype dalam makna matematis
    • Contoh: type Age is range 0 .. 150 membuat tipe terpisah dengan kendala rentang
    • Pengiriman antar tipe yang salah dideteksi sebagai kesalahan waktu kompilasi
  • Pada 1983, sistem tipe Ada jauh lebih ekspresif dibanding C, Fortran, dan Pascal
    • Tipe dengan kendala semantik mencegah kesalahan domain
  • Discriminated record adalah struktur yang memiliki field berbeda bergantung pada nilainya
    • Ini setara dengan sum type atau algebraic data type (ADT) dalam bahasa modern
    • Haskell, Rust, Swift, Kotlin, dan TypeScript memperkenalkan konsep yang sama beberapa dekade kemudian

Generic dan polimorfisme

  • Generic di Ada adalah unit yang dapat menerima type, value, subprogram, dan package sebagai parameter
    • Ini mewujudkan polimorfisme statis (parametric polymorphism) yang memeriksa tipe saat kompilasi
  • C++ (1990), Java (2004), C# (2005), dan Go (2022) memperkenalkan kemampuan serupa beberapa dekade setelah Ada
    • Java dengan type erasure kehilangan informasi tipe saat runtime
    • Ada mendukung pelestarian tipe saat runtime hingga parameterisasi package
  • Generic Ada menawarkan daya ekspresi setingkat higher-kinded polymorphism
    • Mirip dengan type class di Haskell, trait di Rust, dan concepts di C++20

Model konkurensi dan keamanan

  • Sejak 1983, Ada sudah memiliki konkurensi tingkat bahasa (task) bawaan
    • Melalui deklarasi task dan model komunikasi rendezvous, Ada mewujudkan pengiriman pesan tanpa state bersama
    • Channel di Go berasal dari keluarga konsep CSP (Communicating Sequential Processes) yang sama
  • Ada 95 memperkenalkan protected object
    • Ini melindungi akses data dan membedakannya menjadi procedure, function, dan entry
    • Menyediakan kondisi barrier otomatis dan sinkronisasi tanpa lock
  • SPARK Ada memakai verifikasi formal untuk membuktikan secara matematis tidak adanya race condition data, eksepsi, kesalahan rentang, maupun pelanggaran prakondisi dan pascakondisi
    • Sementara borrow checker di Rust hanya menjamin keamanan memori, SPARK juga membuktikan konsistensi logis

Design by contract dan keamanan null

  • Ada 2012 mengintegrasikan contract ke dalam bahasa
    • Dapat menyatakan precondition, postcondition, dan type invariant
    • Toolchain SPARK memanfaatkannya untuk pembuktian statis
  • Konsep Design by Contract dari Eiffel (1986) diformalkan pada tingkat bahasa
    • C++, Java, Python, dan Rust masih terbatas pada implementasi parsial atau tingkat library
  • Ada 2005 memperkenalkan tipe not null untuk mendukung pengecualian null pada waktu kompilasi
    • Secara default, kegagalan aman dijamin lewat eksepsi runtime (Constraint_Error)
    • Pendekatannya mirip nullable reference di C# 8.0

Struktur penanganan eksepsi

  • Ada 83 adalah yang pertama memperkenalkan structured exception handling
    • Eksepsi dideklarasikan sebelum digunakan, ditangani per cakupan, dan memiliki aturan propagasi yang jelas
  • Checked exception di Java adalah bentuk yang lebih berkembang dibanding Ada, karena pemanggil harus menyatakan eksepsi secara eksplisit
    • Ada mengizinkan propagasi eksepsi dengan lebih bebas
  • Rust menghapus eksepsi dan mengadopsi penanganan kesalahan berbasis tipe Result
    • Kontribusi Ada adalah membuat propagasi eksepsi terstruktur dan dapat diprediksi

Annex dan struktur standardisasi

  • Standar Ada memiliki struktur ekstensi opsional bernama Annex
    • Annex C hingga H mendefinisikan fitur untuk sistem, real-time, terdistribusi, numerik, dan bidang berkeandalan tinggi
    • Kompiler harus menerima sertifikasi independen untuk tiap Annex
  • Kesesuaian standar diverifikasi melalui tes ACATS milik ACAA
    • Struktur standar Ada dapat dimanfaatkan langsung untuk sertifikasi perangkat lunak penerbangan DO-178C
    • C/C++ juga bisa memperoleh sertifikasi yang sama, tetapi Ada secara struktural lebih cocok

Pengaruh Ada dan ketimpangan persepsi

  • Ada kurang diperhatikan di budaya Silicon Valley karena merupakan bahasa yang dipimpin pemerintah
    • Ini berlawanan dengan budaya yang menyukai sintaks ringkas berbasis C
  • Kisah sukses Ada di penerbangan, perkeretaapian, dan sistem pertahanan kurang terlihat justru karena tidak gagal
    • Sistem yang sangat andal tidak menghasilkan banyak perdebatan atau insiden
  • Arah perkembangan bahasa modern sedang berkumpul pada prinsip-prinsip yang telah diajukan Ada
    • Seperti pemisahan spesifikasi-implementasi, verifikasi tipe statis, konkurensi tingkat bahasa, dan keamanan berbasis kontrak
  • Ada masih dioperasikan dalam sistem berkeandalan tinggi seperti pesawat, kereta api, dan wahana antariksa, dan tetap menjadi “bahasa yang diam-diam bekerja dengan benar”

1 komentar

 
GN⁺ 3 hari lalu
Komentar Hacker News
  • Saya suka Ada. Tapi saat membahas penanganan tipe, cukup mengejutkan karena keluarga bahasa ML (ML, SML, CML, Caml, OCaml, dll.) sama sekali tidak disebut
    Bahasa-bahasa ini mendukung tipe struktural di tingkat kompiler. Masalah Ada adalah bahasanya sendiri terlalu besar dan sintaksnya rumit, seperti PL/I, PHP, dan Perl. Tulisan itu menganggapnya sebagai kelebihan, tetapi menurut saya ekstensi standar yang dipisahkan sebagai Annex justru lebih baik. Jika bahasa intinya dibuat kecil dan berpusat pada Annex, mungkin akan dipakai lebih luas

    • Di bahasa ML, pengguna tidak bisa mendefinisikan sendiri tipe Integer/Floating point terbatas. Salah satu fitur inti Ada justru ada pada sistem tipe seperti ini. Kalau sudah pernah merasakan sistem tipe Ada, Anda akan terkejut melihat betapa tinggi kualitas dan keandalan kode yang bisa dihasilkannya
  • Salah satu alasan Ada diabaikan adalah karena harga kompiler mencapai puluhan ribu dolar. Di masa ketika belum ada kompiler gratis atau open source, bahasa lain bisa dipakai tanpa biaya. Itu faktor yang sangat menentukan

    • Ada beberapa alasan mengapa Ada tidak pernah keluar dari ceruknya. Kompleksitas bahasa dan teknologi kompiler saat itu membuatnya sulit berjalan dengan baik di mikrokomputer era 1980-an. Intel bahkan membuat i432 yang menanamkan konsep Ada ke perangkat keras, tetapi performanya sangat buruk. Setelah itu mikrokomputer menguasai dunia, dan warisan C serta assembly bertahan lebih dari 20 tahun
    • Saya memakai Ada selama beberapa tahun, dan fakta bahwa rekan-rekan memakai bahasa lain sebagai hobi tidak membantu penyebarannya. Pemrosesan string juga lemah, kecepatannya pun lambat. Terutama pemrosesan konkurensi terasa merepotkan karena tidak memakai thread OS. Akhirnya kami memakai ekstensi real-time HPUX dan menjalankannya sebagai beberapa proses
    • Sejak pertengahan 90-an sudah ada GNAT, dan pada masa itu kompiler komersial juga cukup umum. Yang menghambat Ada adalah persepsi adanya “overhead yang tidak perlu”. Artinya, reputasinya adalah tidak ada alasan memakainya selain untuk militer atau sistem keselamatan
    • GNU Ada Compiler (GNAT) pertama kali dirilis pada 1995
    • Sebenarnya pada 80-an, kualitas kompiler untuk bahasa apa pun memang kurang bagus. GCC pun baru layak dipakai di paruh akhirnya. Kalau memakai bahasa baru, kompiler yang belum matang itu hal wajar. C++ juga saat itu jauh tertinggal dari Ada, dan “fitur killer C++” pada dasarnya adalah bisa dipakai seperti C. Seandainya Ada menyediakan mode kompatibilitas Pascal, mungkin sejarahnya akan berbeda
  • Saat membaca tulisannya, saya merasa baik Ada maupun artikelnya sama-sama menarik, tetapi beberapa kesalahan faktual cukup mencolok. Misalnya dikatakan bahwa hanya Ada yang sepenuhnya memisahkan implementasi dan spesifikasi, padahal JavaScript juga bisa mendefinisikan elemen private di modul ES6. Penjelasan tentang visibilitas private di Java juga keliru. Kesalahan seperti ini menurunkan kredibilitas tulisan itu

    • Di Ada, jika Anda mendefinisikan tipe private, pihak luar tidak bisa mengakses field internalnya. Sebaliknya, di JavaScript siapa pun bebas menambah atau menghapus properti pada objek. Jadi tingkat perlindungan saat compile time di Ada tidak bisa dibandingkan dengan JS
    • Di Java, anggota private bisa diakses lewat reflection. Dengan setAccessible(true), bahkan isi internal String pun bisa diubah
    • Kesan bahwa LLM menulis untuk pembaca manusia dengan cara yang mirip Gell-Mann amnesia terasa menarik
  • Secara keseluruhan artikelnya bagus, tetapi kalimat yang terus diulang seperti “bahasa X mendapatkan fitur ini lebih belakangan daripada Ada” terasa membosankan. Akan jauh lebih meyakinkan kalau ada contoh kode

    • Sebenarnya banyak fitur Ada dipinjam dari bahasa-bahasa sebelumnya (PASCAL, CLU, MODULA, CSP, dll.). Jadi bukan konsep yang sepenuhnya baru, melainkan hasil integrasi ide-ide yang sudah terbukti
    • Beberapa konsep yang diklaim pertama kali diperkenalkan Ada pada praktiknya sering diimplementasikan secara berbeda. Karena itu contoh perbandingan memang diperlukan
    • Tulisan ini bukan argumen bahwa “Ada adalah yang terbaik”, melainkan menunjukkan desain seperti apa yang dibuat Ada demi keamanan dan keandalan. Perbandingan tahun punya arti dalam konteks itu
    • Saya sempat meminta Claude membuat kode demo Ada, dan hasilnya lumayan bagus. Saya sudah lama tahu Ada, tetapi setelah mencoba langsung saya jadi merasa FOMO
    • Dari sudut pandang pengembang Ada, pola perbandingan seperti ini mungkin terasa melelahkan karena sudah berulang selama bertahun-tahun
  • Akun Twitter ini dibuat pada April 2026, dan penulisnya tidak dicantumkan. Dalam waktu singkat produktivitasnya luar biasa tinggi, jadi menarik juga bahwa identitasnya tidak ditampilkan

    • Ada juga pendapat bahwa alasannya tidak ada penulis adalah karena itu bot
  • Klaim “semua bahasa menambahkan sum type dalam 20 tahun terakhir, tetapi Ada sudah memilikinya sejak awal” memang benar, tetapi asal-usulnya bukan dari Ada. Bahasa Hope atau NPL sudah lebih dulu

    • Sebenarnya asal-usul sum type bisa ditelusuri ke makalah John McCarthy tahun 1964, “Definition of new data types in ALGOL X”. Ia mengusulkan kata kunci UNION, yang kemudian berkembang di ALGOL 68, Hope, Miranda, dan lainnya. union di C berbeda dari konsep ini
  • Saya sangat menyukai tulisannya sampai berharap itu bukan ditulis AI, tetapi kecepatan posting di Twitter terlalu tinggi sehingga terasa mencurigakan

    • Tulisan itu agak bertele-tele dan repetitif, jadi terasa seperti AI
    • Sekarang ada banyak alat AI yang otomatis menulis ulang posting blog, jadi wajar kalau muncul kecurigaan
    • Saya juga menikmati membacanya, tetapi setelah melihat ada 110 em dash, barulah saya berpikir, “jangan-jangan ini AI?” Sedih rasanya bahwa sekarang bahkan tulisan blog pun dibaca dengan literasi media seperti ini
    • Saya sendiri menulis 50 artikel selama 3 tahun, tetapi kebanyakan belum diterbitkan. Mungkin penulis ini juga mengalami hal serupa lalu baru belakangan berani memublikasikannya. Saya paham betapa membuat frustrasi jika disalahpahami sebagai AI
    • Kalau AI benar-benar bisa menulis artikel selevel ini, maka itu cukup berharga meski menyita waktu
  • Angkatan Udara AS awalnya ingin memakai Ada, tetapi karena pengembangannya terlambat mereka akhirnya memakai JOVIAL. Saya mengerjakan proyek pertama saya dengan JOVIAL pada 1981, dan saat itu Ada masih pada tahap spesifikasi

    • JOVIAL adalah bahasa turunan IAL, pendahulu ALGOL 60, dan memengaruhi kebutuhan awal pengembangan Ada (STRAWMAN~STEELMAN). Setelah itu Ada menyempurnakan fitur-fitur JOVIAL dan memperkenalkan inovasi seperti penandaan parameter in/out. Berkat ini, Ada tidak memerlukan hal-hal seperti copy constructor atau move semantics yang rumit seperti di C++
  • Di halaman utama situs ada kalimat “ini bukan posisi, ini usulan”, dan ada yang menjadikannya dasar untuk mengklaim bahwa situs itu ditulis AI

    • Namun kalimat itu bukan bukti bahwa teks tersebut dibuat AI
  • Dalam tulisan itu disebut bahwa “sistem modul JavaScript tidak bisa menyembunyikan representasi internal tipe seperti Ada”, padahal di modul JS, jika tidak di-export, hal itu bisa disembunyikan dengan cukup baik. Jadi saya ragu apakah Ada benar-benar punya keunggulan khusus di sini

    • Jika dilihat dari TypeScript, objek JS tetap bisa ditambahi atau diubah propertinya dari luar. Di Ada, instance tipe private tidak bisa dimanipulasi di luar API yang sudah didefinisikan
    • Untuk contoh yang lebih konkret, lihat komentar ini