آغاز کار با FORTH
۱.۱ آشنایی با FORTH
FORTH یک زبان برنامهنویسی است که در دههٔ ۱۹۷۰ توسط چارلز مور طراحی شد. این زبان برخلاف اکثر زبانهای رایج، ساختاری متفاوت دارد و همین تفاوت، آن را برای کنترل مستقیم سختافزار و برنامهنویسی سریع بسیار مناسب کرده است.
اگر با BASIC آشنایی دارید، FORTH برای شما هم قابل یادگیری است. تنها کافی است با چند مفهوم اصلی آن آشنا شوید:
- پشته (Stack): محل نگهداری موقت دادهها.
- واژه (Word): معادل دستور یا تابع در زبانهای دیگر.
- دیکشنری (Dictionary): فهرست همهٔ واژههای تعریفشده.
- حالت مفسر و حالت کامپایلر: دو حالت کاری FORTH.
در ادامه هر یک از این مفاهیم را بهصورت جداگانه توضیح میدهیم.
۱.۲ پشته چیست؟
پشته یکی از مفاهیم بنیادین FORTH است. تصور کنید تعدادی بشقاب روی هم قرار دادهاید. هر بشقاب جدیدی که اضافه میکنید، روی بشقابهای قبلی قرار میگیرد. هنگام برداشتن نیز، همیشه بشقاب رویی برداشته میشود.
پشته در FORTH نیز دقیقاً همینگونه عمل میکند:
- هر مقداری که وارد میکنید، روی پشته قرار میگیرد.
- هر دستوری که اجرا میشود، مقادیر مورد نیاز خود را از روی پشته برمیدارد.
به این دو عمل، اصطلاحاً push (قرار دادن) و pop (برداشتن) گفته میشود.
مثال عملی
دستور زیر را در نظر بگیرید:
3 4 + .
این دستور را میتوان به این ترتیب تفسیر کرد:
- عدد
3روی پشته قرار میگیرد. - عدد
4روی پشته قرار میگیرد. - واژهٔ
+اجرا میشود؛ عدد ۴ و ۳ را از پشته برمیدارد، آنها را جمع میکند و حاصل (عدد ۷) را روی پشته قرار میدهد. - واژهٔ
.(نقطه) اجرا میشود؛ عدد ۷ را از پشته برمیدارد و آن را چاپ میکند.
7 OK
عبارت OK پیامی از سوی FORTH است که نشان میدهد خط واردشده بهدرستی پذیرفته شده است.
۱.۳ واژهها و دیکشنری
در FORTH به هر دستور یا تابع، یک واژه (Word) گفته میشود. هر واژه، یک ورودی در جدولی به نام دیکشنری (Dictionary) دارد. هنگامی که نام یک واژه را وارد میکنید، FORTH در دیکشنری جستجو میکند و در صورت یافتن، آن را اجرا میکند.
مجموعهٔ واژههای FORTH ثابت نیست. استانداردهای این زبان، حداقلی از واژهها را تعریف میکنند، اما کاربر میتواند واژههای جدید بسازد و زبان را گسترش دهد. همین ویژگی، FORTH را به زبانی منعطف و قابل سفارشیسازی تبدیل کرده است.
ساخت واژهٔ جدید
برای ساخت یک واژهٔ جدید، از الگوی زیر استفاده میشود:
: نام_واژه بدنه ;
:نشانهٔ آغاز تعریف است.نام_واژهنامی است که برای واژهٔ جدید انتخاب میکنید.بدنهمجموعهٔ واژهها و مقادیری است که واژهٔ جدید را میسازند.;نشانهٔ پایان تعریف است.
مثال
: DOUBLE 2 * ;
این تعریف، یک واژهٔ جدید به نام DOUBLE میسازد که هر عددی را در ۲ ضرب میکند.
استفاده از آن:
5 DOUBLE .
10 OK
توضیح: عدد ۵ روی پشته قرار میگیرد. سپس واژهٔ DOUBLE اجرا میشود که معادل 2 * است. عدد ۲ روی پشته قرار میگیرد و سپس ضرب انجام میشود. حاصل، عدد ۱۰ است که با واژهٔ . چاپ میشود.
۱.۴ حالتهای کاری FORTH
FORTH در دو حالت کار میکند:
حالت مفسر (Interpreter)
در این حالت، FORTH هر واژهای را که وارد میکنید، بلافاصله جستجو و اجرا میکند. این حالت شبیه کار با BASIC در حالت مستقیم است.
حالت کامپایلر (Compiler)
هنگامی که در حال تعریف یک واژهٔ جدید با : هستید، FORTH وارد حالت کامپایلر میشود. در این حالت، واژهها بلافاصله اجرا نمیشوند؛ بلکه بهعنوان بخشی از تعریف جدید، در حافظه ذخیره میشوند. پس از وارد کردن ;، FORTH به حالت مفسر بازمیگردد.
۱.۵ قواعد نگارش
سه قاعدهٔ مهم در نوشتن دستورات FORTH وجود دارد:
قاعدهٔ اول: فاصله
هر واژه، عدد یا نماد باید با حداقل یک فاصله از مورد بعدی جدا شود. FORTH تنها از طریق تشخیص فاصله میفهمد که یک واژه کجا پایان مییابد و واژهٔ بعدی از کجا آغاز میشود.
این دستور نادرست است:
3+4.
و این دستور درست است:
3 + 4 .
قاعدهٔ دوم: ترتیب نوشتن
در FORTH، ابتدا مقادیر و پارامترها نوشته میشوند و سپس نام واژهای که باید آنها را پردازش کند. به همین دلیل، FORTH را زبانی با نماد پسوندی مینامند.
مثال:
3 4 + .
در اینجا، ابتدا دو مقدار نوشته شده و سپس واژهٔ + که آنها را جمع میکند.
قاعدهٔ سوم: نامگذاری
نام هر واژه میتواند تا ۳۱ کاراکتر طول داشته باشد. برای حفظ سازگاری با سایر سیستمهای FORTH، بهتر است تنها از کاراکترهای استاندارد ASCII استفاده کنید و از کاراکترهای گرافیکی خاص کمودور بپرهیزید.
۱.۶ صفحهها (Screens)
در FORTH، سورسکد برنامهها بهصورت یک فایل پیوسته ذخیره نمیشود. بهجای آن، از مفهوم صفحه (Screen) استفاده میشود.
هر صفحه، بلوکی شامل ۱۰۲۴ بایت داده است که بهعنوان یک واحد، از دیسک یا نوار کاست خوانده یا روی آن نوشته میشود. هنگامی که یک صفحه LOAD میشود، FORTH آن را بهعنوان جریان ورودی در نظر میگیرد؛ یعنی همانطور که گویی شما ۱۰۲۴ کاراکتر را در پاسخ به نشانگر چشمکزن وارد کردهاید.
کاربردهای صفحهها
- ذخیرهٔ سورسکد تعریف واژههای جدید
- ذخیرهٔ آرایهها و جداول داده
- ذخیرهٔ زیرروالهای کد ماشین
- ذخیرهٔ دستورات غیرمستقیم
با ویرایشگر C64-FORTH میتوانید محتوای صفحهها را ویرایش کنید. هر صفحه میتواند صفحهٔ دیگری را نیز بارگذاری کند؛ به این ترتیب، یک برنامهٔ کامل میتواند از چندین صفحه تشکیل شود و تنها با یک دستور بارگذاری گردد.
۱.۷ بارگذاری C64-FORTH
برای بارگذاری این زبان روی کمودور ۶۴، مراحل زیر را انجام دهید:
- مطمئن شوید که هم کمودور ۶۴ و هم درایو دیسک روشن هستند.
- دیسک C64-FORTH را در درایو قرار دهید.
- دستور زیر را وارد کنید:
LOAD"C64FORTH",8
- پس از پایان بارگذاری، دستور زیر را وارد کنید:
RUN
پس از چند لحظه، پیام کپیرایت و شمارهٔ سریال روی صفحه ظاهر میشود و نشانگر چشمک میزند. اگر چنین نشد، دیسک را خارج کنید، برق هر دو دستگاه را خاموش کنید، چند ثانیه صبر کنید و مراحل را تکرار کنید.
ساخت نسخهٔ پشتیبان
پس از نخستین ورود به C64-FORTH، بلافاصله از دیسک اصلی نسخهٔ پشتیبان تهیه کنید. برای این کار:
- دیسک اصلی را در درایو قرار دهید.
- دستور زیر را وارد کنید:
2 LOAD
2 و LOAD ضروری است.- یک برنامهٔ پشتیبانگیری از دیسک بارگذاری میشود. دستورالعملهای روی صفحه را دنبال کنید.
- پس از پایان، یک نسخهٔ دقیقاً مشابه از دیسک در اختیار خواهید داشت.
از این پس، دیسک اصلی را در جای امنی نگه دارید و تنها از نسخهٔ پشتیبان استفاده کنید.
۱.۸ نخستین تجربهها
پس از بارگذاری موفق، دستورات زیر را وارد کنید و نتیجهٔ هر یک را مشاهده کنید.
جمع دو عدد
3 4 + .7 OK
تفریق
10 3 - .7 OK
ضرب
6 7 * .42 OK
تقسیم
20 4 / .5 OK
ترکیب چند عمل
3 4 + 2 * .14 OK
توضیح: ابتدا 3 4 + محاسبه میشود (نتیجه: ۷)، سپس 7 2 * محاسبه میشود (نتیجه: ۱۴).
۱.۹ دستورات پرکاربرد
جدول زیر برخی از دستورات پرکاربرد FORTH را معرفی میکند:
| دستور | کاربرد |
|---|---|
. | چاپ مقدار رویی پشته و حذف آن |
+ | جمع دو مقدار رویی پشته |
- | تفریق دو مقدار رویی پشته |
* | ضرب دو مقدار رویی پشته |
/ | تقسیم دو مقدار رویی پشته |
DUP | تکرار مقدار رویی پشته |
SWAP | جابهجایی دو مقدار رویی پشته |
DROP | حذف مقدار رویی پشته |
CR | انتقال نشانگر به خط جدید |
مثالهایی از این دستورات
5 DUP . .5 5 OK
1 2 SWAP . .1 2 OK
توضیح: ابتدا ۲ و سپس ۱ روی صفحه چاپ میشوند، زیرا SWAP جای دو مقدار را عوض کرده است.
۱.۱۰ نخستین برنامه
برنامهٔ زیر الفبای انگلیسی را چاپ میکند:
: ALPHA 91 65 DO I EMIT LOOP ;
ALPHAABCDEFGHIJKLMNOPQRSTUVWXYZ
توضیح دستور
:آغاز تعریف واژهٔ جدیدALPHAنام واژه91مقدار پایانی حلقه بهاضافهٔ یک65مقدار آغازین (کد ASCII حرف A)DOآغاز حلقهIقرار دادن مقدار شمارندهٔ فعلی روی پشتهEMITتبدیل مقدار عددی به کاراکتر و چاپ آنLOOPپایان حلقه;پایان تعریف
معادل این برنامه در BASIC چنین است:
10 FOR I = 65 TO 90
20 PRINT CHR$(I);
30 NEXT I۱.۱۱ تغییر رنگ حاشیهٔ صفحه
یکی از قابلیتهای جالب FORTH، دسترسی مستقیم به حافظهٔ سختافزار است. دستور زیر رنگ حاشیهٔ صفحه را به رنگ قرمز تغییر میدهد:
4 53280 C!توضیح:
4کد رنگ قرمز53280نشانی حافظهای که رنگ حاشیه را نگه میداردC!ذخیرهٔ مقدار در آن نشانی
برای بازگرداندن رنگ حاشیه به حالت اولیه:
14 53280 C!۱.۱۲ اشتباهات رایج
هنگام کار با FORTH، ممکن است با خطاهای زیر روبهرو شوید:
خطای اول: نبود فاصله
این دستور کار نمیکند:
3+4.باید نوشت:
3 + 4 .خطای دوم: نبود داده روی پشته
اگر دستور زیر را وارد کنید:
+ .FORTH پیام خطا میدهد، زیرا پشته خالی است و نمیتواند دو مقدار را جمع کند.
خطای سوم: واژهٔ تعریفنشده
اگر نام یک واژه که تعریف نشده است را وارد کنید:
FOO .FORTH پیام زیر را نمایش میدهد:
? CAN'T FIND FOO
۱.۱۳ تمرینها
برای تسلط بر مفاهیم این فصل، تمرینهای زیر را انجام دهید:
15 25 + .40 OK
: TRIPLE 3 * ;
7 TRIPLE .21 OK
: ALPHA5 70 65 DO I EMIT LOOP ;
ALPHA5ABCDE
5 53280 C!100 DUP . .100 100 OK
۱.۱۴ خلاصهٔ فصل
نکات کلیدی این فصل
- پشته: محلی برای نگهداری موقت دادهها
- واژه: معادل دستور یا تابع در زبانهای دیگر
- دیکشنری: فهرست واژههای تعریفشده
- حالت مفسر و کامپایلر: دو حالت کاری FORTH
- قواعد نگارش: استفاده از فاصله، رعایت ترتیب نوشتن، رعایت طول نام
- صفحهها: بلوکهای ۱۰۲۴ بایتی برای ذخیرهٔ سورسکد
- نحوهٔ بارگذاری و تهیهٔ نسخهٔ پشتیبان
- دستورات پرکاربرد مانند
+،-،*،/،DUP،SWAPوDROP