اسمال‌تاک

از ویکی‌پدیا، دانشنامهٔ آزاد

پرش به: ناوبری, جستجو

زبان اسمالتاک یک زبان شی‌گرا و دارای تايپ پویا و زبان برنامه‌نویسی انعکاسی است.

یک برنامه اسمالتاک توصیف یک روند محاسباتی پویا را نشان مي دهد. زبان برنامه‌نویسی اسمالتاک نشان‌دهنده چنین برنامه‌هایی مي باشد. منبع استاندارد انسی برای اسمالتاک بخش ۳

اسمالتاک برای پشتيباني از دنياي جديد حاصل از فهماندن محاسبات با مثال توسط «همزیستی میان انسان و کامپیوتر» به وجود آمد. اسمالتاک به منظور اموزش توسط زیراکس پارک (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

که بصورت زیر ارزیابی می‌شود:

  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

با این تغییر نیاز به استفاده از یک متغیر موقت برطرف خواهد شد.

[ویرایش] بلوک کد

یک بلوک از کد (تابع بدون نام) را می‌توان بصورت یک ثابت بیان داشت (که یک شی است چرا که هر مقدار شی می‌باشد) که این هدف با استفاده از [] ممکن است.

[ :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" احتياج به باز كردن دارد تا بتواند دستور را نمايش دهد.

[ویرایش] تصوير براساس اصرار

بيشتر سيستم هاي برنامه نويسي كد برنامه را از حالت برنامه جدا مي كنند. زماني كه شروع به اجرا مي كنند آنها را بار مي كنند و همه حالت برنامه قبلي را بايد دوباره بطور صريح از فايل برنامه و يا از منبع ديگر بوجود آورد. تنظيمات برنامه بطور صريح ذخيره نمي شوند و بايد آنها را بعد از هر راه اندازي تهيه كرد. يك فرمان تجارتي همچنين تعداد زيادي از سند هاي اطلاعاتي را هروقت شما ذخيره مي كنيد ، مي بنديد و دوباره راه مي اندازيد معين مي كند. شما جزئيات از قبيل گذشته تاريخي يا مختصات موس را گم مي كنيد. تصوير بر اساس اصرار شما را به تمامي ضايعاتي كه شما بدليل آن كامپيوتر را خاموش مي كند و يا راه اندازي مي كند اجبار نمي كند در زبان اسمالتك اگرچه فرقي بين داده هاي اجرايي و كد ها ندارند بيشتر سيستم هاي اسمالتك در پايان كار از برنامه يك تصوير مي گيرند. اين تصاوير مي توانند توسط ماشين ديداري به برنامه اضافه شود و سيستم اسمالتك را به حالت قبلي تبديل نمايند. اين كار توسط آلن كي بوجود آمد.

[ویرایش] سطح دسترسي

هرچيزي در اسمالتك 80 قابليت تغيير را در زمان اجرا دارد. براي مثال : دستگاههاي كنترل درايو الكترونيكي يكپارچه مي توانند بدون راه اندازي مجدد در زماني كه سيستم در حال اجرا است تغيير كنند. دستورات نحوي زبان يا اجراي داده هاي نا خواسته مي توانند همچنين در جنبش تغيير يابند. براي مثال دستور true become: falseبا ارزش هست ولي اجراي آن توصيه نمي شود.

[ویرایش] كامپايل كردن اسمالتك

اسمالتك بصورت بايت كد برنامه را كامپايل مي كند كه توسط ماشين ديداري يا بطور دايناميكي به زبان ماشين ترجمه مي شود.

[ویرایش] منبع

دانشنامه آزاد انگلیسی [۱]