بخشی از مقاله

مقدمه‌اي بر 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 مي‌سازد و اقدام به آناليز آن براي بهينه‌سازي‌هاي بالقوه مي‌كند.

در متن اصلی مقاله به هم ریختگی وجود ندارد. برای مطالعه بیشتر مقاله آن را خریداری کنید