06-13-2011، 12:43 PM
زبان اسمالتاک یک زبان شیگرا و دارای انواع پویا و زبان برنامهنویسی انعکاسی است.
یک برنامه اسمالتاک توصیف یک روند محاسباتی پویا است. زبان برنامهنویسی اسمالتاک نشاندهنده چنین برنامههایی است. منبع استاندارد انسی برای اسمالتاک بخش ۳
اسمالتاک برای توصیف دنیای جدید به تصویر کشیده شده در کتاب «همزیستی میان انسان و کامپیوتر» به وجود آمد. اسمالتاک به منظور اموزش خلاقانه توسط زیراکس پارک (Xerox Park) و آلن کی، دان اینگالس، آدل گلدبرگ، تد کاهلر، اسکات والاس، و دیگران در طول دهه ۱۹۷۰ تحت تاثیر لیسپ و لوگو و اسکچپد(sketchpad)، سیمولا ساخته شد.
این زبان اولین بار تحت عنوان اسمالتاک-۸۰ عرضه شد و پس از آن بصورت گسترده به کار برده شد. زبانهایی مشابه اسمالتاک همچنان در حال توسعه هستند و کاربران وفادار بخود را دارند. نسخه انسی اسمالتاک در سال ۱۹۹۸ معرفی شد و بصورت گسترده به کار رفت.
تاریخچه
انواع مختلف موجود از زبان اسمالتاک همانند سایر زبانها موجود است. لغت نامناسب اسمالتاک اشاره به نسخه اسمالتاک-۸۰ دارد.
اسمالتاک محصول تحقیقات گروه پژوهشی زیر نظر الن کی د ر شرکت زیراکس پارک بوده است. آلن کی بیشتر نسخههای اولیه این زبان را طراحی نموده است که توسط دان اینگالس پیاده شدهاند. اولین نسخه این زبان یعنی اسمالتاک-۷۱ در اثر یک شرطبندی در مورد امکان بوجود آوردن یک زبان با کد یک صفحهای براساس ارسال پیام همانند سیمولا در عرض چند صبح بوجود آمد. نسخه بعدی ایجاد شده که در تحقیقات ایجاد مدل بازیگر نیز نقش داشت اسمالتاک-۷۲ بود. این نسخه دارای دستورات و مدل اجرایی متفاوت از بیشتر انواع این زبان در حال حاضر بود. با وجود مسدود نمودن بخشی از مدل اجرایی و بوجود آوردن سلسلهمراتب کلاسها همانند سیمولا نسخه اسمالتاک-۷۶ بوجود آمد. محیط توسعه نرمافزار برای این زبان بیشتر ویژگیهای معمول کنونی در مورد ویرایش کد کتابخانه کلاسها را شامل میگشت. اسمالتاک ویژگی متاکلاس را افزود تا بینش همه چیز جز متغیرها کلاس هستند را پیادهسازی نماید و حتی این مورد را برای مفاهیم پایه مانند اعداد صحیح و منطقی به کار برد و ویژگیها و رفتارها را با این کلاسهای مجزا مرتبط نمود.
اسمالتاک-۸۰ اولین نسخه استفاده شده خارج از شرکت بود و نسخه اول آن را به تعدادی شرکت (هیولت پاکارد، کامپیوتر اپل، تکترونیکس، DEC) و دانشگاه برکلی تا مرور لازم بر آن انجام شود و محیطهای مناسب برای آن توسعه یابد. نسخه عمومی تر که اسمالتاک-۸۰ نسخه دوم نام داشت به صورت فایل تصویری و مستقل از محیط با تعریف اشیا عرضه گشت که ماشین مجازی مناسب خود داشت عرضه گشت. نسخه استاندارد انسی در سال ۱۹۹۸ تا کنون نسخه رسمی مورد استفاده بوده است.
دو نشخه مشتق شده از اسمالتاک هماکنون مورد استفاده است یکی از آنها اسکویک که از اسمالتاک-۸۰ نسخه اول بوجود آمده است به شیوه اپل تولید شده و یک نرمافزار متن باز است. و دیگری ویژوالورکس از اسمالتاک-۸۰ نسخه دوم و اسمالتاک-۸۰ ۲.۵ و ابجکتورکس ساخته شده توسط شرکت سیستمهای پارکپلیس (شرکت تابع از زیراکس پارک برای عمومی سازی زبان اسمالتاک) اشتقاق یافت. به عنوان پیوند جالب بین نسلها واسیلی بایکف هابز را ساخت تا زبان اسمالتاک-۸۰ در ویژوالورکس عمل نماید.
در اواسط دهه ۱۹۹۰ محصولات مربوط به اسمالتاک توسط دو شرکت رقیب پارکپلیس و دیجیتاک عرضه میگشت. پارکپلیس توجه به بازار سان میکروسیستم و یونیکس توجه داشت در حالی که دیجیتاک به شرکت اینتل و سیستم عاملهای OS/2 و ویندوز توجه کردند. هر دو شرکت بدلیل قابلیت خوانایی کد منبع در سیستمهای توزیع شده و محدودیتهای موجود در بهبود عملکرد و عدم وجود ارتباط با یک پایگاه داده منطبق بر SQL دست به گریبان بودهاند. در سال ۱۹۹۵ این دو شرکت با توجه به کاهش موفقیت تجاری این زبان دو شرکت با یکدیگر درشرکت آبجکتشیر ادغام گشتند. اما در ادامه در سال ۱۹۹۹ منحل شدند. نسخه قویتر (ویژوالورکس باقی مانده و هماکنون جزئی از سینکام اسمالتاک است). شرکت رنرمافزاری سیگال آزمایشگاه ایجاد کننده smalltalk/V را خرید و هماکنون نیز مالکیت آن را در اختیار دارد.
اخیرا پایتون و روبی ایدههای اسمالتاک را به کار گرفته است. بدلیل زبانی آموزشی دارای دستوراتی همانند انگلیسی است.
برنامهنویسی شیگرا
همانند سایر زبانهای برنامهنویسی شیگرا زبان اسمالتاک-۸۰ (نه اسمالتاک-۷۲) دارای مفهوم مرکزی شی است. شی یک نمونه از یک کلاس میباشد. کلاسها تعیین کننده نحوه رفتار در نمونههای خود هستند. برای مثال کلاس پنجره باید تعیین نماید که ایا دارای برچسب است یا نه و اعمال مورد نیاز برای پنجرهها همانند باز کردن، بستن، و حرکت دادن را برای آن تعریف نماید. هر نمونه از کلاس پنجره مقادیر مخصوص به خود را داراست و در صورت نیاز میتواند اعمال تعریف شده در کلاس مربوطه را انجام دهد.
یک شی در اسمالتاک میتواند دقیقا سه عمل انجام دهد:
۱- وضعیت را نگهداری نماید (مرجعی برای سایر اشیا باشد)
۲- پیامی را از خود یا شی دیگری دریافت دارد.
۳- در هنگام پردازش پیامی، پیام دیگری برای خود یا اشیا دیگر بفرستد.
وضعیت یک شی در اسمالتاک برای آن شی خصوصی است. دیگر اشیا میتوانند به آن دسترسی داشته باشند یا آن را تغییر دهند در صورتی که یک درخواست (پیام) برای آن شی ارسال نمایند. زمانی که یک پیام دریافت شد شی تعیین میکند که آیا پیام مناسب است. (آلن کی اظهار نظر نموده است در حالی که شی اهمیت زیادی در اسمالتاک داشته است اما پیامها اهمیت بالاتری دارند.)
اسمالتاک کاملا شیگراست یعنی تمام موجودیتها در این زبان از قبیل انواع داده اولیه و ساختارهای دیگر شی هستند. انواع داده اولیه به کلاس مربوط به خود اشاره کرده و عمل متناسب را با توجه ساختار کلاس خود انجام میدهند و پیام مناسب را ارسال مینمایند. برنامهنویسان قادر هستند تا رفتار و کلاس مربوط به نوع داده اولیه را تغییر دهند تا مطابق میل آنها رفتار نماید این بدان معنی است که در صورتی که برنامهنویس ساختار کنترلی جدید را ایجاد نماید این ساختار کنترلی همانند قبلی رفتار ننموده و رفتار جدید تعریف شده در پیش خواهد گرفت. به صورت حلاصه میتوان گفت: همه چیز در اسمالتاک شی است. (البته به صوزت دقیقتر تمام مقادیر شی هستند و نه متغیرها)
چون تمام مقادیر شی هستند کلاسها نیز خود شی هستند. هر کلاس شی متناسب با متاکلاس مربوطه است. متاکلاسها نیز خود کلاس هستد و نمونهای از کلاس متاکلاس هستند. بلاکها کد نیز شی هستند.
انعکاس
اسمالتاک-۸۰ یک سیستم کاملا انعکاسی است که در خود اسمالتاک-۸۰ پیاده شد. اسمالتاک-۸۰ هم ساختار و هم محاسبات انعکاسی فراهم میسازد. کلاسها و متدها که یک شی را تعریف مینمایند خود شی هستند و کاملا جز خود سیستم هستند. کامپایلر اسمالتاک فایلهای متنی را به به اشیا متد تبدیل میکند که معمولا نمونههایی از کلاس Compilemethod است. اینها از طریق اضافه شدن به دیکشنری کلاس اضافه میشوند. سلسله مراتبی که کلاسها را تعریف مینماید خود میتواند کلاسهای جدید اضافه نماید. سیستم از طریق کد اسمالتاک-۸۰ که کلاسهای جدید تعریف میکند یا تغییر میدهد گسترش مییابد. بدین طریق سیستمهای نوشته شده به اسمالتاک-۸۰ سیستمهای زنده هستند و میتوانند در زمان اجرا خود را تغییر دهند و بهبود یابند.
بدلیل کلاس بودن کلاسها میتوان از آنها سوال نمود که دارای چه متدهایی هستند و چه فیلدهایی تعریف مینمایند. بنابراین اشیا میتوانند از طریق کد جنریک هر شی بررسی شوند، کپی گردند، و بصورت سریال به کار روند.
اسمالتاک-۸۰ یک سیستم محاسباتی انعکاسی فراهم میسازد تا وضعیت محاسباتی سیستم قابل مشاهده باشد. در زبانهای مشتق شده از اسمالتاک-۸۰ اصلی، فعالسازی یک سیستم آن را از طریق کلمه کلیدی thisContext قابل دسترسی است. با فرستادن پیامها به thisContext متد فعالشده میتواند بپرسد چه کسی مرا فعال کرده است. این امکانات برنامهنویس را قادر میسازد روتینهای کمکی و بازگشت همانند پرولوگ پیادهسازی نماید بدون آنکه ماشین مجازی را تغییر دهد. یکی از استفادههای جالب این ویژگی در سیساید است که این قالب کار برای وب توسط ایوی برایانت نوشته شده و طراحان را با از پیچیدگیهای دکمههای بازگشت رها نموده و حرکات او را ذخیره کرده و امکان حرکت بین آنها را برای او فراهم میسازد. پس از ذخیرهسازی این حرکات میتوان ظراحی وب را به آسانی به یکی از ویژگیهای معمول ادامه داد.
اگر پیام ارسال شده به هر شی توسط آن شی پیاده نشده باشد پیام عدم فهم شی (doesNotUnderstand ارسال میگردد و پیام آرگومان آن محسوب میشود. پیام (شی دیگری از نمونههای Message) شامل فرستنده و آرایهای ارگومانهایش است. در یک سیستم محاورهای اسمالتاک پیادهسازی پیشفرض پیام doesNotUnderstand: همان است که پنجره را برای نشان دادن خطا باز خواهد کرد. از این طریق میتوان دلیل و زمینه خطا را شناخت و این اشکال را در داخل سیستم برطرف نمود و با استفاده از سیستم انعکاسی یه کار ادامه داد.
کاربرد مهم دیگر doesNotUnderstand: میانجیگری است. برنامهنویس میتواند کلاسی پیاده نماید که هیچ متدی نداشته باشد و فقط پیام doesNotUnderstand: را پیاده کرده باشد و از هیچ کلاسی به ارث نرفته باشد. اگر این اشیا بدرستی به کار روند میتوانند پیامها را به سیستمهای دیگر هدایت بنمایند و سیستمهای توزیعشده به خوبی عمل نمایند. این چنین سیستمی در CORBA و RMI نیز وجود دارد اما در ابتدا در اسمالتاک-۸۰ پیاده گردید.
دستور
دستورات اسمالتاک-۸۰ درصدد کوچک بودن است و تناها از تعدادی کلمات کلیدی و اعلامات استفاده مینماید. در حقیقت تنها شش کلمه کلیدی وجود دارد: true، false، nil، self، super، و thisContext. (اینها در واقع کلمات کلیدی نیستند تنها شبه کلمات کلیدی است که شیهایی به عنوان تنها نمونه کلاسهای خود هستند. اسمالتاک در حقیقت اصولا کلمه کلیدی را به عنوان یک مفهوم نپذیرفته است.) تنها ساختههای داخلی زبان ارسال پیامها، انتصاب، بازگشت مقدار در متد، و ثابت برای بعضی اشیا. باقیمانده زبان، دستورات کنترلی همانند انتخاب شرطی و دستورات تکرارپذیر توسط استاندارد اسمالتاک در کتایخانه کلاسها پیاده میشود. بدلیل بهینهسازی ممکن است بعضی پیادهسازیها به بعضی از پیامها اهمیت زیادی داده ولی باید دقت کرد که این اهمیت دادن در داخل زبان نوشته نشده و تنها یک بهینهسازی است.
ثابتها
مثال پایین نشاندهنده تمام ثابتهای معمول اشیا را در متدهای اسمالتاک-۸۰ است.
اعداد. لیست پایین بعضی اعداد ممکن را نشان میدهد.
42 -42 123.45 1.2345e2 2r10010010 16rA000
در دو خط اخر اعداد دودویی و شانزدهشانزدهی نشان داده شدهاند. r نشاندهنده استفاده از پایه دیگری است البته این منبع میتواند ۲ نباشد. به عنوان مثال 36rSMALLTALK یک عدد ممکن است (برای کسانی که کنجکاوند این عدد برابر است با 80738163270632 دهدهی).
کاراکترها با علامت $ نوشته میشوند.
$A
رشتهها به صورت توالی کاراکترها در بین نوشته میشوند.
'Hello, world!'
برای شمول یک ' دو علامت را بکار ببرید.
'I said, Hello, world! to them.'
" نیاز به هیچگونه تغییری ندارد چون در رشتهها علامت ' بکار میرود.
'I said, "Hello, world!" to them.'
دو رشته برابر (رشتهها برابرند در صورتی که شامل تمام کاراکترها باشد) میتوانند دو شی در دو محل متفاوت از حافظه باشد. علاوه بر رشتهها اسمالتاک دارای یک کلاس توالی کاراکترهای دیگر بنام symbol است. symbolها تضمین شدهاند که منحصر بفرد باشند و هیچ دو symbol برابر دو شی متفاوت نیستند. به دلیل منحصر بفرد بودن آنها را میتوان براحتی مقایسه نمود و برای انتخاب کننده پیامها و سایر مصنوعات زبان به کار رود.
symbolها توسط علامت # و چند کاراکتر نشان داده میشود.
#foo
آرایهها.
#(1 2 3 4)
یک آرایه از ۴ عدد سحیح را تعریف میکند.
و آخرین نه کمترین بلوکها (ثابت توابع بینام).
[... Some smalltalk code...]
بلوکها در ادامه توضیح داده شدهاند.اشتقاقهای دیگر اسمالتاک دستورات اضافهتر را تعریف میکند اما موارد توضیح داده شده در بالا مهمترین ثابتهاست.
اعلام متغیرها
دو نوع متغیر معمول استفاده شده در اسمالتاک متغیرهای نمونه و متغیرهای موقت هستند. متغیرهای دیگر و اصطلاحات مرتبط بستگی به پیادهسازیهای مختلف دارند. به عنوان مثال ویژوالورکس دارای متغیرهای به اشتراک گذاشته در کلاس و فضای نام است در حالی که اسکویک و پیادهسازیهای دیگر متغیرهای کلاس، حوضچه، و جهانی است.
اعلام متغیر موقت در اسمالتاک برای متغیرهای درون متد بکار میرود. این متغیرها در بالای متد تعریف میشوند و با فضای خالی و | جدا میگردند. به عنوان مثال:
| index |
یک متغیر موقت بنام index تعریف میکند. چندین متغیر را میتوان در یک دستور تعریف نمود.
| index vowels |
دو متغیر index و vowels را تعریف میکند.
انتصاب
یک متغیر از طریق دستور =: به یک مقدار منتصب میگردد.
vowels := 'aeiou'
رشته aeiou را به متغیر از پیش تعیین شده vowels نسبت میدهد. رشته یک شی است (توالی کاراکترها در بین نشاندهنده ثابت رشتهایست) که در زمان کامپایل ایجاد میشود.
پیامها
پیامها ساختارهای اساسی در اسمالتاک هستند. حتی دساورات کنترلی نیز به صورت ارسال پیام پیاده میگردند. مثال پایین پیام factorial را به عدد 42 میفرستد.
42 factorial
در این حالت 42 گیرنده پیام است در حالی که factorial انتخابکننده میباشد. گیرنده پیام با بازگرداندن مقداری (در اینجا احتمالا فاکتوریل عدد ۴۲) پاسخ میدهد. علاوه بر این مقدار بازگردانده شده را میتوان به یک متغی نسبت داد:
aRatherBigNumber := 42 factorial
factorial پیامی است که به آن عموما پیام یگانه گویند چرا که فقط یک شی و آن هم دریافتکننده در آن نقش دارد. پیامها میتوانند چندین شی را به عنوان آرگومان خود حمل کنند:
2 raisedTo: 4
در این عبارت دو شی نقش داشتهاند: 2 به عنوان گیرنده و 4 به عنوان آرگومان. نتیجه پیام یا در اصطلاح اسمالتاک پاسخ پیام 16 است. یک پیام میتواند آرگومانهای بیشتری هم داشته باشد.
'hello world' indexOf: $o startingAt: 6
مثال بالا اندیس o در رشته داده شده با شروع از اندیس ۶ را بازمیگرداند. انتخابکننده این پیام :indexOftartingAt که از دو کلمه کلیدی یا قسمت تشکیل شده است.
چنین کلمات کلیدی درهمتنیده خوانایی کد را بالا برده و آرگومانها بوسیله کلمات کلیدی پیش از خود توصیف میگردند. به عنوان مثال یک عبارت برای ساخت یک مستطیل در ++C یا جاوا به شکل زیر است:
new Rectangle(100, 200);
در این عبارت مشخص نیس ت کدام آرگومان طول است یا عرض و شما برای فهمیدن این نکته باید به راهنمای زبان مراجعه نمایید اما همین عبارت در اسمالتاک بدون هیچگونه ابهام نوشته میشود به شکل زیر:
Rectangle width: 100 height: 200
گیرنده در این حالت Rectangle یک کلاس است و در پاسخ یک نمونه از این کلاس با عرض و طول خواسته شده تولید میگردد.
در نهایت بیشتر کاراکترهای غیرالفبایی به عنوان پیام دودویی بکار میرود. این به برنامهنویس اجازه میدهد تا عملگرهای ریاضی را به شکل سنتی بنویسد:
3 + 4
که پیام + را به گیرنده 3 به همراه آرگومان 4 میفرستد (که پاسخ برابر با ۷) است. به طور مشابه:
3 > 4
پیام < را به 3 به همراه آرگومان 4 را میفرستد (پاسخ false است).
توجه کنید که در اسمالتاک-۸۰ خود این عملگرها پیاده نشدهاند. خروجی تنها بستگی به نحوه پاسخدهی گیرنده (در این جا نمونه Number) در برابر پیام < و + پاسخ میدهد.
اثر جانبی این مکانیزم گرانبارسازی عملگر است. یک پیام < را بقیه اشیا هم میتوانند بفهمند که این امکان را میدهد تا از عبارت a>b برای مقایسه آنها بکار میرود.
عبارات
یک عبارت میتواند چندین ارسال پیام داشته باشد. در این مثال پیامها به ترتیب ساده پردازش میشود. پیامهای یگانه اولویت بیشتری داشته و پس از آن پیامهای دوگانه و پیامهای کلمات کلیدی قرار دارند. به عنوان مثال
3 factorial + 4 factorial between: 10 and: 100
که بصورت زیر ارزیابی میشود:
1. 3 پیام factorial را درپافت میکند که پاسخ 6 است.
2. 4 پیام factorial را درپافت میکند که پاسخ 24 است.
3. 6 پیام + را به همراه 24 به عنوان آرگومان دریافت کرده که پاسخ 30 است.
4. 30 گیرنده پیام :between:and را به همراه 10 و 100 به عنوان آرگومان درسافت کرده که پاسخ true است.
پاسخ آخرین پیام به عنوان نتیجه نهایی عبارت ارسال میگردد.
پارانتزها میتوانند ترتیب ارزیابی را تغییر دهند.
(3 factorial + 4) factorial between: 10 and: 100
که معنای عبارت را تغییر داده و عبارت میان پارانتز در ابتدا ارزیابی گردیده و نتیجه ۱۰ میشود. ۱۰ پیام factorial را دریافت میکند که نتیجه ۳۶۲۸۸۰۰ است. و قسمت آخر در نهایت false تولید میکند.
بدلیل این که پیامهای دوگانه در اسمالتاک-۸۰ درونساخت نیستند اولویت برابر با یکدیگر داشته و بسادگی از چپ به راست ارزیابی میگردند. به همین دلیل عبارات مشابه در اسمالتاک ممکن است معنای متفاوت از آنچه که به صورت سنتی است داشته باشند.
3 + 4 * 5
پس از ارزیابی نتیجه ۳۵ است.
پیامهای یگانه را میتوان با نوشتن پشت سر هم به هم زنجیر نمود. به صورت زیر:
3 factorial factorial log
که فاکتوریل را به ۳ فرستاده و نتیجه را که ۶ است دوباره فاکتوریل ارسال میکند و از نتیجه ۷۲۰ لگاریتم میگیرد که نتیجه ۲.۸۵۷۳۳ است.
چند عبارت را میتوان پشت هم نوشت که هر کدام با یک . پایان مییابد. مثال پایین یک نمونه از window ایجاد کرده و آن را در یک متغیر ذخیره مینماید و به آن دو پیام میفرستد.
| window |
window := Window new.
window label: 'Hello'.
window open.
اگر چندین پیام به یک گیرنده ارسال شود میتوان آنها را بصورت یک زنجیره جدا شده با ; نوشت.
(Window new)
label: 'Hello';
open
با این تغییر نیاز به استفاده از یک متغیر موقت برطرف خواهد شد.
بلوک کد
یک بلوک از کد (تابع بدون نام) را میتوان بصورت یک ثابت بیان داشت (که یک شی است چرا که هر مقدار شی میباشد) که این هدف با استفاده از [] ممکن است.
[ arams | ]
که params: نشاندهنده پارامترهای دریافتی است. این بدان معنی است که کد زیر:
[ | x + 1]
میتواند به صورت زیر باشد:
f(x) = x + 1
(یا با استفاده از حساب دیفرانسیل لامدا):
ëx.(x+1)
و
f(3) = 3 + 1
ارزیابی خواهد شد:
[ | x + 1] value: 3
یک برنامه اسمالتاک توصیف یک روند محاسباتی پویا است. زبان برنامهنویسی اسمالتاک نشاندهنده چنین برنامههایی است. منبع استاندارد انسی برای اسمالتاک بخش ۳
اسمالتاک برای توصیف دنیای جدید به تصویر کشیده شده در کتاب «همزیستی میان انسان و کامپیوتر» به وجود آمد. اسمالتاک به منظور اموزش خلاقانه توسط زیراکس پارک (Xerox Park) و آلن کی، دان اینگالس، آدل گلدبرگ، تد کاهلر، اسکات والاس، و دیگران در طول دهه ۱۹۷۰ تحت تاثیر لیسپ و لوگو و اسکچپد(sketchpad)، سیمولا ساخته شد.
این زبان اولین بار تحت عنوان اسمالتاک-۸۰ عرضه شد و پس از آن بصورت گسترده به کار برده شد. زبانهایی مشابه اسمالتاک همچنان در حال توسعه هستند و کاربران وفادار بخود را دارند. نسخه انسی اسمالتاک در سال ۱۹۹۸ معرفی شد و بصورت گسترده به کار رفت.
تاریخچه
انواع مختلف موجود از زبان اسمالتاک همانند سایر زبانها موجود است. لغت نامناسب اسمالتاک اشاره به نسخه اسمالتاک-۸۰ دارد.
اسمالتاک محصول تحقیقات گروه پژوهشی زیر نظر الن کی د ر شرکت زیراکس پارک بوده است. آلن کی بیشتر نسخههای اولیه این زبان را طراحی نموده است که توسط دان اینگالس پیاده شدهاند. اولین نسخه این زبان یعنی اسمالتاک-۷۱ در اثر یک شرطبندی در مورد امکان بوجود آوردن یک زبان با کد یک صفحهای براساس ارسال پیام همانند سیمولا در عرض چند صبح بوجود آمد. نسخه بعدی ایجاد شده که در تحقیقات ایجاد مدل بازیگر نیز نقش داشت اسمالتاک-۷۲ بود. این نسخه دارای دستورات و مدل اجرایی متفاوت از بیشتر انواع این زبان در حال حاضر بود. با وجود مسدود نمودن بخشی از مدل اجرایی و بوجود آوردن سلسلهمراتب کلاسها همانند سیمولا نسخه اسمالتاک-۷۶ بوجود آمد. محیط توسعه نرمافزار برای این زبان بیشتر ویژگیهای معمول کنونی در مورد ویرایش کد کتابخانه کلاسها را شامل میگشت. اسمالتاک ویژگی متاکلاس را افزود تا بینش همه چیز جز متغیرها کلاس هستند را پیادهسازی نماید و حتی این مورد را برای مفاهیم پایه مانند اعداد صحیح و منطقی به کار برد و ویژگیها و رفتارها را با این کلاسهای مجزا مرتبط نمود.
اسمالتاک-۸۰ اولین نسخه استفاده شده خارج از شرکت بود و نسخه اول آن را به تعدادی شرکت (هیولت پاکارد، کامپیوتر اپل، تکترونیکس، DEC) و دانشگاه برکلی تا مرور لازم بر آن انجام شود و محیطهای مناسب برای آن توسعه یابد. نسخه عمومی تر که اسمالتاک-۸۰ نسخه دوم نام داشت به صورت فایل تصویری و مستقل از محیط با تعریف اشیا عرضه گشت که ماشین مجازی مناسب خود داشت عرضه گشت. نسخه استاندارد انسی در سال ۱۹۹۸ تا کنون نسخه رسمی مورد استفاده بوده است.
دو نشخه مشتق شده از اسمالتاک هماکنون مورد استفاده است یکی از آنها اسکویک که از اسمالتاک-۸۰ نسخه اول بوجود آمده است به شیوه اپل تولید شده و یک نرمافزار متن باز است. و دیگری ویژوالورکس از اسمالتاک-۸۰ نسخه دوم و اسمالتاک-۸۰ ۲.۵ و ابجکتورکس ساخته شده توسط شرکت سیستمهای پارکپلیس (شرکت تابع از زیراکس پارک برای عمومی سازی زبان اسمالتاک) اشتقاق یافت. به عنوان پیوند جالب بین نسلها واسیلی بایکف هابز را ساخت تا زبان اسمالتاک-۸۰ در ویژوالورکس عمل نماید.
در اواسط دهه ۱۹۹۰ محصولات مربوط به اسمالتاک توسط دو شرکت رقیب پارکپلیس و دیجیتاک عرضه میگشت. پارکپلیس توجه به بازار سان میکروسیستم و یونیکس توجه داشت در حالی که دیجیتاک به شرکت اینتل و سیستم عاملهای OS/2 و ویندوز توجه کردند. هر دو شرکت بدلیل قابلیت خوانایی کد منبع در سیستمهای توزیع شده و محدودیتهای موجود در بهبود عملکرد و عدم وجود ارتباط با یک پایگاه داده منطبق بر SQL دست به گریبان بودهاند. در سال ۱۹۹۵ این دو شرکت با توجه به کاهش موفقیت تجاری این زبان دو شرکت با یکدیگر درشرکت آبجکتشیر ادغام گشتند. اما در ادامه در سال ۱۹۹۹ منحل شدند. نسخه قویتر (ویژوالورکس باقی مانده و هماکنون جزئی از سینکام اسمالتاک است). شرکت رنرمافزاری سیگال آزمایشگاه ایجاد کننده smalltalk/V را خرید و هماکنون نیز مالکیت آن را در اختیار دارد.
اخیرا پایتون و روبی ایدههای اسمالتاک را به کار گرفته است. بدلیل زبانی آموزشی دارای دستوراتی همانند انگلیسی است.
برنامهنویسی شیگرا
همانند سایر زبانهای برنامهنویسی شیگرا زبان اسمالتاک-۸۰ (نه اسمالتاک-۷۲) دارای مفهوم مرکزی شی است. شی یک نمونه از یک کلاس میباشد. کلاسها تعیین کننده نحوه رفتار در نمونههای خود هستند. برای مثال کلاس پنجره باید تعیین نماید که ایا دارای برچسب است یا نه و اعمال مورد نیاز برای پنجرهها همانند باز کردن، بستن، و حرکت دادن را برای آن تعریف نماید. هر نمونه از کلاس پنجره مقادیر مخصوص به خود را داراست و در صورت نیاز میتواند اعمال تعریف شده در کلاس مربوطه را انجام دهد.
یک شی در اسمالتاک میتواند دقیقا سه عمل انجام دهد:
۱- وضعیت را نگهداری نماید (مرجعی برای سایر اشیا باشد)
۲- پیامی را از خود یا شی دیگری دریافت دارد.
۳- در هنگام پردازش پیامی، پیام دیگری برای خود یا اشیا دیگر بفرستد.
وضعیت یک شی در اسمالتاک برای آن شی خصوصی است. دیگر اشیا میتوانند به آن دسترسی داشته باشند یا آن را تغییر دهند در صورتی که یک درخواست (پیام) برای آن شی ارسال نمایند. زمانی که یک پیام دریافت شد شی تعیین میکند که آیا پیام مناسب است. (آلن کی اظهار نظر نموده است در حالی که شی اهمیت زیادی در اسمالتاک داشته است اما پیامها اهمیت بالاتری دارند.)
اسمالتاک کاملا شیگراست یعنی تمام موجودیتها در این زبان از قبیل انواع داده اولیه و ساختارهای دیگر شی هستند. انواع داده اولیه به کلاس مربوط به خود اشاره کرده و عمل متناسب را با توجه ساختار کلاس خود انجام میدهند و پیام مناسب را ارسال مینمایند. برنامهنویسان قادر هستند تا رفتار و کلاس مربوط به نوع داده اولیه را تغییر دهند تا مطابق میل آنها رفتار نماید این بدان معنی است که در صورتی که برنامهنویس ساختار کنترلی جدید را ایجاد نماید این ساختار کنترلی همانند قبلی رفتار ننموده و رفتار جدید تعریف شده در پیش خواهد گرفت. به صورت حلاصه میتوان گفت: همه چیز در اسمالتاک شی است. (البته به صوزت دقیقتر تمام مقادیر شی هستند و نه متغیرها)
چون تمام مقادیر شی هستند کلاسها نیز خود شی هستند. هر کلاس شی متناسب با متاکلاس مربوطه است. متاکلاسها نیز خود کلاس هستد و نمونهای از کلاس متاکلاس هستند. بلاکها کد نیز شی هستند.
انعکاس
اسمالتاک-۸۰ یک سیستم کاملا انعکاسی است که در خود اسمالتاک-۸۰ پیاده شد. اسمالتاک-۸۰ هم ساختار و هم محاسبات انعکاسی فراهم میسازد. کلاسها و متدها که یک شی را تعریف مینمایند خود شی هستند و کاملا جز خود سیستم هستند. کامپایلر اسمالتاک فایلهای متنی را به به اشیا متد تبدیل میکند که معمولا نمونههایی از کلاس Compilemethod است. اینها از طریق اضافه شدن به دیکشنری کلاس اضافه میشوند. سلسله مراتبی که کلاسها را تعریف مینماید خود میتواند کلاسهای جدید اضافه نماید. سیستم از طریق کد اسمالتاک-۸۰ که کلاسهای جدید تعریف میکند یا تغییر میدهد گسترش مییابد. بدین طریق سیستمهای نوشته شده به اسمالتاک-۸۰ سیستمهای زنده هستند و میتوانند در زمان اجرا خود را تغییر دهند و بهبود یابند.
بدلیل کلاس بودن کلاسها میتوان از آنها سوال نمود که دارای چه متدهایی هستند و چه فیلدهایی تعریف مینمایند. بنابراین اشیا میتوانند از طریق کد جنریک هر شی بررسی شوند، کپی گردند، و بصورت سریال به کار روند.
اسمالتاک-۸۰ یک سیستم محاسباتی انعکاسی فراهم میسازد تا وضعیت محاسباتی سیستم قابل مشاهده باشد. در زبانهای مشتق شده از اسمالتاک-۸۰ اصلی، فعالسازی یک سیستم آن را از طریق کلمه کلیدی thisContext قابل دسترسی است. با فرستادن پیامها به thisContext متد فعالشده میتواند بپرسد چه کسی مرا فعال کرده است. این امکانات برنامهنویس را قادر میسازد روتینهای کمکی و بازگشت همانند پرولوگ پیادهسازی نماید بدون آنکه ماشین مجازی را تغییر دهد. یکی از استفادههای جالب این ویژگی در سیساید است که این قالب کار برای وب توسط ایوی برایانت نوشته شده و طراحان را با از پیچیدگیهای دکمههای بازگشت رها نموده و حرکات او را ذخیره کرده و امکان حرکت بین آنها را برای او فراهم میسازد. پس از ذخیرهسازی این حرکات میتوان ظراحی وب را به آسانی به یکی از ویژگیهای معمول ادامه داد.
اگر پیام ارسال شده به هر شی توسط آن شی پیاده نشده باشد پیام عدم فهم شی (doesNotUnderstand ارسال میگردد و پیام آرگومان آن محسوب میشود. پیام (شی دیگری از نمونههای Message) شامل فرستنده و آرایهای ارگومانهایش است. در یک سیستم محاورهای اسمالتاک پیادهسازی پیشفرض پیام doesNotUnderstand: همان است که پنجره را برای نشان دادن خطا باز خواهد کرد. از این طریق میتوان دلیل و زمینه خطا را شناخت و این اشکال را در داخل سیستم برطرف نمود و با استفاده از سیستم انعکاسی یه کار ادامه داد.
کاربرد مهم دیگر doesNotUnderstand: میانجیگری است. برنامهنویس میتواند کلاسی پیاده نماید که هیچ متدی نداشته باشد و فقط پیام doesNotUnderstand: را پیاده کرده باشد و از هیچ کلاسی به ارث نرفته باشد. اگر این اشیا بدرستی به کار روند میتوانند پیامها را به سیستمهای دیگر هدایت بنمایند و سیستمهای توزیعشده به خوبی عمل نمایند. این چنین سیستمی در CORBA و RMI نیز وجود دارد اما در ابتدا در اسمالتاک-۸۰ پیاده گردید.
دستور
دستورات اسمالتاک-۸۰ درصدد کوچک بودن است و تناها از تعدادی کلمات کلیدی و اعلامات استفاده مینماید. در حقیقت تنها شش کلمه کلیدی وجود دارد: true، false، nil، self، super، و thisContext. (اینها در واقع کلمات کلیدی نیستند تنها شبه کلمات کلیدی است که شیهایی به عنوان تنها نمونه کلاسهای خود هستند. اسمالتاک در حقیقت اصولا کلمه کلیدی را به عنوان یک مفهوم نپذیرفته است.) تنها ساختههای داخلی زبان ارسال پیامها، انتصاب، بازگشت مقدار در متد، و ثابت برای بعضی اشیا. باقیمانده زبان، دستورات کنترلی همانند انتخاب شرطی و دستورات تکرارپذیر توسط استاندارد اسمالتاک در کتایخانه کلاسها پیاده میشود. بدلیل بهینهسازی ممکن است بعضی پیادهسازیها به بعضی از پیامها اهمیت زیادی داده ولی باید دقت کرد که این اهمیت دادن در داخل زبان نوشته نشده و تنها یک بهینهسازی است.
ثابتها
مثال پایین نشاندهنده تمام ثابتهای معمول اشیا را در متدهای اسمالتاک-۸۰ است.
اعداد. لیست پایین بعضی اعداد ممکن را نشان میدهد.
42 -42 123.45 1.2345e2 2r10010010 16rA000
در دو خط اخر اعداد دودویی و شانزدهشانزدهی نشان داده شدهاند. r نشاندهنده استفاده از پایه دیگری است البته این منبع میتواند ۲ نباشد. به عنوان مثال 36rSMALLTALK یک عدد ممکن است (برای کسانی که کنجکاوند این عدد برابر است با 80738163270632 دهدهی).
کاراکترها با علامت $ نوشته میشوند.
$A
رشتهها به صورت توالی کاراکترها در بین نوشته میشوند.
'Hello, world!'
برای شمول یک ' دو علامت را بکار ببرید.
'I said, Hello, world! to them.'
" نیاز به هیچگونه تغییری ندارد چون در رشتهها علامت ' بکار میرود.
'I said, "Hello, world!" to them.'
دو رشته برابر (رشتهها برابرند در صورتی که شامل تمام کاراکترها باشد) میتوانند دو شی در دو محل متفاوت از حافظه باشد. علاوه بر رشتهها اسمالتاک دارای یک کلاس توالی کاراکترهای دیگر بنام symbol است. symbolها تضمین شدهاند که منحصر بفرد باشند و هیچ دو symbol برابر دو شی متفاوت نیستند. به دلیل منحصر بفرد بودن آنها را میتوان براحتی مقایسه نمود و برای انتخاب کننده پیامها و سایر مصنوعات زبان به کار رود.
symbolها توسط علامت # و چند کاراکتر نشان داده میشود.
#foo
آرایهها.
#(1 2 3 4)
یک آرایه از ۴ عدد سحیح را تعریف میکند.
و آخرین نه کمترین بلوکها (ثابت توابع بینام).
[... Some smalltalk code...]
بلوکها در ادامه توضیح داده شدهاند.اشتقاقهای دیگر اسمالتاک دستورات اضافهتر را تعریف میکند اما موارد توضیح داده شده در بالا مهمترین ثابتهاست.
اعلام متغیرها
دو نوع متغیر معمول استفاده شده در اسمالتاک متغیرهای نمونه و متغیرهای موقت هستند. متغیرهای دیگر و اصطلاحات مرتبط بستگی به پیادهسازیهای مختلف دارند. به عنوان مثال ویژوالورکس دارای متغیرهای به اشتراک گذاشته در کلاس و فضای نام است در حالی که اسکویک و پیادهسازیهای دیگر متغیرهای کلاس، حوضچه، و جهانی است.
اعلام متغیر موقت در اسمالتاک برای متغیرهای درون متد بکار میرود. این متغیرها در بالای متد تعریف میشوند و با فضای خالی و | جدا میگردند. به عنوان مثال:
| index |
یک متغیر موقت بنام index تعریف میکند. چندین متغیر را میتوان در یک دستور تعریف نمود.
| index vowels |
دو متغیر index و vowels را تعریف میکند.
انتصاب
یک متغیر از طریق دستور =: به یک مقدار منتصب میگردد.
vowels := 'aeiou'
رشته aeiou را به متغیر از پیش تعیین شده vowels نسبت میدهد. رشته یک شی است (توالی کاراکترها در بین نشاندهنده ثابت رشتهایست) که در زمان کامپایل ایجاد میشود.
پیامها
پیامها ساختارهای اساسی در اسمالتاک هستند. حتی دساورات کنترلی نیز به صورت ارسال پیام پیاده میگردند. مثال پایین پیام factorial را به عدد 42 میفرستد.
42 factorial
در این حالت 42 گیرنده پیام است در حالی که factorial انتخابکننده میباشد. گیرنده پیام با بازگرداندن مقداری (در اینجا احتمالا فاکتوریل عدد ۴۲) پاسخ میدهد. علاوه بر این مقدار بازگردانده شده را میتوان به یک متغی نسبت داد:
aRatherBigNumber := 42 factorial
factorial پیامی است که به آن عموما پیام یگانه گویند چرا که فقط یک شی و آن هم دریافتکننده در آن نقش دارد. پیامها میتوانند چندین شی را به عنوان آرگومان خود حمل کنند:
2 raisedTo: 4
در این عبارت دو شی نقش داشتهاند: 2 به عنوان گیرنده و 4 به عنوان آرگومان. نتیجه پیام یا در اصطلاح اسمالتاک پاسخ پیام 16 است. یک پیام میتواند آرگومانهای بیشتری هم داشته باشد.
'hello world' indexOf: $o startingAt: 6
مثال بالا اندیس o در رشته داده شده با شروع از اندیس ۶ را بازمیگرداند. انتخابکننده این پیام :indexOftartingAt که از دو کلمه کلیدی یا قسمت تشکیل شده است.
چنین کلمات کلیدی درهمتنیده خوانایی کد را بالا برده و آرگومانها بوسیله کلمات کلیدی پیش از خود توصیف میگردند. به عنوان مثال یک عبارت برای ساخت یک مستطیل در ++C یا جاوا به شکل زیر است:
new Rectangle(100, 200);
در این عبارت مشخص نیس ت کدام آرگومان طول است یا عرض و شما برای فهمیدن این نکته باید به راهنمای زبان مراجعه نمایید اما همین عبارت در اسمالتاک بدون هیچگونه ابهام نوشته میشود به شکل زیر:
Rectangle width: 100 height: 200
گیرنده در این حالت Rectangle یک کلاس است و در پاسخ یک نمونه از این کلاس با عرض و طول خواسته شده تولید میگردد.
در نهایت بیشتر کاراکترهای غیرالفبایی به عنوان پیام دودویی بکار میرود. این به برنامهنویس اجازه میدهد تا عملگرهای ریاضی را به شکل سنتی بنویسد:
3 + 4
که پیام + را به گیرنده 3 به همراه آرگومان 4 میفرستد (که پاسخ برابر با ۷) است. به طور مشابه:
3 > 4
پیام < را به 3 به همراه آرگومان 4 را میفرستد (پاسخ false است).
توجه کنید که در اسمالتاک-۸۰ خود این عملگرها پیاده نشدهاند. خروجی تنها بستگی به نحوه پاسخدهی گیرنده (در این جا نمونه Number) در برابر پیام < و + پاسخ میدهد.
اثر جانبی این مکانیزم گرانبارسازی عملگر است. یک پیام < را بقیه اشیا هم میتوانند بفهمند که این امکان را میدهد تا از عبارت a>b برای مقایسه آنها بکار میرود.
عبارات
یک عبارت میتواند چندین ارسال پیام داشته باشد. در این مثال پیامها به ترتیب ساده پردازش میشود. پیامهای یگانه اولویت بیشتری داشته و پس از آن پیامهای دوگانه و پیامهای کلمات کلیدی قرار دارند. به عنوان مثال
3 factorial + 4 factorial between: 10 and: 100
که بصورت زیر ارزیابی میشود:
1. 3 پیام factorial را درپافت میکند که پاسخ 6 است.
2. 4 پیام factorial را درپافت میکند که پاسخ 24 است.
3. 6 پیام + را به همراه 24 به عنوان آرگومان دریافت کرده که پاسخ 30 است.
4. 30 گیرنده پیام :between:and را به همراه 10 و 100 به عنوان آرگومان درسافت کرده که پاسخ true است.
پاسخ آخرین پیام به عنوان نتیجه نهایی عبارت ارسال میگردد.
پارانتزها میتوانند ترتیب ارزیابی را تغییر دهند.
(3 factorial + 4) factorial between: 10 and: 100
که معنای عبارت را تغییر داده و عبارت میان پارانتز در ابتدا ارزیابی گردیده و نتیجه ۱۰ میشود. ۱۰ پیام factorial را دریافت میکند که نتیجه ۳۶۲۸۸۰۰ است. و قسمت آخر در نهایت false تولید میکند.
بدلیل این که پیامهای دوگانه در اسمالتاک-۸۰ درونساخت نیستند اولویت برابر با یکدیگر داشته و بسادگی از چپ به راست ارزیابی میگردند. به همین دلیل عبارات مشابه در اسمالتاک ممکن است معنای متفاوت از آنچه که به صورت سنتی است داشته باشند.
3 + 4 * 5
پس از ارزیابی نتیجه ۳۵ است.
پیامهای یگانه را میتوان با نوشتن پشت سر هم به هم زنجیر نمود. به صورت زیر:
3 factorial factorial log
که فاکتوریل را به ۳ فرستاده و نتیجه را که ۶ است دوباره فاکتوریل ارسال میکند و از نتیجه ۷۲۰ لگاریتم میگیرد که نتیجه ۲.۸۵۷۳۳ است.
چند عبارت را میتوان پشت هم نوشت که هر کدام با یک . پایان مییابد. مثال پایین یک نمونه از window ایجاد کرده و آن را در یک متغیر ذخیره مینماید و به آن دو پیام میفرستد.
| window |
window := Window new.
window label: 'Hello'.
window open.
اگر چندین پیام به یک گیرنده ارسال شود میتوان آنها را بصورت یک زنجیره جدا شده با ; نوشت.
(Window new)
label: 'Hello';
open
با این تغییر نیاز به استفاده از یک متغیر موقت برطرف خواهد شد.
بلوک کد
یک بلوک از کد (تابع بدون نام) را میتوان بصورت یک ثابت بیان داشت (که یک شی است چرا که هر مقدار شی میباشد) که این هدف با استفاده از [] ممکن است.
[ arams | ]
که params: نشاندهنده پارامترهای دریافتی است. این بدان معنی است که کد زیر:
[ | x + 1]
میتواند به صورت زیر باشد:
f(x) = x + 1
(یا با استفاده از حساب دیفرانسیل لامدا):
ëx.(x+1)
و
f(3) = 3 + 1
ارزیابی خواهد شد:
[ | x + 1] value: 3