اسمالتاک
زبان اسمالتاک یک زبان شیگرا و دارای تایپ پویا و زبان برنامهنویسی انعکاسی است.
- یک برنامه اسمالتاک توصیف یک روند محاسباتی پویا را نشان میدهد. زبان برنامهنویسی اسمالتاک نشاندهنده چنین برنامههایی میباشد. منبع استاندارد انسی برای اسمالتاک بخش ۳
الگو برنامهنویسی | برنامهنویسی شیءگرا |
---|---|
طراحی شده توسط | الن کی، Dan Ingalls, Adele Goldberg |
توسعهدهنده | الن کی، Dan Ingalls, Adele Goldberg, Ted Kaehler, Diana Merry, Scott Wallace, Peter Deutsch و زیراکس پارک |
ظهوریافته در | ۱۹۷۲ | (development began in 1969)
انتشار پایدار | Smalltalk-80 version 2
۱۹۸۰ |
وابستگی زیاد و کم به نوع، dynamic | |
سیستمعامل | چندسکویی |
پیادهسازیهای بزرگ | |
Amber, Dolphin Smalltalk, GemStone/S, GNU Smalltalk، فارو (زبان برنامهنویسی), Smalltalk/X, Squeak, VA Smalltalk, VisualWorks | |
متأثر از | |
لیسپ، سیمولا، Euler، آیامپی (زبان برنامهنویسی)، پلانر، لوگو (زبان برنامهنویسی)، Sketchpad، آرپانت، Burroughs B5000، یاخته | |
تأثیر گذاشته بر | |
اپل اسکریپت، Common Lisp Object System، دارت (زبان برنامهنویسی)، Dylan، ارلنگ، Etoys، فالکن، گو (زبان برنامهنویسی)، گرووی (زبان برنامهنویسی)، آیاو (زبان برنامهنویسی)، Ioke، جاوا (زبان برنامهنویسی)، Lasso, Lisaac, Logtalk, NewtonScript, Object REXX، آبجکتیو-سی، پیاچپی، Perl 6 ، پایتون (زبان برنامهنویسی)، روبی (زبان برنامهنویسی)، اسکالا، اسکرچ، سلف (زبان برنامهنویسی) | |
اسمالتاک برای پشتیبانی از دنیای جدید حاصل از فهماندن محاسبات با مثال توسط «همزیستی میان انسان و کامپیوتر» به وجود آمد. اسمالتاک به منظور آموزش توسط زیراکس پارک (Xerox PARC) و آلن کی، دان اینگالس، آدل گلدبرگ، تد کاهلر، اسکات والاس، و دیگران در طول دهه ۱۹۷۰ تحت تأثیر لیسپ و لوگو و اسکچپد(sketchpad)، سیمولا ساخته شد. این زبان اولین بار تحت عنوان اسمالتاک-۸۰ عرضه شد و پس از آن به صورت گسترده به کار برده شد. زبانهایی مشابه اسمالتاک همچنان در حال توسعه هستند و کاربران وفادار بخود را دارند. نسخه انسی اسمالتاک در سال ۱۹۹۸ معرفی شد و این نسخهٔ استاندارد از اسمالتک را نشان میدهد.
تاریخچه
انواع مختلف موجود از زبان اسمالتاک همانند سایر زبانها موجود است. لغت اسمالتاک اشاره به نسخه اسمالتاک-۸۰ دارد. اولین نسخهای از این زبان که بهطور عمومی قابل استفاده بود در سال ۱۹۸۰ ساخته شد اسمالتاک محصول تحقیقات گروه پژوهشی زیر نظر الن کی د ر شرکت زیراکس پارک بودهاست. آلن کی بیشتر نسخههای اولیه این زبان را طراحی نمودهاست که توسط دان اینگالس پیاده شدهاند. اولین نسخه این زبان یعنی اسمالتاک-۷۱ در اثر یک شرطبندی در مورد امکان به وجود آوردن یک زبان با کد یک صفحهای براساس ارسال پیام همانند سیمولا در عرض چند صبح به وجود آمد. نسخه بعدی که بیشتر در کارهای تحقیقاتی به کار رفت و تأثیری روی ایجاد مدل بازیگر داشت اسمالتاک-۷۲ بود. این نسخه دارای دستورها و مدل اجرایی متفاوتی از بیشتر انواع این زبان در حال حاضر بود. با وجود مسدود نمودن بخشی از مدل اجرایی و به وجود آوردن سلسله مراتب کلاسها همانند سیمولا نسخه اسمالتاک-۷۶ به وجود آمد. محیط توسعه نرمافزار برای این زبان بیشتر ویژگیهای معمول کنونی در مورد ویرایش کد کتابخانه کلاسها را شامل میگشت. اسمالتاک ویژگی متاکلاس را افزود تا بینش همه چیز جز متغیرها کلاس هستند را پیادهسازی نماید و حتی این مورد را برای مفاهیم پایه مانند اعداد صحیح و منطقی به کار برد و ویژگیها و رفتارها را با این کلاسهای مجزا مرتبط نمود. اسمالتاک-۸۰ اولین نسخه استفاده شده خارج از شرکت بود و نسخه اول آن را به تعدادی شرکت (هیولت پاکارد، کامپیوتر اپل، تکترونیکس، DEC) و دانشگاه برکلی داشت تا مرور لازم بر آن انجام شود و محیطهای مناسب برای آن توسعه یابد. نسخه عمومی تر که اسمالتاک-۸۰ نسخه دوم نام داشت به صورت فایل تصویری و مستقل از محیط با تعریف اشیا که ماشین مجازی مناسب خود داشت عرضه گشت. نسخه استاندارد انسی در سال ۱۹۹۸ عرضه شد که تاکنون نسخه رسمی مورد استفاده بودهاست. دو نسخه مشتق شده از اسمالتاک هماکنون مورد استفاده است یکی از آنها اسکویک (Squeak) که از اسمالتاک-۸۰ نسخه اول به وجود آمدهاست و به شیوه اپل تولید شده و یک نرمافزار متن باز است؛ و دیگری ویژوالورکس(VisualWorks) از اسمالتاک-۸۰ نسخه دوم و اسمالتاک-۸۰ ۲٫۵ و ابجکتورکس (ObjectWorks)ساخته شده توسط شرکت سیستمهای پارکپلیس (شرکت تابع از زیراکس پارک برای عمومیسازی زبان اسمالتاک) اشتقاق یافت. به عنوان پیوند جالب بین نسلها در سال ۲۰۰۲ واسیلی بایکف هابز را ساخت تا زبان اسمالتاک-۸۰ در ویژوالورکس عمل نماید. در اواسط دهه ۱۹۹۰ محصولات مربوط به اسمالتاک توسط دو شرکت رقیب پارکپلیس و دیجیتاک عرضه میگشت. پارکپلیس (ParkPlace) با توجه به بازار سان میکروسیستم یونیکس (Unix Sun Microsystem)توجه داشت در حالی که دیجیتاک(Digitalk) به شرکت اینتل و سیستمعاملهای OS/2 و ویندوز توجه کردند. هر دو شرکت به دلیل قابلیت خوانایی کد منبع در سیستمهای توزیع شده و محدودیتهای موجود در بهبود عملکرد و عدم وجود ارتباط با یک پایگاه داده منطبق بر SQL دست به گریبان بودهاند. در سال ۱۹۹۵ این دو شرکت با توجه به کاهش موفقیت تجاری این زبان دو شرکت با یکدیگر درشرکت آبجکتشیر (ObjectShare) ادغام گشتند. اما در ادامه در سال ۱۹۹۹ منحل شدند. نسخه قویتر (ویژوالورکس باقیمانده و هماکنون جزئی از سینکام اسمالتاک (Cincom Smalltalk) است). شرکت نرمافزاری سیگال آزمایشگاه ایجادکننده smalltalk/V را خرید و هماکنون نیز مالکیت آن را در اختیار دارد.
تأثیرات بر روی زبانهای دیگر برنامهنویسی
زبان اسمالتک در ۴ محیط اصلی بر سایر زبانهای برنامهنویسی تأثیر گذاشت.
- اسمالتک دستورها نحوی و معنایی جدیدی را ابداع کرد.
- اسمالتک اولین نسخهای است که محاسبات را فرستادن پیغام انجام میدهد.
۳. اسمالتک اولین برنامهٔ گرافیگی با محیط ویندوز در کامپیوترهای شخصی را در اواخر قرن ۲۰ و اوایل قرن ۲۱ ابداع کرد. ۴. در پایان محیط توسعه جامع برای ایجاد دسترسی به ابزار دیداری برنامهنویسی شبیه اشکال زدایی کد اسمالتک به وجود آمد. اسمالتک زمینههایی برای گسترش و تجارتی زبان برنامهنویسی جاوا فراهم کرد. همچنین زبان امری شبیه اسمالتک توسط دیوید سیمنس به وجود آمد که طراحیها را با نوشتن سند انجام میدهد. این زبان که S# نام دارد از نوع تکنولوژی است که در هر پیوسته کامپایل میشود.
برنامهنویسی شیگرا
همانند سایر زبانهای برنامهنویسی شیگرا زبان اسمالتاک-۸۰ (نه اسمالتاک-۷۲) دارای مفهوم مرکزی شی است. شی یک نمونه از یک کلاس است. کلاسها تعیینکننده نحوه رفتار در نمونههای خود هستند. برای مثال کلاس پنجره باید تعیین نماید که ایا دارای برچسب است یا نه و اعمال مورد نیاز برای پنجرهها همانند بازکردن، بستن، و حرکت دادن را برای آن تعریف نماید. هر نمونه از کلاس پنجره مقادیر مخصوص به خود را داراست و در صورت نیاز میتواند اعمال تعریف شده در کلاس مربوطه را انجام دهد. یک شی در اسمالتاک میتواند دقیقاً سه عمل انجام دهد:
- ۱- وضعیت را نگهداری نماید (مرجعی برای سایر اشیا باشد)
- ۲- پیامی را از خود یا شی دیگری دریافت دارد.
- ۳- در هنگام پردازش پیامی، پیام دیگری برای خود یا اشیا دیگر بفرستد.
وضعیت یک شی در اسمالتاک برای آن شی خصوصی است. دیگر اشیا میتوانند به آن دسترسی داشته باشند یا آن را تغییر دهند در صورتی که یک درخواست (پیام) برای آن شی ارسال نمایند. زمانی که یک پیام دریافت شد شی تعیین میکند که آیا پیام مناسب است یا نه. (نظر آلن کی در این باره این است: در حالی که شی اهمیت زیادی در اسمالتاک داشتهاست اما پیامها اهمیت بالاتری دارند) اسمالتاک کاملاً شیگراست یعنی تمام موجودیتها در این زبان از قبیل انواع داده اولیه و ساختارهای دیگر شی هستند. انواع داده اولیه به کلاس مربوط به خود اشاره کرده و عمل متناسب را با توجه به ساختار کلاس خود انجام میدهند و پیام مناسب را ارسال مینمایند. برنامهنویسان قادر هستند تا رفتار و کلاس مربوط به نوع داده اولیه را تغییر دهند تا مطابق میل آنها رفتار نماید این بدان معنی است که در صورتی که برنامهنویس ساختار کنترلی جدید را ایجاد نماید این ساختار کنترلی همانند قبلی رفتار ننموده و رفتار جدید تعریف شده در پیش خواهد گرفت. به صورت حلاصه میتوان گفت: همه چیز در اسمالتاک شی است. (البته به صوزت دقیقتر تمام مقادیر شی هستند و نه متغیرها)
چون تمام مقادیر شی هستند کلاسها نیز خود شی هستند. هر کلاس شی متناسب با متاکلاس مربوطه است. متاکلاسها نیز خود کلاس هستد و نمونهای از کلاس متاکلاس هستند. بلاکها کد نیز شی هستند.
انعکاس
اسمالتاک-۸۰ یک سیستم کاملاً انعکاسی است که در خود اسمالتاک-۸۰ پیاده شد. اسمالتاک-۸۰ هم ساختار و هم محاسبات انعکاسی فراهم میسازد. کلاسها و متدها که یک شی را تعریف مینمایند خود شی هستند و کاملاً جز خود سیستم هستند. کامپایلر اسمالتاک فایلهای متنی را به به اشیا متد تبدیل میکند که معمولاً نمونههایی از کلاس 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 یک عدد ممکن است (برای کسانی که کنجکاوند این عدد برابر است با ۸۰۷۳۸۱۶۳۲۷۰۶۳۲ دهدهی).
کاراکترها با علامت $ نوشته میشوند.
$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 factorial
در این حالت ۴۲ گیرنده پیام است در حالی که factorial انتخابکننده است. گیرنده پیام با بازگرداندن مقداری (در اینجا احتمالاً فاکتوریل عدد ۴۲) پاسخ میدهد. علاوه بر این مقدار بازگردانده شده را میتوان به یک متغی نسبت داد:
aRatherBigNumber := 42 factorial
factorial پیامی است که به آن عموماً پیام یگانه گویند چرا که فقط یک شی و آن هم دریافتکننده در آن نقش دارد. پیامها میتوانند چندین شی را به عنوان آرگومان خود حمل کنند:
2 raisedTo: 4
در این عبارت دو شی نقش داشتهاند: ۲ به عنوان گیرنده و ۴ به عنوان آرگومان. نتیجه پیام یا در اصطلاح اسمالتاک پاسخ پیام ۱۶ است. یک پیام میتواند آرگومانهای بیشتری هم داشته باشد.
'hello world' indexOf: $o startingAt: 6
مثال بالا اندیس o در رشته داده شده با شروع از اندیس ۶ را بازمیگرداند. انتخابکننده این پیام :indexOf:startingAt که از دو کلمه کلیدی یا قسمت تشکیل شدهاست.
چنین کلمات کلیدی درهمتنیده خوانایی کد را بالا برده و آرگومانها بهوسیله کلمات کلیدی پیش از خود توصیف میگردند. به عنوان مثال یک عبارت برای ساخت یک مستطیل در ++C یا جاوا به شکل زیر است:
new Rectangle(100, 200);
در این عبارت مشخص نیس ت کدام آرگومان طول است یا عرض و شما برای فهمیدن این نکته باید به راهنمای زبان مراجعه نمایید اما همین عبارت در اسمالتاک بدون هیچگونه ابهام نوشته میشود به شکل زیر:
Rectangle width: 100 height: 200
گیرنده در این حالت Rectangle یک کلاس است و در پاسخ یک نمونه از این کلاس با عرض و طول خواسته شده تولید میگردد.
در نهایت بیشتر کاراکترهای غیرالفبایی به عنوان پیام دودویی بکار میرود. این به برنامهنویس اجازه میدهد تا عملگرهای ریاضی را به شکل سنتی بنویسد:
3 + 4
که پیام + را به گیرنده ۳ به همراه آرگومان ۴ میفرستد (که پاسخ برابر با ۷) است. بهطور مشابه:
3> 4
پیام <را به ۳ به همراه آرگومان ۴ را میفرستد (پاسخ false است).
توجه کنید که در اسمالتاک-۸۰ خود این عملگرها پیاده نشدهاند. خروجی تنها بستگی به نحوه پاسخدهی گیرنده (در اینجا نمونه Number) در برابر پیام <و + پاسخ میدهد.
اثر جانبی این مکانیزم گرانبارسازی عملگر است. یک پیام <را بقیه اشیا هم میتوانند بفهمند که این امکان را میدهد تا از عبارت a>b برای مقایسه آنها بکار میرود.
عبارات
یک عبارت میتواند چندین ارسال پیام داشته باشد. در این مثال پیامها به ترتیب ساده پردازش میشود. پیامهای یگانه اولویت بیشتری داشته و پس از آن پیامهای دوگانه و پیامهای کلمات کلیدی قرار دارند. به عنوان مثال
3 factorial + 4 factorial between: 10 and: 100
که به صورت زیر ارزیابی میشود:
- ۳ پیام factorial را درپافت میکند که پاسخ ۶ است.
- ۴ پیام factorial را درپافت میکند که پاسخ ۲۴ است.
- ۶ پیام + را به همراه ۲۴ به عنوان آرگومان دریافت کرده که پاسخ ۳۰ است.
- ۳۰ گیرنده پیام :between:and را به همراه ۱۰ و ۱۰۰ به عنوان آرگومان درسافت کرده که پاسخ 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
با این تغییر نیاز به استفاده از یک متغیر موقت برطرف خواهد شد.
بلوک کد
یک بلوک از کد (تابع بدون نام) را میتوان به صورت یک ثابت بیان داشت (که یک شی است چرا که هر مقدار شی است) که این هدف با استفاده از [] ممکن است.
[:params | <message-expressions>]
که params: نشاندهنده پارامترهای دریافتی است. این بدان معنی است که کد زیر:
[:x | x + 1]
میتواند به صورت زیر باشد:
f(x) = x + 1
(یا با استفاده از حساب لامدا):
λx.(x+1)
و
f(3) = 3 + 1
ارزیابی خواهد شد:
[:x | x + 1] value: 3
ساختار کنترل
ساختار کنترل، دارای دستور خاصی در اسمالتک ناست. در عوض اسمالتک آن را با فرستادن پیغام به شی انجام میدهد. برای مثال شرط اجرا در صورتی که درست بود با فرستادن پیغام به شی بولی آن را انجام میدهد. سپس آن را به عنوان یک آرگومان بلاکی از کد شروع به اجرا کردن میکند اگر و تنها اگر دریافت شی بولی درست باشد. این قطعه از کد توضیح بالا را نمایش میدهد:
result := a> b
ifTrue:['greater']
ifFalse:['less']
بلاکها نیز برای اجرای ساختار کنترلی تعریف شده توسط کاربر، مشاهدهها و .. کاربرد دارند برای مثال:
| aString vowels |
aString := 'This is a string'.
vowels := aString select: [:aCharacter | aCharacter isVowel].
در خط آخر پیغامی که فرستاده میشود توسط select: با یک آرگومانی که به صورت بلاک کد ثابت است معین میشود. بلاک کد ثابت به عنوان خبر دادن به یک تابعی که باید جواب صحیح بودن را بدهد اگر و تنها اگر یک المان از رشته در مجموعهای از رشتهها که توسط کد ثابت فرستاده شده موجود باشد.
کلاسها
این یک مثالی از کلاس است:
Object subclass: #MessagePublisher
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Smalltalk Examples'
اغلب بیشتر این تعریفها توسط محیط برنامه کامل خواهند شد. توجه کنید که این در حقیقت یک پیغام به کلاس "شی" برای ساختن یک زیر کلاس است که "MessagePublisher" مینامند. بعبارت دیگر در اسمالتک کلاسها اول به صورت کلاس شی هستند که میتوانند پیغامهایی را فقط توسط شیهای دیگر دریافت نماید و به صورت داینامیک در زمان اجرا آن را به وجود میآورد.
توابع
زمانی که یک شی یک پیغامی را دریافت میکند تابع پیغام دریافتی را با اسم تابع تطبیق میدهد. مثال زیر یک تابع "Publish" را تعریف میکند و پس از آن آنچه را که اتفاق خواهد افتاد را در خود تعریف میکند. این زمانی اجرا میشود که یک پیغامی حاوی "Publish"را دریافت نماید.
publish
Transcript show: 'Hello, World!'
در زیر تابعی تعریف میشود که چند آرگومان را میگیرد و مقداری را برمیگرداند.
quadMultiply: i1 and: i2
"This method multiplies the given numbers by each other and the result by 4."
| mul |
mul := i1 * i2.
^mul * 4
توجه کنید که شی برای تعیین اینکه در زمان اجرا بهطور داینامیکی شروع به پاسخ دهی به پیغام نماید یا بهطور استاتیکی در زمان کامپایل این کار را انجام دهد مسئول میباشد.
ساختن نمونهای از کلاسها
به قطعه کد زیر توجه کنید که یک شی از کلاس میسازد:
MessagePublisher new
دستور بعدی یک شی از کلاس میسازد و مقداری را برمیگرداند و آن را مقدار دهی مینماید.
publisher := MessagePublisher new
در زبان اسمالتک ممکن است که به یک کلاس موقتی و بینام پیغامی بزنیم مانند کد خط بعد.
MessagePublisher new publish
توجه کنیدکه برنامهنویس با توجه به شرایط از یکی از حالات بالا برای ساختن نمونه از شی استفاده میکند.
مثال معروف "!Hello World
Transcript show: 'Hello, world!'.
دستور "show" به شی "Transcript" پیغامی با یک آرگومان ثابت "!Hello World" میفرستد. دستور "show" باعث نمایش "!Hello World" در قسمت "Transcript" ویندوز میشود. توجه کنیدکه "Transcript" احتیاج به باز کردن دارد تا بتواند دستور را نمایش دهد.
تصویر براساس اصرار
بیشتر سیستمهای برنامهنویسی کد برنامه را از حالت برنامه جدا میکنند. زمانی که شروع به اجرا میکنند آنها را بار میکنند و همه حالت برنامه قبلی را باید دوباره بهطور صریح از فایل برنامه یا از منبع دیگر به وجود آورد. تنظیمات برنامه بهطور صریح ذخیره نمیشوند و باید آنها را بعد از هر راه اندازی تهیه کرد. یک فرمان تجارتی همچنین تعداد زیادی از سندهای اطلاعاتی را هروقت شما ذخیره میکنید، میبندید و دوباره راه میاندازید معین میکند. شما جزئیات از قبیل گذشته تاریخی یا مختصات موس را گم میکنید. تصویر بر اساس اصرار شما را به تمامی ضایعاتی که شما به دلیل آن کامپیوتر را خاموش میکند یا راه اندازی میکند اجبار نمیکند در زبان اسمالتک اگرچه فرقی بین دادههای اجرایی و کدها ندارند بیشتر سیستمهای اسمالتک در پایان کار از برنامه یک تصویر میگیرند. این تصاویر میتوانند توسط ماشین دیداری به برنامه اضافه شود و سیستم اسمالتک را به حالت قبلی تبدیل نمایند. این کار توسط آلن کی به وجود آمد.
سطح دسترسی
هرچیزی در اسمالتک ۸۰ قابلیت تغییر را در زمان اجرا دارد. برای مثال: دستگاههای کنترل درایو الکترونیکی یکپارچه میتوانند بدون راه اندازی مجدد در زمانی که سیستم در حال اجرا است تغییر کنند. دستورها نحوی زبان یا اجرای دادههای ناخواسته میتوانند همچنین در جنبش تغییر یابند.
برای مثال دستور true become: false
با ارزش هست ولی اجرای آن توصیه نمیشود.
کامپایل کردن اسمالتک
اسمالتک به صورت بایت کد برنامه را کامپایل میکند که توسط ماشین دیداری یا بهطور داینامیکی به زبان ماشین ترجمه میشود.