فورث (انگلیسی: forth) یک زبان برنامهنویسی رایانه بر پایه برنامهنویسی ساخت یافته و ساختمان داده پشته است و در اصل توسط چاک مور طراحی شدهاست. از ویژگیهای این زبان می توان به برنامهنویسی ساخت یافته، پژواک (توانایی بررسی و تغییر ساختار برنامه در حین اجرا)، برنامهنویسی متقابل (توابع این زبان با هم قرار گرفتن در کنار هم ترکیب شدهاند) و قابلیت توسعه ماژولار (برنامهنویس میتواند دستور جدید ایجاد کند) اشاره کرد. اگرچه نام این زبان مخفف کلمه ای نیست، اما گاهی اوقات به دلیل استفاده زیاد در سالهای اولیه نام آن با حروف بزرگ FORTH نوشته میشود.
Forth که یک زبان برنامهنویسی رویه ای و بدون بررسی نوع دادهاست، این زبان امکان اجرای تعاملی دستورها (ساختن یک شل مناسب برای سیستمهایی که فاقد سیستم عامل رسمی هستند) و توانایی کامپایل دستورات برای اجرای بعدی را فراهم میکند. در گذشته زبان فورث، روش استاندارد کامپایل کردن کد ریسهای بود، اما پیادهسازیهای مدرنی وجود دارد که مانند کامپایلرهای زبانهای برنامهنویسی دیگر کد ماشین بهینهسازی شده را تولید میکند.
فورث در بوت لودر نرمافزار Open Firmware، در برنامههای فضایی[۱] مانند فضاپیمای Philae ,[۲][۳] و در سایر سامانههای تعبیه شده شده که تعامل با سختافزار دارند، استفاده میشود. همچنین پرفروشترین بازی رایانه ای سال 1986 Starflight، ساخته شرکت الکترونیک آرتس، توسط نسخه ای سفارشی شده از زبان فورث نوشته شدهاست.[۴]
پیادهسازی آزاد این زبان برنامه نویسی که Gforth نام دارد هنوز به شکل مستمر پشتیبانی میشود
Forth یک زبان ساده و در عین حال قابل گسترش است. وجود قابلیت گسترش (ماژولار بودن) در این زبان اجازه نوشتن برنامههای مهم را میدهد.
محیط برنامهنویسی زبان فورث کامپایلر را با شل، که در کاربر زیرروالها که کلمات(words) نامیده میشوند را تعریف و اجرا میکند. کلمات بدون کامپایل یا راه اندازی مجدد کل برنامه میتوانند به صورت تعاملی تعریف، آزمایش، تعریف مجدد و اشکال زدایی شوند. تمام دستور زبان برنامه (syntax)، از جمله متغیرها و عملگرهای اصلی، به عنوان کلمات (words) تعریف میشوند. در حالت عادی، اجرای برنامه اثری یکسان با دوباره وارد کردن دستی کد منبع و کامپایل آن دارند
فلسفه زبان فورث بر استفاده از کلمات ساده و کوچک تأکید دارد. کلمات مربوط به کارهای بزرگتر بسیاری از کلمات کوچکتر را فراخوانی میکنند که هرکدام یک کار فرعی مشخص را انجام میدهند. یک برنامه بزرگ نوشته شده با زبان فورث سلسله مراتبی از این کلمات است. این کلمات، ماژولهای متمایزی هستند که بهطور ضمنی از طریق مکانیزم پشته ارتباط برقرار میکنند (دادهها را منتقل میکنند) و میتوانند به صورت مستقل، ساخته و آزمایش شوند. بالاترین سطح کد زبان فورث احتمالاً شبیه یک توصیف انگلیسی از برنامه باشد. Forth را "زبان فرا برنامه ای " خواندهاند: زبانی که میتواند برای ایجاد زبانهای خاص دامنه مورد استفاده قرار گیرد.[۵]
فورث دارای کاربردهای نجومی و فضایی[۶] و همچنین دارای سابقه استفاده در سیستمهای نهفتهاست. رامهای راه اندازی Open Firmware که توسط اپل، IBM، Sun و OLPC XO-1 استفاده میشوند دارای از زبان Forth استفاده میکنند.
دو بازی رایانه ای که الکترونیک آرتس، در دهه ۱۹۸۰ منتشر کردهاست، Worms (1983)[۷] و Starflight (1986). توسط این زبان نوشته شدهاند[۸] شرکت آتاری برای نمایش تواناییهای رایانههای خانواده ۸ بیتی آتاری در فروشگاهها از یک نسخهٔ نمایشی که توسط زبان Forth نوشته شده بود استفاده کرد.[۹]
فورث از ساختمان داده پشته و نشانه گذاری معکوس لهستانی (نشانه گذاری پیش وندی) استفاده میکند که معمولاً در ماشین حسابهای شرکت هیولت پاکارد (HP) استفاده میشود. در این نشانه گذاری، عملگر بعد از عملوندهای آن قرار میگیرد، در مقابل نشانه گذاری میانوندی متداول که عملگر بین عملوندها قرار میگیرد، قرار میگیرد. این روش نشانه گذاری، تجزیه و گسترش یک زبان را آسانتر میکند. انعطافپذیری فورث، یک دستور زبان BNF را تولید میکند و یک کامپایلر یکپارچه ندارد. گسترش کامپایلر، به جای اصلاح دستور زبان و تغییر در عملکرد اصلی آن فقط به نوشتن یک کلمه (word)جدید نیاز دارد
با استفاده از نشانه گذاری معکوس لهستانی میتوان نتیجه عبارت ریاضی (25 * 10 + 50)
این طریق بدست آورید:
25 10 * 50 + CR .
300 ok
ابتدا اعداد ۲۵ و سپس ۱۰ را داخل داده ساختار پشته قرار میدهیم.
خواندن کلمه *
از ورودی دو عدد بالا را از پشته خارج میکند، آنها را ضرب میکند و نتیجه ضرب را دوباره داخل پشته قرار میدهد.
سپس عدد ۵۰ از ورودی خوانده شده و داخل پشته قرار میگیرد.
سپس کلمه +
از ورودی خوانده میشود دو مقدار بالا را از پشته خارج میشوند و جمع آنها محاسبه میشود دهد. CR
(بازگشت) به اول خط بعدی رفته در نهایت، .
نتیجه را چاپ میکند. هنگامی که همه چیز بهطور کامل انحام میشود زبان فورث عبارت OK
را چاپ میکند.
حتی سایر ساختارهای این زبان نیز از ویژگیهای داده ساختار پشته استفاده میکنند. برای مثال :
: FLOOR5 ( n -- n' ) DUP 6 < IF DROP 5 ELSE 1 - THEN ;
علامت :
بیانگر شروع یک تعریف جدید است در اینجا یک کلمه (اصطلاحی که برای یک زیرروال در این برنامه به کار میرود) جدید به اسم FLOOR5
تعریف میکنیم متنی که داخل پرانتز قرار گرفته یک کامنت است که بیان میکند این کلمه یک عدد را میگیرد و داخل پشته قرار داده و سپس عددی تغییر یافته را بازمیگرداند.
زیر روال دستورات زیر را انجام میدهد:
DUP
عدد داخل پشته را تکرار میکند 6
عدد ۶ را به بالای پشته اضافه میکند. >
دو عدد بالای پشته را با هم مقایسه میکند (عدد ۶ و عددی که DUP شدهاست)
و آنرا با یک عبارت درست یا غلط (true or false) جایگزین میکند. سپس در صورت درست بودن گزاره قبلی شرط IF
اجرا شده DROP تمامی مقادیر داخل پشته را نادیده گرفته و ۵ عدد ۵ را به بالای پشته اضافه میکند در صورت غلط بودن شرط قسمت ELSE
اجرا میشود و مقدار بالای پشته را یک واحد کم میکند THEN;به معنای پایان کلمه است اگر بخواهیم مشابه کلمه FLOOR5
در زبان برنامهنویسی سی یک تابع تعریف کنیم به شکل زیر آنرا مینویسیم:
int floor5(int v) {
return (v < 6) ? 5 : (v - 1);
}