زبان برنامه نویسی ادا

ادا

زبانی که سالها در پنتاگن از آن استفاده میشد!!!!!!
زبان ادا
این زبان برای کاربردهای نظامی طراحی شد_ولی یک زبان همه منظوره برای حل بسیاری
از مسائل برنامه نویسی  است.
ساختار بلوکی ومکانیزم نوع داده آن مثل پاسکال است_ولی قابلیتهایی برای
کاربردهای بی درنگ real timeوتوزیعی دارد.بسته بندی ووراثت نیز در این زبان
امکان پذیر است.
اشیاء داده===
انواع اصلی شکل توسعه یافته ای از انواع پاسکال میباشد_اما قدرت تعریف نوع جدید

در آن بیشتر است.پکیج برای بسته بندی تعریف نوع وزیربرنامه ها برای انتزاع به

کارمی روند.
انواع داده اولیه===
انواعی مثل (صحیح integerحقیقیfloat)کاراکتر.بولین.و.رشته ای از پیش تعریف شدند
{یعنی در استاندارد ادا تعریف شده که در هر برنامه ادا شناخته میشوند}.
این انواع با استفاده از سازنده سطح پایین تری ساخته شده اند.
نمونه هایی از این سازنده ها عبارتند از شمارشی _آرایه_رکورد. برای مثال بولین

وکاراکتربه صورت شمارشی ورشته به صورت برداری از کاراکترها تعریف می شوند.
چون مکانیزم تعریف نوع برای انواع اولیه وانواع تعریفی برنامه نویس به کارمیرود
بسیاری از مثالها شامل تعریف نوع می باشند.
متغییر ها وثوابت===
هر شئ داده می تواند به صورت ثابت یا متغییر تعریف شود.هر اعلانی که با کلمه

کلیدیconstantشروع میشودثابت است.در غیر این صورت متغییر اعلان میشود.
مثال:                       maxSize constant integer  500
                                currentSize  integer   0
ثوابت ادا ممکن است آرایه_رکورد واشیاءداده اولیه باشند:
                            weekDays  constant array  1..5 of string1..3
                                                     mon_tue_wed_thu_fri")

ادا صفات از پيش تعيين شده اي دارد که انقياد يا خواص مهم شيء داده ،نوع داده-زيربرنامه يا سخت افزارراتعيين ميکند.
نام صفات که با "کوتيشن" شروع ميشود به همراه نام شيء به کار ميرود تامقدار صفت رابازيابي کند.
براي مثال،يکي ازصفات هرنوع داده برداري به نام vcct،حدپايين بازهِ انديس آن است که باvcct"firstمشخص ميشود.
vcct"lastحدبالااست.با استفاده از اين صفات،برنامه ميتواندطوري نوشته شود که مستقل از تعريف نوع vcctباشد.
لذا اگر تعريف vcctاصلاح شود،دستوراتي از برنامه که ازvcct"firstوvcct"lastاستفاده ميکنند ،به همان شکل باقي ميمانند.
صفات از پيش تعريف شده براي اغلب انواع اصلي که درزير بحث ميشوندوجوددارد.


****انواع داده عددي==
انواع صحيح،حقيقي مميز شناور وحقيقي مميزثابت ،انواع داده عددي در زبان ادا ميباشند.
اعلان آنها مانند پاسکال ميباشد>که ازصفاتrange(براي مقادير صحيح)وdigit(براي مقادير اعشاري )استفاده ميکند.
اين صفات بازه مقاديراشياءرامشخص ميکند.
***مقادير صحيح از1تا336                           ;type dayofyear is range1...336
***my birth dayبرابرهفتم آگوست               Mybirthday :dayofyear :=219 ;i
***نوع floatهفت رقمي                                            type result is digit 7;i
***متغيير floatهفت رقمي                                              answer:result;i
انواع صحيح واعشاري درپکيج استاندارد به اين صورت تعريف مي شوند:
                                              type integer is range implementation defined;i
                                                      type float is digits implementaition defined;i
يعني:درحقيقت از آنها مي توان به گونه اي استفاده کرد که گويي انواع اوليه اند.
    داده هاي اعشاري مي توانند داره بازه باشند:
به اين روش:                                 type ressult is float range -1"0E12..1.0E12 ;l    
اين دستور-نوع اعشاري از ارقام را با بازه اي از مقادير شامل **10E12 ()مثبت           يا10E12**y-(منفي)اعلان کرد.
resultاز نوع اعشاري است اما در دستور زير-نوع اعشاري نيز ثابت است:
                                                      type ressult is  range -1"0E12..1.0E12 ;l                 
برنامه ها ميتوانند به نمايش عدد حقيقي مميز ثابت سخت افزاري (درصورت وجود)دستيابي داشته باشند.
(اين استثناء به خاطر اين است که بعضي از رايانه هاي قديمي از نوع داده مميز شناور حمايت نمي کنند)
براي تعريف نوع داده مميز ثابت -برنامه حد اکثر اختلاف مورد نياز بين دو مقدار متوالي از نوع داده را به نام مقدار
 دلتا اعلان ميکند.براي مثال ،براي مشخص کردن بازهاي از اعداد دهدهي مميز ثابت که دو رقم اعشار دارند،مقدار دلتاي0.01به
صورت زير اعلان ميشود :
                               type smallamount is delta 0.01 range -100.0..100.0;i
عمليات حسابي براي اعداد مميز ثابت به کار ميروند. اگر سخت افزارمستقيماّ نمايش عدد مميز ثابت را تدارک ببيند،نمايش
مميز شناور مي تواند براي پياده سازي آن به کار گرفته شود ،به شرطي که محدوديت هاي دقت برآورده شوند.
انواع شمارشي ==
انواع شمارشي ادا مانند پاسکال قابل تعريف وپياده سازي است.تعريف زير يک نمونه است:
                                             type class is(fresh"soph,junior,senior);I
برخلاف پاسکال ,نوع شمارشي را نمي توان مستقيماّ دراعلان متغيير تعريف کرد,بلکه بايد در تعريف نوع جداگانه اي تعريف نمود.
نمايش زمان اجراي مقادير شمارشي ,براي هر ليترال از شماره موقعيت  آن استفاده ميکند.اولين ليترال با صفر ,دومين ليترال
با يک وغيره نمايش داده ميشوند.علاوه بر عملگرهاي predوsucc,عملگرهاي رابطه اي نيز براي مقادير شمارشي
تعريف شده اند. چندين نوع شمارشي مي توانند ليترال هاي هم نام داشته باشند.(بر خلاف پاسکال که اين کار امکان پذير نبود).
بدين ترتيب مي گوييم اين نام دوباره تعريف شده است.
براي مثال ،با توجه به تعريفclassکه در بالا آمده است،تعريف زير ليترال freshرادوباره تعريف مي کند:
                                    type breadstatus is (stale,fresh);i
در بعضي موارد کامپايلر ممکن است همنامي را مستقيماّ حل کند(يعني خودش فرق بين دو ليترال همنام را تشخيص دهد).
مثل دستور b:=fresh که b  از نوع classاست. البته اگر در جايي از برنامه هر دو نوع شمارشي قابل دستيابي باشند،براي
جلوگيري از ابهام بايد از نام نوع شمارشي و ليترال مربوط استفاده کرد،مثلclass(fresh)i يا breadStatus(fresh)i

***انواع کاراکتري وبولين==
اين انواع در پکيج standardبه صورت شمارشي تعريف شده اند.

***انواع داده اشاره گر==
نوع اشاره گر که نوع دستيابي(access) نام دارد،همراه با تابع اوليه newيک شئ داده جديد را توليد مينمايدواشاره گري را
به آن برمي گرداندئ که ممکن است بعداّ به متغيري از نوع دستيابي نسبت داده شود . متغيير را نمي توان از نوع دستيابي
تعيين کرد بلکه بايد ابتدا از تعريف نوع استفاده نمود:
                           ;  نام نوع       type                            is access     
                                                                نام نوع دستيابي
اکنون مي توان متغيير هايي از نوع دستيابي اعلان نمود.متغييري از نوع فقط به يک
نوع شئ داده اشاره مي کند.مقدار اوليهتمام متغيير هاي نوع دستيابي تهي(null)است،
مگراينکه هنگام اعلان،مقداري به آنها نسبت داده شود.
بلوکي از حافظه با استفاده از دستور زير مي تواند براي نسبت دادن حافظهّ تمام اشياء
دادهء يک نوع دستيابيبه کار مي رود:
                          عبارت            use        نام نوع دستيابي           for
  عبارت اندازه بلوکي را مشخص مي کند که بايد رزرو شود. هر استفاده بعدي از newبراي
 آن نوع دستيابي ،حافظه اي را در بلوک رزرو شده تخصيص مي دهد.

***انواع ساختمان داده==
بردارها وآرايه ها::
شئ داده آرايه با هر بعد وهر بازه اي از انديس مي تواند تعريف شودوعناصر آن از هر نوعي
 مي توانند باشند.اعلان زير ،ماتريس20*10   از اعدادحقيقي را ايجاد مي کند وبراي دستيابي
 به عناصر آن از انديس استفاده ميشود،
مثل(3،2)table: array (1..10,1..20)of float  ;        table
تعريف نوع مي تواند براي دسته اي از اشياء داده آرايه به کار رود.ادا(برخلاف پاسکال )حدود
 آرايه را به عنوان بخشي از نوع درنظر نمي گيرد.در ادا مي توان نوع آرايه را بدون تعيين بازه
انديس براي يک يا چند بعد اعلان کرد.وقتي آرايه اي از نوع اعلان مي شود ،ابعاد آن نيز قابل
 تعيين است:
                                                                                         type Matrix is
                     ;   array(integer range <>,integer range<>)of float                         
<>را کادر گويند که نشان ميدهد هنگام اعلان متغييري از نوعMatrixيک بازه انديس آن بايد
 مشخص گردد.دستورات زير را ببينيد:           ; table :Matrix(1..10,1..20)l
چون نوع صحيح از يک نوع اوليه شمارشي مشتق ميشود ،لازم نيست بازه انديس يک بازه صحيح
باشد،بلکه مي تواندبازه اياز هرنوع شمارشي باشد.حدود انديس را مي توان با عبارت
 (عبارات رياضي)مشخص کرد:
                                        ;  NewList:array(1..n) Of listltem
در اينجا nمتغييري است که محاسبه خواهد شد.هر وقت زير برنامه حاوي اين دستور اجرا مي شود،
بر حسب N طول جديديبراي بردارNewlist     در نظرگرفته مي شود.
با استفاده از انديس ميتوان برشي(slice)از بردار را انتخاب کرد.برش،بخش پيوسته اي از بردار
 اصلي است. براي مثال:
NewList(2..4);lيک برش سه عنصري از عناصر دوم تا چهارم NewListرا انتخاب مي کند.
برشها در پردازش رشته ها ،که به صورت برداري از کاراکترها ذخيره مي شود مفيد است.


مقدار اوليه::
عناصر آرايه را مي توان هنگام اعلان آرايه مقذار داد:
                     power of two: array(1..6) of integer :=(2,4,8,16,32,64);    l


***رشته هاي کاراکتري::
با رشته هاي کاراکتري مثل بردار رفتار ميشود که با دو نوع از پيش تعريف شدهِ ديگر اعلان مي گردد:positive(عدد صحيح مثبت)
و کاراکتر (نوع شمارشي در پکيج standard):
                         type string is arry (positive range<>)of character;      h
عملياتي که بر روي بردارها انجام مي شونددررشته هاي کاراکتري نيز قابل استفاده اند.


***انواع داده فايل::
فايل وعمليات داده ورودي-خروجي،با استفاده از پکيجهاي از پيش تعريف شده،به صورت انواع داده انتزاعي تعريف شده اند.علاوه بر اين
پکيج ها ،هرپياده سازي،پکيج هاي ورودي-خروجي ديگري را فراهم ميسازد،مثل پکيج خروجي گرافيک در پايانه.


***انواع تعريفي کاربر==
اشياء داده رکورد در ادا مثل رکورد در پاسکال است.برخلاف پاسکال،بخش متغيير رکورد حتما بايد فيلد بر چسپ داشته باشد.
در ادا بايد نوع رکورد تعريف شود وسپس متغييرهايي از آن نوع اعلان واستفاده شود.اگر عنصري از رکورد،خودش رکورد باشد،
آن ساختار رکورد بايد به صورت جداگانه اي تعريف گردد،به اين معني که تعريف رکورد دوم نبايد درداخل تعريف رکورد اول انجام شود.
به هر يک از اعضاء رکورد مي توان مقدار اوليه داد:
                                                                                                type Birthday is
     record
  Month:string(1..3):="jan";         g
  day:integer range 1..31:=17;      j
    year:integer range 1950..2050:=1969;    k
   end record;                         j
هر شئ داده از نوع birthdayداراي مقدار اوليه (jan",17,1969")است، مگر اينکه هنگام اعلان آن ،مقدار اوليه ديگري به آن
داده شود.دستورات زير را ببينيد:
                                                           myDay:birthday;  w
                                    yourday:birthday:=("mar",13,1968);    l
 yourday:birthday:=(month=>"mar",day=>13,year=>1968);  ;l
دستور اول از مقادير اوليه تعريف نوع استفاده ميکند ودستور دوم مقادير جديدي به متغييرyOURDAYمي دهد.دستور سوم
شکل ديگري ازدستور دوم است. 
تعريف نوع مي تواند شامل پارامتر باشد.به عنوان مثال،براي تعريف نوع رکوردي که حاوي اطلاعات هر ماه است،اگر برداري
ازعناصر حقيقي منظور شودکه براي هر روز از ماه يک عنصر داده داشته باشد،به صورت زير عمل مي شود:
 type month (length(integer range 1..31)is
    record
     name:string(1..30);         h
                   days:array(1..length)of float ;   g
   end record;      i
رکوردهاي نوعMOnthبه صورت زير اعلان ميشوندتابردار  Days  باطول دسترسي بوجود آيد:
    jan:Month(31);          l
    feb:month(28);        g
صفات Day'sFirstوDay'sLastمي توانند براي دسترسي به عناصر هر ماه به کار روند،بدون اينکه
از حد هر ماه اطلاعي داشته باشند.
روش ديگري براي استفاده ازيک تعريف نوع رکوردبراي تعريف اشياء داده مشابه وتي غير يکسان،
استفاده از ساختار رکورد متغيير مانند پاسکال است.فيلد برچسپ مشخص مي کندکه کدام شکل رکورد استفاده مي شود.
رکورد کارمندان را مي توان به صورت زير اعلان کرد:
type wegetype is (hourly,salaried);
                type EmployeeRec (paytype:wegeType)is          
                                                           record
   name:string(1..30);                              i
   age:integer range15..100;                    i    
                          case  payType is
  when hourly=>                            q
   hours:float;                             l
 when Salaried=>                          h
MonthlyRate :float;                     h
 end record;                              o
اشياءداده رامي توان به صورت زير اعلان کرد:
president: EmployeeRec(salaride);                                                             l
chauffeur:EmployeeRec(Hourly);                                                                l
توجه داشته باشيد که شکل انتخاب شده در زمان اجرا تغيير نمي کند،يعني مثلا نوع حقوقpresident
هيچگاه بهHourlyتغيير پيدا نمي کند.
اگر شکلي از رکوردمتغيير بخواهددرزمان اجراتغيير کند،انتساب بايد به کل رکورد صورت گيرد؛يعني
مقدارفيلد برچسب نمي تواندبه هيچ روش ديگري تغيير کند. اين انتساب،بلوکي از حافظه راکه نشان دهنده
رکورد است،با مقاديرجديد ازجمله برچسب جايگزين ميکند.


زيرنوع::
هرنوع،نامي را به دسته اي از اشياء داده اختصاص مي دهدکه صفات خاصي دارد. زيرنوع آن نوع پايه،شامل
زيرمجموعه اي ازآن اشياءداده است که محدوديت خاصي دارد.محدوديت نوع پايه صحيح،با استفاده از محدوديت
بازه انذيسِ نهمعلوم(<>)مشخص مي گردد.زير نوع با نحو زير تعريف مي شود:
                                      ;محدوديت نام نوع پايه  hs  نام زيرنوع  subType
يا اين مثالها:
                                      ;subType Grafscale is integer range 20..20
                                      ;subType executive is employeerec(salaried)l
زيرنوع،نوع جديدي تعريف نمي کند،بلکه زير مجموعه اي ازاشياءداده اي راتعريف مي کند که توسط نوع
پايه مشخص شده است.عملياتي که برروي نوع پايه مشخص مي شوند،برروي زير نوع نيزاجرا خواهندشد.
کاربردزيرنوع در ادا از اين واقعيت ناشي مي شود که زيرنوع محدوديتي رااعمال مي کندکه براي جلوگيري
ازخطاهامفيداست.وقتي عملياتي اشياءداده جديدي را از زير نوع ايجادمي کند،پياده ساز ادا کنترل ميکند که آيا
محدوديت تعريف شده براي زير نوع اعمال شده است ياخير.
********** سلسله مراتب زير نوع در ادا؛   **************
زير نوع در ادا 95####
allTypes                               alltypes continued                         1
elementary                                   elementry    continued       2
scalar                                         access                              3
discrete                                      access to object                4
enumeration                            access to subprogram      5
character                                composite                           6
Boolean                                  array                                    7
other enumeration                 string                                   8
integer                                      other array                          9
sigened integer                      untagged integer               10
modular integer                      tagged                               11
real                                                 task                                   12
floating point                             protected                         13
fixed point                                                                           14
انواع عددي ونامحدوددر                                     ordinary fixed point
اين سلسله مراتب نمي گنجد                                 decimal fixed point
***********************
نام نوع پايه بايد با يک محدوديت در ادا تعريف شود:
 
Type meters is new  integer ;                                             1
Type liters is new integer;                                                  2
نوع مشتق اجازه دارد از تمام عمليات نوع پايه استفاده کند،اما چون نوع مشتق مجزا ازنوع پايه است،
عمليات نمي تواند برروي عملوندهاي ترکيبي نوع پايه ونوع مشتق به کارگرفته شوند.به عنوان مثال،
با توجه به تعاريف اوليه،به"+"براي نوع صحيح تعريف شدوسپس براي انواع مشتق باشند،Metersوliters
تعريف گرديد.اگرx,y&zبه ترتيب ،متغييرهايي از نوع صحيح،از نوع اينMetersوlitersهيچکدام از
اين متغييرهانمي توانند با هم جمع شوند.بنابراين بااستفاده ازنوع مشتق،برنامه نويس از نوع اعمالِِ ِ
نامعتبردرامان خواهدبود.

**********کنترل ترتيب اجرا==
اجراي ادا ،مثل زبانهاي فرترن وپاسکال دستورگرااست.

عبارات::
درعبارات ادا ،توابع اوليه وتعريفي برنامه نويس مي توانندبايکديگرترکيب شوند.براي عمليات دودويي از
نشانه گذاري infixوبراي عمليات يکاني از نشانه گذاري prefixاستفاده مي شود.پرانتزهانيز در عبارات
قابل استفاده اند.تقدم عمليات در ادا به صورت زير است:
                                                          (exponentiation)**
                    mod    rem/ * 
                      abs       not (unary+and-)l         +            -
                                   &        (binary+and-)     +            -
              in     not in          =       /=     <     <=      >      >=   
                         and    or    xor     andthen      or    else
عملياتي با تقدم يکسان از چپ به راست انجام مي شوند. ادا داراي عمليات مدار کوتاهand thenوor else است،
به طوري که اگر ارزيابي اولين عملوندبراي تعيين مقدارعبارت کافي باشد،فقط اولين عملوند را ارزيابي مي کند.
عملياتinوnot inتعيين مي کنند مقداري در يک بازه وجوددارد يا خير.


هم ارزي نوع::
در ادا از هم ارزي نام استفاده مي شود. مفهوم انواع مشتق به برنامه نويس امکان مي دهدبا استفاده از
قائده هم ارزي نام،در حالتي که دسته اي ازمتغييرها بايد از هم جدا باشند،امنيت را از طريق کنترل متغييرها
بدست آورد.مفهوم زير نوع به برنامه نويس اجازه مي دهد،بدون تفکيک متغييري از ساير متغييرهاي نوع ِ
پايه،کنترل نوع ومحدوديتهاي مشابهي را برروي مقادير آن متغيير بدست آورد.


دستورات::
دستورات وساختارهاي کنترل ترتيب اجرا عبارتند از:if,case,ودستورات حلقه(loop).حلقه به سه صورت است
وexitاجازه خروج از حلقه را مي دهد.ازgotoنيز مي توان به طور محدود استفاده کرد.تمام دستورات کنترلي با
کلمه کليدي end خاتمه مي يابند،مثلend ifبراي خروج از ifوend loopبراي خروج ازloop.


انتساب::
انتساب در ادا مثل پاسکال است. انتساب مجموعه کاملي ازمقاديربه رکورد ،به دوصورت امکان پذير است:
 myDay:=("Dec",30,1964);                                               1
  myDay:=(year=.1964,Month=."dec",day=.30);              2

 

دستورات شرطي::
دستورif.
شکل کلي دستور ifبه صورت زير است:
                           if  boolean expression  then
                          -statement sequence -   
                     else if boolean expression then         
                          -statement sequence -
                     else if boolean expression then         
                                                                   ....
                                                                  else
                           statement sequence -
                                                               ;end if
دستورifمي تواند فاقد بخشهاي   else if  يا  else  باشد.

دستورcase.
شکل کلي دستور case  به صورت زير است:
                                                               case expression is
        ;when  choice |...|  choice=>statements sequance
        ;when  choice |...|  choice=>statements sequance
                                                                                     .........
                            when  others=>statements sequance
                                                                              ;end case
هرchoise يک مقدار با بازه اي ازمقاديررابراي عبارات جلوي case نشان مي دهد:
                                                              case grade level is
                                             ;when  fresh=>statement
                                 ;when soph | junior=>statement            
                                          ; when senior=>statement
                                                                             ;end case
لازم است که مجموعه اي از انتخاب ها (choice)شامل تمام مقادير ممکن عبارات باشند،ياwhen other
گنجانده شودتا براي بقيه،مقاديردستورات آن اجرا شوند. اگردرانتخابي،عملي صورت نگيرد،مي توان کلمه کليدي
nullرا قرار داد.


دستورات تکرار::
دستور   loop.
شکل کلي آن به اين صورت است:                                         loop
                                                     *دنباله اي از دستورات
                                                                         end loop
چون شرطي براي خروج ذکر نمي شود،بايد با استفاده از دستوراتexit,  goto,   returnيا استثناء از آن خارج شد.
تکرارهاي کنترلي توسط دستور   whileوfor   ايجاد مي شوند.دستور while  به صورت زير به کار ميرود:
                                                عبارت منطقي             while      
for به دو صورت استفاده مي شود:
                                           بازه گسسته   in   نام متغيير  for
                              بازه گسسته  reverse in   نام متغيير  for
بازه گسسته مي تواند زير بازه نوع شمارشي يا نوع صحيح باشد،مثل1..10يا fresh..junior.
کلمه reverse نشان مي دهد که حلقه از آخرين مقدار به اولين مقدار متغيير انجام ميشود.
ويژگي مهم for  اين است که متغييري که در for مي آيدبه عنوان متغيير محلي تعريف نمي شود،بلکه با حضورش
درfor  به طور ضمني تعريف مي گرددوفقط درداخل حلقه قابل مراجعه است.پس از خروج از حلقه، اين متغيير از بين
ميرود وقابل دستيابي نيست.اين کار باعث بهينه سازي حلقه توسط کامپايلر ادا مي شود.

دستورexit.
دستور exit  به صورت زير به کار مي رود:
                                                         عبارت منطقي   exit   when
البطه به صورت ساده exitهم قابل استفاده است.با اجرايexit ،کنترل به خارج از داخلي ترين حلقه منتقل مي شود.
حلقه ممکن است برچسپ داشته باشد وexit براي آن حلقه در نظر گرفته شود:
                                        ;exit OTHER loop when A(i,j)=0

دستورgoto.
دستور goto مانند بعضي ديگر از زبانهاي برنامه نويسي در ادا هم فراهم شده است ولي استفاده از آن محدود است.
به طور کلي،gotoمي تواند کنترل را به دستوري درهمان زير برنامه يا همان سطح يا  سطح  خارجي دستورات
تو در تو انتقال دهد.


********ورودي-خروجي**********I/O
ادا ويژگي هاي ورودي-خروجي ندارد.اين کارها با توابعي که در پکيج هاي از پيش تعيين شده انجام مي شوند که دوباره
تعريف شده اند.براي مثال،پکيج  text_io  شامل تعاريف ساده اي از ورودي ها وخروجي ها در ادا است.تابعget(arg
ارگومانهاي عددي يا رشته اي را از صفحه کليد مي خواند.put(arg  درخروجي استاندارد(صفحه نمايش)مي نويسد.
put(arg,w)l،مقدار argرا به عنوان فيلدfwکاراکتري چاپ مي کند.new_line   نماد انتهاي خط را مي نويسد.
تبديل بين رشته وداده هاي عددي نيز توسط getوput انجام مي شود.تابع(get(in string,out number,out last
مقدار عددي کاراکترهاي1تا last را از رشته string درnumberقرار مي دهد.تابع(put(out string,in number
مقدار number را در string قرار مي دهد.
getوput  براي داده هاي فايل نيز به کار مي روند.فايل ها به صورت limited privateتعريف مي شوند.تابع
(open(in File_Name,in File_Mod,Out File_type رشته File_name رادرحالتي باز مي کندکه با
In_Fileوout_Fileوappend_Fileمشخص شود.تابع( close(in out file_Type  فايل را مي بندد.


*pragma*
pragma  دستوري است که اطلاعاتي را به کامپايلر تحويل ميدهد.به عنوان بخشي از زبان نيست.يعني اگر تمام
pragmaها از برنامه حذف شوند برنامه کامپايل مي شودومعنايش باقبل از حذف pragmaها تغيير نمي کند.
شکل کلي آن به صورت زير است:                               (پارامترها)نام       pragma
نام ممکن است در زبان از قبل تعريف شده باشدو پياده ساز آنرا تعريف کند.بعضي از pragma ها عملکرد کامپايلر را
کنترل مي کنند،مثل توليد ليست برنامه (pragma list).اما اکثريت تمايل به کنترل ساختار زمان اجراي زيربرنامه دارند.
به عنوان مثال،(زير برنامه ها)pragma INLINE  مشخص مي کند که هر وقت اين زير برنامه ها فراخواني مي شوند،
کد آنها در برنامه کپي مي شوند.دستور(pragma OPTIMAIZE(time or spase) موجب مي شود تا زير برنامه اي
که اين دستور در آن قرار دارد طوري ترجمه شود که زمان ومعناي آن بهينه باشد.

استثناءها::
در انتهاي هر واحدبرنامه(زيربلوک،بلوک ، تسک يا پکيج)مي توان مجموعه اي از پردازنده هاي استثناء رامشخص کرد.
اين پردازنده ها براي پردازش استثناءهاي آن بلوک يا استثناءهايي که از ديگر بلوک ها پخش شده اندبه کارمي رود. هر استثناء
داراي نام است.استثناءهاي اندکي از پيش تعريف شده اند،مثلCONSTRAINT_ERROR . بقيه استثناءها به صورت زير
 تعريف مي شوند:                                                                          
                                                                                     exepotion   :نام استثناء
پردازنده استثناء بانام استثناءي که پردازش مي کند شروع مي شودوبعد از آن دستوراتي قراردارد که استثناءراپردازش مي کند.
نحو کلي پردازنده استثناء به صورت زيراست:
                                                                                      exepotion
                                when exeption_name|...| exeption_name
                                                     ;    statement_sequence<=
                                                                                             ....
                                    ;when others=>statement_sequence
هر دنباله از دستورات ممکن است يک يا چند استثناءرا پردازش کند.پردازندهothers لازم نيست که مشخص شود،امااگر اعلان
شود،تمام استثناءهايي را که تاکنون نامي از آنها برده نشده است (منظور در خطوط برنامه موردنظرمي باشد)را پردازش مي کند.
استثناء يا با عمليات اوليه به طور ضمني رشد پيدا مي کنديا به طور صريح با دستور زير:
                                                                           نام استثناء      ralse
وقتي استثناء پرورش يافت،کنترل به پردازنده اي در واحد  برنامه اي که در حال احرا است منتقل مي شود(درصورتي که اين
برنامه پردازنده اي براي آن داشته باشد).اگرپردازنده اي نداشته باشد،استثناء به طرف بالاي زنجيره پوياي برنامه هاپخش مي شود
تا به زيربرنامه اي برسد که پردازنده اي براي آن استثناء داشته باشد.اگرپردازنده اي پيدا نشداز پردازنده تعريفي سيستم استفاده
مي شود.استثناءها ازتسک منتشرنمي شوند.
وقتي استثناءي از پردازنده اي منتشر مي شود،زيربرنامه(يا هر واحد ديگر از برنامه)به طور نرمال خاتمه مي يابدوکنترل
به فراخوان آن برمي گردد.پردازنده استثناء در ادا کامل کننده اجراي بدنه برنامه است که استثناءدرآن رخ داده است.راهي
وجود ندارد که ازسرگيري مجدد زيربرنامه جلوگيري نمايد.ردازنده استثناءممکن است بخشي ازاستثناءرا پردازش نمايد وآنرا در
زنجيره پويا به سمت بالا پخش نمايد.براي اين کار ازدستور raseبدون نام استثناء استفاده مي شود.


تسک ها::
تسک زير برنامه اي است که مي تواند با ساير تسک هابه طور همزمان اجرا شود.تعريف تسک مثل تعريف پکيج است.تسک
 داراي بخش مشخصات است که سايرتسک ها مي توانند با آن ارتباط برقرار کنندويک بخش بدنه دارد که تسک را
پياده سازي مي کند.بدنه تسک طوري بسته بندي مي شود که اعلان ها وددستورات آن از کاربران تسک پنهان است.بدنه
تسک مي تواند به طور جدا کامپايل شود.به جاي تعريف مجزاي هرتسک،مي توان نوع تسک رامعرفي کرد.بااستفاده از
نوع تسک مي توان چندين تسک رااز يک نوع ايجادکرد.
                                                         task  taskname is
                                               entry declarations
                                                                           ;end
                                               task body  taskname  is
                                     sequence of declarations
                                                                begin

                                sequence of statements
                                                            exeption
                                       exeption handlers
                                                                            ;end


برنامه هاي کاربردي تعبيه شده::
چون ادا براي برنامه هاي کاربردي تعبيه شده طراحي شد،نيازبه دستيابي خاصي به سخت افزار دارد.
بعضي از اين ويژگي ها:

مشخصات آدرس:
محل خاصي از حافظه که يک شئ داده،زير برنامه يا تسک بايد قرار بگيرد و با دستور زير مشخص مي گردد:
                                            آدرس حافظه   use at    نام شئ   for
آدرس حافظه با يک عبارت مشخص مي گردد.

وقفه ها:
 در سيستم هاي تعبيه شده لازم است برنامه قادر باشد وقفه هاي سخت افزاري يادستگاه هاي خارجي را پردازش نمايد.
وقفه ها ممکن است به صورت زير به کار گرفته شوند
                                      for entry_name use at  interrupt_address
وقتي وقفه اي رخ مي دهد،فراخواني با اولويت بالايي براي ورودي به تسک محسوب مي شود. بنابراين تسکي که
مسئول پردازش وقفه است،چنانچه منتظر دستور accept  مناسبي باشد فورا پاسخ مي دهد.

 

****توابع استاندارد==******
ادا پکيج هاي از پيش تعريف شده بسياري دارد که توابع استانداردي را تعريف مي کند.متداولترين آنها عبارتند از:
   * توابع رشته اي با طول ثابت                                     Ada.String.Fixed
   * توابع رشته اي با طول متغيير                             Ada.string.Bounded
   * توابع رشته اي با طول نامحدود                       Ada.string.UnBounded
   *توابع مثلثاتي        Ada.Numerics.generic_elementary_functions
 

***پکيج==***
پکيج در ادا بسته بندي را بوجود مي آورد.ادا95  ويژگي هاي ديگري براي وراثت شئ گرا دارد.
تعريف پکيج دو بخش دارد:1)مشخصات(داراي بخش قابل مشاهده وبخش خصوصي است)2)بدنه.
مشخصات اطلاعات لازم براي استفاده درست از پکيج رافراهم مي کند.بدنه،متغييرهاي محلي بسته بندي شده،
تعريف زير برنامه وبدنه برنامه هايي است که درخارج پکيج قابل دستيابي اند.دربعضي موارد ممکن است پکيج فاقد
بدنه باشد.
####مشخصات پکيج####
                                                                             pakage pakagename is
                                                     decleration   of  visible data object
                                                                                                        private
                                    complete definitions  of private data objects
                                                                                                            ;end                                                                                                                     pakage body pakagename is
                      definition of data objects and subprograms declared
                                                           in the spesification part above
                                                                                                          begin
                  statements to initialize the package when first instanted
                                                                                                   exception
                                                                              exception handlers
                                                                                                            ;end
بخش قابل مشاهده پکيج که قبل از کلمه کليدي private قرار دارد،درخارج از پکيج قابل دستيابي است.
اگر در بخش تعريف نوع وجود داشته باشد،کاربر مي تواند متغييرهايي را از آن نوع تعريف نمايد.ثوابت ومتغييرهاي
 آن بخش نيز در خارج از پکيج قابل استفادع اند.
اگر پکيج نوع داده انتزاعي راتعريف کند،کاربر بايد بتواند متغييرهايي از آن نوع را اعلان کند،اما جزئيات تعريف
نوع نبايد قابل مشاهده باشد.در اين مورد،درتعريف نوع در بخش قابل مشاهده به صورت زير خواهد بود:
                                                                      ;is    private   نام نوع     type
تعريف کامل نوع در بخش خصوصي مشخصات مي ايد.به نظر مي رسد که اجزاي خصوصي پکيج به جاي اينکه
در مشخصات ظاهر شوند بايد در بدنه پکيج باشند،ولي به خاطر ملاحظات پياده سازي اين کار صورت نمي گيرد.


انواع خصوصي محدود==
معمولا مطلوب است که عمليات اوليه اي از انتساب وتست هايي براي تساوي وعدم تساوي حتي براي نوع خصوصي
به صورت خودکار فراهم باشد.يعني A:=B براي انواع خصوصي A وB فراهم باشد.در ادا ،اينها تنهاعملياتي هستند
که براي نوع اختصاصي بدمن نياز به تعريف برنامه نويس،  فراهم هستند.اما در اغلب موارد،اين عمليات نيز نبايد
براي نوع خصوصي از پيش تعريف شده فراهم باشند.اگر برنامه نويس نوعي را limited prevate اعلان کند،آنگاه
هيچ عملياتي  براي آن نوع تعريف شده نيست.


پکيج هاي کلي::
مشخصات پکيج کلي پارامترهايي دارد که نوع عناصر پکيج،اندازه آرايه در پکيج وغيره را مشخص
مي کنند. براي مثال،پکيج کلي که نوع داده انتزاعي پشته را معرفي مي کند،ممکن است پارامتري داشته باشد
که نوع عناصرذخيره شده در پشته را تعيين نمايد.
شکل کلي:                                                        is    نام واقعي پکيج  package
                                                           ;(پارامترها)نام پکيج کلي  new

نمونه سازي پکيج توسط کامپايلر صورت مي گيرد.در زمان کامپايل،هرمراجعه به نام پارامترمجازي در پکيج،
با پارامترهاي واقعي در دستوري که پکيج را نمونه سازي مي کند جايگزين مي شود.پکيج حاصل به صورت عادي کامپايل
ميشود.پکيج کلي ونمونه سازي آن تاثيري در ساختار زمان اجرا ندارد.فقط پکيج واقعي(پس از نمونه سازي)به اشياء
زمان اجرا وکد اجرايي ترجمه مي گردد.چون نمونه سازي پکيج کلي در ادا به وفور انجام ميشود،به خصوص اگر از
پکيج هاي کتابخانه اي استفاده گردد،اغلب کامپايلر هاي ادا اين عمل را به روشهاي گوناگوني بهينه ميکنند.اين کار
را معمولا با کامپايل کردن خود پکيج کلي انجام مي دهند،به طوري که آن بخش از پکيج که  به پارامترهاي نوع
مربوط مي شود،باقي مي ماند.


***وراثت==***
ادا 95 مفهوم پکيج را توسعه داد تا شامل وراثت شود.يعني مفهوم بسط نوع(Type extension)را با نوع جديدي
به نام بر چسپ دار(tagged)اضافه کرد.براي مثال فرض کنيد my dataبه صورت زير اعلان شود:
                                            type Mydata is tagged record
                                                                 ;val: myaray
                                                             ;sz: integer:=0
                                                                         ;end record
مي توانيم شئ ديگري رابه نام amin1981را به صورت زير اعلان کنيم:
                                  type        amin1981      is new mydata  with
                                                                                   record
                                                               ;new data:myarray
                                                                          ;end record
amin1981 عنلصر valو sz را ازmydataبه ارث مي برد. ادا با استفاده از نوع برچسپ دار،اجازه مي دهد
پکيج هاي جديد بدون نياز به کامپايل مجددتعريف پکيج موجود،ايجاد شوند.
هر نوع برچسپ دار شامل صفت کلاس است،مثل کلاس mydata'class  و  amin1981'class  که مي توانند
براي انقياد پويا به کارروند.amin1981عضوي از کلاسي مثل mydataاست ،زيرا از آن مشتق شده است.
دستور زير را ببينيد:
                                               type mydata is abstract tagged with null record

اين دستور نام شئ را مشخص مي کند وتعريفي براي حافظه ندارد.تعريف mydataمي تواند با بسط نوع پرشود.
بدين ترتيب قالبي براي نوع آماده مي شود وانواع برچسپ دار براي استفاده از اين شئ بايد تعريف شود.
فراخواني عمليات اوليه با پارامتر واقعي نوع برچسپ دار،منجربه انقياد زمان اجراي زير برنامه واقعي به فراخواني
مي شود.اين متفاوت از ادا 83 است وويژگي مدل اجرايي شئ گراي پويا را براي ادا 95 فراهم مي کند.