بخشی از مقاله
مقدمهاي بر Object Pascal
چنانچه درباره مكآپ مطالعهاي داشته باشيد ممكنست تعجب كرده باشيد از اينكه بايد برنامهريز Macintosh peogrommer’s Workshop(MPW) را تهيه كنيد و بخصوص اينكه اين برنامهريز بايد به زبان پاسكال نوشته شده باشد. فعلاً پاسخ مثبت است. در مورد آن كساني كه تأليفات ديگران را دوست دارند و يا برنامهريزي به زبان ديگر مثلاً C را ترجيح ميدهند در حال حاضر شانس زيادي ندارند. دليل آن دو چندان است. بسياري از زبانها بروي Macintosh مطالب لازم را كه سيستم مكآپ دارد ندارند و حتي اگر داشته باشند سرعت پاسكال را ندارند.
در اين مقاله، ابتدا ساختار O.P را توضيح داده سپس بعضي از معناشناسيهائي مورد استفاده در اين ساختار را پيشنهاد ميكنيم. در خصوص مراحل مختلفي از سازگاري بحث ميكنيم كه يك زبان يا مؤلف ديگر براي استفاده از مكآپ و مراحل رسيدن به هدف آن نياز دارد. خصوصاً، شغل خاص كه حاوي و زبان معمولي را كه به آن كه مربوط ميشود نشان ميدهيم. يكي هم راجع به چگونگي اضافه كردن مواد به زبان MPW صحبت خواهيم كرد. در آخر نمائي از آنچه تا بحال فرا گرفتهايم ارائه ميكنيم.
Object Pascal
پيوست و ادامهاي است بر زبان پاسكال كه با مشورت نيكلاس ويرث، مخترع سيستم پاسكال، در شركت آپل انجام شد. اين تداوم ناشي از تلاش نوعي از تشخيص پاسكال به نام كلسكال ميباشد كه در كامپيوتر ليزا قابل دسترسي بود. خود مكآپ حاصل تولكيت ليزا، كه كارگاهي كاربردي براي ايجاد كاربردهاي ليزا است، ميباشد. ليزا تول كيت به زبان كلسكال نوشته شده است.
در سيستم O.P. معناشناسيهاي معدودي ديده ميشوند. غوده آبجكت، نوع جديدي از دادههاست. Object شباهت بسيار زيادي به شرح كتبي دارد كه ميتواند رشته دادههاي مضاعف نوع گشتاري را در خود جاي دهد. مضافاً اينكه، فهرستي از روشها و دستورالعملهائي مربوط به متدهاي مختلف را براي نوع خاصي از Object مشخص ميكنيد. اين متدها، نقش هر يك از اين نوع Object را توضيح ميدهد. مثلاً ميتوانيد نوع ظاهري Object را به شرح زير تعريف كنيد:
type
Shape = object
Bounds : Rect
Color: Pattemm
Pracedave Draw:
Procedure Erase:
Procedure Rotate (angle: integer):
Procedure Meve (delta: Point)
Function Area: integer:
End:
بعلاوه، ميتوانيد نوعي از Object را كه داراي حوزهها و روشهاي Object نوع ديگري باشد نيز شناسائي كنيد. نوع جديد ميتواند روشها و حوزههاي جديدي را مشخص نموده روشها كه را كه در درون نهفته دارد و موردنظر شماست انتخاب نمايد.
Type
Circle = object (Shape)
Radias: integer
Procedure Draw: override:
Function Area: integer: override
Procedure SetRadis (new Raduig: unteger)
End
هر مدلي از Object معمولاً اشاره به گروهي دارد. در مثال بالا، دايره زيرگروه شكل است. شكل گروه اصلي دايره ميباشد. هر گروه (نوع Object) ميتواند زيرمجموعهها (انشعابات) زيادي داشته باشد، اما فقط يك سرگروه (اصل) دارد. وقتي از مفهوم ارتباط صحبت ميشود اكثراً از واژه گروه (Class) استفاده ميكنيم. هر وقت از انواع داده پاسكال حرف ميزنم، واژه Object را به كار ميبرم.
Object ها از نامگذاري روشهاي انواع جديد فرمهاي پاسكال بوجود آمدهاند. لغت جديد (دايره) را به كار ميبريد تا مثالي براي Object نوع دايرهاي بزنيد. وقتي در مورد متغيرهاي از نوع Object از واژه جديد استفاده ميشود، به ذخيرهاي كافي در گروه اشاره داشته ميزان متغير را تا رسيدن به داده موردنظر (نقطه به نقطه) تنظيم ميكند. فلشهاي دوبل معمولاً براي تفهيم و بيان عدم مراجعهاي كه بطور اتوماتيك توسط مؤلف انجام ميشود مورد نياز است، بنابراين ميتوان مستقيماً به حوزههاي اطلائي دست يافت، بعنوان مثال:
Acircle.bounds درست است نه Bounds 88 aCricle. برعكس براي استناد به روشي كه براي همان بيان استفاده ميكنيد بايد نوشت: Acricle اين طرح به روش نوع شيئي دايره شكل استفاده دارد. از آنجا كه همه متغيرههاي نوع Object به دادهها برميگردند. نموداري مثل شكل 1=: شكل 2 باعث ميشود كه نحوه شكل 1 بر دادههاي شكل 2 منطبق شود.
حوزههاي يك موضوع خود ميتوانند مرجعهائي باشند براي موضوعات ديگر. مثلاً ميتوانيد براي تعريف Shape حوزه جديد Shape بعدي را تعريف كنيد و فرمهاي بهم پيوستهاي داشته باشيد با سيستم O.P. ميتوانيد نوع جرياني را كه ميتواند مرجعي ناشناخته باشد شناسائي كنيد. در اين روش، ميتوانيد مرجعي دوراني براي انواع Object كه داشته باشيد. چنانچه رالف با مشخص كننده يا مأنوسي مواجه شود ميتوان پذيرفت كه بزودي مشخص خواهد شد. چنانچه بعداً عنوان نشد، دستگاه علامت error ميدهد. اندازة موضوع نامشخص به دليل اينكه مرجع آن هميشه چهار بايت است زياد مهم نيست. عمقي كه هر نوع Object بتواند داشته باشد نامحدود است. ميتوانيد نسلي كوچك از يك دايره و يا نسل كوچك ديگري از آن نوع و امثال آنرا داشته باشيد. هر نسلي كه جانشين ميشود همه حوزهها و روشهاي همه نياكان خود را بهمراه دارد.
لازمة O.P. اينست كه نوع تعريف شده Object در بالاترين سطح دستگاهها يا برنامه بوده هميشه مدتي قابل ارائه باشد. در مورد يك دستگاه، اين قضيه ميتواند حالت متقابل داشته و يا بخشي تكميلب باشد. پيكره يا كد واقعي اين روش در دستورالعمل دستگاه و كاربرد يا برنامه كار قطعه ظاهر ميشود. چنانچه پيكره روش اظهار شده در پرونده ظاهر نشده، مؤلف نشان خطاي «روش كامل نشده است» ميدهد. پيكره اين روش درست مثل هر عملكرد و روش ديگري است:
Procodure shope. Erase
Begin
Erase Rect (bounds)
End.
Procedure circle. Draw
Begin
Fill Oval (bounds. Colcr)
Frame Oval (bounds)
End
در مورد اين دو مثال نكات چندي است كه بايد تذكر داده، نام روش با عنوان نام نوع، بيان شده است. واژه نام روش براي تمايز روشي است كه تعريف شده است. وقتي در مورد اصل روش صحبت ميشود، هميشه عاملي ضمني براي خود (Self) وجود دارد. Self به شيئي اشاره دارد كه به روش استفاده ميكند. حوزههاي Object نيز ميتوانند با Self تعريف شوند. مرزها يا Self. اما مؤلف عاملي ضمني را بوجود آورده بنام رنگ «با استفاده از Self» كه روش را احاطه كرده باعث ميشود حوزههاي نام مستقيماً قابل دسترسي باشند.
بطور مشابه، با استفاده از واژه Self ميتوانيد از درون هر روش به روش ديگري استفاده كنيد. واژه روش ديگر، تكرار ميكنيم فقط واژة روش ديگر كافيست. اين موضوع نياز Self را نسبت به وقتي كه كسي بخواهد موضوعي را به وضعيت عادي ديگري برگرداند مرتفع ميسازد. مثلاً در مورد موضوع «مرا به ليست اضافه كنيد (Self). در مورد عبارت a Circle. Draw از آنجا كه واژه a Circle زير مجموعه Circleاست، روش Circle Draw بيش از بيش Shape Draw شناخته شده است. مضافاً اينكه اگر بخواهيم روي موضوع a Cricle Erase كار كنيم، چون Circle در مجموعه روش Erase نيست، بايد به روش Shape Erase استفاده كرده، اين مطلب بسادگي قابل فهم است. اگركه زير را اجرا كنيم روش ناآشناتري را خواهيم داشت:
Var ashape: Shape
A Circle: Circle
New (a Circle)
A Circle. Bounds=some Rect
A Circle. Color=white
A Circle. Radius=bo
A shape=a circle
A shape=Draw
وقتي سيستم Shape Draw را اجرا ميكنيد، نام اين روش چيست. Shape Draw يا circle Draw؟ حتي اگر سيستم a shape به عنوان يك شكل بيان ميشود، تشخيص يك دوران باعث ميشود به چيزي دوراني باشد و بنابراين طرح دوار نام اين روش خواهد بود. اين روش با مقاديري از مشخصههاي دو بايتي در ابتداي هر شيئي كامل ميشود. (تصوير 1) اين قضيه نكات مهمي را گوشزد ميكند. تشخيص و اظهار يك موضوع برابر است با يك دوران يعني «امنيت» زيرا هر حوزهاي از روشها كه براي اشياء بدست كه ميباشد براي هر مورد دواري نيز صادق است.
اما تشخيص بر عكس آن به معناي شكل با امنيت نيست زيرا حوزهها و روشهاي اضافي Circle الزاماً با shape object قابل فهم نيست. مثلاً اگر بعدها به دوران شاعاي روي آوريم، نميتوان فهميد كه آيا آن موضوع شكلي معمولي بوده است يا خير. (در واقع اين متغيرة شكل ميتواند به نسل كاملاً متفاوتي از Shape مثلاً مثلث، اشاره كند. كه روشهاي خاص دوراني نيز قابل شناخت نميباشند.)
در اين مورد بايد بخاطر داشت كه حتي اگر متغيره موردي از نوع خاص هم باشد، در گذر زمان، به بيان نوع اصلي يا به نسل آن برميگردد. معني اين حرف اينست كه ميتوان فهرستي از «اشكال» را داشت كه هر يك طرحي از كل باشد كه انواع اصلي مخلوطي از مجموعه دواير، مستطيلها، مثلثها و انواع آن باشند. در نتيجه، تشخيص اينكه كلام را بايد روش اصلي ناحيه بايد از طولاني دست باشد. اين كار با استفاده از طرح «روش رايج مخابره پيام» انجام ميشود كه در آن جدولهائي از موقعيت روشها براي هدايت به روش صحيح به كار گرفته ميشوند. اين روش را بعداً مفصلتر توضيح خواهيم داد.
ساختار نهائي اضافه بر پاسكال، لغات كليدي است. چنانچه روشي را كنار گذاشتهايد تا كد نهائي خاص براي نوع مورد نظرتان اضافه كنيد، اما هنوز مايليد از روش قبلي استفاده نمائيد ميبايد از لغت بجا مانده بدنبال تمام روش استفاده كنيد.
Qrocedure my controler. Procosskey stroke (ch:char)
Begin
Ifch=(X) Then
Do samethcing speeial
Else
Inheoited processkey strovk(ch).
End
كنترلر فرضي (A.C) بدون واسطه به نياكان M.e.(My controller) برميگردد. يعني به P.K. (چرخه كه استراك) (بفرض آنكه وجود داشته باشد). اگر موجود باشد. بهترين روش ناميدن آن هميشه در زمان تأليف تعيين ميشود-نيازي به روش مخابره زماني نيست. اين روش همواره نزديكترين ريشه كاني است كه روش را كامل ميكند. توجه داشته باشيد كه منظور الزاماً ريشة بلافاصله قبلي نيست.
چنانچه ريشة قبلي روش را كامل نكند و ريشة بعدي نسل آنرا انجام دهد، آن روش را بآن نام ميتوان شناخت. با استفاده از لغت كليدي ارثي بجاي نامگذاري نياي واقعي نوع موضوع (عالي)، تغييرات بعدي ميتواند شامل شما شود كه تكميل روشي را در نياي اصلي يا عالي دارد و يا حذف كنيد. چنانچه اين نوع بجا مانده در روش استفاده شده باشد كه از نوع نياز قبلي موضوع بجا نمانده باشد دستگاه پيام اشتباه ميدهد.
O.P سيستم عملكرد عضويتي را نيز بدست ميدهد. از اين سيستم ميتوانيد زماني كه مورد خاصي در كلاسه معيني باشد استفاده نمائيد. مثلاً ميتوانيد بگوئيد
If member (a) shape, Circle) then
Num circle:=numcicle +1
چنانچه نوع مورد از همان نوع يا از نسل مورد آزمايش باشد. سيستم member آنرا تائيد ميكند. در نمونة بالا. Numcircle ميتواند ضربهاي براي دواير و هر زير مجموعهاي از دايره باشد، اما براي مربعها، مثلثها يا اشكال معمولي خطري محسوب نميشود. استفاده از سيستم Member تا حدودي برعكس اصول برنامهريزي مواد است (شما مجاز به شناخت آن با نوع خود نيستند). بنابراين استفادة آن معمولاً جز در موارد و شرايط خاص، منع شده است.
از آنجا كه همه منابع Object بعنوان ابزاري در دادههاي تودهها نگهداري شدهاند، ساختارهاي زيادي از نوع Padcal هستند كه براي استفاده مطمئن ميباشند. يكي از آنها عامل VAR در دستورالعمل جاري است. مؤلف Pascal عنوان عامل VAR را در جايگاه يعني ميكند. اگر توده در زمان انجام پروسه تكميل شده، عنوان عامل موضوع خوره اعتبار خود را از دست ميدهد. در چنين مواردي نويسنده هشدار ميدهد. اگر مطمئن هستيد دستورالعمل با متن هماهنگ نميشود، ميتوانيد قبل از عبارت از ($H-) استفاده كنيد. با اين كار ديگر نويسنده هشداري اعلام نميكند. براي برگرداندن متن به حالت اول بايد به عبارت. ($H+) را اضافه كنيد.
سطوح انطباق
اگر برنامهنويسي هستيد كه ميخواهيد از سيستم Mac App استفاده كنيد سطوح گوناگوني از انطباق را بايد بررسي كنيد. يكي از آنها استفاده از عبارتهاي مشخص شده موارد است مثل نوع مورد يا موردي از كل مجموعه. ديگر وقتي است كه از ساختار پرونده موضوع صحبت ميكنيم كه عبارتست از ساختار موضوع براساس تعاريف مشخص شدة مفهوم مورد نظر، اجزاء بجا مانده و يا انواع روشهاست. مؤلف پاسكال بايد همه بخشهاي الحاقي به سيستم پاسكال را كه از MWP ميگيرد به كاربرد تا علاوه بر ضمائم مشخص شده مورد، آن اضافات را به عنوان عوامل تأليف جداگانه به كارگيرد، عباراتي بر خلاف اظهارات، و حتي موارد زماني متعددي مثل تأليفات شرطي.
نهايتاً، زبانهائي كه قابل تأليف براي موارد فايل هستند از ساختار تاليفي يكساني استفاده ميكنند، كه نام آنها در فهرست جزوه مرجع MPW آمده است. و بعلاوه پيمانها و روشهاي خاص و جدول ساختارهاي خاصي را كه در برنامه O.P آمده دربرميگيرد.
چنانچه زباني كه براي برنامهريزي انتخاب شده مذموم موضوع مشخص شده O.P را تائيد كند و اگر ساختارهاي برنامهريزي آن زبان با ساختارهاي پاسكال شباهت داشته باشد براحتي ميتوان برنامهاي نوشت كه توجه اتوماتيكي Mac App به زبان دلخواه را بدهد. حالا مؤلف ميتواند متن ترجمه شده و يا اصل تأليف را از Mac App به هر جهت نامفهوم مورد نظري از سيستم Apple را جايگزيني سيستم Mac App نمايد. نويسندگاني كه از سيستم ساختار موضوعي MPW استفاده نميكنند ميتوانند از بعضي از متغيرههاي موجود در Mac App را انتخاب نمايند. نويسندگاني كه به سيستم Pascal، سيستم كارگاهي M.P را اضافه كردهاند خود ميتوانند مستقيماً از منابع Mac App استفاده نمايند. اگر مؤلفه شما فقط تعدادي (نه همه) ضمائم را ميدهد، ميتوانيد منابع Mac App خود را به صورت عدم استفاده از مدلهاي تأئيد نشده تغيير دهيد. البته ضمائم موضوع مشخص شده بايد تأئيد شده باشند.
برنامه نويسندگاني كه به هنگام كاربرد ساختار پرونده MPW كد گذاري ميكنند و از جدول روش O.P و نمادهاي مربوطه استفاده مينمايند ميتوانند مستقيماً به دو فايل Mac App مرتبط شوند. ميتوانند توسط فايلهاي O.P از قبيل واحدهاي Text و Dialog Box ارتباط برقرار نمايند.
اخيراً بسياري از برنامه نويسان ساختار فايل MPW را تائيد نميكنند. از اينرو تنها امكان انتخاب آنها از ترجمه Mac App به زبان خاص خودشان است (كه لكنت در وضعيت O.Pترجمهاي ناچيز يا حتي بي معني باشد.)
چنانچه شما بعنوان مؤلف نويسنده از جهت مذهبي (يا اعتقاد عملي) تعهدي در قبال ساختار خاص موضوع فايل نداريد، ميخواهم استفاده از سيستم MPW را به شما توصيه كنم. در هر حالتي، بحث سازمان جدول روش خاص ما و نمايد مخابره پيامي كه بدنبال آن ميآيد بسيار مفيد است بخصوص اگربخواهيد موارد خاصي را به زبان برنامهنويسي اضافه كنيد و حتي اگر قصد داشته باشيد كه زبان برنامه خود را به نحو كاملاً متفاوتي بنويسيد.
ساختار فايل موضوع
همانطور كه قبلاً گفتيم،سيستم A.O.P فائلهائي را براي استفاده از ساختارهاي MPW بدست ميدهد. ساختار اين فايل از مجموعهاي از گزارشات طولاني است. يازده نوع گزارش مختلف داريم. مهمترين انواع آنها براي اين منظور عبارتند از تحريري، ضمني و مرجعي، گزارش تحريري كه يا دادههاي تحريري جديدي را شامل ميشود. هر دستورالعمل يا كاربردي بوسيله كدي تحريري بيان ميشود. اين كه معمولاً بعد از يك يا چند گزارش مرجعي و يا ضمني ميآيد. گزارشهاي مرجعي به مرجع گزارشات تحريري از گزارش ضمني ميپردازد. گزارشهاي ضمني شامل كدهايي رايج و واقعي است.
«The class info proc» پروسه گروه اطلاعاتي
زماني كه يك نوعي از Object type تعريف ميشود يك (مقياس كد ساختگي) ايجاد ميگردد. كه اين مدول به نام «Class info proc» پروسه گروه اطلاعاتي شناخته ميشود، كه شامل اطلاعاتي مانند اطلاعاتي در ارتباط با ساير اين نوع Obgect و اينكه از چه متدهايي و روشهايي براي اين نوع استفاده شدهاند ميباشد. اين مدول هرگز فراخواني نميشود و در يك بخش خامي جايگذاري شده به نام Methtable% به همراه بقية پروسه گروه اطلاعاتي Class info ptoc همچنين اين بخش يا Segment يك برنامه كوتاه دارد با نام RTS1% در هنگام شروع كار RTS1% فراخواني ميشود كه تمام سگمنتها را همراه متد تيبلها را در خود جاي ميدهد.
«The method Call» سيستم متدكال
قبل از اينكه من بخواهم به تنهايي در مورد نوع اين متد تيبل صحبت بكنم، ما نياز داريم كه بدانيم اصولاً چگونه يك متدكال كار ميكند. به متدكال زير توجه فرماييد.
Ashape.Move(dist);
متدكالها در سيستم پاسكال به طور طبيعي، اصولاً از تعرفه Pascal calling استفاده ميكنند. در ابتدا پارامترهاي جمعآوري و طبقهبندي ميشوند (به صورتي كه آنها به صورت يك روش بياني Preceduredeelaration به نظر ميرسند)
سپس يكJSRcoll (Jamp to Subroutirc) ايجاد ميگردد. براي متدكال بالا كه ابجكت به صورت زير ظاهر ميشود:
Move. L Dist,-(SP)
Move. L a shape, -(SP)
JSR
JSR به كجار ميرود؟ همواره متدكال به اجراي نوع فرم سيستم ashape را بسته ميباشد. ما نميتوانيم كه يك JSR را مستقريم در يك Shape. Move جايگذاري كنيم. در زمان اجرا ashape ميتواند يك دايره، مربع يا چيز ديگري باشد در زماني كه اين كد كامپايل شده است.
ما نيازمند يك مكانيسم ارسال هستيم كه ابجكت را كنترل كند تا نوع آن را مشخص نمايد. سپس روشي مناسب و در خور آن نوع را انتخاب كند. اما به كد بالا نگاه كنيد ما حتي براي تماس روش خاصي را مشخص نكرديم. اكثر زبانهاي كه (Obgect oriented) يا زبانهايي كه به object گرديدهاند از يك روش انتخاب كننده براي تشخيص متد استفاده ميكنند.
انتخابگر يك تشخيص دهنده منحصر بفرد براي يك اسم متد خاص ميباشد. اين شيوه ميتواند گران باشد به اين دليل كه به فضا و حافظه بيشتري نيازمند است. بعلاوه Object pascal كه متدهاي نامربوط از سلسله Object داراي اسم مشابهي باشند در صورتي كه ليستهاي پارامتر كاملاً متفاوتي از يكديگر دارند. به طور كلي كامپايلر به صورت تعريفهاي جداگانه متد برخورد ميكند. در حقيقت اسم روش براي انتخابگر ميتواند گيج كننده باشد.
«The Selector proc» پروسه انتي بگر
اين سئوال باقي ميماند كه ما چگونه ميتوانيم يك انتخاب گر خاص براي هر(Method name) اسم متد ايجاد كنيم؟ ما اجازه ميدهيم كه لينكر (Linker) اين كار را انجام بدهد. لينكر در هنگام اصلاح بازفرنسهاي سگمنت مواجه ميشود و آنها را با JSRها ارتباط ميدهد، و با داشتن آنها به جامپ تيبل ميرود و سپس به مسير و روتين صحيح ميرسد.
زماني كه سگمنتها لود نشدهاند و در حافظه دوباره لود ميشوند وروديهاي جامپ تيبل به طور مناسبي به زور ميگردند. جامپ تيبل در نزديكي يك آدرس رجيستر A5 ذخيره ميگردند. همگي JSRها در جدول از فرم JSR X(A5) هستند. جاي X به نقطه مبدا در جامپ تيبل برميگردد. اين همان مبدا X است كه لينكر ايجاد ميكند و اين همانست كه ما به عنوان متد سلكتور استفاده ميكنيم. به همين ترتيب به هر اسم متد جديد كه ميرسد، در هنگام تاليف و نوشتن از يك تعرف ابجكت مواجه ميگردد. يك رويه بسيار كوچك ايجاد ميشود. اينرويه منسوب داشته شده به «Selectorpric» است.
اسم آن به فرم Type name$Method Name همانند Shape$move است. توجه داشته باشيم كه سلكتور پراك پروسه انتي بگر براي متدهاي باطل شده ايجاد نشده است. و فقط در زماني است كه در ابتدا با تعريف متد روبرو ميشود. متدها به همراه اسمهاي همنام در يك شاخه نامربوط از يك سلسله يك سلكتور پراك دارند. براي مثال Employce$Move. محتويات سلكتور پراك به سارگي يك JSR به روتين توزيع كننده متد حقيقي آن است كه با –Method% مشخص ميگردد.
اين بخش به سلكتور پراك مناسب مربوط ميشود كه همه متدكالها را هدايت كرده باشد. بنابراين در توضيح بالا در مورد JSR خواهد شد JSR Shape$Move. تمامي سلكتور پراكها در يك بخش مخصوص ديگري جاي گرفتند. «%-Selproc» قدر بحراني آن زماني است كه JSR توسط لينكر متصل گردد.
2-بايستي كه به جامپ تيبل جابجا ميشوند مخصوص آن اسم متد ميباشد. روتين توزيع كننده متد آن بايتها را چك ميكند و آنها را در مقابل ارزشهاي ذخيره شده در متد تيبل جفت ميكند (Match). كه تشخيص دهد كه چه متدي فراخواني شده است.
«Mettod table format» جدول ساختار روش
همانطور كه در قبل متذكر شديم متد تيبل براي يك ابجكت تايپ خاص در انتهاي Class info proc ظاهر ميشود. تيبل در حقيقت يك جفت از رفرنسها است هر جفت براي هر متد بوسيله نوع آن ايجاد شده است. رفرنس اول در هر جفت مربوط به سلكتورپراك و دومين مربوط به اجراي متد حقيقي ميباشد. هر كدام از اين رفرنسها متعد ميباشند كه همواره در كنار سكنت باشند.
به طور طبيعي زماني كه لينكر در حال اصلاحسازي در كنار رفرنس سگنت ميباشد تنها به وصل بايتهاي جابجا شده از اينتراكشن نميباشد. و همچنين بيتها را در اينتراكشن مرتب ميكند تا يك AS مرتبط ايجاد كند. براي متد تيبلها هيچ JSR وجود ندارد تنها Offsetها يا مبداءهايي كه احتياج دارند به اينكه متصل گردند. خوشبختانه يك بيت مخصوص وجود دارد به نام (The AS relatve flay) محل آن در ركورد رفرنس است تا به لينكر گوشزد كند كه تلاش براي ويرايش كلمه قبل از محل شروع (Offset) نكند.
روش جديد
ابجكتهايي كه ايجاد شدهاند از رويه جديد استفاده ميكنند. با وجود اينكه پارامتر يك متغير، Object type باشد كامپايلر آن را شناسايي ميكند. اين براي Pointer tyepها نسبت به يك رويه نرمال كه جديد است خيلي متفاوت به نظر ميرسد. اين رويه و %OB NEW ديتارادوي توده كاربرد اختصاص ميدهد. (پوينتر نرمال ديتاي اختصاص داده شده را از توده يا گروه مخصوص پاسكال ميگيرد.)
%-DB NEW همچنين بايد دو بايت شناساگر براي ابجكت ايجاد كند. خيلي شبيه به دو بايت ديگري كه خيلي قبل با آنها برخورد كرديم. اين يك مبدأ (Offset)A5 در جامپ تيبل ميباشد.
اين بار رفرنس به Class info proc از Class از پارامتر به NEW است. ترتيب فراخواني حقيقي براي NEW (يك دايره) به صور زير است:
PEA a circle
PEA circle’s class info proc +2
Move.W #Size of instanse, -(sp)
JSR %-OBNEW
علامت «+2» براي Info proc يك مثل عمل Haek است. ورودي جامپ تيبل براي Jump X Class info proc است در جايي كه X آدرس Class inf proc ميباشد. ما نميخواهيم كه كد را آنجا اجرا كنيم. ما فقط ميخواهيم به اطلاعات داخل آن نگاه كنيم. با «+2» ما حالتي را ايجاد كردهايم كه به Class info proc دسترسي داشته باشيم و جايي كه پرينتر اصلي (ارجح) آدرس ذخيره شده بعد از JMP اينستراكشن درون جامپ تيبل ميباشد.
%-OB NEW روتين %-Set Class index را فراخواني ميكند كه AS را از اين «handle» كم كرده و نتيجه را در بخش 2 بايت شناساگر انباشته ميكند. زماني كه يك متد فراخواني ميگردد %-Method را به بخش 2 بايت از آبجكت اضافه ميكند. بنابراين دسترسي به بخش Class info proc را بازسازي ميكند.
The method Dispatch Routine روش جاري مخابره پيام
در جدولهاي 2 و 3 چگونگي كلي فراخواني يك متد را مشاهده كرديم. همانطور كه قبلاً هم ديديم پارامترهاي متد بتنهايي توسط هندل به ابجكت كشانده شدهاند به صورتي كه هر كدام بدست ذخيره شدن هدايت شده باشند.
سپس ما يك JSR را به سلكتورپراك انجام داديم در اين مورد داريم: Shape$ Ratate مثل همه سلكتورپراكها Shape$ Ratate به سادگي يك JSR به روتين اتصال %-Method ميباشد. در متد اتصال روتين ابتدا ما قسمت هندل به ابجكت را از قسمتي كه در آن انباشته ميكنيم يا محل ذخيره، به اصطلاح تصرف ميكنيم يا ميرباييم. سپس ما از بخش بالايي ابجكت كلاس شناساگر بايتها را ميگسترانيم.
با اضافه كردن A5 به اين بايتها امكان دسترسي به دايرهي Class info proc را خواهيم داشت. متد «Seleator» 2 بايت مبدأ، بعد از اينستراكشن JSR به سلكتورپراك است. ما به جستجو از ميان متد تيبل در Class info proc براي جفت كردن اين انتخابگر ميپردازيم. تا زماني كه Rotate از دايره خارج نشده است ما نميتوانيم جفتي در اين تيبل پيدا كنيم. سپس به بخش روتين مناسب Shape-Rotate ميرود.
Type cheking
در گذشتهاي نه چندان دور متذكر شدم كه اگر شما از تايپ استفاده كنيد مجبور هستيد تا به گمارش يك تعريفي از Object type به ديگري داشته باشيد، چك كننده run time هم ايجاد ميشود. اين چك كردن براي آن است كه ببيند نوع تايپ ابجكت همانند آن چيزي است كه نگارش شده يا يك زاده از متغير در سمت چپ گمارش است. اين چك كردن در زماني ايجاد ميشود كه شما Member funtion را فراخواني ميكنيد. روتيني كه اين كار را انجام ميدهد به نام %-OBCHK است.
2 پارامتر را ميگيرد و يك هندل به ابجكت و يك پوينتر به ورودي جامپ تيبل از Class info proc براي كلاس كه چه عضوي تست شده است. اگر تست موفقيتآميز باشد %=OBCHK ابجكت Hondle را برميگرداند و اگر در تست جواب ندهد آن را حذف و معدوم ميسازد. اين به نام روتين برلين فراخواني ميشود. روتين %-IN obj براي انجام يك تست واقعي است.
اطلاعات آماده شدهاند از اين قرار بعلاوه براي كسي كه ميخواهد امكانات Object-orientel را در زبانهايش بكار گيرد بايد كافي باشد. Object Assebler بحثي است كه در پيش ميباشد، يك مثالي است كه چگونه ما ميتوانيم يك متد تيبل نوبت از زبان ديگر بگيريم و مشابه آن ايجاد كنيم. و ساخت يك Object file سازگار و متناوب (متغير) در برنامهنويسي مخصوصاً در Object Pascul را انجام دهيم و به پايان برسانيم.
با وجود اينكه فوايد زيادي در استفاده يك زبان سطح بالا وجود دارد ميخواهيم كه قادر باشيم فرار كنيم از جمع كردن زبان زماني كه مجبور هستيم. بخشهاي بحراني يك كاربرد Code-time را بهرهور سازيم.
استفاده كردن از زبان قدرتمند ماكرو توسط اسمبلگر MPW 68000 اين امكان را به من ميدهد كه يك مجموعه از ماكروها را بنويسم كه اين اجازه را به من ميدهد كه يك گروه را تعريف، متدها را فراخواني و بكار گيرم. و همچنين يك ابجكت جديد ايجاد كنم. تمامي اينها در زبان اسمبلي 68000 ميباشد.
براي مثال تعريفهاي دايره و Shape كه ما در پاسكال مشاهده ميكنيم به صورت زير است:
(زماني كه يك خط را ادامه ميدهد، كاراكتر (\) براي اسمبلگر نياز است.)
ابجكت Def macro در حقيقت Class info proc ايجاد ميكند و سلكتورپراك نيزهمانطور كه در قبل گفتيم. همانطور كه در ذيل مشاهده ميكنيد متد A تعريف ميشود:
Proc meth از ماكرو (و Func Meth از ماكرو) ماكروي ديگري را ميطلبند. ابجكت With اين اجازه و اين امكان را به رفرنسهاي داخليتر يا اصليتر ميدهد كه به طور صحيح و مناسب فعاليت بكنند مانند كرانهاي (AO).
Move self يك ماكروي ساده ميباشد كه SELF off را از محل ذخيره ميگيرد. اين فرض را بر اين ميگذارد كه شما متد را با يك لينك A6 شروع كردهايد. روتين فوق SELF را در A0 لود ميكند و همچنين اختلافهاي آن. و باندهاي فيلد را به قسمت ذخيره ميفرستد بنابراين Eease Rect ميتواند فراخواني شود. بعد از جداسازي قسمت ذخيره و انباشتن توسط انباشتن آدرس برگشتي در بالاي پارامتر سينگل (كك) و SELF و بازگشتهاي متد و … تصحيح ميشود.
متد كالهاي ايجاد شده از Methcall macro استفاده ميكنند:
براي كشيدن (Draw)Methcall يك JSR براي سلكتورپراك مناسب و صحيح ايجاد ميكند. اگر فراخواني از داخل يك Shape يا يك Subclass از Shape ايجاد شده باشد پارامتر Shape ميتواند حذف شود. ماكروهاي مهم ديگرinherited و New object باشند:
inhorited همانند چيزي كه در Object pascal است رفتار ميكند New object نيازمند يك مرجعي براي حافظه و يك اسم Type است. موضوع New object در حافظه ذخيره شده است كه محل آن توسط پارامتر مشخص ميگردد.
توضيح كامل در ارتباط با ماكروها در نشريه مانوال MPW Assemblerو هم در رفرنس راهنماي Mac App وجود دارد. تا زماني كه اين ماكروها ايجاد ميشوند زبان ميتواند بين كدهاي مشابه كه در Object Pascal و فايلهاي Mac App Object ايجاد ميشوند ارتباط برقرار كند. در حقيقت متدهاي خاص در Object Pascal ميتوانند در خارج از محيط شناسايي شوند و در زبان اسمبلي كه از ماكروها استفاده ميكنند به صورت كد كدينگ شوند.
«The Optimzer and the New Run Time Environmenth»
در اجرا، Applicationهايي كه در Mac APP نوشته شدهاند به خوبي نقش خود را ايفا ميكنند و به طور كلي از كيفيت خوبي برخوردارند. با وجود اينكه حقيقت اين است كه متد گال قبل از اينكه اجرا شود بايد همراه مكانيسم اتصال برود. به هر حال ما متوجه شديم كه بعضي بهينهسازيهاي معنيدار و مهم در كل سلسله Object type كه تا به حال شناخته شده يكبار ممكن گشته است.
ما يك برنامه بهينهساز را توسعه و بسط داديم كه فايلهاي ابجكت را درست قبل از اينكه به متصل شوند پردازش كند. اين يك نماينده داخلي از كل سلسله Object thpe ميسازد و اقدام به آناليز آن براي بهينهسازيهاي بالقوه ميكند.