অ্যাডা

**অ্যাডা** হলো প্যাসকেল এবং অন্যান্য প্রোগ্রামিং ভাষা থেকে উদ্ভূত একটি স্ট্রাকচারড, স্ট্যাটিকালি টাইপড, ইম্পারেটিভ, অবজেক্ট ওরিয়েন্টেড উচ্চস্তরের প্রোগ্রামিং ভাষা। এটিতে ডিজাইন বাই কন্ট্রাক্ট (DbC), অত্যন্ত স্ট্রং টাইপিং, সুস্পষ্ট কনকারেন্সি, টাস্ক, সিঙ্ক্রোনাস মেসেজ পাসিং, সুরক্ষিত অবজেক্ট, এবং নন-ডিটারমিনিজমের অন্তর্নির্মিত সমর্থন রয়েছে। অ্যাডা রানটাইম ত্রুটির সাহায্যে ত্রুটিগুলি খুঁজতে কম্পাইলার ব্যবহার করে কোডের সুরক্ষা এবং রক্ষণাবেক্ষণ উন্নত করে। অ্যাডা একটি আন্তর্জাতিক প্রযুক্তিগত মান, যা আন্তর্জাতিক মান সংস্থা (আইএসও), এবং ইন্টারন্যাশনাল ইলেকট্রোটেকনিক্যাল কমিশন (আইইসি) দ্বারা যৌথভাবে সংজ্ঞায়িত। ২০২০ সাল অনুযায়ী, অনানুষ্ঠানিকভাবে অ্যাডা ২০১২ নামে পরিচিত মান হলো আইএসও/আইইসি ৮৬৫২:২০১২।

প্রাথমিকভাবে ১৯৭৭ থেকে ১৯৮৩ সাল পর্যন্ত এটি মার্কিন যুক্তরাষ্ট্রের প্রতিরক্ষা বিভাগের তত্ত্বাবধানে গ্রুপ বুল কোম্পানিতে কর্মরত ফরাসি কম্পিউটার বিজ্ঞানী জঁ ইখবিয়া-র নেতৃত্বে পরিকল্পিত হয়েছিল। এটি নির্মাণের উদ্দেশ্য ছিল তৎকালীন ডিওডিতে ব্যবহৃত প্রায় ৪৫০ এর অধিক প্রোগ্রামিং ভাষাকে প্রতিস্থাপিত করা। প্রোগ্রামিং ধারণার প্রবর্তক হিসেবে স্বীকৃত অ্যাডা লাভলেসের নামে অ্যাডা ভাষাটির নামকরণ করা হয়েছিল।

## বৈশিষ্ট্য
অ্যাডা মূলত এমবেডেড এবং রিয়েল-টাইম সিস্টেমগুলির জন্য পরিকল্পিত হয়েছিল। ১৯৯২ এবং ১৯৯৫ এর মধ্যবর্তী সময়ে ইন্টারমেট্রিক্সের এস টাকার টাফ্ট অ্যাডা&nbsp;৯৫ রিভিশন ডিজাইন করেছেন যা সিস্টেম, সংখ্যাগত, আর্থিক এবং অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (ওওপি) এর জন্য সমর্থন উন্নত করেছে।

অ্যাডার বৈশিষ্ট্যগুলির মধ্যে রয়েছে: স্ট্রং টাইপিং, মডিউলার প্রোগ্রামিং মেকানিজম (প্যাকেজ), রান-টাইম চেকিং, সমান্তরাল প্রক্রিয়াজাতকরণ (টাস্ক, সিঙ্ক্রোনাস মেসেজ পাসিং, সুরক্ষিত অবজেক্ট এবং ননডেস্ট্রিমেন্টিক সিলেক্ট স্টেটমেন্ট), এক্সেপশন ব্যবস্থাপনা এবং জেনেরিক। অ্যাডা&nbsp;৯৫ গতিশীল প্রেরণাসহ অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের জন্য সমর্থন যুক্ত করেছে।

অ্যাডার সিনট্যাক্সটি মৌলিক ক্রিয়াকলাপ সম্পাদনের উপায়সমূহকে সংক্ষিপ্ত করে এবং এটিতে ইংরেজী কীওয়ার্ড (যেমন "or else" এবং "and then") এবং প্রতীক (যেমন "||" এবং "&&") ব্যবহার করা হয়। অ্যাডা মৌলিক গাণিতিক অপারেটর "+", "-", "*" এবং "/" ব্যবহার করলেও অন্যান্য চিহ্নগুলি ব্যবহার করা থেকে এড়িয়ে যায়। কোড ব্লকসমূহ "declare", "begin" এবং "end" এর মতো শব্দ দ্বারা সীমাবদ্ধ করা হয়, যেখানে "end" (বেশিরভাগ ক্ষেত্রে) এর পর যে ব্লকটি বন্ধ হয়ে যায় তার শনাক্তকারী (যেমন, *if ... end if*, *loop ... end loop*) ব্যবহার করা হয়।

অ্যাডা বড় মাপের সফটওয়্যার সিস্টেম বিকাশের জন্য তৈরি করা হয়েছে। অ্যাডার প্যাকেজগুলি পৃথকভাবে কম্পাইল করা যায়। ধারাবাহিকতা যাচাই করা ছাড়াও অ্যাডা প্যাকেজ স্পেসিফিকেশনগুলো (প্যাকেজ ইন্টারফেস) পৃথকভাবে কম্পাইল করা যেতে পারে। এর ফলে বাস্তবায়ন শুরুর আগে ডিজাইন পর্বের প্রথম দিকেই সমস্যাগুলি শনাক্ত করা সম্ভব হয়।

বহুসংখ্যক কম্পাইল-টাইম চেকগুলি এমন বাগগুলি এড়াতে সহায়তা করে যা অন্যান্য ভাষায় রান-টাইমের আগে শনাক্ত করা যায় না বা শনাক্ত করার জন্য সোর্স কোডে সুস্পষ্ট চেক সংযুক্ত করতে হয়। উদাহরণস্বরূপ, সিনট্যাক্সের সাথে মেলে না এমন শেষ টোকেনের কারণে ত্রুটিগুলি রোধ করতে ব্লকগুলির সুস্পষ্টভাবে নামকরণ করা দরকার। স্ট্রং টাইপিংয়ের ফলে অনেকগুলি সাধারণ সফ্টওয়্যার ত্রুটি (ভুল পরামিতি, সীমার লঙ্ঘন, অবৈধ উদ্ধৃতি, টাইপের অমিল ইত্যাদি) কম্পাইল-টাইম অথবা রান-টাইমের সময় শনাক্ত করা যায়। যেহেতু কনকারেন্সি ভাষার নির্দিষ্টকরণের অংশ, তাই কম্পাইলার কিছু ক্ষেত্রে সম্ভাব্য অচলাবস্থা শনাক্ত করতে পারে। কম্পাইলার সাধারণত আইডেন্টিফারারের বানান ভুল, প্যাকেজগুলির দৃশ্যমানতা, অপ্রয়োজনীয় ডেক্লারেশন ইত্যাদির জন্যও পরীক্ষা করে এবং ত্রুটিটি কীভাবে ঠিক করা যায় সে সম্পর্কে সতর্কতা এবং দরকারি পরামর্শ সরবরাহ করতে পারে।

অ্যাডা অননুমোদিত মেমরির অ্যাক্সেস, বাফার ওভারফ্লো ত্রুটি, পরিসীমা লঙ্ঘন, অ্যারে অ্যাক্সেস ত্রুটি এবং অন্যান্য শনাক্তযোগ্য বাগগুলি থেকে রক্ষা করতে রান-টাইম চেক সমর্থন করে। এই চেকগুলি রানটাইম দক্ষতার স্বার্থে অক্ষম করা যেতে পারে তবে প্রায়শই দক্ষতার সাথে কম্পাইল করা যায়। এটিতে প্রোগ্রাম যাচাইকরণে সহায়তা করার সুবিধাও রয়েছে। একারনে সংকটপূর্ণ সিস্টেমে অ্যাডা ব্যাপকভাবে ব্যবহৃত হয়, যেখানে যেকোনও অসঙ্গতির পরিণতি খুব মারাত্মক হতে পারে, যেমন, দুর্ঘটনাজনিত মৃত্যু, আঘাত বা গুরুতর আর্থিক ক্ষতি। অ্যাডা ব্যবহৃত হয় এমন সিস্টেমগুলির উদাহরণগুলির মধ্যে রয়েছে এভিওনিক্স, এয়ার ট্র্যাফিক কন্ট্রোল, রেলপথ, ব্যাংকিং, সামরিক এবং মহাকাশ প্রযুক্তি।

আডার ডায়নামিক মেমরি পরিচালনা উচ্চ-স্তরের এবং টাইপ-নিরাপদ। অ্যাডার কোনও জেনেরিক বা টাইপহীন পয়েন্টার নেই; বা এটি সুস্পষ্টভাবে কোনও পয়েন্টার টাইপ ঘোষণা করে না। এর পরিবর্তে, সমস্ত ডায়নামিক মেমরি অ্যালোকেশন এবং ডিঅ্যালোকেশন অবশ্যই স্পষ্টভাবে ঘোষিত অ্যাক্সেস টাইপের মাধ্যমে হতে হবে। প্রতিটি অ্যাক্সেস টাইপের একটি সম্পর্কিত স্টোরেজ পুল রয়েছে যা মেমরি পরিচালনার নিম্ন-স্তরের বিশদ পরিচালনা করে; প্রোগ্রামার হয় ডিফল্ট স্টোরেজ পুল ব্যবহার করতে পারেন বা নতুন স্টোরেজ পুল সংজ্ঞায়িত করতে পারেন (অসামঞ্জস্য মেমরি অ্যাক্সেসের জন্য)। এমনকি বিভিন্ন ধরনের অ্যাক্সেস টাইপ ঘোষণা করাও সম্ভব যা সমস্ত একই টাইপ মনোনীত করে তবে বিভিন্ন স্টোরেজ পুল ব্যবহার করে। এছাড়াও, ভাষাটি কম্পাইলের সময় এবং রান-টাইম উভয়ই অ্যাক্সেসযোগ্যতার যাচাইয়ের জন্য সরবরাহ করে, এটি নিশ্চিত করে যে কোনও অ্যাক্সেসের মানটি যে অবজেক্টের দিকে ইঙ্গিত করে তার টাইপগুলিকে প্রকাশ করতে পারে না।

যদিও ভাষার শব্দার্থগুলি অ্যাক্সেসযোগ্য অবজেক্টগুলিকে স্বয়ংক্রিয় আবর্জনা সংগ্রহের অনুমতি দেয়, বেশিরভাগ বাস্তবায়ন এটিকে ডিফল্টরূপে সমর্থন করে না, কারণ এটি রিয়েল-টাইম সিস্টেমে অবিশ্বাস্য আচরণের কারণ হতে পারে। অ্যাডা অঞ্চল-ভিত্তিক মেমরি পরিচালনার সীমিত ফর্মকে সমর্থন করে; এছাড়াও, স্টোরেজ পুলের সৃজনশীল ব্যবহার স্বয়ংক্রিয় আবর্জনা সংগ্রহের সীমিত ফর্মের জন্য সরবরাহ করতে পারে, যেহেতু স্টোরেজ পুলটি ধ্বংস করার ফলে পুলের সমস্ত বস্তু ধ্বংস হয়।

এম ড্যাশের অনুরূপ একটি ডাবল-ড্যাশ ("--") দ্বারা মন্তব্য পাঠ্যকে বোঝানো হয়। সোর্স কোডের কোনও একটি সম্পূর্ণ বিভাগ দুর্ঘটনাক্রমে অকার্যকর হওয়া থেকে রোধ করতে অনাবৃত মন্তব্যগুলি লাইনের শেষে শেষ হয়ে যায়। কোডের পুরো ব্লক অকার্যকর করার জন্য প্রতিটি লাইনের (বা কলাম) শুরুতে পৃথকভাবে "--" যুক্ত করা প্রয়োজন।

সেমিকোলন (";") হলো বিবৃতি সমাপ্তিকারক এবং নাল বা নো-অপারেশন বিবৃতি হলো `null;` সমাপ্তি ঘটানোর মতো বিবৃতি ছাড়া কেবল `;` ব্যবহারের অনুমতি নেই।

অ্যাডা প্রোগ্রামারদের তাদের অ্যাডা সোর্স কোড রচনায় সহায়তা করতে অনেকের ব্যবহৃত একটি উল্লেখযোগ্য মুক্ত সফটওয়্যার সরঞ্জাম হলো জিএনএটি প্রোগ্রামিং স্টুডিও।

## ইতিহাস
১৯৭০ এর দশকে মার্কিন প্রতিরক্ষা বিভাগ (ডিওডি) এর এমবেডেড কম্পিউটার সিস্টেম প্রকল্পগুলির জন্য ব্যবহৃত বিভিন্ন প্রোগ্রামিং ভাষার সংখ্যা নিয়ে উদ্বিগ্ন হয়ে পড়েছিল যার মধ্যে অনেকগুলি ভাষাই অপ্রচলিত বা হার্ডওয়্যার-নির্ভর ছিল এবং সেগুলির কোনোটিই নিরাপদ মডুলার প্রোগ্রামিং সমর্থন করে না। ১৯৭৫ সালে, হাই অর্ডার ল্যাঙ্গুয়েজ ওয়ার্কিং গ্রুপ (HOLWG) নামে একটি ওয়ার্কিং গ্রুপ গঠিত হয়েছিল, যা উদ্দেশ্যে ছিল প্রতিরক্ষা বিভাগ এবং যুক্তরাজ্যের প্রতিরক্ষা মন্ত্রণালয়ের জন্য প্রয়োজনীয় একটি প্রোগ্রামিং ভাষা খুজে বের করে বা তৈরি করে প্রোগ্রামিং ভাষার এই সংখ্যা হ্রাস করা। মূল স্ট্র ম্যানের প্রস্তাবনা দিয়ে শুরু হওয়া বহু পুনরাবৃত্তির পরে শেষ প্রোগ্রামিং ভাষার নামকরণ করা হয়েছিল আডা। প্রকল্পসমূহের জন্য ব্যবহৃত উচ্চ-স্তরের প্রোগ্রামিং ভাষার সংখ্যা ১৯৮৩ সালের ৪৫০ এরও বেশি থেকে ১৯৯৬ সালের মধ্যে ৩৭ এ নেমে এসেছে।

HOLWG ওয়ার্কিং গ্রুপ স্টিলম্যান ভাষার প্রয়োজনীয়তা রচনা করেছিল, এটি একটি ধারাবাহিক নথি যা তারা মনে করে যে একটি প্রোগ্রামিং ভাষার এই প্রয়োজনীয়তাগুলো পূরণ করা উচিত। অনেকগুলি বিদ্যমান ভাষা আনুষ্ঠানিকভাবে পর্যালোচনা করা হয়েছিল, তবে দলটি ১৯৭৭ সালে সিদ্ধান্তে পৌঁছেছিল যে কোনও বিদ্যমান ভাষা নির্দিষ্টকরণ মেনে চলে না।

ফলে নতুন প্রোগ্রামিং ভাষার তৈরির জন্য প্রস্তাব করা হয়েছিল এবং এটি বাস্তবায়নের জন্য রেড (বেঞ্জামিন ব্রোসগোলের নেতৃত্বে ইন্টারমিট্রিক্স), গ্রিন (জিন ইছবিয়ার নেতৃত্বে সিআইআই হানিওয়েল বুল), ব্লু (জন গুডেনফের নেতৃত্বে সফটেক) এবং ইয়েলো (এসআইআর ইন্টারন্যাশনাল, জে স্পিটজেনের নেতৃত্বে) নামে চারজন ঠিকাদারকে নিয়োগ দেওয়া হয়েছিল। সর্বজনীন তদন্তের পরে ১৯৭৮ সালের এপ্রিলে লাল এবং সবুজের প্রস্তাবনা পরবর্তী পর্যায়ে উত্তীর্ণ হয়। ১৯৭৯ সালের মে মাসে সিআইআই হানিওয়েল বুলের জিন ইছবিয়ার ডিজাইন করা সবুজের প্রস্তাবনাটি বেছে নেওয়া হয়েছিল এবং অ্যাডা লাভলেসের নামে অ্যাডা নামকরণ করা হয়েছিল। এই প্রস্তাবনাটি ১৯৭০ এর দশকে ইছবিয়া এবং তার গ্রুপ কর্তৃক বিকশিত ভাষা এলআইএস দ্বারা প্রভাবিত হয়েছিল। প্রাথমিক অ্যাডা রেফারেন্স ম্যানুয়ালটি ১৯৭৯ সালের জুনে এসিএম সিগপ্ল্যান নোটিসে প্রকাশিত হয়েছিল। মিলিটারি স্ট্যান্ডার্ড রেফারেন্স ম্যানুয়ালটি ১০ ​​ডিসেম্বর, ১৯৮০ (অ্যাডা লাভলেসের জন্মদিন) অনুমোদিত হয়েছিল এবং অ্যাডা লাভলেসের জন্ম বর্ষের সম্মানে MIL-STD-1815 নম্বর দেওয়া হয়েছিল। ১৯৮১ সালে টোনি হোর তাঁর টুরিং পুরস্কারের বক্তৃতার সুযোগ নিয়ে অ্যাডাকে অত্যধিক জটিল এবং অবিশ্বস্ত বলে সমালোচনা করেছিলেন, কিন্তু পরবর্তীকালে তিনি অ্যাডা পাঠ্যপুস্তকের জন্য লিখেছিলেন।

অ্যাডা প্রাথমিকভাবে প্রোগ্রামিং সম্প্রদায়ের কাছ থেকে পুরোপুরি মনোযোগ আকর্ষণ করেছিল। এর সমর্থকরা ভবিষ্যদ্বাণী করেছিল যে এটি কেবল প্রতিরক্ষা সম্পর্কিত কাজের জন্য নয়, বরং সাধারণ উদ্দেশ্যে প্রোগ্রামিংয়ের জন্য একটি প্রভাবশালী ভাষাতে পরিণত হতে পারে। ইছবিয়া প্রকাশ্যে বলেছিলেন যে দশ বছরের মধ্যে কেবল দুটি প্রোগ্রামিং ভাষা থাকবে: অ্যাডা এবং লিস্প। প্রারম্ভিক বৃহত জটিল ভাষা কম্পাইল করতে অ্যাডা কম্পাইলারগুলো সংগ্রাম করেছিল এবং কম্পাইল-টাইম এবং রান-টাইম পারফরম্যান্স উভয়ই ধীর ছিল। কম্পাইলার বিক্রেতারা তাদের প্রচুর প্রচেষ্টা ব্যয় করেছেন বৃহত্তর, ভাষা-ধারণা-পরীক্ষা-নিরীক্ষায়, সরকারের প্রয়োজনীয় "এসিভিসি" বৈধতা স্যুট যা অ্যাডা ভাষার প্রচেষ্টার অন্য একটি অভিনব বৈশিষ্ট্যে প্রয়োজনীয় ছিল।

প্রথম বৈধতা প্রাপ্ত অ্যাডা বাস্তবায়নটি হলো ১৯৮৩ সালের ১১ এপ্রিল প্রত্যয়িত এনওয়াইইউ অ্যাডা/এড অনুবাদক। উচ্চ-স্তরের সেট ভাষা এসইটিএল-এ এনওয়াইইউ অ্যাডা/এড প্রয়োগ করা হয়েছে। বেশ কয়েকটি বাণিজ্যিক সংস্থা অ্যালেসিস, টেলিসফট, ডিডিসি -১, অ্যাডভান্সড কম্পিউটার প্রযুক্তি, টার্টান ল্যাবরেটরিজ, টিএলডি সিস্টেমস এবং ভারডিক্স সহ সম্পর্কিত বিকাশের সরঞ্জামসহ বেশ কয়েকটি অ্যাডা কম্পাইলার এবং সম্পর্কিত উন্নয়ন সরঞ্জাম সরবরাহ করা শুরু করে।

[সংযোগ=https://en.wikipedia.org/wiki/File:Ada_Lovelace_1838.jpg|ডান|থাম্ব|196x196পিক্সেল|[অ্যাডা লাভলেস]]

১৯৯১ সালে মার্কিন প্রতিরক্ষা বিভাগের সমস্ত সফ্টওয়্যারের জন্য অ্যাডা (*অ্যাডা ম্যান্ডেট*) ব্যবহার করা শুরু হয়েছিল, যদিও প্রায়শই এই নিয়মের ব্যতিক্রম মঞ্জুর করা হয়েছিল। ডিওডি সিওটিএস প্রযুক্তি গ্রহণ করতে শুরু করার সাথে সাথে ১৯৯৭ সালে প্রতিরক্ষা বিভাগের অ্যাডা ম্যান্ডেট কার্যকরভাবে সরানো হয়েছিল। অন্যান্য ন্যাটো দেশগুলিতেও অনুরূপ প্রয়োজনীয়তা বিদ্যমান ছিল: কমান্ড এবং নিয়ন্ত্রণ এবং অন্যান্য কার্যাদি জড়িত ন্যাটো সিস্টেমগুলির জন্য অ্যাডা প্রয়োজন ছিল এবং সুইডেন, জার্মানি এবং কানাডার মতো দেশগুলিতে প্রতিরক্ষা সম্পর্কিত প্রয়োগের জন্য অ্যাডা বাধ্যতামূলক অথবা পছন্দের ভাষা ছিল।

১৯৮০ এর দশকের শেষের দিকে এবং ১৯৯০ এর দশকের গোড়ার দিকে, অ্যাডা কম্পাইলারগুলোর পারফরম্যান্স উন্নত হয়েছিল, তবে তখনও অ্যাডার দক্ষতা পুরোপুরি কাজে লাগাতে বাধা ছিল, একটি টাস্কিং মডেল যা বেশিরভাগ রিয়েল-টাইম প্রোগ্রামারদের ব্যবহৃত ছিল তার চেয়ে আলাদা ছিল।

অ্যাডার সুরক্ষা-সংকটমূলক সমর্থন বৈশিষ্ট্যগুলির কারণে এটি এখন কেবলমাত্র সামরিক প্রয়োগের জন্যই নয়, যেসকল ক্ষেত্রে একটি সফটওয়্যার বাগের পরিণতি মারাত্মক হতে পারে এরকম বাণিজ্যিক প্রকল্পগুলিতেও অ্যাডা ব্যবহৃত হয়, যেমন, এভায়োনিকস এবং এয়ার ট্র্যাফিক কন্ট্রোল, বাণিজ্যিক রকেট যেমন এরিয়েন ৪ এবং ৫, কৃত্রিম উপগ্রহ এবং অন্যান্য মহাকাশ ব্যবস্থা, রেলপথ পরিবহন এবং ব্যাংকিং। কানাডীয় অটোমেটেড এয়ার ট্র্যাফিক সিস্টেম অ্যাডা (এসএলওসি গণনা) ভাষা ব্যবহার করে ১ মিলিয়ন লাইনে লেখা হয়েছিল। এটিতে রয়েছে উন্নত ডিস্ট্রিবিউটেড প্রক্রিয়াজাতকরণ, একটি ডিস্ট্রিবিউটেড অ্যাডা ডাটাবেস এবং অবজেক্ট-ওরিয়েন্টেড ডিজাইন। অ্যাডা অন্যান্য এয়ার ট্র্যাফিক সিস্টেমেও ব্যবহৃত হয়, যেমন, যুক্তরাজ্যের পরবর্তী প্রজন্মের অন্তর্বর্তী ভবিষ্যত অঞ্চল নিয়ন্ত্রণ সরঞ্জাম সহায়তা (আইএফএসিটিএস) এয়ার ট্র্যাফিক কন্ট্রোল সিস্টেমটি স্পার্ক অ্যাডা ব্যবহার করে ডিজাইন এবং প্রয়োগ করা হয়েছে। এটি টিজিভি হাই-স্পিড রেল সিস্টেমের ফরাসি টিভিএম ইন-ক্যাব সিগন্যালিং সিস্টেম এবং প্যারিস, লন্ডন, হংকং এবং নিউ ইয়র্ক সিটির মেট্রো শহরতলির ট্রেনগুলিতেও ব্যবহৃত হয়।

## মানীকরণ
১৯৮৩ সালে ভাষাটি আনসি স্ট্যান্ডার্ড (ANSI/MIL-STD 1815A) এবং ১৯৮৭ সালে ফরাসি ভাষায় অনুবাদের পর ইংরেজি সংস্করণে কোনও পরিবর্তন বাদে আইএসও স্ট্যান্ডার্ড হয়েছিল। ভাষাটির এই সংস্করণটি নসিক র্তৃক গৃহীত হওয়ার তপরথেকে ইসাধারণত অ্যাডা&nbsp;৮৩ নামে পরিচিত, তবে এটি কখনও কখনও আইএসও কর্তৃক গৃহীত হওয়ার তারিখ হিসেবে অ্যাডা&nbsp;৮৭ নামেও পরিচিত।

১৯৯৫ সালের ফেব্রুয়ারিতে আইএসও এবং আনসি (ISO-8652:1995) উভয় কর্তৃক যৌথভাবে গৃহীত অ্যাডা&nbsp;৯৫ প্রকাশিত হয়েছিল, যা হলো প্রথম আইওসও স্ট্যান্ডার্ড অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভাষা। মানক পুনর্বিবেচনা এবং ভবিষ্যতের গ্রহণযোগ্যতায় সহায়তা করার জন্য, মার্কিন বিমান বাহিনী জিএনএটি কম্পাইলার বিকাশের জন্য অর্থায়ন করেছিল। বর্তমানে, জিএনএটি কম্পাইলার জিএনইউ কম্পাইলার সংগ্রহের অংশ।

অ্যাডা ভাষার প্রযুক্তিগত বিষয়বস্তু উন্নত ও হালনাগাদ করার কাজ অব্যাহত রয়েছে। ২০০১ সালের অক্টোবরে অ্যাডা&nbsp;৯৫ এর একটি প্রযুক্তিগত শুদ্ধিপত্র প্রকাশিত হয়েছিল এবং ২০০৭ সালের ৯ মার্চ এটির একটি বড় সংশোধনী ISO/IEC 8652:1995/Amd 1:2007 প্রকাশিত হয়েছিল। স্টকহোমে অ্যাডা-ইউরোপ ২০১২ সম্মেলনে অ্যাডা রিসোর্স অ্যাসোসিয়েশন (এআরএ) এবং অ্যাডা-ইউরোপ অ্যাডা ভাষার সর্বশেষ সংস্করণটির নকশা শেষ করার এবং অনুমোদনের জন্য আন্তর্জাতিক সংস্থার (আইএসও) কাছে রেফারেন্স ম্যানুয়াল জমা দেওয়ার ঘোষণা দিয়েছে। ২০১২ সালের ডিসেম্বরে ISO/IEC 8652:2012 প্রকাশিত হয়েছিল।

অন্যান্য সম্পর্কিত মানগুলির মধ্যে রয়েছে ISO 8651-3:1988 *Information processing systems—Computer graphics—Graphical Kernel System (GKS) language bindings—Part 3: Ada*.

## ভাষা গঠন
আডা হলো ALGOL এর মতো একটি প্রোগ্রামিং ভাষা যা সংরক্ষিত শব্দ যেমন *if*, *then*, *else*, *while*, *for*, ইত্যাদি সহ নিয়ন্ত্রণ কাঠামোর বৈশিষ্ট্যযুক্ত। তবে, অ্যাডায় অনেকগুলি ডেটা স্ট্রাকচারিং সুবিধা এবং অন্যান্য বিমূর্ততা রয়েছে যা মূল ALGOL 60 তে অন্তর্ভুক্ত ছিল না, যেমন টাইপ সংজ্ঞা, রেকর্ড, পয়েন্টার, গণনা। এই জাতীয় নির্মাণগুলির কিছুটা উত্তরাধিকার সূত্রে প্রাপ্ত বা প্যাসকেলের দ্বারা অনুপ্রাণিত হয়েছিল।

### অ্যাডায় "Hello, world!"
কোন প্রোগ্রামিং ভাষার সিনট্যাক্সের একটি সাধারণ উদাহরণ "হ্যালো, ওয়ার্ল্ড!" প্রোগ্রাম: (hello.adb)


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


এই প্রোগ্রামটি নির্বিঘ্নে মুক্তভাবে উপলব্ধ উন্মুক্ত উৎসের কম্পাইলার জিএনএটি ব্যবহার করে সংকলন করা যায়,


```bash
gnatmake hello.adb
```


### ডাটা টাইপ
অ্যাডা টাইপ সিস্টেম পূর্বনির্ধারিত আদিম টাইপের একটি সেটের উপর ভিত্তি করে নির্মিত নয়, বরং ব্যবহারকারীরা তাদের নিজস্ব টাইপ ডিক্লার করতে পারেন। এর ডিক্লারেশনটি টাইপের অভ্যন্তরীণ উপস্থাপনার ভিত্তিতে নয় বরং যে লক্ষ্যটি অর্জন করতে হবে তার ভিত্তিতে করা উচিত। এটি কম্পাইলারকে টাইপের জন্য উপযুক্ত মেমরির আকার নির্ধারণ করতে এবং সংকলন সময় এবং রান সময় (যেমন, পরিসীমা লঙ্ঘন, বাফার ওভাররানস, টাইপের ধারাবাহিকতা ইত্যাদি) টাইপ সংজ্ঞা লঙ্ঘনের জন্য পরীক্ষা করতে সহায়তা করে। অ্যাডা একটি পরিসীমা দ্বারা সংজ্ঞায়িত সংখ্যাসূচক টাইপ, মডুলো টাইপ, সমষ্টিগত টাইপ (রেকর্ড এবং অ্যারে) সমর্থন করে। অ্যাক্সেস টাইপগুলি নির্দিষ্ট টাইপের উদাহরণের জন্য একটি রেফারেন্স সংজ্ঞায়িত করে; টাইপহীন পয়েন্টারসমূহকে অনুমতি দেওয়া হয় না ↵ ভাষা দ্বারা প্রদত্ত বিশেষ টাইপগুলি হল টাস্ক টাইপ এবং সুরক্ষিত টাইপ।

উদাহরণস্বরূপ, একটি তারিখ এভাবে উপস্থাপিত হতে পারে:


```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;
```


সাব-টাইপ ডিক্লারেশন করে টাইপগুলো পরিমার্জন করা যায়:

```ada
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
```
টাইপের মধ্যে *সীমিত, বিমূর্ত, ব্যক্তিগত* ইত্যাদির মতো সংশোধক থাকতে পারে। ব্যক্তিগত টাইপগুলো কেবল অ্যাক্সেস করা যায় এবং সীমিত প্রকারগুলিকে কেবল প্যাকেজগুলির স্কোপগুলির মধ্যে সংশোধন বা অনুলিপি করা যেতে পারে যা সেগুলিকে সংজ্ঞায়িত করে। অ্যাডা ৯৫-এ টাইপের অবজেক্ট-ওরিয়েন্টড এক্সটেনশনের জন্য আরও বৈশিষ্ট্য যুক্ত করা হয়েছে।

### নিয়ন্ত্রণ কাঠামো
অ্যাডা একটি কাঠামোগত প্রোগ্রামিং ভাষা, যার অর্থ নিয়ন্ত্রণের প্রবাহ স্ট্যান্ডার্ড স্টেটমেন্টগুলিতে কাঠামোযুক্ত হয়। সমস্ত স্ট্যান্ডার্ড কনস্ট্রাক্টস এবং গভীর-স্তরের প্রারম্ভিক প্রস্থান সমর্থিত, তাই কমান্ডগুলিতে সমর্থিত "go to" কমান্ডের ব্যবহার খুব কমই প্রয়োজন।


```ada
-- 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;
```


### প্যাকেজ, পদ্ধতি এবং ফাংশন
অ্যাডা প্রোগ্রামের অংশগুলির মধ্যে রয়েছে প্যাকেজ, পদ্ধতি এবং ফাংশন।

উদাহরণ:
Package specification (example.ads)

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

Package body (example.adb)

```ada
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;
```

এই প্রোগ্রামটি এক্সেকিউশনের মাধ্যমে মুক্তভাবে উপলভ্য উন্মুক্ত উৎসের কম্পাইলার জিএনএটি ব্যবহার করে সংকলন করা যায়,

```bash
gnatmake -z example.adb
```
প্যাকেজ, পদ্ধতি এবং ফাংশনগুলি যে কোনও গভীরতায় নেস্ট করতে পারে এবং প্রত্যেকটিই লজিকাল বহিরাগততম ব্লকও হতে পারে।

প্রতিটি প্যাকেজ, পদ্ধতি বা ফাংশনে নিজস্ব ধ্রুবক, টাইপ, ভেরিয়েবল এবং অন্যান্য পদ্ধতি, ফাংশন এবং প্যাকেজ ডিক্লারেশন থাকতে পারে যা যেকোনো ক্রমে ডিক্লারেশন করা যেতে পারে।

### কনকারেন্সি
টাস্ক-ভিত্তিক কনকারেন্সিতে অ্যাডার ভাষা সমর্থন রয়েছে। অ্যাডার মৌলিক কনকারেন্ট একক হলো একটি *টাস্ক*, যা একটি অন্তর্নির্মিত সীমিত টাইপ। টাস্ক দুটি অংশে সুনির্দিষ্ট করা হয় - টাস্ক ডিক্লারেশন টাস্ক ইন্টারফেসকে (টাইপ ডিক্লারেশনের অনুরূপ) সংজ্ঞায়িত করে, টাস্ক বডি টাস্কের কার্যকারিতা নির্ধারণ করে। প্রয়োগের উপর নির্ভর করে, অ্যাডা টাস্কগুলি হয় অপারেটিং সিস্টেম থ্রেড বা প্রক্রিয়াগুলিতে ম্যাপ করা হয় বা অ্যাডা রানটাইম দ্বারা অভ্যন্তরীণভাবে নির্ধারিত হয়।

টাস্কগুলিতে সিঙ্ক্রোনাইজেশনের জন্য এন্ট্রি থাকতে পারে (সিঙ্ক্রোনাস মেসেজ পাস করার একটি ধরন)। টাস্ক এন্ট্রিসমূহ টাস্ক স্পেসিফিকেশনের মধ্যে ঘোষণা করা হয়। প্রতিটি টাস্ক এন্ট্রি টাস্ক বডি মধ্যে এক বা একাধিক *accept* স্টেটমেন্ট থাকতে পারে। যদি কার্যটির নিয়ন্ত্রণ প্রবাহ একটি accept বিবৃতিতে পৌঁছায়, অন্য টাস্ক দ্বারা সংশ্লিষ্ট এন্ট্রি কল না করা পর্যন্ত টাস্কটি অবরুদ্ধ করা হয় (অনুরূপভাবে, কল করা টাস্কটিতে accept বিবৃতি না পৌঁছানো অবধি সংশ্লিষ্ট কলিং টাস্ককে অবরুদ্ধ করা হয়)। টাস্ক এন্ট্রিগুলিতে প্রক্রিয়াগুলির মতো পরামিতি থাকতে পারে, যাতে কার্যগুলি সিঙ্ক্রোনালি ডেটা আদান প্রদানের অনুমতি দেয়। *select* বিবৃতিগুলির সাথে একত্রে accept বিবৃতিগুলির *guards* এর সংজ্ঞা দেওয়া সম্ভব (ডিজকস্ট্রার রক্ষিত আদেশের মতো)।

অ্যাডায় পারস্পরিক বর্জনের জন্য *protected objects* রয়েছে। protected objects হলো মনিটরের মতো একটি গঠন, তবে সিগন্যালিংয়ের জন্য শর্তসাপেক্ষ ভেরিয়েবলের পরিবর্তে guards ব্যবহার করে (শর্তাধীন সমালোচনামূলক অঞ্চলের মতো)। protected objects ডেটা এনক্যাপসুলেশন এবং মনিটরের থেকে নিরাপদ পারস্পরিক বর্জন এবং শর্তসাপেক্ষ গুরুত্বপূর্ণ অঞ্চলের প্রবেশদ্বারকে একত্রিত করে। ক্লাসিক্যাল মনিটর থেকে প্রধান সুবিধাটি হলো সংকেত দেওয়ার জন্য কন্ডিশনাল ভেরিয়েবলের প্রয়োজন হয় না, যার ফলে ভুল লকিং সেমান্টিকের কারণে সম্ভাব্য ডেডলকগুলি এড়ানো যায়। টাস্কের মতো, সুরক্ষিত অবজেক্টটি একটি অন্তর্নির্মিত সীমিত টাইপের এবং এটিতে একটি ডিক্লারেশন অংশ এবং একটি বডি রয়েছে।

একটি সুরক্ষিত অবজেক্টে এনক্যাপসুলেটেড প্রাইভেট ডেটা (যা কেবল সুরক্ষিত অবজেক্টের মধ্যে থেকে অ্যাক্সেস করা যেতে পারে) এবং প্রক্রিয়াগুলো, ফাংশন এবং এন্ট্রিগুলি পারস্পরিকভাবে স্বতন্ত্র হওয়ার নিশ্চয়তাযুক্ত (একমাত্র ফাংশনগুলির ছাড়া, যা পার্শ্ব প্রতিক্রিয়া মুক্ত হওয়া প্রয়োজন যেন তা অন্যান্য ফাংশনগুলির সাথে একই সাথে চলতে পারে)। যদি সুরক্ষিত অবজেক্টের ভিতরে অন্য একটি টাস্ক বর্তমানে চালিত হয়, তবে একই সুরক্ষিত অবজেক্টকে কল করা কোনও টাস্ককে অবরুদ্ধ করা হয় এবং যখন এই অন্য টাস্কটি সুরক্ষিত অবজেক্টটি ছেড়ে যায় তখন অবরোধ ছেড়ে দেওয়া হয়। সুরক্ষিত অবজেক্টের উপর অবরুদ্ধ টাস্কগুলো আগমনের সময় অনুযায়ী ক্রম করে সারিবদ্ধ করা হয়।

সুরক্ষিত অবজেক্ট এন্ট্রিগুলি পদ্ধতির অনুরূপ, তবে অতিরিক্ত *guards* রয়েছে। যদি কোনও guard মিথ্যা হিসাবে মূল্যায়ন করা হয়, একটি কলিং টাস্ক ব্লক হয়ে যায় এবং সেই এন্ট্রির কিউতে যুক্ত হয়; সুরক্ষিত অবজেক্টের ভিতরে বর্তমানে কোনও কাজ সম্পাদন করা হচ্ছে না বলে এখন অন্য একটি কাজ সুরক্ষিত অবজেক্টে সংযুক্ত করা যেতে পারে। যখনই কোনও টাস্ক সুরক্ষিত বস্তুটি ছেড়ে দেয় তখন গার্ডগুলো পুনরায় মূল্যায়ন করা হয়, কারণ এই একমাত্র সময় যখন গার্ডগুলোর মূল্যায়ন পরিবর্তন হতে পারে।

এন্ট্রিগুলিতে কল একই স্বাক্ষর সহ অন্যান্য এন্ট্রিগুলিতে *requeued* করা যেতে পারে। কোনো টাস্ককে রিকিউ করা হলে তাকে অবরুদ্ধ করে লক্ষ্য এন্ট্রিতে সারিবদ্ধ করা হয়; এর অর্থ হলো সুরক্ষিত অবজেক্টটি মুক্তি পেয়েছে এবং অন্য কোনও টাস্ক সংযুক্তির অনুমতি দেয়।

নীচের উদাহরণটি অ্যাডায় সাম্প্রতিক প্রোগ্রামিংয়ের কয়েকটি ধারণার চিত্র তুলে ধরেছে।

```ada
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;
```


### প্রাগমা
প্রাগমা হলো একটি কম্পাইলার নির্দেশ যা সংকলিত আউটপুটটির সুনির্দিষ্ট কারসাজির অনুমতি দেওয়ার জন্য কম্পাইলারকে তথ্য পৌঁছে দেয়। কিছু প্রাগমা ভাষার মধ্যেই তৈরি করা হয়, অন্যগুলো বাস্তবায়ন-নির্দিষ্ট।

কম্পাইলার প্রাগমার সাধারণ ব্যবহারের উদাহরণগুলি হল কিছু নির্দিষ্ট বৈশিষ্ট্য অক্ষম করা যেমন, রান-টাইম টাইপ চেকিং বা অ্যারে সাবস্ক্রিপ্ট বাউন্ডারি চেকিং, বা কোনও ফাংশন কলের পরিবর্তে কম্পাইলারকে অবজেক্ট কোড সন্নিবেশ করার নির্দেশ দেওয়া (যেমনটা সি/সি ++ ইনলাইন ফাংশনগুলির সাথে করে)।

## তথ্যসূত্র

## বহিঃসংযোগ

* Ada - C/C++ changer - MapuSoft
* DOD Ada programming language (ANSI/MIL STD 1815A-1983) specification
* JTC1/SC22/WG9 ISO home of Ada Standards
* 

বিষয়শ্রেণী:প্রোগ্রামিং ভাষা
বিষয়শ্রেণী:উচ্চস্তরের প্রোগ্রামিং ভাষা
বিষয়শ্রেণী:১৯৮০-এর সফটওয়্যার