پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر
نظر شما رو به این نکات جلب میکنم: (البته اینا یک سری نکته هستن. هنوز جمع بندی شون نکردم)
1- قبلا میخواستم بخاطر توسعه و نگهداری پروژه های مبتنی بر میکرو کنترلر از یک زبان مشترک استفاده کنم. مثل #C اما بعلت اینکه ساختار پایه زمان اجرای این زبان بشدت پیچیده بود منصرف شدم. روی جاوا سوئیچ کردم. اما جاوا هم با اینکه کد کوچکی تولید میکرد که به نسبه میشد روی میکرو های متفاوت اجراش کرد ولی در نهایت خلاصه سازی به این مشکل بر خوردم که خیلی جاها نمیشه بین یک عدد و رفرنس حافظه تفاوتی قائل شد. و این به نحوه تولید کد جاوا برمیگرده. یعنی باید یک آنالایزر برای کد تولید شده توسط کامپایلر نوشت که خودش منجر به تولید یک سری کد های بالاسری میشد. و البته نیاز های من رو هم رفع نمیکرد. ولی من حیث المجموع کد جاوا از همه بهتره.
2- در دات نت یک مدل برای کد اسمبلی پیش بینی شده که بهش قدرت میده وگرنه این دو خیلی فرقی با هم ندارن. مثلا فرض کنین در هر لحظه عددی که در eval stack نگهداری میشه در جاوا مشخصه چون دستورات تفکیک شده ای داره ولی در دات نت به نوع کلاس مورد بخث بستگی داره. ضمنا یک مورد مهمی که هست من میخواستم روی یک میکرو با حداقل میزان امکانات هم کد هام براحتی اجرا بشه و این طلب میکرد که کد نهایی بشدت اپتیمم بشه. یعنی نمیشه انتظار داشت برای همه میکرو ها یک کد مشخص تولید بشه. یک مورد این رو میشه در دستور add دید. این دستور کاری نداره که شما دارین 2 عدد 8 بیتی رو جمع میکنین یا 64 بیتی.
3- یکی از قدرت های این تیپ زبونها استفاده از حافظه مجازی به همراه memory compaction هست. بدون این ها و ایضا مواردی مثل exception handling که یک ساختار high level هست پیاده سازی این طرح هیچ gain خاصی نداره.
4- توصیه میکنم معماری لایه ای رو استفاده کنین و بخش GUI رو از بخش عملیاتی جدا کنین.
5- راجع به سخت افزار حجم فلش و رم و ایپرام و mmc و غیره خیلی ممکنه در کد تولید شده نقش پیدا کنه. الان پروژه ای که من دارم باید با 64 کیلو بایت رم کل کارهام راه بندازم و این برای پروژه من یعنی مصیبت. در یک ساختار 8 بیتی؛ یک متغیر محلی از نوع بایت فقط یک بایت جا میبره ولی در یک ساختار 32 بیتی چهار بایت چون قراره اینها در پشته نگهداری بشن. تازه مواردی مثل alignment هم باعث دردسره. مثلا در ARM اگر یک int32 رو در آدرسی که قابل تقسیم به 4 نیست قرار بدین برنامه تون اجرا نمیشه. ولی در یک 80486 یا AVR اینطوری نیست.
6- یک مورد مهم در این سری طرح ها کم کردن مشکلات برنامه نویس و افزایش ضریب امنیت کد تولید شده هست. اگر قرار باشه که هزار اما و اگر جلوی پای برنامه نویس بذاریم که چه کاریه. سورس ها ی کتابخانه ها رو به زبان اصلی مثلا C نگهداری میکنیم و میذتریم خود کامپایلر در لحظه نهایی تولید کد زحمتش رو بکشه.
7- اشکالات زمان اجرا بسیار مهم هستن. و باید بشه با حداقل سرباری مشکل رو کشف و حل کرد. اینجا یک میکرویی داریم که ممکنه یک 8051 باشه با فرکانس 12 مگا هرتز (سرعت حدود یک MIPS یا کمتر) ضمنا یک سیستم Embedded داریم آماده میکنیم. ممکنه در یک لحظه بحرانی فرصتی برای کشف و مدیریت خطا هم وجود نداشته باشه. چون بحث میکرو ثانیه ها وسط هست. معمولا هم اپراتوری وجود نداره که بخواد پیغام خطا رو مشاهده کنه.
بگذریم... دیگه دارم جوش میارم.
نظر شما رو به این نکات جلب میکنم: (البته اینا یک سری نکته هستن. هنوز جمع بندی شون نکردم)
1- قبلا میخواستم بخاطر توسعه و نگهداری پروژه های مبتنی بر میکرو کنترلر از یک زبان مشترک استفاده کنم. مثل #C اما بعلت اینکه ساختار پایه زمان اجرای این زبان بشدت پیچیده بود منصرف شدم. روی جاوا سوئیچ کردم. اما جاوا هم با اینکه کد کوچکی تولید میکرد که به نسبه میشد روی میکرو های متفاوت اجراش کرد ولی در نهایت خلاصه سازی به این مشکل بر خوردم که خیلی جاها نمیشه بین یک عدد و رفرنس حافظه تفاوتی قائل شد. و این به نحوه تولید کد جاوا برمیگرده. یعنی باید یک آنالایزر برای کد تولید شده توسط کامپایلر نوشت که خودش منجر به تولید یک سری کد های بالاسری میشد. و البته نیاز های من رو هم رفع نمیکرد. ولی من حیث المجموع کد جاوا از همه بهتره.
2- در دات نت یک مدل برای کد اسمبلی پیش بینی شده که بهش قدرت میده وگرنه این دو خیلی فرقی با هم ندارن. مثلا فرض کنین در هر لحظه عددی که در eval stack نگهداری میشه در جاوا مشخصه چون دستورات تفکیک شده ای داره ولی در دات نت به نوع کلاس مورد بخث بستگی داره. ضمنا یک مورد مهمی که هست من میخواستم روی یک میکرو با حداقل میزان امکانات هم کد هام براحتی اجرا بشه و این طلب میکرد که کد نهایی بشدت اپتیمم بشه. یعنی نمیشه انتظار داشت برای همه میکرو ها یک کد مشخص تولید بشه. یک مورد این رو میشه در دستور add دید. این دستور کاری نداره که شما دارین 2 عدد 8 بیتی رو جمع میکنین یا 64 بیتی.
3- یکی از قدرت های این تیپ زبونها استفاده از حافظه مجازی به همراه memory compaction هست. بدون این ها و ایضا مواردی مثل exception handling که یک ساختار high level هست پیاده سازی این طرح هیچ gain خاصی نداره.
4- توصیه میکنم معماری لایه ای رو استفاده کنین و بخش GUI رو از بخش عملیاتی جدا کنین.
5- راجع به سخت افزار حجم فلش و رم و ایپرام و mmc و غیره خیلی ممکنه در کد تولید شده نقش پیدا کنه. الان پروژه ای که من دارم باید با 64 کیلو بایت رم کل کارهام راه بندازم و این برای پروژه من یعنی مصیبت. در یک ساختار 8 بیتی؛ یک متغیر محلی از نوع بایت فقط یک بایت جا میبره ولی در یک ساختار 32 بیتی چهار بایت چون قراره اینها در پشته نگهداری بشن. تازه مواردی مثل alignment هم باعث دردسره. مثلا در ARM اگر یک int32 رو در آدرسی که قابل تقسیم به 4 نیست قرار بدین برنامه تون اجرا نمیشه. ولی در یک 80486 یا AVR اینطوری نیست.
6- یک مورد مهم در این سری طرح ها کم کردن مشکلات برنامه نویس و افزایش ضریب امنیت کد تولید شده هست. اگر قرار باشه که هزار اما و اگر جلوی پای برنامه نویس بذاریم که چه کاریه. سورس ها ی کتابخانه ها رو به زبان اصلی مثلا C نگهداری میکنیم و میذتریم خود کامپایلر در لحظه نهایی تولید کد زحمتش رو بکشه.
7- اشکالات زمان اجرا بسیار مهم هستن. و باید بشه با حداقل سرباری مشکل رو کشف و حل کرد. اینجا یک میکرویی داریم که ممکنه یک 8051 باشه با فرکانس 12 مگا هرتز (سرعت حدود یک MIPS یا کمتر) ضمنا یک سیستم Embedded داریم آماده میکنیم. ممکنه در یک لحظه بحرانی فرصتی برای کشف و مدیریت خطا هم وجود نداشته باشه. چون بحث میکرو ثانیه ها وسط هست. معمولا هم اپراتوری وجود نداره که بخواد پیغام خطا رو مشاهده کنه.
بگذریم... دیگه دارم جوش میارم.
دیدگاه