Ada: उसका डिज़ाइन और वह भाषा जिसने भाषाएँ बनाईं
(iqiipi.com)- 1970 के दशक में अमेरिकी रक्षा विभाग के सॉफ़्टवेयर अव्यवस्था के बीच जन्मी Ada एक ऐसी भाषा है जिसकी मुख्य विशेषताएँ strong static typing और specification-implementation separation हैं
- package संरचना और representational invisibility के जरिए यह पूर्ण encapsulation लागू करती है, और बाद में Java·C#·Go जैसी आधुनिक भाषाओं के module systems को प्रभावित करती है
- semantic constraint types, generic, concurrency(task), contract-based design जैसी अवधारणाएँ Ada ने कई दशक पहले पेश की थीं, जिन्हें बाद में Haskell·Rust·Swift आदि ने आगे बढ़ाया
- SPARK Ada formal verification के जरिए data race और logical errors तक को हटाता है, और aviation·railway·defense systems जैसे high-reliability क्षेत्रों में इस्तेमाल होता है
- Ada भले ही जनप्रिय भाषा न हो, लेकिन “चुपचाप सही ढंग से काम करने वाली भाषा” के रूप में यह आधुनिक programming language design के मूल सिद्धांतों की आधारशिला है
Ada की उत्पत्ति की पृष्ठभूमि और डिज़ाइन दर्शन
- 1970 के दशक की शुरुआत में अमेरिकी रक्षा विभाग(DoD) ने हथियार, logistics और communication systems में 450 से अधिक भाषाओं और dialects के मिश्रण वाली स्थिति का अध्ययन किया
- हर system में interoperability की कमी, maintenance की असंभवता, और मूल लेखक के अनुपस्थित होने जैसी समस्याएँ थीं
- इससे software procurement crisis पैदा हुआ
- DoD ने मौजूदा भाषाएँ (COBOL, Fortran, PL/1 आदि) अपनाने के बजाय, 5 साल तक requirements definition की प्रक्रिया चलाई
- Strawman → Woodenman → Tinman → Ironman → Steelman दस्तावेज़ों तक विकास हुआ
- Steelman(1978) ने explicit interface separation, strong static typing, built-in concurrency, consistent exception handling, machine independence, readability और verifiability की मांग की
- 1979 में 4 टीमों (Green, Red, Blue, Yellow) के बीच प्रतिस्पर्धा में Jean Ichbiah के नेतृत्व वाली Green टीम चुनी गई और उसका नाम Ada रखा गया
- यह नाम Ada Lovelace के सम्मान में रखा गया था और भाषा के उद्देश्य का प्रतीक था
package संरचना और encapsulation
- Ada की केंद्रीय संरचना package है, जिसमें specification और body भौतिक रूप से अलग होते हैं
- specification बाहरी रूप से दिखाई देने वाला contract है, जबकि body implementation है, और compiler दोनों के संबंध को enforce करता है
- client code specification में न होने वाले तत्वों तक पहुँच नहीं सकता
- यह संरचना module system के prototype जैसी है, जिसे बाद की भाषाओं ने आंशिक रूप से अपनाया
- Java, Python, JavaScript, C, Go, Rust में भी Ada जैसी पूर्ण structural separation नहीं है
- private type में केवल नाम दिखता है और उसका internal representation पूरी तरह opaque रहता है
- client type की आंतरिक संरचना नहीं जान सकता और केवल अनुमति प्राप्त operations ही उपयोग कर सकता है
- यह Java के
privateaccess control से भी अधिक शक्तिशाली representational invisibility है
- Java और C# ने कई दशकों में धीरे-धीरे Ada-स्तर के encapsulation की दिशा में विकास किया
type system और semantic constraints
- Ada type और subtype के अंतर को गणितीय अर्थ में परिभाषित करती है
- उदाहरण:
type Age is range 0 .. 150range constraint के साथ एक अलग type बनाता है - गलत types के बीच passing को compile-time error के रूप में पकड़ा जाता है
- उदाहरण:
- 1983 के समय Ada का type system, C, Fortran और Pascal की तुलना में कहीं अधिक expressive था
- semantic constraint types के जरिए domain errors को रोका जाता था
- discriminated record ऐसी संरचना है जिसमें value के आधार पर fields बदलते हैं
- यह आधुनिक भाषाओं के sum type या algebraic data type(ADT) के समान है
- Haskell, Rust, Swift, Kotlin, TypeScript आदि ने कई दशक बाद यही अवधारणा अपनाई
generic और polymorphism
- Ada के generic ऐसे units हैं जो type, value, subprogram और package को parameters के रूप में लेते हैं
- यह compile time पर type checking करने वाला static polymorphism(parametric polymorphism) लागू करता है
- C++(1990), Java(2004), C#(2005), Go(2022) आदि ने Ada के कई दशक बाद समान सुविधाएँ जोड़ीं
- Java में type erasure के कारण runtime type information खो जाती है
- Ada runtime type preservation और package parameterization तक को support करता है
- Ada के generic higher-kinded polymorphism स्तर की expressive power देते हैं
- Haskell के type classes, Rust के traits, और C++20 के concepts जैसी अवधारणाओं से मिलते-जुलते
concurrency model और safety
- Ada में 1983 से ही language-level concurrency(task) built-in है
taskdeclaration और rendezvous communication model के जरिए shared state के बिना message passing लागू किया जाता है- Go के channel इसी CSP(Communicating Sequential Processes) परिवार की अवधारणा हैं
- Ada 95 ने protected object पेश किया
- यह data access को सुरक्षित रखता है और
procedure,function,entryमें विभाजित होता है - automatic barrier conditions और lock-free synchronization देता है
- यह data access को सुरक्षित रखता है और
- SPARK Ada formal verification के जरिए यह गणितीय रूप से सिद्ध करता है कि data race, exceptions, range errors, और pre/postcondition violations नहीं होंगे
- जहाँ Rust का borrow checker केवल memory safety सुनिश्चित करता है, SPARK logical consistency तक सिद्ध कर सकता है
contract-based design और null safety
- Ada 2012 ने contracts को भाषा में एकीकृत किया
- precondition, postcondition, और type invariant को स्पष्ट रूप से लिखा जा सकता है
- SPARK toolchain इन्हें static proof में इस्तेमाल करती है
- Eiffel(1986) की Design by Contract अवधारणा को भाषा-स्तर पर औपचारिक रूप दिया गया
- C++, Java, Python, Rust आदि अभी भी आंशिक या library-level implementations तक सीमित हैं
- Ada 2005 ने
not nulltype पेश किया, जिससे compile-time null exclusion संभव हुआ- default रूप से runtime exception(
Constraint_Error) के जरिए safe failure सुनिश्चित होती है - यह C# 8.0 के nullable reference जैसी पद्धति है
- default रूप से runtime exception(
exception handling संरचना
- Ada 83 ने सबसे पहले structured exception handling प्रस्तुत किया
- exception को declare करने के बाद उपयोग किया जाता है, scope स्तर पर handle किया जाता है, और propagation rules स्पष्ट हैं
- Java की checked exception Ada से अधिक विकसित रूप है, जहाँ caller को exception स्पष्ट करना होता है
- Ada exception propagation को स्वतंत्र रूप से अनुमति देती है
- Rust exceptions को हटाकर
Resulttype आधारित error handling अपनाता है- Ada का योगदान यह था कि उसने exception propagation को structured और predictable बनाया
Annex और standardization संरचना
- Ada standard में Annex नाम की optional extension संरचना है
- Annex C~H system, real-time, distributed, numeric, और high-reliability क्षेत्रों की सुविधाएँ परिभाषित करते हैं
- compiler को हर Annex के लिए independent certification लेना होता है
- ACAA के ACATS tests के जरिए standard conformance की जाँच होती है
- DO-178C aviation software certification में Ada की standard संरचना सीधे उपयोगी हो सकती है
- C/C++ भी वही certification पा सकते हैं, लेकिन Ada संरचनात्मक रूप से अधिक उपयुक्त है
Ada का प्रभाव और पहचान का असंतुलन
- Ada एक government-led language होने के कारण Silicon Valley की संस्कृति में खास ध्यान नहीं पा सकी
- यह C-आधारित संक्षिप्त syntax को पसंद करने वाली संस्कृति से विपरीत थी
- Ada की सफलताएँ (aviation, railway, defense systems) विफलता न होने के कारण कम दिखाई देती हैं
- उच्च विश्वसनीयता वाले systems आम तौर पर चर्चा या घटनाएँ पैदा नहीं करते
- आधुनिक भाषाओं की विकास दिशा उन सिद्धांतों की ओर जा रही है जिन्हें Ada पहले ही प्रस्तुत कर चुकी थी
- specification-implementation separation, static type verification, language-level concurrency, contract-based safety आदि
- Ada आज भी aircraft, railway, spacecraft जैसे high-reliability systems में संचालन में है, “चुपचाप सही ढंग से काम करने वाली भाषा” के रूप में बनी हुई है
1 टिप्पणियां
Hacker News की राय
मुझे Ada पसंद है। लेकिन type handling की बात करते हुए ML परिवार की भाषाओं (ML, SML, CML, Caml, OCaml आदि) को पूरी तरह छोड़ देना हैरान करने वाला था
ये भाषाएँ compiler स्तर पर structural typing को support करती हैं। Ada की समस्या यह थी कि PL/I, PHP, Perl की तरह भाषा खुद ही बहुत बड़ी थी और उसका syntax जटिल था। लेख में इसे उसकी ताकत बताया गया है, लेकिन मेरी नज़र में Annex के रूप में अलग किए गए standard extensions ज़्यादा बेहतर थे। अगर core language को छोटा रखा जाता और Annex-केंद्रित दिशा अपनाई जाती, तो शायद इसका इस्तेमाल अधिक व्यापक होता
Ada के नज़रअंदाज़ किए जाने का एक कारण compiler की कीमत भी थी, जो कई दसियों हज़ार डॉलर तक होती थी। जब free या open source compiler नहीं थे, तब दूसरी भाषाएँ मुफ़्त में इस्तेमाल की जा सकती थीं। वही निर्णायक कारक था
लेख पढ़ते हुए Ada और खुद लेख दोनों दिलचस्प लगे, लेकिन कुछ तथ्यात्मक त्रुटियाँ नज़र आईं। उदाहरण के लिए, यह कहा गया कि implementation और specification को पूरी तरह अलग करने वाली केवल Ada है, जबकि JavaScript में भी ES6 modules के भीतर private elements define किए जा सकते हैं। Java के
privatevisibility के बारे में भी विवरण गलत था। ऐसी गलतियों से लेख की विश्वसनीयता कम हो जाती हैprivatetype define करने पर बाहरी code उसके internal fields तक पहुँच नहीं सकता। इसके उलट JavaScript में किसी भी object में मनचाहे properties जोड़ी या हटाई जा सकती हैं। यानी Ada की compile-time protection का स्तर JS से तुलना योग्य नहीं हैsetAccessible(true)से String के भीतर की चीज़ें भी बदली जा सकती हैंलेख कुल मिलाकर अच्छा था, लेकिन बार-बार दोहराया गया “भाषा X में यह feature Ada के बाद आया” वाला वाक्य उबाऊ लगने लगा। अगर code examples होते, तो बात कहीं अधिक प्रभावशाली होती
यह Twitter अकाउंट अप्रैल 2026 में बनाया गया था, और लेखक का नाम साफ़ तौर पर नहीं दिया गया है। कम समय में बहुत ज़्यादा उत्पादकता दिखाई गई, इसलिए नाम छिपा होना दिलचस्प लगा
“पिछले 20 सालों में हर भाषा ने sum type जोड़ा, लेकिन Ada में वह शुरू से था” — यह दावा सही है, लेकिन इसकी उत्पत्ति Ada नहीं है। Hope भाषा या NPL उससे पहले थे
UNIONkeyword प्रस्तावित किया था, और बाद में ALGOL 68, Hope, Miranda आदि में यह विकसित हुआ। C काunionइस concept से अलग हैयह लेख इतना पसंद आया कि मन किया काश यह AI द्वारा लिखा हुआ न हो, लेकिन Twitter पर पोस्ट की गति इतनी तेज़ थी कि शक होना स्वाभाविक था
अमेरिकी वायुसेना मूल रूप से Ada इस्तेमाल करना चाहती थी, लेकिन development में देरी हुई, इसलिए JOVIAL का उपयोग किया गया। मैंने 1981 में JOVIAL पर अपना पहला project किया था, और उस समय Ada अभी specification चरण में था
साइट के मुख्य पृष्ठ पर “यह कोई stand नहीं, बल्कि एक proposal है” जैसी पंक्ति है, और उसी के आधार पर दावा किया गया कि यह AI से लिखा गया साइट है
लेख में कहा गया कि “JavaScript का module system, Ada की तरह type की internal representation नहीं छिपा सकता”, लेकिन वास्तव में JS modules में अगर export न किया जाए तो चीज़ें पर्याप्त रूप से छिपाई जा सकती हैं। इसलिए यह सवाल उठा कि Ada सच में किस तरह बेहतर है