گرچه قبلا سعی کردم چنین کاری کنم و حتی نسخه قدیمی WENT رو هم نوشتم، ولی کار بهینه نبود، و تصمیم گرفتم همون WENT رو بازنویسی کنم. پس تصمیم گرفتم کمی بیشتر در اعماق روبی سفر کنم و با کشفیات جدید، دوباره زبانم رو بنویسم. توی این مطلب خیلی بحث رو کش نمیدم، فقط یکم در مورد این که زبان اون پشت چی کار میکنه توضیح میدم و بعد یک تکه کد ساده میزنم.
هر زبانی، اون پشت توی مفسر یا کامپایلر، بخشی داره که هرچی که بهش دادیم رو میخونه. اصولا این بخش Parser نامیده میشه و هرچی توی یک خط برنامه هست رو میخونه، به یک تابع میفرسته و بعد عملیات رو روش انجام میده. برای مثال عبارت ۲ + ۲ رو در نظر بگیرید، این عبارت از ۳ کاراکتر تشکیل شده، ۲ و ۲ و +. این رو که به مفسر بدید، میفهمه که باید ۲ و ۲ با هم جمع شن و جواب بشه ۴ (یا شایدم ۵ 😀 ). ولی این کار چطوری توی مفسر اتفاق میفته؟ کد زیر توی روبی بهتون میگه :
a = "2 + 2"
a = a.split(' ')
sum = 0
for i in a
sum += i.to_i
end
puts sum
توجه کنید که این کد بسیار کوتاه شده و اصولا منطق زبان درش رعایت نشده. ولی خب برای توضیح، کار راه اندازه. در خط اول، رشته ۲+۲ رو توی متغیر a ریختیم و بعدش توی یک آرایه قرارشون دادیم. دقت کنید که اینجا فاصله بسیار اهمیت داره ! چرا که جداسازی درون آرایه کاملا به فواصل وابستس. بعد از اون، اومدم یه متغیر ایجاد کردم به اسم sum و مقدارش رو صفر قرار دادم. بعد توی یک حلقه، تمام اعضای آرایه رو به عدد صحیح تبدیل کردم و بعد ریختم توی sum . به این شکل، عملیات جمع رو به زبان برنامه سازی فهموندیم. حالا برای بهتر شدن زبان، باید کلاس و تابع و … بنویسیم. وقتی نسخه جدید WENT رو نوشتم سعی میکنم اینجا در موردش یک مطلب کوتاه بنویسم.
موفق باشید 🙂
درود
من گیج شدم. از عنوان اینطور برداشت کردم که قراره از پایه یک زبان رو طراحی کنیم. اما چیزی که در ادامه گفتید مثل آموزش یک زبان برنامه نویسی هست. خب باز اون پایین تر چه اتفاقی می افته که زبان، متغییرها رو تشخیص میده ؟ یا این زبان قراره نحوش رو چطور از بقیه زبان ها متمایز کنه ؟ فکر کنم چیزایی مثل این موارد از پایه یک زبان جدید رو بسازن. اینطور نیست ؟
درسته. ولی توی مطالبم نهایت به این میرسیم که چطور چن تا عملیات ساده رو با زبانمون انجام بدیم. خود منم نو آموزم 🙂 و دارم یاد میگیرم.
برای نوشتن یک برنامه که یک عبارت ساده جمع و منها و ضرب رو محاسبه کند شاید به صد ها خط کد نیاز بشه
در حالی که می شه این کار خیلی راحت با ده خط با
BISON و FLEX انجام داد.
دقیقا 🙂
وای کار سختی در پیش دارم…
سلام
ممنون بابت آموزش تون
ولی من که گیج شدم
چطور مثلا به زبان یا کامپایلری بفهمانیم که چطور مثلا کدی تایپ شد فلان کار رو بکن؟
اگر میشه راه ارتباطی دیگه ای مثل ایمیل یا تلگرام بپرسم چون طولانین و اینجا نمیشه
آموزشهای موجود در osdev.org رو بخونید، اونجا توضیح داده شده.