طراحی کامپایلر (تبدیل یک زبان سطح بالا به MIPS assembly)

compiler

#1

سلام
برای یه پروژه دانشگاهی باید یه کامپایلر بنویسم که یه نمونه کد ساده از یه زبان سطح بالا مثل c++ یا java بگیره و تبدیل کنه به assembly
خیلی قرار نیست کد داده شده پیچیده و شامل توابع خیلی زیاد (شاید حتی تابع هم نداشته باشه) و حلقه های تو در تو و … باشه
فقط کافیه برای نمونه کد سطح بالای ساده شامل چند if و تعریف متغییر و یه نمونه حلقه مثل while کار کنه
از اونجایی که تا حالا کاری مشابه این انجام ندادم ممنون میشم اگر اطلاعاتی دارین با من به اشتراک بزارین و یه جورایی یه Road map بهم بدین که بدونم از چی باید شروع کنم و چه کار باید بکنم
زبانایی که میتونم باهاشون بنویسم Python, Java, cpp هست
محدودیت زبان نداره اما من با این سه زبان در حال حاظر کار میکنم
برای زبان کدی که قراره تبدیل بشه هم محدودیت خاصی نداره میتونه هر زبان سطح بالایی باشه (c++ هم سطح بالا در نظر گرفته شده)


#2

فکر نمیکنم هیچکدوم از ما تجربه‌ی همچین کای داشته باشیم و توی درک مطلبی که شما میگید یه کم مشکل دارم.
با python میخواید یه کامپایلر بسازید؟؟؟؟ اونوقت باید کد java رو تبدیل کنه به اسمبلی؟؟؟؟

این اولین باره که یه چیزیو تا این حد نمیتونم درک کنم :grin:


با پایتون که نمیشه کامپایلر ساخت. این بدبخت، خودش هم کامپایل نمیشه :grin:
چیزی مثل java خودش به باینری تبدیل نمیشه و روی ماشین مجازی جاوا داره اجرا میشه. واقعا نمیدونم چطور میشه اینو تبدیل کرد به باینری!
از طرف دیگه فرمودید که میخواید تبدیل کنید به اسمبلی! اینکه اسمش «کامپایلر» نمیشه. بهش میگن «اسمبلر».


اگه درست فهمیده باشم میخواید اینکارو انجام بدید:

  • یه برنامه بنویسید که یه فایل تکست دریافت کنه
  • فایل تکست، نحوه‌ی نوشتن شدن دیتاش شبیه سینتکس یکی از زبانهای مطرح باشه (نه دقیقا کد اون زبان با لایبرریهاش!!! پردازش همچین چیزی فقط از عهده‌ی سازنده‌های اون زبون بر میاد)
  • از روی اون فایل خونده بشه (با regex مثلا) و هر قسمت کد از روی یه دیتابیس یا یه همچین چیزی، معادل اسمبلیش توی یه فایل دیگه نوشته بشه.

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

من با اسمبلی کد زدم (ولی نه تا این حد). انجام پروژه‌ی متاپروگرامینگ با اسمبلی میتونه یه لشکر برنامه نویس رو به خودکشی برسونه :grin:


#3

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

با MّIPS آشنایی ندارم اما خوب مفاهیم شبیه هم هستند و فقط کافیه کد مشاین یه سری عملگر اولیه رو بدونی و همینطور ساختار باینری های MIPS که مطمئنم که تو درستون بوده


#4

کامپایلر معمولا از قسمت های زیر تشکیل شده
Tokenizer کد تبدیل به واژه های جدا تقسیم می‌کند
Parser
واژه هارو به فرمان ها دسته بندی می‌کند اکثرا به شکل abstract syntax tree
Interpreter
که فرمان اجرا میکنه

همین طور که @lxsameer عزیز گفت برای این کار فوق العاده است
یکی از بهترین کتاب ها برای این موضوع (معروف به کتاب اژدها )

و یک کتاب ساده تر


#5

YACC yet another compiler-compiler رو ببینین. مخصوص این کار هست. کافی هست قوانین زبان رو بهش بدین و تمام فایل های مورد نیاز رو براتون تولید می کنه. کد قابل اجرا هم براتون می سازه.

اگر بگردید می تونین mini-java یا mini-pascal (یادش بخیر) یا زبان های دیگه رو پیدا کنین.

کامپایلر-کامپایلرهای دیگه ای هم هستن که خروجی غیر از جاوا تولید می کنن.