اطلاعیه

Collapse
No announcement yet.

یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #16
    پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

    دیگه این بحث ها داره کم کم رنگ و بوی دعوا به خودش میگیره. این یکی دیگه پست آخریه. اما بنظرم ذکر چند تا نکته خالی از لطف نیست:

    opcode جاوا نوع داده ای وجود دارد به نام refrence

    من باب اطلاعتون این مفهوم رفرنس بطور فیزیکی همون اشارهگر خودمونه. (حاضرم با مشاهده کد تولیدی جاوا و #C نشونتون بدم) اما از لحاظ منطقی با اشاره گر فرق میکنه. پس با این حساب شما همه زبونهای اسمبلی شی گرا هستن. که اینطوری نیست. اصلا یکی از مواردی که MSIL ایجاد شد شق شی گرا بودن زبان اسمبلی پایه نسبت به زبونهایی مثل جاوا هست.

    نه اصلا منافات ندارد، مثل این می مونه بگید چون شترمرغ نمی تواند پرواز کند پس کل پرندگان نمی تواند پرواز کنند
    اتفاقا من منظورم اینه که چون شما قید میکنین "همه میکروها" توصیفتون از این طرح ایراد داره. نه خود طرح و این با طرز تلقی شما از حرف من منافات داره. شما میگین که همه پرنده ها میپرن؛ و من هم نتیجه گیری میکنم که پس شتر مرغ هم باید بپره. که همه میدونن اینجوری نیست.

    چون یک دستور سرعت زیادی برای پیاده سازی در این میکرو می خواهد پس کل دستورات سرعت زیادی برای اجرا در میکرو می خواهد
    اتفاقا حرف من سر همینه! من اصلا کاری به "کل میکروها" و "همه امکانات بطور مشترک" برای میکرو ها ندارم. مسئله مهم اینجاست که کم کم به این نتیجه دارین میرسین که این طرح اونجوری که خودتون قید کرده بودین "در این طرح قرار این کامپایلر نوشته شود که در آن بتوان تمام میکروهای موجود را ساپورت کنه و از تمام زبانها نیز پشتیبانی کند" اصلا طبق یک اصل و نظر ثابت امکانپذیر نیست چون امکانات میکروها و نیاز هایی که ما را به سمت یک میکرو سوق میدهند و کلا موارد استفاده این میکروها شدیدا با هم متفاوته. از 4 بیتی بودن تا 32 بیتی بودن گرفته تا امکانات سخت افزاری و گرید سرعتی و غیره. بنا براین مواردی از نوع سخت افزار و آدرس حافظه و موارد فیزیکی دیگه فقط راه رو مشکل و خاص میکنه که با طرح اولیه شما منافات داره. از طرف دیگه اگه بخوایین این موارد رو هم از این طرحتون حذف کنین که چه مزیتی نسبت به یک زبون مثل جاوا یا MSIL با یک cross JIT compiler هست؟ چه چیز جدیدی قراره وسط بیاد. اینو تاکید میکنم که من جاوا رو در این مدارک نه اون زبان سطح بالایی که میتونین کلاس و شی تعریف کنین حساب میکنم. بلکه منظور من همون زبون سطح پایینی هست که pcode خونده میشه و کامپایلر های جاوا سورس جاوا رو به اون تبدیل میکنن. من میتونم تمام این کارهایی که شما میگین رو با همون جاوا یا زبونهای دیگه موجود و غیر موجود انجام بدم. ضمنا جاوا این حسن رو هم داره که خیلی از میکروهای داخل بازار بطور سخت افزاری از این زبون پشتیبانی میکنن. مثلا اینو ببینین:

    http://en.wikipedia.org/wiki/ARM_architecture
    و در متن برای Jazelle جستجو کنین:

    Jazelle is a technique that allows Java Bytecode to be executed directly in the ARM architecture as a third execution state (and instruction set)

    یعنی که این طرح قبلا ایجاد شده. یا لااقل عمده اش. شما فقط کافیه یک مجموعه نرم افزار آماده کنین که شامل یک Framework یک cross JIT compiler که کد نهایی رو از روی کد اولیه تولید کنه. و یک سری آت و آشغالهای دیگه برای استفاده راحتتر از این محیط برای کاربر ایجاد کنین. نه یک زبون اسمبلی پایه.

    اینجوری بگم. من با اسمبلی و ساختار داخلی خیلی ماشین ها آشنایی دارم. اسپکتروم - آمیگا - 68000 - Z80 - 80386 - AVR - ARM - ZE02 و غیره. حتی مدتی روی ساخت یک PLC مدل S5 زیمنس کار کردم و کلی راجع بهش اطلاعات دارم. نهایتا: طرح جنابعالی چیز قشنگیه. میتونین بقول یکی از دوستان 4 موتوره هم جلو برین. اما نهایتا حیف از این همه سعی و تلاش چون میبینین که ابزار های موجود اغلب دیدهای شما رو پیاده سازی کردن و همه هم دارن استفاده میکنن و متاسفانه شما این وسط وقتتون رو تلف کردین. میدونم این لفظ یک کمی تنده ولی بهتر از این نمیتونم منظورم رو بیان کنم.....
    بگذریم....
    از اینکه احیانا باعث رنجش شما ممکنه شده باشم معذرت میخوام. ولی اینو بدونین که این چیزایی رو که براتون قید کردم به هیچ عنوان برای مایوس کردنتون نیست. من خودم به این اعتقاد دارم که خیلی از چیز های جدیدی که داریم و بشر اختراع یا ابداع کرد مبتنی بر نظراتی بوده که حتی در وهله اول دیوانگی محض بنظر میومده. و ضمنا هر سعی و تلاشی برای ایجاد پیشبردی در هر کاری قابل تحسینه. جلو برین. اما با چشم باز و گوش شنوا نسبت به چیزایی که بدردتون میخوره. با چشم بسته و گوش نا شنوا نسبت به افراد و چیزایی که قراره تاثیری ولو اندک در مسیر مایوس کردنتون (و نه روشنایی بیشتر) داشته باشن.

    دیگه بریدم!
    خدا حافظ.
    (ولی خودمونیم ها! چه توی این بحث پا کار بودین!!)

    دیدگاه


      #17
      پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

      رضا آقا این حرف نزنید من باز منتظر تاپیک های شما در این بحث هستم ، لطفا من رو تنها نزارید
      من هم قبول دارم که بحثها یه کم به حاشیه کشیده شده اما این دلیل نمی شه شما من رو تنها بزارید (من گناه دارم :cry . طرح الان من از چیزی که در تاپیکهای اولیه نوشتم کمی متفاوت است و کمی پخته تر شده است (از برکات وجود شما) اما عنوانی که از اول مطرح کرده بودم به نظرم هنوز می تواند اجرایی شود یعنی "در این طرح قرار این کامپایلر نوشته شود که در آن بتوان تمام میکروهای موجود را ساپورت کنه و از تمام زبانها نیز پشتیبانی کند" (پخته تر شده و این اضافه شده: هر میکرویی با توجه به امکاناتش می تونه از این کامپایلر استفاده کنه)"
      همونطور که قبلا گفتم این کار رو بخاطر علاقه ی شخصی که دارم انجام می دم و اگر این ایده پیاده بشه و حتی مورد استقبال کسی هم قرار نگیره و در مقابل کامپایلرها (یا تکنولوژیهای) دیگر اصلا قابل قیاس هم نباشه واسه خوده من به شخصه ارزش داره چون تونستم یکی از آرزوهامو به واقعیت تبدیل کنم.
      دیگه بریدم!
      به نظر من یا شما دارین چیزی رو بیان می کنید که من هرچی فکر می کنم متوجه اش نمی شم و تا در عمل اون رو لمس نکنم و درگیرش نشم درکش نمی کنم یا من چیزی رو بیان کردم که که باعث شده شما برداشت اشتباهی بکنید و اینطور روی مسئله خاص پافشاری کنید. برای همین اگه به من یه مدتی فرصت بدهید از تاپیک بعدی می خوام دیگه وارد کار عملی بشم. یعنی برم سراغ برنامه نویسی تو کامپیوتر. من از زبان vb.net استفاده خواهم کرد.
      ابتدا یک توضیح مختصر درباره طراحی کامپایلر میدم و بعد تک تک اجزای یک کامپایلر را مطالعه و طراحی می کنیم و یا از نرم افزارهایی که بدین منظور ایجاد شدند استفاده میکنیم تا این ایده به واقعیت نزدیکتر بشه و دقیقا دستون بیاد منظور من از به کار بردن یک کامپایلر برای همه میکروها چگونه است (ممکن است از برداشتی که شما از گفته های من کرده باشد متفاوت باشد)
      و در آخر استادی مثل شما باید صبور باشه و یادش باشه همیشه یک شاگرد خنگ اون ته مه های کلاس (مثل من ) پیدا میشه ، که هییییییچ چیز نوفهمه و
      امیداورم این جمله "این یکی دیگه پست آخریه "و کلمه "خدا حافظ." فقط شوخی باشه چون اگر قرار بود این راهی که من می روم با شما به یک انتهایی ختم بشه بدون شما مطمئنا به هیچ جا ختم نمی شه، لطفا من رو از دانشتون تو این راه بی بهره نزارید
      این داستان تازه شروع شده (تا الان پیش مقدمه اش رفته)
      هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

      دیدگاه


        #18
        پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

        از تاپیک بعدی وارد مسائل مربوط به مباحث برنامه نویسی برای کامپیوتر می شیم بهتر قبل از اون یه توضیح مختصر درباره طراحی کامپایلرها بدم
        ترجمه عبارت است از انتقال یک ساختار از یک زبان مبدا به زبان دیگر که به آن زبان مقصد می گویند. اگر زبان مبدا زبان سطح بالا مثل پاسکال و یا زبان میانی مثل زبان C باشد زبان مقصد یک زبان سطح پایینی نظیر زبان اسمبلی یا زبان ماشین باشه ، چنین مترجمی را کامپایلر می نامند. مفسر نیز همانند کامپایلر می باشد با این تفاوت که بجای یکجا ترجمه نمودن برنامه مبدا (مانند کامپایلر) هر دستورالعمل را بطور انفرادی ترجمه و اجرا می کند.
        هر چند کامپایلر و مفسر هر دو مترجمی اند که برنامه ورودی به آنها زبان سطح بالا ترجمه می کنه، اما چون کامپایلر برنامه مبدا را بطور یکجا به برنامه مقصد که به زبان ماشین یا اسمبلی است ترجمه می کنه ، ما برنامه به زبان ماشین یا اسمبلی داریم ولی با بهره گیری از مفسر چیزی به نام برنامه به زبان ماشین به وجود نمی آید.
        در کل برای تست و دیباگ کردن برنامه از مفسرها و برای ایجاد یک فایل قابل اجرا به زبان ماشین از کامپایلرها استفاده می شود.
        و اگر مترجمی زبان اسمبلی را به زبان ماشین ترجمه کند به آن اسمبلر می گویند.
        ساختار متعارف یک کامپایلر
        ساختار متعارف کامپایلر از مولفه های تحلیگر لغوی،تحلیلگر نحوی، تحلیلگر معنائی ، مولد کد میانی، بهینه ساز، مولد کد نهایی، جدول نمادها و خطا گردان تشکیل می گردد

        این ساختار یک ساختار کلی و متعارف که می تواند چند قسمت در یک گذر (به هر یک از این عملیات که درون مستطیل نشان داده شده گذر می گوییم) انجام شده یا یک قسمت به چند گذر تقسیم شود. به مراحل (گذرهای) قبل از کد میانی جلو بندی و مراحل بعد از کد میانی عقب بندی می گویند.
        1- تحلیلگر لغوی
        در مرحله تحلیل لغوی که اولین مرحله از مراحل کامپایلر می باشد، تک تک کاراکترها از ورودی خوانده شده و کاراکترهایی که به هم مرتبط هستند را در یک گروه جای داده، به طوری که به طور منطقی قابل تجزیه نباشند که به آنها توکن می گویند. این گروه ها در دو گروه کلی توکنهای واژهای کلیدی (مانند if، dim و .. برای زبان VB) و شناسه ها (شامل اسم مانند N،Var ،Here ، ثابتها ، عملگردهای مانند +، -، ..و نمادهای کاربردی مانند پرانتز باز و بسته)( و ...)تقسیم می شوند.
        در

        مثلا if var=10 then Print ”NUmBER10” ‘print number10 if var=10
        در متن بالا 7 توکن وجود دارد.اگر متن بالا را به یک تحلیلگر لغوی بدهید سعی می کند که واژهای کلیدی و شناسه ها (با تفکیک نوع شناسه ها) ، شناسه اسم (هر نوع داده ای از جمله اسم متغیر ، اسم تابع، برچسب،هر نوع، اسم معتبر، ... شناسه محسوب می شود)، اعداد ، جدا کننده ها (مثل عملگردهای محاسباتی،منطقی، کاما، و ...)، رشته های ثابت را از هم در جمله تشخیص داده و به صورت آرایه ای ذخیره و یا بعد از تشخیص به مرحله بعد بدهد.
        هر توکن را معمولا به دو بخش تقسیم می شود که یکی نوع توکن و دیگری مقدار آن را نگه می دارد و برای شناسه ها اسم، اعداد و رشته ثابت اولی نوع توکن و دیگری آدرسی است که در جدول نمادها ذخیره شده است. این جدول توسط گذرهای بعدی تکمیل شوند ، مثلا نوع شناسه معلوم گردد ، آیا متغیر ، برچسب، تابع، .. یا عدد ثابت چه نوع عددی ، صحیح، اعشاری (با توجه مکان و کاربرد عدد)

        در مثال بالا چنین آرایه ای از توکنها خواهیم داشت
        واژهای کلیدی ، "if"
        شناسه اسم ، 0(آدرس در جدول)
        جداکننده،”=”
        عدد ثابت،1(آدرس در جدول)
        واژهای کلیدی ، “then”
        واژهای کلیدی ، “print”
        رشته ثابت،2 (آدرس در جدول)
        قسمت ‘print number10 if var=10 نیز در نظر نمی گیرد چون که توضیح است و برای خوانایی بیشتر برنامه به کار برده می شود و کاربردی در ترجمه ندارد
        واژهای کلیدی که نیاز و جدا کنندها که نیاز به توصیف بیشتر ندارند توسط مقدارشان تعریف می شوند (به جای آدرس در جدول)
        کشف خطاهای مربوط به ساختار تک تک لغات نیز وظیفه تحلیلگر لغوی است. مثلا در اکثر زبانها اولین حرف یک شناسه اسم نباید عدد باشد در غیر این صورت خطا ایجاد می شود مثل 7segment یک شناسه معتبر نیست و یا اعداد اعشاری فقط باید دارای یک نقطه اعشاری باشند و در صورتی که دو نقطه بین اعداد باشد این خطاست و شناسه معتبر نیست و ..
        برای روشن شدن هر چه بیشتر کارکرد تحلیلگر لغوی از یک مثال ساده استفاده می کنیم. فرض کیند جمله ذیل را می خواهیم از زبان انگلیسی به فارسی ترجمه کنیم
        @aq)ewr %tywqe56 47ewitn 472hmmj
        واضح است که هیچ مترجمی قادر به ترجمه جمله فوق نیست زیرا تک تک لغات نشان می دهد که هیچ یک از دنباله کاراکترها، یک لغت معتبر در زبان انگلیسی نیست.
        2- تحیلیگر نحوی
        پس از تشخیص توکنها توسط تحلیلگر لغوی به قسمت تحلیلگر نحوی ارسال می شود در این بخش متن نوشته شده را از لحاظ ساختار آن زبان برنامه نویسی تعریفی بررسی می کند آیا درست است در واقع تحلیلگر نحوی بررسی صحت و درستی ترتیب لغات برنامه مبدا را انجام می دهد
        بعنوان مثال فرض کنید می خواهیم جمله زیر را که به زبان انگلیسی است به زبان فارسی ترجمه کنیم
        Am Are then is you I do
        درسته که تک تک لغات دارای معنی در زبان انگلیسی می باشند اما باز نمی توانیم این جمله را ترجمه کنیم زیرا در یک زبان انگلیسی دارای ساختار دستوری زیر می باشیم
        مفعول فعل فاعل
        که در جمله بالا رعایت نشده است
        کلیه مثالای که می زنم برای قواعد زبان VB
        در یک عبارت سمت راست یک مساوی فقط باید یک شناسه اسم قرار بگیرد در غیر این صورت یک خطاست
        A B=C+10
        یا مثلا در زبان vb بعد از دستور if باید یک عبارت قرار گیرد و سپس واژه کلیدی then و بعد یک عبارت یا عبارات دیگر و در پایان end if
        یا بعد از یک پرانتز باز ( یک عبارت قرار می گیرد سپس پرانتز بسته )
        و خروجی یک درخت تجزیه شده جمله است که تک تک اجزای جمله را تشخیص داده شده است و ترتیب آن تایید شده است و آماده برای رفتن به قسمت بعدی برنامه است.
        3- تحلیلگر معنایی
        بزارید دوباره از مثال ترجمه به زبان فارسی را دوباره تکرار کنیم.
        I run water
        علیرغم این که این جمله از نظر لغوی صحیح است (یعنی تک تک لغاتش در زبان انگلیسی مجازه) و از نظر نحوی نیز صحیح است ولی این جمله قابل ترجمه نیست و از نظر معنایی معنی ندارد ( من آب را دویدم)
        زبان های برنامه سازی از قواعد زیادی جهت تامین نیازمندیها برخوردارند که بمراتب فراتر از قواعد لغوی و نحوی می باشند. چنین قواعدی قواعد معنایی نام دارند.مثلا در زبان پاسکال هر دو طرف یک دستور انتسابی (=) از نوع سازگاری نسبت بهم برخوردار باشند.
        مرحله تحلیل معنایی مهترین مرحله از فرآیند کامپایل کردن می باشد. در این مرحله ساختارهای معنایی که توسط تحلیلگر نحوی مشخص شده اند مورد پردازش قرار گرفته و ساختار کد میانی شکل می گیرد.
        عملکرد واقعی تحلیلگر معنایی با توجه به نوع زبان و سازمان منطقی کامپایلر متفاوت می باشند ولی عملیات زیر را می توان از متداول ترین عملیات یک تحلیلگر معنایی دانست

        • نگهداری جدول نمادها
        جدول نمادها جهت هر شناسه موجود در داخل برنامه یک آدرس دارد . تحلیلگر معنایی مسئولیت تکمیل اطلاعات لازم برای هر شناسه را بر عهده دارد . تحلیلگر معنایی این اطلاعات را هنگام پردازش اعلانها، سرآغازهای زیربرنامه ها و دستورهای برنامه وارد جدول نمادها می نماید.
        • درج اطلاعات ضمنی
        در بعضی مواقع در برنامه مبدا اطلاعات حالت ضمنی دارند و لازم است در برنامه مقصد سطح پایین بصورت صریح بیان گردند.غالبا این اطلاعات ضمنی به قواعد پیش فرض مربوط می گردند، مثلا چنتنچه نوع متغیر در زبان فرتون بصورت صریح اعلان نشود طبق پیش فرض اگر اولین کاراکتر نام متغیر یکی از حروف I,J,K,L,M,N باشد آن متغیر یک متغیر صحیح می باشد در غیر اینصورت متغیر اعشاری محسوب می شود.
        • کشف خطا
        تحلیلگر نحوی و معنایی باید برنامه های درست و نادرست را پردازش نمایند. در هرجایی ممکن است تحلیلگر لغوی یک عنصر لغوی را به تحلیلگر نحوی بفرستد که مناسب نباشد،مثلا اعلانی در بین دنباله ای از دستورها باشد یا نماد عملگری به جای شناسه ای قرار گرفته باشد. خطا ممکن است نشانگر وجود یک مغییر صحیح بجای متغیر اعشاری باشد و یا نشان دهنده استفاده از دو اندیس یا شاخص بجای سه اندیس در آرایه ای که به صورت سه بعدی اعلان گردیده است. در هر مرحله از کامپایل خطاهای گوناگونی ممکن است تشخیص داده شوند. تحلیلگر معنائی علاوه بر اینکه باید خطاها را مشخص و گزارش نماید ترتیبی اتخاذ نماید که تحلیلگر نحوی به کارش ادامه دهد.
        • پردازش ماکرو و عملیات زمان ترجمه
        هر چند تمام زبانها حاوی ویژگی ماکرو یا ماکرو یا دستور کلان نیستند و عملیات زمان ترجمه را ندارند، اما چنانچه زبانی در برگیرنده آنها باشد پردازش آنها یکی از مسئولیتهای تحلیلگر معنایی می باشد.
        • تبدیل نوع
        عملیات جمع برای اعداد صحیح و اعشاری متفاوت است برای انجام عمل جمع باید عملوندهای، عملگر از یک نوع باشند به همین جهت تحلیلگر معنایی عمل ارتقا نوع را انجام می دهد.
        • بررسی تعریف دوباره متغییر
        تحلیلگر معنایی بررسی می کند تا هیچ متغیری دوبار تعریف نشده باشد.
        4- جدولهای نمادها و خطاگردانها
        دو مولفه وجود دارند که نقشهای خیلی متفاوتی نسبت به مولفه های دیگر مسیر جوی واره اصلی داده ها دارند. هر دوی آنها با تعدای از اجزای مختلف کامپایلر در تعامل هستند و هیچکدام از این دو مولفه در واقع برنامه مبدا را در جریان عبور از مولفه های مختلف کامپایلر پردازش نمی نمایند.
        اولین مولفه یک جدول نمادها می باشد. هدف اصلی از اینگونه جدول ها جهت ذخیره سازی نامها یا شناسه هایی است که در یک برنامه مبدا با آنها برخورد شده است و همچنین اطلاعات شناسه ای یا صفات خاصه مربوطه به آنها می باشد.
        دومین مولفه یک خطا گردان می باشد. یک کامپایلر خوب باید بعد از یافتن اولین خطای برنامه سازی و گوشزد نمودن آن به کارش ادامه دهد و هر مولفه آن باید خطاهای برنامه را که با آن مواجه می شود گزارش نماید و سپس سعی بر آن داشته باشد که از مشکل موجود بحد کافی رهائی یابد به گونه ای که فرآیند کامپایل کردن با هدف یافتن خطاهای دیگر در برنامه ادامه یابد. این کار از طریق بهره گیری از مولفه خطا گردان تحقق می یابد.
        5- مولفه مولد کد میانی
        ساختمان داده های نقل و انتقال یافته مابین دو بخش تجزیه و تحلیل و ترکیب در یک کامپایلر نمایش کد میانی کد مبدا می باشد. این ساختمان داده ها حاوی کلیه اطلاعاتی است که کامپایلر قادر به جمع آوری یا استنباط در طی تجزیه و تحلیل می باشد. یک نزبان میانی خوب طراحی شده به میزان زیادی به نگهداری کارآمد و توسعه مداوم از طریق سهولت بخشیدن به یک درجه بالایی از استقلال نسبت به جلوبندی و عقب بندی کمک می نماید.
        این کد حداقل خواص ذیل را باید دارا باشد
        سهولت تولید کد: زبان ماشین منطقی تا حد امکان باید ساده در نظر گرفته شود تا تولید کد برای آن آسان باشد.
        سهولت ترجمه به زبان مقصد: زبان ماشین منطقی باید به گونه ای باشد که تبدیل آن به زبان ماشین آسان باشد.
        6- مولفه بهینه ساز کد
        کد مقصد تولید شده توسط یک کامپایلر می تواند خیلی بد باشد، بویژه اگر تولید کننده کد یا به یک روش مبتدی یا ناشنانه و یا به یک روش خاص نگر ساخته شده باشد. بهینه سازی یعنی اعمال تغییراتی در برنامه که بدون تغییر در عملکرد برنامه ، مصرف حافظه کاهش و یا سرعت اجرای برنامه ، افزایش یابد.
        7- مولفه مولد کد نهایی
        کار مولد کد نهایی، ترجمه نمایش میانی برنامه مبدا به کد بومی ماشین مقصد می باشد . این برنامه توسط اسمبلر به زبان ماشین ترجمه می شود.
        بگذارید یک مثال کلی برای مراحل کامپایلر بزنم

        مطالبی که ارائه شد برگرفته از کتاب اصول طراحی کامپایلرها نوشته مهندس جعفر پورامینی انتشارات پیام نور و کتاب طراحی کامپایلر نوشته ایرج دقی انتشارات ناقوس برداشته شده است (هرچند تغییرات جزئی داده شده است)
        هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

        دیدگاه


          #19
          پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

          تا اینجای کار من تحلیل لغوی و تحلیلی نحوی برنامه را با استفاده از دو نرم افزار Open Source ، به نام های AvalonEdit و GoldParser انجام داده ام و هنوز تحلیل معنایی و تبدیل برنامه برای میکرو AVR انجام نشده است. هدف از این تاپیک این است که بدانید من بیکار ننشستم و تلاش خودم رو می کنم هر چند این نرم افزار حتی برای تحلیل لغوی و نحوی هنوز ناقص است و جای کار دارد.
          لیست دستورات که قبلا اعلام شد به علاوه راهنماهای که در زیر آورده شده است را می توانید در برنامه استفاده کنید راهنماها تماما با . شروع می شوند

          .If
          .Then
          .ElseIf
          .Else
          .EndIf
          .End
          .Const
          .Var
          .Method
          .EndMethod
          .NameSpace
          .EndNameSpace
          .Include
          .Device
          .Macro
          .EndMacro
          .Region
          .EndRegion
          .CPMML
          .Imports
          .Error
          .Warning
          را در چند روز آینده توضیح درباره این فایل اجرایی به همراه سورس برنامه قرار خواهم داد
          توجه : این نرم افزار برای اجرا نیاز به FrameWork .Net 3.5 SP1 به بالا نیاز دارد و فایل اجرایی با نام CompilerMML.exe می باشد
          برای تحلیل لغوی و معنایی روی دکمه Parser در بالای صفحه کلیک کنید
          لینک دانلود نرم افزار
          http://telec.persiangig.com/Compiler...ompilerMML.zip
          راستی ، متاسفانه به قولی که قبلا داده بودم ( سعی می کنم تا اول دی یک نمونه بنویسم) نمی توانم عمل کنم و این کار به زمان بیشتری نیاز دارد، ببخشید :redface:
          هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

          دیدگاه


            #20
            پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

            میشه مزیت این نرم افزار رو نسبت به بقیه نرم افزار ها بگی

            اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

            دیدگاه


              #21
              پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

              یه چیز خیلی خیلی مهم اینجا جا افتاده. اگه مسئله زبونه. که زبون های خیلی زیادی موجود داریم. C و پاسکال - فرترن - جاوا - الگول - کوبول و خیلی های دیگه. زبان جدید شما چه نیازی رو برطرف میکنه که اونای دیگه نمیتونستن برطرف کنن؟ اگه مسئله نوشتن کامپایلری برای میکروهای متفاوته چرا با یک cross-compiler مربوط به تبدیل یک کدی مثل کد جاوا به میکروی مربوطه شروع نکردین. اگه منظور ایجاد یک Framework برای کارهای مرسوم هست چرا سراغ پیاده سازی کامپایلر رفتین؟

              میدونین همین کار رو با اون چیزی که مد نظرتون هست (یا بنظر میاد هست) رو میشه براحتی با یک برنامه کوچولو برای کار روی جاوا انجام داد؟ جسارتا نمیدونم چرا کار شما منو یاد یک گرداب میندازه که خودتون از ابتدا خالقش بودین و حالا خودتون هم اسیرش شدین!! پست آقای باقرانی رو دیدین؟ یه جواب بدین. چیزای قبلی رو کپی پیست نکنین. یه فکری بکنین و دوباره جواب بدین. من که این همه پستهاتون رو خوندم هنوز متوجه نشدم این همه انرژی صرف کردن قراره چه نفعی ایجاد کنه؟!!

              بعدش فکر کنم یه جایی یه چیزی میلنگه.
              در هر کاری باید اجزا به درستی انتخاب بشن تا بعدا دچار مشکل نشین. شما اسمبلی مینویسین یا یک زبان سطح بالا؟ اگر اسمبلیه که "متد" چکار میکنه؟ مگه نه اینه که یک متد در زبان اسمبلی فقط یک label هست؟ یا تعریف دیگه ای دارین؟ اصلا ببینم. دستور if شما چکار میکنه؟ قراره کد تولید کنه؟ این کد با اون کدی که در بدنه این دستور دیده میشه چه سنخیتی داره؟ منظورم اینه که در زمانی که شما کد jmp Next رو نوشتین باید حواستون باشه که ممکنه با دستورات بطور اتوماتیک تولید شده توسط زبون شما سیستم دچار مشکل بشه؟ اگه اینطوره که این اسمبلی حسن جالب توجهی نداره. اولا خودشو باید یاد گرفت (مثل زبون میکروی X) ثانیا تا بیاد باگ هاش برطرف بشه هی ممکنه revision بخوره و دوبار روزی از نو. بعدش باید منطق شو در هنگام برنامه نویسی یاد بگیرین. مثلا در 8051 و 8086 شما میتونین به راحتی با مقدار عددی صفر برای جمع و تفریق کار کنین. ولی در AVR این مقدار باید در یک رجیستر باشه. بیخود نیست WinAVR رجیستر r1 رو برای نگهداری مقدار صفر رزرو کرده. بعد زبونتون یه جورایی آدمو یاد لیسپ میندازه. من خودم لیسپ بلد نیستم اما بد بختی اینه که از میون کسایی که اتوکد بلدن کم کسی رو میشناسم که این زبون رو بلد باشه و بدتر از اون کم کسی رو میشناسم با این زبون راحت باشه. چرا؟ چون بر اساس یک پشته کار میکنه. درست عین کد شما.

              ldc.b 78
              این از دید یک بابایی که داره تازه شروع میکنه یعنی چی؟
              عدد 78 رو به عنوان یک بایت لود کن. کجا؟ توی evaluation-stack! اییی که گفتی یعنی چه؟ میدونین! خیلی پیش فرض ها هست که طرف باید بدونه و بفهمه تا بتونه با این زبون کد بنویسه. بیخود نیست که خود میکروسافتی ها هم با MSIL کد نمینویسن. یا جاوا کارها با pcode! چون سخته. چون احتمالا اصل مسئله رو باید فراموش کنه و مشکل شما رو حل کنه. چون کامپایلر رو برای اینجور مواقع نوشتن. چون اینا وظیفه ماشینه. چون شما خیلی راحت میتونین این ایده رو به نوعی دیگه پیاده کنین تا نه من بخوام برای یادگیری طرح شما وقت بذارم نه شما (ببخشید) وقتتونو روی این طرح تلف کنین. تازه مسئله اعتماده و حسن انجام کار و این طرح هیچ کدوم از این موضوعات رو در ذهن من تداعی نمیکنه. نمیدونم. لاید یه چیزی رو نمیفهمم. مهمترین مسئله اینه که آقای باقرانی گفت: "مزیتش چیه؟"
              اونی که هست. نه اونی که دلت میخواد باشه.

              دیدگاه


                #22
                پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

                میشه مزیت این نرم افزار رو نسبت به بقیه نرم افزار ها بگی
                فعلا که هیچ
                این یک پیش نمایش اولیه است از این نرم افزار که می تواند متنی که وارد کردید را از لحاظ ترتیب جملات چک کند که درست است یا نه تا اینجا همین و کار خاصی انجام نمی دهد.
                بهتر قبل از اینکه مزایای نرم افزاری که قرار است به مرور تکمیل شود را بگویم بهتر است یه مقدمه چینی کنم
                پروژه نهایی یک IDE است که بصورت بلوک دیاگرامی در شکل زیر می بینید
                محیط توسعه یا IDE محیطی است شامل ابزار که موجب سهولت کار توسعه و طراحی نرم افزار می شود
                بلوک دیاگرامی طرح نهایی


                اما همون طور که می بینید طرح خیلی خیلی بزرگه واسه همین یک بخش از طرح که پایه نیز است را جدا کردم تا روش کار کنم

                برای اینکه بتوانم روی این بخش کار کنم بهتر است که به بخشهای کوچکتر تقسیم بندی بکنم تا بتونم قدم به قدم طرح رو پیش ببرم
                طرحی بلوک دیاگرامی که به نظرم رسید تا بتوانم طرح رو پیاده سازی کنم در شکل زیر آمده است

                همونطور که میبینید من تازه اول راهم و این نرم افزار در واقع هیچ کاری انجام نمی دهد.
                این طرح اولیه دارای 3 بخش اصلی است که از همه مهمتر به طوری که می توان ریشه کل پروژه دانست قسمت زبان میانی ،که من اسم زبان میانی طرح رو گذاشتم MML. کل مطالبی که در این تاپیک تا الان نوشته شده است درباره این زبان میانی که چطور باشه و چطور نه باشه و ...
                فعلا تمرکز روی زبان میانی است که چطور کار کند چون نقطه عطفی که می تواند باعث تفاوت این نرم افزار (در آینده) با دیگر نرم افزارها شود همین زبان میانی است برای همین مزایایی که می تواند برای پروژه انجام دهد رو برای شما لیست می کنم فارغ از قسمتهای دیگر
                چیزای قبلی رو کپی پیست نکنین.
                ببخشید هر کاری کردم نتونستم کپی نکنم چون طرح هیچ فرقی نکرده است. اما فکر کنم مقدمه بالا کمی بحث رو باز تر کند

                نکته : بعضی از محدودیتها توسط خود میکرو انجام می شود مثلا استفاده از وسایل جانبی داخلی که درون میکرو وجود ندارد یا استفاده از ظرفیت میکرو بیش از اندازه و ... و این گونه محدودیتها نقص در طرح را بیان نمی کند.
                زبان میانی MML که قابلیت تبدیل شدن به زبانهای سطح بالا (مثل C و Basicو..( و سطح پایین (اسمبلی) با کمترین دستورات ممکن را می دهد. یعنی این زبان بگونه ای است که هم از قابلیتهای زبان اسمبلی و هم قابلیت انعطاف زبان سطح بالا بهره جسته است.
                تا جایی که امکان دارد به برنامه نویس قدرت برنامه نویسی بدون در نظر گرفتن نوع میکرو را می دهد.
                تبدیل از یک زبان سطح بالا به زبان سطح بالای دیگر را راحت تر می کند.
                کتابخانه هایی ایجاد شده در آن برای همه میکروها و همه زبانها قابل استفاده خواهد بود.
                مهاجرت از یک میکرو به میکرو دیگر را راحت تر خواهد کرد.
                ساختن شبیه ساز برای میکرو را راحتتر می کند.
                دسته بندی بهتر کتابخانه ها نسبت به زبان C به طوریکه بتوان با صرف کمترین زمان ممکن به کتابخانه مورد نظر خود دست پیدا کنید. و با صرف کمترین زمان ممکن بتوانید از آن استفاده کنید.

                زبان جدید شما چه نیازی رو برطرف میکنه که اونای دیگه نمیتونستن برطرف کنن؟
                این زبان جدید نیست همونطور که تا الان بحث شد این زبان از زبان MSIL یا همون IL ماکروسافت گرفته شده است و یکسری دستورات این زبان که برای کار در میکروکنترلرها مناسب نبود حذف شد و بجای آن دستوراتی که بنظرم لازم بود قرار داد شد مثل دستورات چرخش و تغییراتی که فکر میکنم این زبان نیاز داشت را انجام دادم (،مثل اضافه کردن سه بخش Ram، Flash و IO ،) که تا جایی که ممکن باشد به کمترین دستورات اسمبلی تبدیل شود.
                راهنماها
                راهنماها تبدیل به زبان اسمبلی نمی شوند و فقط بعضی از آنها برای تغییر مسیر کامپایل کردن و یا استفاده زمانی که بخواهد در یک زبان سطح بالا استفاده شود کاربرد پیدا می کند
                .method
                این راهنما قرار است که زمانی که فایل حاوی زبان میانی توسط کامپایلر زبان سطح بالا مثلا بیسیک خوانده می شود بتواند متدها را تشخیص دهد و نوع ورودی و خروجی را مشخص کند. اما در MML فقط نقش برچسب را بازی می کند. و برای نشان دادن پایان متد از راهنمای .endmethod استفاده می شود.
                .Var
                برای تعریف متغییر در یکی از مکانهای flash (که در واقع ثابت نه متغیر)،Ram،IO و یا Local استفاده می شود
                .Const
                برای تعریف ثابتها در کل برنامه استفاده می شود
                .NameSpace
                دوستانی که با .net کار کرده باشند با این واژه آشنا هستند.
                یکی از قسمتهای مهم چارچوب .NET کلکسیون عظیم کلاسهای آن است. در چارچوب .NET حدود 3500 کلاس در رابطه با موارد مختلف وجود دارد، اما سوال این است که چگونه به عنوان یک برنامه نویس می توانید کلاس مورد نظرتان را در بین کلاسها پیدا کنید؟
                کلاسهای موجود در چارچوب .NET به چندین گروه مختلف به نام فضای نام (NameSpace) تقسیم می شود که هر کدام از آنها حاوی چندین کلاس مرتبط به هم است. به این ترتیب اگر به دنبال کلاسی برای یک کار خاص باشید می توانید فقط کلاسهای داخل فضای نام مربوط را جستجو کنید.
                خود این فضای نامها نیز به صورت سلسله مراتبی هستند ، به این معنی که یک فضای نام خود نیز می تواند شامل چندین فضای نام دیگر باشد، که آنها نیز به نوبه خود کلاسهای داخل آن فضای نام را دسته بندی می کنند.
                حال از همین قضیه برای کتابخانه های که به زبان MML نوشته می شوند استفاده خواهیم کرد. و برای نمایش پایان فضای نام از راهنمای .EndNameSpace اسفاده می شود.
                .Imports
                برای برنامه هایی که در حال استفاده هستید برای اینکه نخواهید هر بار هنگام استفاده از متدهای یک کلاس در برنامه فضای نام را ذکر نکنید از این دستور .Imports استفاده می شود.
                به شکل اول این پست نگاه کنید اگر همچین فضای نامی تعریف شده باشدو بخواهید از lcd گرافیکی با کنترلر k108b استفاده کنید مثلا بخواهیم صفحه را پاک کنیم (متد را Clear به نامیم) و بخواهیم متنی را روی صفحه نشان دهیم (show)
                بدون استفاده از .Imports
                Display.LCD_Graphic_BW.ks108s.Clear()
                Display.LCD_Graphic_BW.ks108s.show(“Welcome& rdquo
                با استفاده از .Imports
                .Imports Display.LCD_Graphic_BW
                ks108s.Clear()
                ks108s.show(“Welcome&rdquo
                دستور .if همانند کاری رو انجام می دهد که در زبان C ، #if انجام می دهد است و می تواند مسیر کامپایل کردن برنامه را تغییر دهد. این دستور فقط فقط می تواند روی داده های ثابت (اعم از تعریف شده با .Const ، اعداد ثابت ، متن ثابت و یا ثابتهایی که توسط کامپایلر تعریف می شود) تصمیم گیری کنند . بقیه راهنماهای .endif و .else و .elseif و .thenبه همان شکلی که در دستورات if استفاده می شود بکار می روند
                .Device
                این برای تعریف نوع IC به کار رفته در پروژه است تا بر اساس آن بتواند کد زبان میانی را به زبان اسمبلی آن میکرو تبدیل کند.
                .Region
                فقط ایجاد بلوک هایی برای دسته بندی برنامه نوشته شده کاربرد دارد.و فقط جنبه بهتر دیدن پروژه را دارد. همانند کاری که #Region در VB می کند
                .CPMML
                برای تنظیم نحوه کامپایل کردن برنامه همانند کاری که #pragma در کد ویژن می کند
                .Error
                نشان دادن خطاهایی به کامپایلر که توسط کاربر در برنامه گنجانده می شود و متنی را به کاربر نشان می دهد.همانند کاری که راهنمای #Error در کد ویژون می کند.
                .Include
                اضافه کردن محتوای یک فایل به برنامه
                .end
                این دستور برنامه را به دو قسمت تقسیم می کند
                قسمتی که قبل از این دستور قرار داشته ، و توسط کامپایلر تک تک دستورات این بخش به زبان اسمبلی تبدیل می شود و قسمتی که بعد از دستور .end بکار رفته که فقط بخش هایی از برنامه که label آن بخش در برنامه بالا(بخش بالای .end) قرار گرفته در آن ترجمه می شود تا جایی که بخشهای دیگر وابسته نباشد (مثلا تا جایی که به یک دستور پرشی برسیم که به نقطه ای در همان محدوده اشاره می کند یا دستور ret و یا دستور reti و یا .endmethod (البته Lebal های مورد استفاده در این بخش هستند نیز اگر در جای دیگر استفاده شده است در برنامه گنجانده شود)
                این از دید یک بابایی که داره تازه شروع میکنه یعنی چی؟
                میدونم فهم این زبان کمی مشکل است اما قرار نیست در آینده افراد عادی با این زبان کار کنند (مگر برای طراحی ابزار جانبی و یا بخشهایی که بخواهند به شدت کتابخانه های بهینه بنویسند). و تا وقتی که که این 3 قسمت که در بلوک دیاگرامش کشیدم تمام نشود قرار نیست کاربران با آن کار کنند
                همونطور که در دیاگرامی که می بینید ممکن است چندین و چند بار دستورات کم و یا زیاد شود چندین بار باید بازنویسی شود تا به دستورات ایده آل خودش برسه و تکمیل برای ارائه بشود
                هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

                دیدگاه


                  #23
                  پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

                  من دلم میخواد ایندفعه به یه چیز دیگه گیر بدم. فرض کنیم:

                  شما به زبان X برنامه مینویسین و به کد ماشین Y تبدیل میکنین. اگه زبان X قابلیت این رو نداشته باشه که مثلا rotate رو انجام بده (اپراتورش وجود خارجی نداشته باشه) هزاری هم زبان Y دارای این دستور باشه دردی از شما دوا نمیکنه. مضاف بر اینکه من تنها جایی که دیدم فرمان rotate داره کامپایلر های قدیمی C مثل Borland و MSC بودن که این عمل رو به عنوان یکی دو تابع داخلی معرفی میکردن. که من تا به حال با این توابع داخلی سر و کارم نیفتاده. توضیح این نکته رو ضروری میدونم که من از سال 65 تا بحال بطور فعالی دارم برنامه مینویسم و در برنامه های دیگرون فضولی میکنم. از طرف دیگه وقتی یک ابزاری مثل GCC وجود داره و شما میتونین براحتی این ابزار رو برای تولید کد فرضی خودتون تغییر بدین تا کامپایلر های زبونهای موجود به کد شما درست بشه دیگه چه کاریه که بخوایین یه زبونی که هیچ مزیت مهمی نسبت به زبونهای موجود نداره طراحی و بعد براش کامپایلر بنویسین؟

                  من باب اطلاعتون نظرتون رو جلب میکنم به WinAVR که نسخه تغییر داده شده gcc هست برای میکروی AVR و تمامی مشخصات و امکانات تمامی AVR ها رو پوشش میده.

                  از بابت Framework هم خدمتتون عرض کنم که استاندارد کردن توابع و ایجاد یک Framework واحد ما رو بیشتر به طرف یک سیستم به طور تئوری نامحدود از بابت منابع سوق میده و ما اینجا با سیستم هایی سروکار داریم که عمدتا بشدت از بابت منابع موجود در مضیقه هستن. و اگر بنا باشه برای هر سیستمی یک Framework نوشته بشه که اصلا راه عوضی میشه.

                  یه مورد دیگه.
                  قبلا برای PC و ARM برای کار روی شبکه روالهایی رو نوشته بودم. هر جا دید خودش رو داشت. حالا دارم برای پروژه ای روی ATmega64 با آی سی ENC28J60 کار میکنم. جالبه بدونین پیاده سازی این سه مورد بشدت با هم تفاوت داره. نه از بابت Ethernet Stack که خودش دردسر مفصلیه بلکه از بابت دید برنامه نویسی سطح بالای محیطش. تو یکی محدودیتی از بابت میزان حافظه مصرفی نداریم. توی اون یکی سیستم نسبتا محدوده ولی میشه با فریم های مجزای 1536 بایتی کار کرد. توی این یکی شاید سر 100 بایت بالا و پایین کردنش هم دردسر پیش بیاد. حالا برای حل این مورد چه جوری میخوایین راه حلی در Framework بذارین؟ چون فرم برنامه نویسی و بازی کردن با حافظه هم با همدیگه متفاوته. راستی یادم رفت! وقتی شما یک استاندارد واحد رو برای چند مورد ذاتا متفاوت پیاده سازی میکنین قاعدتا یه چیزی رو فدا میکنین و در یک میکروکنترلر بشدت محدود چیزی برای فدا کردن موجود نیست.

                  یه چیز دیگه. (بازم میخوام به جاوا گیر بدم) چرا یک مبدل کد جاوا به اسمبلی میکروکنترلر های موجود (چیزی که بهش میگن JIT) نمینویسین؟ این کارتون رو خیلی کم میکنه و برای بقیه هم دردسر یاد گیری یک چیز جدید وسط نمیاد. ضمنا شما درگیر نوشتن یه کامپایلر جدید نمیشین. براحتی میشه این مبدل رو جوری آماده کرد که بتونه کد نسبتا بهینه ای تولید کنه و ضمنا موارد خاص میکرو یا میکرو ها رو با استفاده از Annotation ها در نظر گرفت.
                  این کاری در حد کمتر از سه ماه هست.

                  دیدگاه


                    #24
                    پاسخ : یک کامپایلر برای همه میکروها ، همه زبا

                    واقعا خوشحالم شما را با این همه سابقه برنامه نویسی (که اگر یک سال بیشتر بود، هم سن من می شد :eek در جمع خودمون داریم و می تونیم از راهنمایی هایتان بهره مند بشیم.
                    من درست متوجه نشدم منظورتان اگر x داشته باشه و y نداشته باشه یا برعکس، به هرحال دو مورد را بررسی می کنیم
                    اگر زبان x داشته باشه و زبان Y نداشته باشه می شود با دستورات دیگر در آن پیاده سازی کرد مثلا
                    ROR ZL
                    LSR ZL
                    BRCC NEXT
                    SBI ZL,7
                    NEXT:

                    اگر زبان x نداشته باشه و زبان Y داشته باشد، بله بکار گرفته نمی شود اما می شود توسط بهینه سازی کد خروجی آن را لحاظ کرد به فرض در بیشتر تبدیلات وقتی به چند دستور مشخص پشت سر هم رسیدی معادل کد اسمبلی را قرار بده
                    و یا برعکس وقتی به این سه تا دستور رسیدی معادل ROR را بزار. میدون به این راحتی ها که الان گفتم نیست اما میشه.
                    هر جا دید خودش رو داشت.
                    درسته من با شما کاملا موافقم . اما همیشه اینگونه نیست و می شود گفت روند اجرای برنامه ها در 60-70 درصد موارد مشابه هستند
                    در مواردی که نیست معمولا از راهنما ها و پیش پردازشگرها برای حل اینگونه مشکلات استفاده می کنند.

                    در یک Framework قدرت اصلی را می توان کتابخانه های آن دانست
                    کتابخانه ها را می شود به دو صورت در نظر گرفت
                    1- کتابخانه هایی که بدون هیچ ملاحظه ای نوشته می شوند
                    2- کتابخانه هایی که مواردی مثل محدودیت حافظه ، یا سرعت زیاد یا داشتن وسیله جابنی خاصی یا... را در نظر گرفته و بر اساس آن کتابخانه را می نویسد.
                    برای مورد دو می توان کتابخانه را مثلا در موردی که شما ذکر کردید و از نظر حافظه تقسیم بندی کرد و بر اساس آن برای هر قسمت برنامه را نوشت
                    مثلا اگر برنامه شما دارای متدی به نام send باشد.(___memory عدد ثابتی است که حافظه را نشان می دهد زمانی که شما میکرو خاصی را انتخاب کرده باشید توسط کامپایلر مقدار دهی می شود.)
                    .method send()
                    .if ___memory<8192 .then
                    کد برنامه مخصوص حافظه های پایین از 8K
                    .else
                    کد برنامه مخصوص حافظه های بالاتر از 8K
                    .endif
                    .endmethod
                    دیگه این وظیفه کامپایلراست که با توجه به میکرویی که شما انتخاب کردید کدام قسمت از کدها را در برنامه بگنجاند
                    اما اگر از بابت سطح بالا مد نظرتون باشه که چه جوری میشه ؟
                    می توان در برنامه ها چیزی به نام اعتبار حافظه ها برای کتابخانه ها در نظر گرفت.
                    مثلا وقتی به پروژه ای که میکروی خاصی را در آن لحاظ کردیم (برای تشخیص منابع قابل استفاده)و یک کتابخانه به آن اضافه کردیم ، آن کتابخانه مقدار حداقل و مقدار حداکثر که از لحاظ حافظه RAM یا FLASH نیاز دارد ذکر شود تا بتوان تصمیم گرفت که از مکان حافظه ای که قرار داده ایم کافی است یا باید به پروژه حافظه جانبی اضافه کرد یا نوع میکرو را تغییر داد یا از فضای حافظه موجود (منظورم ram) به صورت اشتراکی بین چند برنامه ایی که همزمان بکار گرفته نمی شوند قرار داد
                    بازم میخوام به جاوا گیر بدم
                    فکر کنم شما زیادی به جنبه اقتصادی قضیه نگاه می کیند.به جز مزایایی که من فکرمی کنم داره و شما اینها مزایا نیست، طراحی دوباره می تونه دیدم رو کلا به نرم افزار و سخت افزار تغییر بده.
                    در آخر این پروژه چه به انتها برسد چه نه می تواند مزایای دیگری نیز داشته باشد.سه تا از اساسی ترینش رو در زیر بیان می کنم.
                    1- کار با میکرو در سطح اسمبلی و آشنایی با پروتکلهای مختلف و قطعات مختلف و پیاده سازی آن بدون هیچ واسطه ای که قدرت برنامه نویسی را بالا خواهد برد.
                    2- یادگیری زبان C# (کمی تا قسمتی VB.NET بلدم ، اما چون اکثر منابع موجود به زبان C# هستند مجبورم به این زبان Switch کنم).
                    3- یادگیری WPF، روش جدید ماکروسافت برای طراحی ظاهر برنامه ها، یادگیری این زبان نه تنها به قدرت طراحی ظاهر برنامه ها در سیستم های ویندوز می ده بلکه در طراحی ظاهر نرم افزارهای تحت وب و همچنین برنامه هایی که برای SilverLight می توان نوشت کمک می کند (اگه برنامه نویسی تحت ویندوز می کنید توصیه می کنم حتما یه نگاهی بهش بندازید، هرچند میدونم که می دونید).
                    در همه این مواردی که در بالا ذکر کردم مبتدی هستم و می خواهم تو چند ماهی که تا گرفتن لیسانس وقت دارم (پایان دوره خوش و ورود به بازار بیکاران) روی این موارد کار کنم . چون احتمالا دیگه فرصت همچنین کارهایی تحقیقاتی رو نخواهم داشت.
                    و در آخر می خوام یک اعترافی بکنم ، :redface:
                    شاید یکی از دلایلی که نسبت به یک JITجاوا یا .netمقاومت می کنم این است که یه جورای ازشون می ترسم ، چون وقتی بهشون فکر می کنم فقط سایه می بینم و دانشی در این رابطه از کجا چطوری چگونه باید شروع کنم ندارم. آقا رضا اگر شما در این باره ساختن JIT اللخصوص برای .net (هر چند میدونم برای میکرو کاربردی ندارد )مطلبی سایتی می دانید لطفا بگویید تا ما هم استفاده کنیم (فکر کنم کم کم دارم به راه راست هدایت میشم )
                    هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

                    دیدگاه


                      #25
                      پاسخ : یک کامپایلر برای همه میکروها ، همه زبا

                      سلام دوباره به دوستان
                      متاسفانه برای مدتی نتوانستم این قضیه را دونبال کنم ، اما به تازگی (بر سر اجبار، چون پروژه پایانی را همین موضوع انتخاب کردم ) دوباره دارم روی آن کار می کنم
                      ابتدا یک نمونه شبیه سازی (نه برای همگی دستورات) روی کامپیوتر انجام دادم که بیشتر مواقع همانطور که انتظار می رود رفتار می کند
                      چون بیشتر از این فرصت کار روی کامل کردن شبیه ساز در این برهه زمانی ندارم برای همین مجبور شدم فعلا کار روی این قسمت رو متوقف کنم و فکری برای تبدیل زبان میانی به زبان اسمبلی میکرو باشم .
                      بگذارید کاری که این نرم افزار داره انجام می دهد رو شرح بدم
                      1- برنامه نوشته شده در درون textbox سمت چپ پس زدن دکمه PLAY ، اگر از وسط پنجره پایین sim رو انتخاب کرده باشید ، شبیه ساز اجرا می شود و اگر AVR انتخاب شود کد اسمبلی در بالای همین radiobox نمایش داده خواهد شد.
                      2- بدون توجه به اینکه کدامیک را انتخاب کنید ابتدا این برنامه به صورت یک فایل باینی (کد هگز) ایجاد شده و سپس به کتابخانه مربوطه ( شبیه ساز یا avr) برای اجرا فرستاده می شود. علت اینکه بدین صورت عمل می کند جدا سازی بخش ها از یکدیگر است به طوری که اگر مثلا بخواهم دستورات پیش پردازنده را به برنامه اعمال کنم ، دیگر نیازی به تغییری در بخش های پایین تر نیست و برعکس

                      3- اگر شبیه سازی انتخاب شده باشد ، دستورات از فایل باینری بیرون کشیده شده و خط به خط خوانده می شود با توجه به نوع دستور که قبلا گفته شد در کامپیوتر اجرا می شود مثلا با نوشتن دستور ldc.ui1 یک عدد ثابت درون پشته کامپیوتر (منظور پشته ای که در کامپیوتر برای این نرم افزار تعریف شده است) که در کنار Textbox سمت چپ قرار دارد ، ریخته می شود با مشخصات جز آن مثل ، این دستور (نوع بایت، ورد و ..) ، مقدارش ، اسم دستور و ... و نمایش داده می شود و نقشه RAM و IO نیز در سمت راست نرم افزار قرار دارد .

                      4- اگر avr انتخاب شود نیز دستورات از درون فایل باینری کشیده شده و خط به خط اجرا می شود و معادل اسمبلی هر خط نیز درون یک فایل text دیگر ذخیره می شود اما، همزمان با توجه به نوع دستور همانند شبیه ساز مقدار آن دستور ، خود دستور ، نوع آن درون پشته کامپیوتر برای مرتبط کردن دستورات به هم و نیز مشخص کردن دقیق نوع داده مورد استفاده قرار می گیرد ، اما این برنامه اسمبلی درون این text حاوی هیچ رجستر مشخصی نیست ، یعنی دستور بدین گونه نوشته نمی شود lds R16,5688 ، بلکه به ازای هر رجیستری که استفاده می شود یک عملوند تعریف می شود که منحصر به فرد هستند مثل lds op3434,5688 پس از اتمام تبدیل ، رجیسترها ، با توجه به اینکه قرار است به جای کدام op قرار بگیرند و باید در چه محدودی از رجیسترها باشند (مثلا فقط می توانند r16 تا r23 باشند یا فقط Z می تواند باشد) جایگذاری می شوند . ضمنا ابتدای تبدیل هر دستور یک رشته منحصربفرد قرار می گیرد و در صورتی که نیاز به اضافه کردن دستوراتی مثل پوش یا پاپ قبل از یک دستور MML ، بعد از تبدیل کامل و برای جایگذاری رجیسترها، مورد استفاده قرار می گیرد.
                      برای گرفتن منطق اولیه برنامه نیز فعلا خودم را محدود به 4 تا دستور add ، ldc ، ldind.ui1 و ldindf.ui1 کردم.

                      برای تعیین رجیسترها دو راه داشتم
                      1- استفاده از رجیسترهای خاص برای کارهای خاص ( مثلا رجیستر r20 و r21 برای انتقال داده به تابع ، یا رجیسترهای R30 و R31 برای انجام عملیات منطقی و حسابی و نمونه های دیگر که شما اکثرا در کامپیلرها دیگر از جمله ، کدویژن، بیسکام،IAR و ... دیده اید و در پروژه هایتان نیز ممکن است استفاده کرده باشید
                      2- روش بعدی اختصاص رجیسترها با توجه به نیاز هر دستور MML و نوع آن و رجیسترهای قبلی و بعدی ، یعنی استفاده از رجیسترهایی که در آن لحظه مورد استفاده قرار نمی گیرند ،مثل این می ماند که شخصی بدون هیچ قاعده خاصی (البته اینجا قاعده دارد) تصمیم بگیرد از R8 برای پیاده سازی این دستور استفاده کند یا از رجیستر R12 ، مثلا دستور add با توجه به اینکه در آن لحظه کدام یک از رجیسترها مورد استفاده قرار نگرفته است را جایگزین می کند. در این روش ابتدا به جای هر رجیستری یک اسم عملوند قرار می گیرد (همانطور که بالا نیز گفته شد) که یک نام منحصر به فرد است سپس پس از اتمام عملیات تبدیل دستور به دستور (یعنی به جای استفاده از اسم رجیستر(مثل R20) یک عملوند قرار می گیرد (OP1998))،مثلا اگر کد زیر به زبان MML نوشته شود
                      ldc.ui1 200
                      ldindr.ui1
                      ldindf.ui1
                      ldc.ui1 10
                      add
                      به کد زیر تبدیل می شود
                      ___@#Push0_@#end
                      LDS ___@#Op0_@#end ,200
                      ___@#Push1_@#end
                      CLR ___@#Op1_@#end
                      LSL ___@#Op0_@#end
                      ROL ___@#Op1_@#end
                      LPM ___@#Op3_@#end , ___@#Op2_@#end
                      ___@#Push2_@#end
                      LDI ___@#Op4_@#end , 10
                      ADD ___@#Op3_@#end , ___@#Op4_@#end
                      برنامه با توجه به اینکه آن عملوند ، چه نوع رجیستری می تواند باشد(مثلا فقط می توان از رجیسترهای xوyوz استفاده کرد (برای مواردی که آن عملوند جایگزین یک رجیستری شده است که یک اشاره گر غیر مستقیم داده است))،کجاها مورد استفاده قرار گرفته است و موارد دیگر رجیستر جایگزین آن را مشخص می کند و سپس عمل جابجایی صورت می گیرد
                      و در آخر تبدیل به کد زیر می شود و به کاربر نشان داده می شود
                      LDS R30 ,200
                      CLR R31
                      LSL R30
                      ROL R31
                      LPM R8 ,Z
                      LDI R16 , 10
                      ADD R8 ,R16
                      روش دوم که من انتخاب کردم دارای مزایا و معایبی
                      مزایا:
                      امکان استفاده از حداکثر ظرفیت رجیسترها در برنامه
                      معایب
                      چون در هنگام ارسال داده به توابع (آرگومانها) اصلا مشخص نیست که چه رجیستر است باید از پوش و پاپ استفاده کنم که فکر می کنم این مورد باعث کاهش سرعت برنامه شود (البته می توان با استفاده از رجیسترهای خاص برای انتقال این مشکل را تا حدودی حل کرد، دنبال روش بهتری هستم) و همچنین
                      زمانی که از دستورهای پرش استفاده می شود استفاده از پشته کامپیوتر ممکن نیست و باید آن را به پشته واقعیت (یعنی پشته میکرو) تبدیل شوند ، چون که نوع داده را زمان پاپ کردن از پشته واقعی نمی توان مشخص کرد ، پس باید یک بایت اضافه به عنوان نوع داده نیز درون پشته قرار گیرد و نیز تمامی زیربرنامه های مربوط به تمامی نوع داده (بیت ، بایت، اینتیجر و ..)نیز در برنامه نهایی قرار داده شود مثل دستور ADD ، همه 13 حالت جمع (بیت با بیت ، بایت با بایت، ورد با ورد و ..) باید نوشته شود که این یعنی افزایش حجم
                      دیباگ کردن برنامه (پس از تبدیل به اسمبلی) نیز خیلی خیلی سخت خواهد شد ( البته بعد از پایدار شدن هسته اصلی مشکلی بوجود نخواهد آمد)

                      فعلا مشکل اصلی چگونگی پیاده سازی دستورات پرشی هستند
                      حال دوستان اگه ایده ای ، راه حل بهتری برای پیاده سازی دستورات پرشی دارند لطفا دریغ نکنند
                      برنامه برای اجرا نیاز به فریم ورک 4 داره
                      لینک دانلود
                      http://telec.persiangig.com/Compiler/MML/IDE1.zip
                      برنامه با ویژوال استودیو 2010 نوشته شده است به زبان VB.NET دوستانی که تمایل به همکاری دارند برای گرفتن سورس بهم پی ام بدند
                      تشکر

                      هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

                      دیدگاه


                        #26
                        پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

                        من خیلی خوشحالم که یکی داره با جدید این پروژه رو انجام میده این پروژه یکی از ارزوهای سالهای دور من بود
                        دوست عزی ایتطور که من فهمیدم شما اول نیاز دارید یه کامپایلر اسمبلی بنویسید بعد در مرحله بعد یه مفصر مثلا بیسیک به اسمبلی
                        در ضمن چه اشکالی داره که دستوراتی که زبانهای سطح بالا ندارند رو به اونا اضافه کنیم مثلا روتیت رو به سی یا کار مستقیم بروری بیتهای یک رجیستر
                        در ضمن از مهمترین مزایای این کامپایلر اینه که هر کی با هر زبانی که دلش بخواد میتونه توش بنویسه و مهمتر از همه اینه که کتابخونه در گیر زبان نیستن میشه وقتی یه کتابخونه به زبان بیسیک نوشتیم می تونیم از اون تو زبان سی استفاده کنیم
                        یا اینکه یه برنامه رو با هر زبونی که نوشته شده به فلوچارت تبدیل کرد که یه شیوه استاندارد برای تمام زبانهاست
                        یا بیسیک به سی و برعکس چون تو این نرم افزار فقط سینتکسها تغییر میکنن



                        راستی دوست گرامی ما رضااقازاده خیلی استاده اگر فکرش رو به این پروژه بشه مثبت کرد میتونه خیلی کمک کنه
                        این پروژه اگه یه کارر تیمی بشه خیلی عالی میشه و من اطمینان دارم اینده درخشانی داره
                        من پیگیر این پروژه هستم موفق باشید
                        ما زنده به آنیم که آرام نگیریم موجیم که آسودگی ما عدم ماست

                        وقتی یک ملت برای فرهنگ و نژاد و ملیت خویش ارزشی قائل نشد و حقی را که طبیعت برای نگاهداری نژاد پاکش به او ارزانی داشته بود پایمال ساخت و به بیگانگان روی آورد و تسلیم شد دیگر حق ندارد از شکست و بدبختی سیاسی که خودش باعث آن شده است شکایت کند .ادولف هیتلر

                        r.babazadeh@yahoo.com

                        دیدگاه


                          #27
                          پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

                          اگر فکرش رو به این پروژه بشه مثبت کرد...
                          جناب بابازاده. من چیزایی که گفتم منفی گرایانه نبود. اما متاسفانه (مورد فعلی رو کاری ندارم. مطلقا) اغلب عادت داریم چاه نکنده منار میدزدیم. من فقط انتظار داشتم یه کمی مشکلاتی رو که ممکنه جناب savameri باهاش برخورد کنن گوشزد کنه. علاوه بر تمام اینا فکر نمیکنم (خوشبختانه) ایشون با تمام این (بقول شما) منفی بافی های من از کارشون کم بذارن و این نهایت خوشوقتیه.

                          من باب اطلاعتون خودم فعلا روی یک پروژه کار میکنم که حجم کد اجراییش بالاست و غیر از کلی زار و زنبیل؛ یک سیستم DATABASE هم داره. و همه اش هم بایستی با 64 کیلو بایت سر و ته اش جمع بشه. اتفاقا یکی از قسمتهایی که دارم روش کار میکنم یک کامپایلر زبانی مشابه #c هست که کد نهاییش یه چیزی تو مایه های همین ایده دوستمونه. ولی فعلا قابلیت ترجمه به کد نهایی رو نداره اما براحتی میشه با نوشتن یک کلاس برای هر پلاتفرم سخت افزاری؛ کد مربوط به اون پلاتفرم رو تولید کرد. (یعنی این مورد رو توش از همین حالا دیده ام)

                          این "پلاتفرم" میتونه شامل یک میکروی خالی باشه و یا یک سیستم Embedded با کلی تجهیزات متفاوت.
                          غیر از این مورد هم این کامپایلر کلی مواردی رو مثل exception handling و virtual memory رو هم خودش پشتیبانی میکنه. چون فعلا چیزی مثل mmc خیلی ارزونتر از اضافه کردن رم یا حافظه های جنبی دیگه به سیستم در میاد.

                          دیدگاه


                            #28
                            پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

                            نوشته اصلی توسط r.babazadeh
                            دوست عزی ایتطور که من فهمیدم شما اول نیاز دارید یه کامپایلر اسمبلی بنویسید بعد در مرحله بعد یه مفصر مثلا بیسیک به اسمبلی
                            در ضمن چه اشکالی داره که دستوراتی که زبانهای سطح بالا ندارند رو به اونا اضافه کنیم مثلا روتیت رو به سی یا کار مستقیم بروری بیتهای یک رجیستر
                            بله همینطور است ابتدا برنامه تبدیل زبان میانی به اسمبلی میکرو پیاده سازی می شود سپس تبدیل زبان بیسیک به زبان میانی نوشته خواهد شد ( که این بخش نیز داستان ها برای خودش دارد اما جای خوشبختی که این بخش الگوریتم خاصی دارد و کامل درون کامپیوتر انجام می شود که شاید پیاده سازیش را نسبت به قبلی کمی آسانتر کند).
                            این دستوراتی که در نظر گرفته ام ، تغییرات زیادی خواهند کرد تا به یک پایداری قابل قبولی برسد (هرچند دستوراتی که عنوان کردید را نیز اکنون پوشش می دهد، اما اگر منظورتون در تبدیل زبان بیسیک یا زبان سی به زبان میانی هست که در این صورت می توان دو نمونه استاندارد و غیر استاندارد زبان سی را پیاده سازی کرد که فعلا در روند کار فعلی تاثیری ندارد و در این موارد بعدها بحث خواهیم کرد )
                            نوشته اصلی توسط r.babazadeh
                            راستی دوست گرامی ما رضااقازاده خیلی استاده اگر فکرش رو به این پروژه بشه مثبت کرد میتونه خیلی کمک کنه
                            این پروژه اگه یه کارر تیمی بشه خیلی عالی میشه و من اطمینان دارم اینده درخشانی داره
                            من پیگیر این پروژه هستم موفق باشید
                            بله حق با شماست ، باعث افتخار ماست که جناب آقازاده با این همه معلومات (در همه جوانب الکترونیک و کامپیوتر) را در کنار خودمان داریم ، و خیلی خوشحال می شوم اگر ایشان لطف کنند و در این پروژه ما رو یاری کنند .
                            من هم قبول درایم که این یک پروژه گروهی ولی کسی تا کنون تمایلی برای انجام آن نشان داده ( به چند علت : فکر می کند پروژه غیر ممکنه، فکر می کنه پروژه برای ما غیر ممکنه، فکر می کنه بیخودی وقت تلف کردنه، فکر می کنه جنبه اقتصادی نداره، نمی خواهند خودشون رو درگیر کنند،) و برای تک تک بخش های آن مجبورم فقط با خودم فکر کنم و چندین بار یک بخش رو به روشهای مختلف پیاده سازی کنم تا بهترین روش رو پیدا کنم که این خود زمانبر است

                            نوشته اصلی توسط رضا آقازاده
                            من فقط انتظار داشتم یه کمی مشکلاتی رو که ممکنه جناب savameri باهاش برخورد کنن گوشزد کنه.
                            راستش بین این پروژه وقفها های زیادی افتاد که بعضیاش بخاطر پیاده سازی بخشهای مختلف بود ، علت اینکه مشکلات رو ذکر نکردم راغب نبودن کسی برای ادامه کار بود، کما اینکه قبل از پست جناب بابازاده نمی خواستم این تاپیک رو دیگر ادامه بدهم .
                            نوشته اصلی توسط رضا آقازاده
                            اتفاقا یکی از قسمتهایی که دارم روش کار میکنم یک کامپایلر زبانی مشابه #c هست که کد نهاییش یه چیزی تو مایه های همین ایده دوستمونه.
                            خیلی جالبه ، اگه میشه کمی بیشتر توضیح دهید

                            بریم سر مشکل خودم ، دستورات پرشی
                            بعد از اینکه یک دستور پرشی اجرا شود 2 حالت برای دستورات بعدی ممکن است پیش بیاید
                            الف ) می توان دستورات درون پشته کامپیوتر را حدس زد ، یعنی دستور درون پشته کامپیوتر وجود دارد
                            ب) نمی توان دستورات درون پشته کامپیوتر را حدس زد ، یعنی دستورات درون پشته کامپیوتر وجود ندارد
                            در حالت الف مشکلی وجود ندارد و مثل قبل می توان عمل کرد و دستورات را پیاده سازی کرد
                            اما در حالت ب 3 راه حل به ذهن من می رسه
                            1- اگر مشخص نباشد آن را فرض یک داده مشخص در نظر بگیریم ، یعنی قبل از دستور پرشی داده به داده مشخص (مثلا integer) تبدیل و درون پشته میکرو قرار دهد و سپس در محاسبات نیز فرض را integer بودن داده درون پشته قرار دهد.
                            مزایا
                            کمتر کردن دستورات اضافی ، تغییر پیدا نکردن در ساختار اجرا و دستورات
                            معایب
                            ممکن است نیاز به اجرای داده های بزرگتر داشته باشیم که باعث اجرای نشدن صحیح برنامه می شود (اگر در نظر گرفته نشود) و در داده های کوچکتر نیاز به اجرا و کد بیشتری هست
                            2- ذخیره نوع داده به همراه داده درون پشته ، که در پست قبل معایب و مزایای آن را ذکر کردم
                            3- تغییر در ساختار و تغییر دستور های محاسباتی ، مثلا برای دستور ADD ، به ازای هر نوع داده موجود یک نوع در نظر بگیریم (که فعلا 13 نوع دستور add خواهیم داشت add.b،add.n،add.i1 و...)
                            مزایا
                            پیاده سازی با کمترین دستورات اسمبلی میکرو
                            معایب
                            تغییر در دستورات و ساختار برنامه ، ممکن است دستوری که در پشته میکرو قرار گرفته باشد با داده ایی که محاسباتی پردازش می کند یکی نباشد (مثلا دستور قبل از دستور پرشی ldind.ui4 باشد و دستور موجود در آدرسی که به آن پرش شده add.i2 باشد ، یک راه برای رفع آن این است که نوع داده را همراه داده درون پشته میکرو قرار داده که باز همان مشکل حالت2 را دارد)
                            حالا اگر دوستان راه حل دیگی به ذهنشون می یاد اعلام کنند
                            نظر خود من اجرای حالت 3 هست ، نظز شما چیه؟؟
                            هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

                            دیدگاه


                              #29
                              پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

                              فرمی که من دارم کار میکنم اینه: (خلاصه اش البته)

                              1- یک کلاس عمومی به عنوان Lexical Analyzer دارم که قابل customize کردن هست. یعنی با override کردن چند تا property میشه کل عملکرد رو برای هر زبانی که بخوایین تغییر داد. keyword ها و اپراتور ها و separator ها تماما از طریق تعریف یک enum قابل تغییر هستن. و برنامه هم به راحتی کار میکنه.

                              2- در Semantic Analyzer قوانین چک میشه. در صورت نیاز پیش پردازش انجام میشه و نهایتا یک نوع کد داخلی تولید میشه که ربطی به پلاتفرم نداره. این کد در ماجولهای متفاوت ذخیره میشه تا بعد بشه ازش استفاده کرد. تا اینجای کار میشه سورس ها رو کامپایل کرد و لایبرری ها رو تشکیل داد. در این مرحله هم کاری نداریم که آیا پلاتفرم نهایی چه خصوصیاتی داره. آیا فرم 64 بیتی رو ساپورت میکنه یا نه. و الی آخر.
                              یک سری بهینه سازی های اولیه هم در همین مرحله انجام میشه. ضمنا چون ممکنه به خودی خود یک سری روال ها در سخت افزار های متفاوت؛ بطور متفاوتی پیاده سازی بشن در همین مرحله با استفاده از چیزی مثل Attribute های زبان #C قید میشه که مثلا این تابع برای نوع عمومی AVR تعریف شده. و اون یکی برای "ARM".
                              بنا براین امکانش هست که یک تابع با یک heading چند بار هم توصیف بشه. چیزی که در #C وجود خارجی نداره.

                              3- به ازای سخت افزار نهایی (که الزاما فقط یک میکرو نیست) شما میتونین با داشتن یک کلاس که نحوه تولید کد از اون سخت افزار رو به همراه پشن های اون سخت افزار معرفی میکنه بهره ببرین و کد نهایی تون رو تولید کنین. یه چیزی مثل JIT ولی مفصل تر. چون در اینجا شما میتونین database یا عکس و یا فونت هم داشته باشین. میتونین lcd گرافیکی و یا متنی هم داشته باشین و الی آخر. و اینها جزئی از مشخصات سخت افزار نهایی هست. مرحله تولید کد نهایی چه در حالت تفسیر و چه اجرا بسیار مهم هست. و جدای از کد زدن. پس تولید کد نهایی باید جدای از کامپایل برنامه اصلی انجام بشه.

                              4- مطلقا نمیشه و نباید موارد سخت افزاری رو در فاز اولیه لحاظ کرد چون ممکنه یکی مثل AVR باشه با ساختار پشته 8 بیتی و اون یکی با ساختار پشته 32 بیتی. بنابراین حتی رزرو کردن local variable ها در پشته هم به سخت افزار بستگی پیدا میکنه.

                              دیدگاه


                                #30
                                پاسخ : یک کامپایلر برای همه میکروها ، همه زبانها برای یک کامپایلر

                                خیلی عالیه ، در واقع بیشتر قسمتهایی که روی آن کار می کنید با برنامه من مشترک ، یه جورایی ،که این خیلی خوبه و می توانم از راهنمایی های شما استفاده کرد
                                هر چند تفاوتهایی دارد از جمله کد داخلی که شما اسم بردید و سریع رد شدید ، را من زبان میانی تعریف کردم و به آن شاخ و برگ دادم (البته واقعا اینطور نیست ولی می توان اینگونه برداشت کرد) و پایه کتابخانه ها و ... می خواهم همین زبان میانی قرار بدهم.
                                در واقع با توجه به صحبتهاتون من اینطور برداشت کردم که در شروع کار شما از زبان سطح بالا (گزینه 1و2) به زبان سطح میانی (کد داخلی که نام بردید) دارید کار می کنید ولی من برعکس شما از سطح میانی ( زبان میانی نام می برم و گزینه 3) به سمت اسمبلی میکرو کار می کنم (هرچند تا اینجای کار من قسمتهای 1و2 که گفتید (یعنی تحلیل لغوی و نحوی و تبدیل به یک کد داخلی ) را برای زبان میانی انجام می دهم
                                بگذارید من هم کمی از بخشهای مختلف این راه حل (Solution ) برنامه بگویم تا شباهتهای این دو پروژه بیشتر آشکار بشود و در صورت تمایل شما بتوانیم تعاملهایی داشته باشیم

                                این راه حل (هنگامی که یک برنامه ایجاد می کنید در واقع یک راه حل در ویژوال استودیو ایجاد کرده اید که خود می تواند شامل چندین پروژه برای بخشهای مجزا داشته باشد) دارای 6 پروژه مجزا هست (یعنی بر برنامه نهایی 5 تا فایل dll و یک فایل Exe خواهیم داشت ، البته به به همراه یک فایل CodeBoxControl.dllکه کامپایل شده درون برنامه قرار می گیرد که در ادامه کار تک تک این فایل ها را ذکر خواهم کرد)
                                1- پروژه MMLIDE که ظاهر برنامه را نمایش می دهد و فایل اجرایی ما را تشکیل می دهد
                                2- پروژه GOLD Engine (که open source هست و از سایت GOLD Parser دریافت شده است) به همراه فایل کامپایل شده ایی که از برنامه GOLD Parser دریافت می شود (یک فرازبانی که با آن کلمات کلیدی و ساختار هر دستور را در آن ذکر کرده اید) وظیفه تحلیل لغوی و نحوی را بر عهده دارد
                                3- پروژه MMLCommon که در آن enum ها و توابعی و کلاسهایی که در بین کل پروژه مشترک می باشد در این فایل dll قرار دارد.
                                4- پروژه MMLLibrary وظیفه آن تبدیل زبان میانی به فایل باینری همین زبان را بر عهده دارد ( در واقع این فایل dll برای انجام این کار از فایل dll شماره 2 استفاده می کند به همراه دیگر توابعی که خودش دارد) که تعریف متغیر، تعریف کلاس، تعریف ساختار و ... باید در همین بخش انجام شود و فایل باینری آن فایلی است که به جز معادل عددی دستورات و معادل عددی (یعنی آدرس) هر متغیر توضیحی در آن نیست (البته فعلا)
                                5- پروژه MMLtoSim که فایل باینری زبان میانی را به عنوان ورودی دریافت کرده و شبیه سازی اجرای هر دستور را درون کامپیوتر بر عهده دارد
                                6- پروژه MMLtoAVR که فایل باینری زبان میانی را به عنوان ورودی دریافت کرده و معادل اسمبلی AVR را در خروجی قرار می دهد.
                                7- فایل کتابخانه ای CodeBoxControl.dll که یک فایل opensource (به زبان C# و برای قالب wpf)می باشد و وظیفه آن رنگ آمیزی متن وارد شده توسط کاربر می باشد (مثلا زبانی که کاربر کلمات کلیدی را تایپ می کند رنگ آن را آبی می کند)
                                تا آنجا که شده بخش های مختلف برنامه را از هم جدا کردم تا در صورت تغییر در یکی از بخشها به دیگر قسمتها آسیبی وارد نشود.
                                همانطور که می بینید قسمتهایی که شما در نظر گرفته اید را من نیز قرار داده ام ( مثلا قسمت 1و2 که شما نام بردید من نیز در 2و3و4 قرار داده ام (البته برای زبان سطح میانی نه سطح بالا ، هرچند می توان از همین روشها برای پیاده سازی سطح بالا نیز استفاده کرد) و بخش 3 که شما نام بردید را من در بخش 5و6 انجام می دهم (البته نه به اون وسعتی که شما بیان کردید، یعنی دیتا بیس و .. در این بخش تعریف نشده است)


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

                                در مورد شماره 4 که فرمودید من تا کنون هیچ گونه موارد سخت افزاری را لحاظ نکردم (اگر مورد خاصی هست لطفا بگویید)


                                اما در مورد مشکل خودم یک راه حل دیگه به ذهنم رسید
                                بدین صورت که کاربر موظف باشد در صورتی که داده درون پشته میکرو قرار داده شده باشد (یعنی پشته کامپیوتر هنگام صدا زدن دستوری خالی باشد، ) نوع دستور را با استفاده از دستورات conv (دستور تبدیل)مشخص کند
                                مثلا
                                کد:
                                Ldc.ui2 6890
                                Ldind.ui1
                                Ldc.ui2 5999
                                Ldind.ui1
                                Br Label
                                .
                                .
                                .
                                Label :
                                Conv.ui1
                                add
                                مزایا
                                لازم به تغییر دستورات نیست، لازم به تغییر ساختار برنامه نیست ، کد کمترین را می توان تولید کرد
                                معایب
                                نوشتن برنامه را سخت تر می کند (می توان به کاربر اعلام کرد که در این نقطه باید از دستور conv استفاده کنی ولی استفاده نکردی و ایجاد خطا کنیم) ، یک قانون من درآوردی را به کاربر تحمیل کرده ایم ، در صورتی که داده واقعی درون پشته میکرو با دستور conv یکی نباشد برنامه کاملا بهم می خورد و یک اشکال زمان اجرا خواهد بود که دیباگ کردن برنامه را مشکل می کند
                                نظر شما چیست؟ لطفا پیشنهادی بدهید
                                هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

                                دیدگاه

                                لطفا صبر کنید...
                                X