انعکاس
پنج شنبه 2 دی 1389 7:27 AM
اسمالتاک-۸۰ یک سیستم کاملاً انعکاسی است که در خود اسمالتاک-۸۰ پیاده شد. اسمالتاک-۸۰ هم ساختار و هم محاسبات انعکاسی فراهم میسازد. کلاسها و متدها که یک شی را تعریف مینمایند خود شی هستند و کاملاً جز خود سیستم هستند. کامپایلر اسمالتاک فایلهای متنی را به به اشیا متد تبدیل میکند که معمولاً نمونههایی از کلاس Compilemethod است. اینها از طریق اضافه شدن به دیکشنری کلاس اضافه میشوند. سلسله مراتبی که کلاسها را تعریف مینماید خود میتواند کلاسهای جدید اضافه نماید. سیستم از طریق کد اسمالتاک-۸۰ که کلاسهای جدید تعریف میکند یا تغییر میدهد گسترش مییابد. بدین طریق سیستمهای نوشته شده به اسمالتاک-۸۰ سیستمهای زنده هستند و میتوانند در زمان اجرا خود را تغییر دهند و بهبود یابند.
بدلیل کلاس بودن کلاسها میتوان از آنها سوال نمود که دارای چه متدهایی هستند و چه فیلدهایی تعریف مینمایند. بنابراین اشیا میتوانند از طریق کد جنریک هر شی بررسی شوند، کپی گردند، و بصورت سریال به کار روند.
اسمالتاک-۸۰ یک سیستم محاسباتی انعکاسی فراهم میسازد تا وضعیت محاسباتی سیستم قابل مشاهده باشد. در زبانهای مشتق شده از اسمالتاک-۸۰ اصلی، فعالسازی یک سیستم آن را از طریق کلمه کلیدی thisContext قابل دسترسی است. با فرستادن پیامها به thisContext متد فعالشده میتواند بپرسد چه کسی مرا فعال کرده است. این امکانات برنامهنویس را قادر میسازد روتینهای کمکی و بازگشت همانند پرولوگ پیادهسازی نماید بدون آنکه ماشین مجازی را تغییر دهد. یکی از استفادههای جالب این ویژگی در سیساید است که این قالب کار برای وب توسط ایوی برایانت نوشته شده و طراحان را با از پیچیدگیهای دکمههای بازگشت رها نموده و حرکات او را ذخیره کرده و امکان حرکت بین آنها را برای او فراهم میسازد. پس از ذخیرهسازی این حرکات میتوان ظراحی وب را به آسانی به یکی از ویژگیهای معمول ادامه داد.
اگر پیام ارسال شده به هر شی توسط آن شی پیاده نشده باشد پیام عدم فهم شی (doesNotUnderstand:) ارسال میگردد و پیام آرگومان آن محسوب میشود. پیام (شی دیگری از نمونههای Message) شامل فرستنده و آرایهای ارگومانهایش است. در یک سیستم محاورهای اسمالتاک پیادهسازی پیشفرض پیام doesNotUnderstand: همان است که پنجره را برای نشان دادن خطا باز خواهد کرد. از این طریق میتوان دلیل و زمینه خطا را شناخت و این اشکال را در داخل سیستم برطرف نمود و با استفاده از سیستم انعکاسی یه کار ادامه داد.
کاربرد مهم دیگر doesNotUnderstand: میانجیگری است. برنامهنویس میتواند کلاسی پیاده نماید که هیچ متدی نداشته باشد و فقط پیام doesNotUnderstand: را پیاده کرده باشد و از هیچ کلاسی به ارث نرفته باشد. اگر این اشیا بدرستی به کار روند میتوانند پیامها را به سیستمهای دیگر هدایت بنمایند و سیستمهای توزیعشده به خوبی عمل نمایند. این چنین سیستمی در CORBA و RMI نیز وجود دارد اما در ابتدا در اسمالتاک-۸۰ پیاده گردید.