اسمال‌تاک

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

: یک برنامه اسمالتاک توصیف یک روند محاسباتی پویا را نشان می‌دهد. زبان برنامه‌نویسی اسمال تاک نشان‌دهنده چنین برنامه‌هایی می‌باشد. منبع استاندارد انسی برای اسمالتاک بخش ۳
اسمال تاک برای پشتیبانی از دنیای جدید حاصل از فهماندن محاسبات با مثال توسط «هم‌زیستی میان انسان و کامپیوتر» به وجود آمد. اسمالتاک به منظور آموزش توسط زیراکس پارک (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. (این‌ها در واقع کلمات کلیدی نیستند تنها شبه کلمات کلیدی است که شی‌هایی به عنوان تنها نمونه کلاس‌های خود هستند. اسمالتاک در حقیقت اصولاً کلمه کلیدی را به عنوان یک مفهوم نپذیرفته‌است) تنها ساخته‌های داخلی زبان ارسال پیام‌ها، انتصاب، بازگشت مقدار در متد، و ثابت برای بعضی اشیا. باقی‌مانده زبان، دستورها کنترلی همانند انتخاب شرطی و دستورها تکرارپذیر توسط استاندارد اسمالتاک در کتایخانه کلاس‌ها پیاده می‌شود. به دلیل بهینه‌سازی ممکن است بعضی پیاده‌سازی‌ها به بعضی از پیام‌ها اهمیت زیادی داده ولی باید دقت کرد که این اهمیت دادن در داخل زبان نوشته نشده و تنها یک بهینه‌سازی است.

### ثابت‌ها
مثال پایین نشان‌دهنده تمام ثابت‌های معمول اشیا را در متدهای اسمالتاک-۸۰ است.

اعداد. فهرست پایین بعضی اعداد ممکن را نشان می‌دهد.


```smalltalk
42
-42
123.45
1.2345e2
2r10010010
16rA000
```


در دو خط آخر اعداد دودویی و شانزده‌شانزدهی نشان داده شده‌اند. r نشان‌دهنده استفاده از پایه دیگری است البته این منبع می‌تواند ۲ نباشد. به عنوان مثال 36rSMALLTALK یک عدد ممکن است (برای کسانی که کنجکاوند این عدد برابر است با ۸۰۷۳۸۱۶۳۲۷۰۶۳۲ دهدهی).

کاراکترها با علامت $ نوشته می‌شوند.


```smalltalk
$A
```


رشته‌ها به صورت توالی کاراکترها در بین * نوشته می‌شوند.

<syntaxhighlight lang="smalltalk">'Hello, world!'</syntaxhighlight>

برای شمول یک ' دو علامت * را بکار ببرید.


```smalltalk
'I said, ''Hello, world!'' to them.'
```


" نیاز به هیچگونه تغییری ندارد چون در رشته‌ها علامت ' بکار می‌رود.


```smalltalk
'I said, "Hello, world!" to them.'
```


دو رشته برابر (رشته‌ها برابرند در صورتی که شامل تمام کاراکترها باشد) می‌توانند دو شی در دو محل متفاوت از حافظه باشد. علاوه بر رشته‌ها اسمالتاک دارای یک کلاس توالی کاراکترهای دیگر به نام symbol است. symbolها تضمین شده‌اند که منحصربه‌فرد باشند و هیچ دو symbol برابر دو شی متفاوت نیستند. به دلیل منحصربه‌فرد بودن آن‌ها را می‌توان به راحتی مقایسه نمود و برای انتخاب‌کننده پیام‌ها و سایر مصنوعات زبان به کار رود.

symbolها توسط علامت # و چند کاراکتر نشان داده می‌شود.


```smalltalk
#foo
```


آرایه‌ها.


```smalltalk
#(1 2 3 4)
```


یک آرایه از ۴ عدد صحیح را تعریف می‌کند.

و آخرین نه کمترین بلوک‌ها (ثابت توابع بی‌نام).


```smalltalk
[... Some smalltalk code...]
```


بلوک‌ها در ادامه توضیح داده شده‌اند. اشتقاق‌های دیگر اسمالتاک دستورها اضافه‌تر را تعریف می‌کند اما موارد توضیح داده شده در بالا مهم‌ترین ثابت‌هاست.

### اعلام متغیرها
دو نوع متغیر معمول استفاده شده در اسمالتاک متغیرهای نمونه و متغیرهای موقت هستند. متغیرهای دیگر و اصطلاحات مرتبط بستگی به پیاده‌سازی‌های مختلف دارند. به عنوان مثال ویژوالورکس دارای متغیرهای به اشتراک گذاشته در کلاس و فضای نام است در حالی که اسکویک و پیاده‌سازی‌های دیگر متغیرهای کلاس، حوضچه، و جهانی است.

اعلام متغیر موقت در اسمالتاک برای متغیرهای درون متد بکار می‌رود. این متغیرها در بالای متد تعریف می‌شوند و با فضای خالی و | جدا می‌گردند. به عنوان مثال:


```smalltalk
| index |
```


یک متغیر موقت به نام index تعریف می‌کند. چندین متغیر را می‌توان در یک دستور تعریف نمود.


```smalltalk
| index vowels |
```


دو متغیر index و vowels را تعریف می‌کند.

### انتساب
یک متغیر از طریق دستور =: به یک مقدار منتسب می‌گردد.


```smalltalk
vowels := 'aeiou'
```


رشته aeiou را به متغیر از پیش تعیین شده vowels نسبت می‌دهد. رشته یک شی است (توالی کاراکترها در بین * نشان‌دهنده ثابت رشته‌ایست) که در زمان کامپایل ایجاد می‌شود.

=== پیام‌ها ===
پیام‌ها ساختارهای اساسی در اسمالتاک هستند. حتی دستورها کنترلی نیز به صورت ارسال پیام پیاده می‌گردند. مثال پایین پیام factorial را به عدد ۴۲ می‌فرستد.

<syntaxhighlight lang="smalltalk">42 factorial</syntaxhighlight>

در این حالت ۴۲ گیرنده پیام است در حالی که factorial انتخاب‌کننده است. گیرنده پیام با بازگرداندن مقداری (در اینجا احتمالاً فاکتوریل عدد ۴۲) پاسخ می‌دهد. علاوه بر این مقدار بازگردانده شده را می‌توان به یک متغی نسبت داد:

<syntaxhighlight lang="smalltalk">aRatherBigNumber := 42 factorial</syntaxhighlight>

factorial پیامی است که به آن عموماً پیام یگانه گویند چرا که فقط یک شی و آن هم دریافت‌کننده در آن نقش دارد. پیام‌ها می‌توانند چندین شی را به عنوان آرگومان خود حمل کنند:

<syntaxhighlight lang="smalltalk">2 raisedTo: 4</syntaxhighlight>

در این عبارت دو شی نقش داشته‌اند: ۲ به عنوان گیرنده و ۴ به عنوان آرگومان. نتیجه پیام یا در اصطلاح اسمالتاک پاسخ پیام ۱۶ است. یک پیام می‌تواند آرگومان‌های بیشتری هم داشته باشد.

<syntaxhighlight lang="smalltalk">'hello world' indexOf: $o startingAt: 6</syntaxhighlight>

مثال بالا اندیس o در رشته داده شده با شروع از اندیس ۶ را بازمی‌گرداند. انتخاب‌کننده این پیام :indexOf:startingAt که از دو کلمه کلیدی یا قسمت تشکیل شده‌است.

چنین کلمات کلیدی درهمتنیده خوانایی کد را بالا برده و آرگومان‌ها به‌وسیله کلمات کلیدی پیش از خود توصیف می‌گردند. به عنوان مثال یک عبارت برای ساخت یک مستطیل در ++C یا جاوا به شکل زیر است:

<syntaxhighlight lang="smalltalk">new Rectangle(100, 200);</syntaxhighlight>

در این عبارت مشخص نیس ت کدام آرگومان طول است یا عرض و شما برای فهمیدن این نکته باید به راهنمای زبان مراجعه نمایید اما همین عبارت در اسمالتاک بدون هیچ‌گونه ابهام نوشته می‌شود به شکل زیر:

<syntaxhighlight lang="smalltalk">Rectangle width: 100 height: 200</syntaxhighlight>

گیرنده در این حالت Rectangle یک کلاس است و در پاسخ یک نمونه از این کلاس با عرض و طول خواسته شده تولید می‌گردد.

در نهایت بیشتر کاراکترهای غیرالفبایی به عنوان پیام دودویی بکار می‌رود. این به برنامه‌نویس اجازه می‌دهد تا عملگرهای ریاضی را به شکل سنتی بنویسد:

<syntaxhighlight lang="smalltalk">3 + 4</syntaxhighlight>

که پیام + را به گیرنده ۳ به همراه آرگومان ۴ می‌فرستد (که پاسخ برابر با ۷) است. به‌طور مشابه:

<syntaxhighlight lang="smalltalk">3> 4</syntaxhighlight>

پیام <را به ۳ به همراه آرگومان ۴ را می‌فرستد (پاسخ false است).

توجه کنید که در اسمالتاک-۸۰ خود این عملگرها پیاده نشده‌اند. خروجی تنها بستگی به نحوه پاسخ‌دهی گیرنده (در این‌جا نمونه Number) در برابر پیام <و + پاسخ می‌دهد.

اثر جانبی این مکانیزم گرانبارسازی عملگر است. یک پیام <را بقیه اشیا هم می‌توانند بفهمند که این امکان را می‌دهد تا از عبارت a>b برای مقایسه آن‌ها بکار می‌رود.

=== عبارات ===
یک عبارت می‌تواند چندین ارسال پیام داشته باشد. در این مثال پیام‌ها به ترتیب ساده پردازش می‌شود. پیام‌های یگانه اولویت بیشتری داشته و پس از آن پیام‌های دوگانه و پیام‌های کلمات کلیدی قرار دارند. به عنوان مثال

<syntaxhighlight lang="smalltalk">3 factorial + 4 factorial between: 10 and: 100</syntaxhighlight>

که به صورت زیر ارزیابی می‌شود:
# ۳ پیام factorial را درپافت می‌کند که پاسخ ۶ است.
# ۴ پیام factorial را درپافت می‌کند که پاسخ ۲۴ است.
# ۶ پیام + را به همراه ۲۴ به عنوان آرگومان دریافت کرده که پاسخ ۳۰ است.
# ۳۰ گیرنده پیام :between:and را به همراه ۱۰ و ۱۰۰ به عنوان آرگومان درسافت کرده که پاسخ true است.

پاسخ آخرین پیام به عنوان نتیجه نهایی عبارت ارسال می‌گردد.

پارانتزها می‌توانند ترتیب ارزیابی را تغییر دهند.

<syntaxhighlight lang="smalltalk">(3 factorial + 4) factorial between: 10 and: 100</syntaxhighlight>

که معنای عبارت را تغییر داده و عبارت میان پارانتز در ابتدا ارزیابی گردیده و نتیجه ۱۰ می‌شود. ۱۰ پیام factorial را دریافت می‌کند که نتیجه ۳۶۲۸۸۰۰ است؛ و قسمت آخر در نهایت false تولید می‌کند.

به دلیل این که پیام‌های دوگانه در اسمالتاک-۸۰ درون‌ساخت نیستند اولویت برابر با یکدیگر داشته و به سادگی از چپ به راست ارزیابی می‌گردند. به همین دلیل عبارات مشابه در اسمالتاک ممکن است معنای متفاوت از آنچه که به صورت سنتی است داشته باشند.

<syntaxhighlight lang="smalltalk">3 + 4 * 5</syntaxhighlight>

پس از ارزیابی نتیجه ۳۵ است.

پیام‌های یگانه را می‌توان با نوشتن پشت سر هم به هم زنجیر نمود. به صورت زیر:

<syntaxhighlight lang="smalltalk">3 factorial factorial log</syntaxhighlight>

که فاکتوریل را به ۳ فرستاده و نتیجه را که ۶ است دوباره فاکتوریل ارسال می‌کند و از نتیجه ۷۲۰ لگاریتم می‌گیرد که نتیجه ۲٫۸۵۷۳۳ است.

چند عبارت را می‌توان پشت هم نوشت که هر کدام با یک. پایان می‌یابد. مثال پایین یک نمونه از window ایجاد کرده و آن را در یک متغیر ذخیره می‌نماید و به آن دو پیام می‌فرستد.

<syntaxhighlight lang="smalltalk">
 | window |
  window := Window new.
  window label: 'Hello'.
  window open.
</syntaxhighlight>

اگر چندین پیام به یک گیرنده ارسال شود می‌توان آن‌ها را به صورت یک زنجیره جدا شده با؛ نوشت.

<syntaxhighlight lang="smalltalk">
  (Window new)
    label: 'Hello';
    open
</syntaxhighlight>

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

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

<syntaxhighlight lang="smalltalk">[:params | <message-expressions>]</syntaxhighlight>

که params: نشان‌دهنده پارامترهای دریافتی است. این بدان معنی است که کد زیر:

<syntaxhighlight lang="smalltalk">[:x | x + 1]</syntaxhighlight>

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

<syntaxhighlight lang="smalltalk">f(x) = x + 1</syntaxhighlight>

(یا با استفاده از حساب لامدا):

<syntaxhighlight lang="smalltalk">λx.(x+1)</syntaxhighlight>

و

<syntaxhighlight lang="smalltalk">f(3) = 3 + 1</syntaxhighlight>

ارزیابی خواهد شد:

<syntaxhighlight lang="smalltalk">[:x | x + 1] value: 3</syntaxhighlight>

== ساختار کنترل ==
ساختار کنترل، دارای دستور خاصی در اسمالتک ناست. در عوض اسمالتک آن را با فرستادن پیغام به شی انجام می‌دهد. برای مثال شرط اجرا در صورتی که درست بود با فرستادن پیغام به شی بولی آن را انجام می‌دهد. سپس آن را به عنوان یک آرگومان بلاکی از کد شروع به اجرا کردن می‌کند اگر و تنها اگر دریافت شی بولی درست باشد.
این قطعه از کد توضیح بالا را نمایش می‌دهد:
<syntaxhighlight lang="smalltalk">
result := a> b
    ifTrue:['greater']
    ifFalse:['less']
</syntaxhighlight>
بلاک‌ها نیز برای اجرای ساختار کنترلی تعریف شده توسط کاربر، مشاهده‌ها و .. کاربرد دارند برای مثال:
<syntaxhighlight lang="smalltalk">
| aString vowels |
aString := 'This is a string'.
vowels := aString select: [:aCharacter | aCharacter isVowel].
</syntaxhighlight>
در خط آخر پیغامی که فرستاده می‌شود توسط select: با یک آرگومانی که به صورت بلاک کد ثابت است معین می‌شود. بلاک کد ثابت به عنوان خبر دادن به یک تابعی که باید جواب صحیح بودن را بدهد اگر و تنها اگر یک المان از رشته در مجموعه‌ای از رشته‌ها که توسط کد ثابت فرستاده شده موجود باشد.

== کلاس‌ها ==
این یک مثالی از کلاس است:
<syntaxhighlight lang="smalltalk">
Object subclass: #MessagePublisher
    instanceVariableNames: *
    classVariableNames: *
    poolDictionaries: *
    category: 'Smalltalk Examples'

اغلب بیشتر این تعریف‌ها توسط محیط برنامه کامل خواهند شد. توجه کنید که این در حقیقت یک پیغام به کلاس "شی" برای ساختن یک زیر کلاس است که "MessagePublisher" می‌نامند. بعبارت دیگر در اسمالتک کلاس‌ها اول به صورت کلاس شی هستند که می‌توانند پیغام‌هایی را فقط توسط شی‌های دیگر دریافت نماید و به صورت داینامیک در زمان اجرا آن را به وجود می‌آورد.

### توابع
زمانی که یک شی یک پیغامی را دریافت می‌کند تابع پیغام دریافتی را با اسم تابع تطبیق می‌دهد. مثال زیر یک تابع "Publish" را تعریف می‌کند و پس از آن آنچه را که اتفاق خواهد افتاد را در خود تعریف می‌کند. این زمانی اجرا می‌شود که یک پیغامی حاوی "Publish"را دریافت نماید.

```smalltalk
publish
    Transcript show: 'Hello, World!'
```

در زیر تابعی تعریف می‌شود که چند آرگومان را می‌گیرد و مقداری را برمی‌گرداند.

```smalltalk
quadMultiply: i1 and: i2
    "This method multiplies the given numbers by each other and the result by 4."
    | mul |
    mul := i1 * i2.
    ^mul * 4
```

توجه کنید که شی برای تعیین اینکه در زمان اجرا به‌طور داینامیکی شروع به پاسخ دهی به پیغام نماید یا به‌طور استاتیکی در زمان کامپایل این کار را انجام دهد مسئول می‌باشد.

### ساختن نمونه‌ای از کلاس‌ها
به قطعه کد زیر توجه کنید که یک شی از کلاس می‌سازد:

```smalltalk
MessagePublisher new
```

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

```smalltalk
publisher := MessagePublisher new
```

در زبان اسمالتک ممکن است که به یک کلاس موقتی و بی‌نام پیغامی بزنیم مانند کد خط بعد.

```smalltalk
MessagePublisher new publish
```

توجه کنیدکه برنامه‌نویس با توجه به شرایط از یکی از حالات بالا برای ساختن نمونه از شی استفاده می‌کند.

## مثال معروف "!Hello World

```smalltalk
Transcript show: 'Hello, world!'.
```

دستور "show" به شی "Transcript" پیغامی با یک آرگومان ثابت "!Hello World" می‌فرستد. دستور "show" باعث نمایش "!Hello World" در قسمت "Transcript" ویندوز می‌شود.
توجه کنیدکه "Transcript" احتیاج به باز کردن دارد تا بتواند دستور را نمایش دهد.

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

## سطح دسترسی
هرچیزی در اسمالتک ۸۰ قابلیت تغییر را در زمان اجرا دارد. برای مثال: دستگاه‌های کنترل درایو الکترونیکی یکپارچه می‌توانند بدون راه اندازی مجدد در زمانی که سیستم در حال اجرا است تغییر کنند. دستورها نحوی زبان یا اجرای داده‌های ناخواسته می‌توانند همچنین در جنبش تغییر یابند.
برای مثال دستور `true become: false`با ارزش هست ولی اجرای آن توصیه نمی‌شود.

## کامپایل کردن اسمالتک
اسمالتک به صورت بایت کد برنامه را کامپایل می‌کند که توسط ماشین دیداری یا به‌طور داینامیکی به زبان ماشین ترجمه می‌شود.

## منابع

دانشنامه آزاد انگلیسی :en:Smalltalk

رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۱۹۷۲ (میلادی)
رده:زبان‌های برنامه‌نویسی ساخته‌شده در دهه ۱۹۷۰ (میلادی)
رده:زبان‌های برنامه‌نویسی شیءگرا
رده:زبان‌های برنامه‌نویسی کلاس محور
رده:زبان‌های برنامه‌نویسی ماشینی پویا
رده:کامپایلرها و مفسرهای آزاد
رده:نرم‌افزارهای آزاد چندسکویی
رده:نرم‌افزارهای آموزشی آزاد