اسمالتاک
- یک برنامه اسمالتاک توصیف یک روند محاسباتی پویا را نشان می دهد. زبان برنامهنویسی اسمالتاک نشاندهنده چنین برنامههایی می باشد. منبع استاندارد انسی برای اسمالتاک بخش ۳
اسمالتاک برای پشتیبانی از دنیای جدید حاصل از فهماندن محاسبات با مثال توسط «همزیستی میان انسان و کامپیوتر» به وجود آمد. اسمالتاک به منظور اموزش توسط زیراکس پارک (Xerox PARC) و آلن کی، دان اینگالس، آدل گلدبرگ، تد کاهلر، اسکات والاس، و دیگران در طول دهه ۱۹۷۰ تحت تأثیر لیسپ و لوگو و اسکچپد(sketchpad)، سیمولا ساخته شد. این زبان اولین بار تحت عنوان اسمالتاک-۸۰ عرضه شد و پس از آن بصورت گسترده به کار برده شد. زبانهایی مشابه اسمالتاک همچنان در حال توسعه هستند و کاربران وفادار بخود را دارند. نسخه انسی اسمالتاک در سال ۱۹۹۸ معرفی شد و این نسخهٔ استاندارد از اسمالتک را نشان می دهد.
تاریخچه
انواع مختلف موجود از زبان اسمالتاک همانند سایر زبانها موجود است. لغت اسمالتاک اشاره به نسخه اسمالتاک-۸۰ دارد. اولین نسخه ای از این زبان که بطور عمومی قابل استفاده بود در سال 1980 ساخته شد اسمالتاک محصول تحقیقات گروه پژوهشی زیر نظر الن کی د ر شرکت زیراکس پارک بوده است. آلن کی بیشتر نسخههای اولیه این زبان را طراحی نموده است که توسط دان اینگالس پیاده شدهاند. اولین نسخه این زبان یعنی اسمالتاک-۷۱ در اثر یک شرطبندی در مورد امکان بوجود آوردن یک زبان با کد یک صفحهای براساس ارسال پیام همانند سیمولا در عرض چند صبح بوجود آمد. نسخه بعدی که بیشتر در کارهای تحقیقاتی به کار رفت و تاثیری روی ایجاد مدل بازیگر داشت اسمالتاک-۷۲ بود. این نسخه دارای دستورات و مدل اجرایی متفاوتی از بیشتر انواع این زبان در حال حاضر بود. با وجود مسدود نمودن بخشی از مدل اجرایی و بوجود آوردن سلسله مراتب کلاسها همانند سیمولا نسخه اسمالتاک-۷۶ بوجود آمد. محیط توسعه نرمافزار برای این زبان بیشتر ویژگیهای معمول کنونی در مورد ویرایش کد کتابخانه کلاسها را شامل میگشت. اسمالتاک ویژگی متاکلاس را افزود تا بینش همه چیز جز متغیرها کلاس هستند را پیادهسازی نماید و حتی این مورد را برای مفاهیم پایه مانند اعداد صحیح و منطقی به کار برد و ویژگیها و رفتارها را با این کلاسهای مجزا مرتبط نمود. اسمالتاک-۸۰ اولین نسخه استفاده شده خارج از شرکت بود و نسخه اول آن را به تعدادی شرکت (هیولت پاکارد، کامپیوتر اپل، تکترونیکس، DEC) و دانشگاه برکلی داشت تا مرور لازم بر آن انجام شود و محیطهای مناسب برای آن توسعه یابد. نسخه عمومی تر که اسمالتاک-۸۰ نسخه دوم نام داشت به صورت فایل تصویری و مستقل از محیط با تعریف اشیا که ماشین مجازی مناسب خود داشت عرضه گشت. نسخه استاندارد انسی در سال ۱۹۹۸ عرضه شد که تا کنون نسخه رسمی مورد استفاده بوده است. دو نشخه مشتق شده از اسمالتاک هماکنون مورد استفاده است یکی از آنها اسکویک (Squeak) که از اسمالتاک-۸۰ نسخه اول بوجود آمده است و به شیوه اپل تولید شده و یک نرمافزار متن باز است. و دیگری ویژوالورکس(VisualWorks) از اسمالتاک-۸۰ نسخه دوم و اسمالتاک-۸۰ ۲.۵ و ابجکتورکس (ObjectWorks)ساخته شده توسط شرکت سیستمهای پارکپلیس (شرکت تابع از زیراکس پارک برای عمومی سازی زبان اسمالتاک) اشتقاق یافت. به عنوان پیوند جالب بین نسلها در سال 2002 واسیلی بایکف هابز را ساخت تا زبان اسمالتاک-۸۰ در ویژوالورکس عمل نماید. در اواسط دهه ۱۹۹۰ محصولات مربوط به اسمالتاک توسط دو شرکت رقیب پارکپلیس و دیجیتاک عرضه میگشت. پارکپلیس (ParkPlace) با توجه به بازار سان میکروسیستم یونیکس (Unix Sun Microsystem)توجه داشت در حالی که دیجیتاک(Digitalk) به شرکت اینتل و سیستمعاملهای OS/2 و ویندوز توجه کردند. هر دو شرکت بدلیل قابلیت خوانایی کد منبع در سیستمهای توزیع شده و محدودیتهای موجود در بهبود عملکرد و عدم وجود ارتباط با یک پایگاه داده منطبق بر SQL دست به گریبان بودهاند. در سال ۱۹۹۵ این دو شرکت با توجه به کاهش موفقیت تجاری این زبان دو شرکت با یکدیگر درشرکت آبجکتشیر (ObjectShare) ادغام گشتند. اما در ادامه در سال ۱۹۹۹ منحل شدند. نسخه قویتر (ویژوالورکس باقی مانده و هماکنون جزئی از سینکام اسمالتاک (Cincom Smalltalk) است). شرکت نرمافزاری سیگال آزمایشگاه ایجاد کننده smalltalk/V را خرید و هماکنون نیز مالکیت آن را در اختیار دارد.
تاثیرات بر روی زبانهای دیگر برنامه نویسی
زبان اسمالتک در 4 محیط اصلی بر سایر زبانهای برنامه نویسی تاثیر گذاشت. 1. اسمالتک دستورات نحوی و معنایی جدیدی را ابداع کرد. 2. اسمالتک اولین نسخه ای میباشد که محاسبات را فرستادن پیغام انجام می دهد. 3. اسمالتک اولین برنامهٔ گرافیگی با محیط ویندوز در کامپیوترهای شخصی را در اواخر قرن 20 و اوایل قرن 21 ابداع کرد. 4. در پایان محیط توسعه جامع برای ایجاد دسترسی به ابزار دیداری برنامه نویسی شبیه اشکال زدایی کد اسمالتک بوجود آمد. اسمالتک زمینه هایی برای گسترش و تجارتی زبان برنامه نویسی جاوا فراهم کرد. همچنین زبان امری شبیه اسمالتک توسط دیوید سیمنس بوجود آمد که طراحیها را با نوشتن سند انجام می دهد. این زبان که 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 یک عدد ممکن است (برای کسانی که کنجکاوند این عدد برابر است با 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 در رشته داده شده با شروع از اندیس ۶ را بازمیگرداند. انتخابکننده این پیام :indexOf:startingAt که از دو کلمه کلیدی یا قسمت تشکیل شده است.
چنین کلمات کلیدی درهمتنیده خوانایی کد را بالا برده و آرگومانها بهوسیله کلمات کلیدی پیش از خود توصیف میگردند. به عنوان مثال یک عبارت برای ساخت یک مستطیل در ++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
که بصورت زیر ارزیابی میشود:
- 3 پیام factorial را درپافت میکند که پاسخ 6 است.
- 4 پیام factorial را درپافت میکند که پاسخ 24 است.
- 6 پیام + را به همراه 24 به عنوان آرگومان دریافت کرده که پاسخ 30 است.
- 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
با این تغییر نیاز به استفاده از یک متغیر موقت برطرف خواهد شد.
بلوک کد
یک بلوک از کد (تابع بدون نام) را میتوان بصورت یک ثابت بیان داشت (که یک شی است چرا که هر مقدار شی میباشد) که این هدف با استفاده از [] ممکن است.
[ :params |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" احتیاج به باز کردن دارد تا بتواند دستور را نمایش دهد.
تصویر براساس اصرار
بیشتر سیستمهای برنامه نویسی کد برنامه را از حالت برنامه جدا می کنند. زمانی که شروع به اجرا می کنند آنها را بار می کنند و همه حالت برنامه قبلی را باید دوباره بطور صریح از فایل برنامه و یا از منبع دیگر بوجود آورد. تنظیمات برنامه بطور صریح ذخیره نمی شوند و باید آنها را بعد از هر راه اندازی تهیه کرد. یک فرمان تجارتی همچنین تعداد زیادی از سندهای اطلاعاتی را هروقت شما ذخیره می کنید ، می بندید و دوباره راه می اندازید معین می کند. شما جزئیات از قبیل گذشته تاریخی یا مختصات موس را گم می کنید. تصویر بر اساس اصرار شما را به تمامی ضایعاتی که شما بدلیل آن کامپیوتر را خاموش میکند و یا راه اندازی میکند اجبار نمی کند در زبان اسمالتک اگرچه فرقی بین دادههای اجرایی و کدها ندارند بیشتر سیستمهای اسمالتک در پایان کار از برنامه یک تصویر می گیرند. این تصاویر می توانند توسط ماشین دیداری به برنامه اضافه شود و سیستم اسمالتک را به حالت قبلی تبدیل نمایند. این کار توسط آلن کی بوجود آمد.
سطح دسترسی
هرچیزی در اسمالتک 80 قابلیت تغییر را در زمان اجرا دارد. برای مثال : دستگاههای کنترل درایو الکترونیکی یکپارچه می توانند بدون راه اندازی مجدد در زمانی که سیستم در حال اجرا است تغییر کنند. دستورات نحوی زبان یا اجرای دادههای نا خواسته می توانند همچنین در جنبش تغییر یابند. برای مثال دستور true become: falseبا ارزش هست ولی اجرای آن توصیه نمی شود.
کامپایل کردن اسمالتک
اسمالتک بصورت بایت کد برنامه را کامپایل میکند که توسط ماشین دیداری یا بطور داینامیکی به زبان ماشین ترجمه می شود.
مهندسی نرم افزار کامپیوتر