EBFC(1) General Commands Manual EBFC(1)

ebfc - کامپایلر زبان Brainfuck به ساختار ELF

ebfc [OPTIONS] SRCFILE

دستور ebfc کامپایلری برای زبان برنامه‌نویسی Brainfuck است که فایل‌های ۶۴ بیتی ELF را برای معماری Intel x86-64 تولید می‌کند.

ebfc می‌تواند فایل‌های اجرایی مستقل، کتابخانه‌های اشتراکی یا فایل‌های شیء (object files) ایجاد کند. فایل‌های شیء خود می‌توانند برای یک فایل اجرایی مستقل، یک کتابخانه اشتراکی یا یک پودمان (ماژول) در برنامه‌ای بزرگ‌تر هدف‌گذاری شوند.

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

کامپایل کد منبع به یک فایل اجرایی مستقل، با نام foo.
کامپایل کد منبع به یک فایل کتابخانه اشتراکی، با نام libfoo.so. برنامه به‌صورت تابعی با نام foo() صادر (export) خواهد شد.
کامپایل کد منبع به یک تابع، با نام foo()، در یک فایل شیء، با نام foo.o. فایل شیء برای یک پودمان در یک فایل اجرایی هدف‌گذاری خواهد شد.
کامپایل کد منبع به یک فایل شیء، با نام foo.o، که سپس می‌تواند به‌صورت یک فایل اجرایی مستقل پیوند (link) داده شود.
کامپایل کد منبع به یک تابع، با نام foo()، در یک فایل شیء، با نام foo.o، که سپس می‌تواند به‌صورت یک کتابخانه اشتراکی پیوند داده شود.

اگر آرگومان SRCFILE فاقد پسوند .b یا .bf باشد، از کل نام فایل هنگام ایجاد نام فایل هدف و تابع استفاده خواهد شد. (در مورد -x، نام فایل هدف در عوض a.out خواهد بود.)

کامپایل تابع به‌گونه‌ای که یک آرگومان دریافت کند، یعنی یک اشاره‌گر به آرایه بایت. به‌طور پیش‌فرض، ebfc کد خود را به تابعی کامپایل می‌کند که هیچ آرگومانی نمی‌پذیرد و از یک آرایه بایت داخلی استفاده می‌کند. هنگامی که از این گزینه استفاده شود، هیچ تفاوتی در فایل شیء ایجادشده توسط -c و -lc وجود ندارد. (این گزینه برای یک فایل اجرایی مستقل کاربرد ندارد.)
استفاده از FUNCTION به‌عنوان نام تابعی که حاوی برنامه کامپایل‌شده است. اگر این آرگومان حذف شود، نام تابع از نام فایل منبع گرفته خواهد شد، همان‌طور که در بخش قبل شرح داده شد.
استفاده از FILE به‌عنوان نام فایل منبع برای قرار گرفتن در فایل هدف. این گزینه جایگزین آرگومان SRCFILE نمی‌شود؛ صرفاً نامی را که در فایل شیء ذخیره می‌شود تغییر می‌دهد. (این گزینه در صورتی که هدف یک فایل شیء نباشد، یا اگر از گزینهٔ --strip استفاده شود، بی‌معنی است.)
استفاده از FILE به‌عنوان نام فایل هدف. اگر این گزینه حذف شود، نام فایل خروجی از نام فایل منبع تولید خواهد شد، همان‌طور که در بخش قبل شرح داده شد.
جلوگیری از گنجاندن داده‌های غیرضروری در فایل هدف. به‌طور پیش‌فرض، ebfc یک بخش .comment و یک نماد در جدول نمادها برای نام فایل منبع می‌گنجاند. در صورت استفاده از این گزینه، این موارد از خروجی حذف خواهند شد. علاوه بر این، اگر خروجی یک فایل اجرایی مستقل باشد، این گزینه از گنجاندن جدول سرآیند بخش‌ها (section header table) جلوگیری می‌کند.
خواندن فایل منبع در قالب فشردهٔ Brainfuck (پایین‌تر را ببینید).
نمایش راهنما و خروج.
نمایش شماره نسخه و خروج.

هنگام فراخوانی یک برنامه کامپایل‌شدهٔ Brainfuck از درون یک برنامه C، پیش‌نمونهٔ (prototype) تابع در C باید به این شکل باشد:


extern void foo(void);

یا اگر گزینهٔ --arg مشخص شده باشد:


extern void foo(char *buffer);

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

یک برنامهٔ Brainfuck دارای یک اشاره‌گر بایت ضمنی به نام «اشاره‌گر» (the pointer) است که آزادانه درون آرایه‌ای از بایت‌ها حرکت می‌کند، که در ابتدا همگی صفر مقداردهی شده‌اند. خود اشاره‌گر مقداردهی اولیه می‌شود تا به ابتدای این آرایه اشاره کند. (اندازه آرایه توسط زبان محدود نشده است، اما معمولاً ۳۰۰۰۰ بایت یا بیشتر است. برنامه‌های ebfc آرایه‌ای با اندازه ۳۲۷۶۸ بایت دریافت می‌کنند.)

زبان برنامه‌نویسی Brainfuck شامل هشت دستور است که هر یک با یک نویسه منفرد نمایش داده می‌شوند.

>
اشاره‌گر را یکی افزایش می‌دهد.
<
اشاره‌گر را یکی کاهش می‌دهد.
+
بایت موجود در محل اشاره‌گر را یکی افزایش می‌دهد.
-
بایت موجود در محل اشاره‌گر را یکی کاهش می‌دهد.
.
بایت موجود در محل اشاره‌گر را در خروجی می‌نویسد.
,
یک بایت ورودی خوانده و در بایت محل اشاره‌گر ذخیره می‌کند.
[
اگر بایت موجود در محل اشاره‌گر صفر باشد، به ] متناظر می‌پرد.
]
به [ متناظر می‌پرد.

هر نویسهٔ دیگری در کد منبع به‌عنوان توضیح (کامنت) یا نویسه فاصله در نظر گرفته شده و نادیده گرفته می‌شود.

معناشناسی دستورهای Brainfuck را می‌توان به‌طور خلاصه بر حسب زبان C نیز بیان کرد (با فرض اینکه p قبلاً به‌صورت یک char* تعریف شده باشد):

>
تبدیل می‌شود به  ++p;
<
تبدیل می‌شود به  --p;
+
تبدیل می‌شود به  ++*p;
-
تبدیل می‌شود به  --*p;
.
تبدیل می‌شود به  putchar(*p);
,
تبدیل می‌شود به  *p = getchar();
[
تبدیل می‌شود به  while (*p) {
]
تبدیل می‌شود به  }

همانند زبان C، در صورتی که اشاره‌گر به خارج از محدوده آرایه بایت منتقل شود، رفتار برنامهٔ تولیدشده تعریف‌نشده (undefined) خواهد بود.

یک قالب فشرده برای ذخیره‌سازی و انتقال برنامه‌های Brainfuck وجود دارد که ebfc می‌تواند با استفاده از گزینهٔ --compressed مستقیماً آن را بخواند.

در Brainfuck فشرده‌شده، هشت دستور به‌صورت سه‌بیتی به شرح زیر کدگذاری می‌شوند:

+
000
-
001
<
010
>
011
[
100
]
101
,
110
.
111

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

Encoding    Bits
 Translation
 abc
 abc و سپس def
 0ab سپس 0cd سپس 0ef
 def تکرار شده به میزان 2 + abc بار (۲-۹)
 0ef تکرار شده به میزان 2 + abcd بار (۲-۱۷)

اگر برنامه حاوی دستورهای قلاب (براکت) نامتوازن باشد، یا اگر عمق براکت‌های تو‌در‌تو از حداکثر ظرفیت کامپایلر (که به‌صورت اختیاری روی ۲۵۶ تنظیم شده است) تجاوز کند، کامپایلر پیام خطایی صادر کرده و فرایند کامپایل با شکست مواجه می‌شود.

حق نشر © 1999, 2001, 2021 برای Brian Raiter <breadbox@muppetlabs.com>.

مجوز GPLv2+: گنو GPL نسخه ۲ یا بالاتر. این نرم‌افزار آزاد است: شما می‌توانید آزادانه آن را تغییر دهید و توزیع کنید. تا حد مجاز طبق قانون، هیچ ضمانتی وجود ندارد.

May 2021 ELF kickers 3.2