اطلاعیه

Collapse
No announcement yet.

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

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

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

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

    من هم با خودم گفتم می شود چنین کاری را برای میکروهایی که با آنها سرو کار داریم انجام دهیم کافی است یک زبان میانی قوی ایجاد کنم
    برای شروع زبانهای اسمبلی ic ها مختلف رو وارسی کردم و به این نتیجه رسیدم که بهترین روش استفاده از دستورات زبان میانی شرکت ماکروسافت به نام MSIL است
    لینک زیر لیست کامل این دستورات را به همراه توضیح مختصر درباره آن نوشته است
    http://en.wikipedia.org/wiki/List_of_CIL_instructions
    هسته اصلی این زبان میانی یک پشته است در واقع شما به جای اینکه عملیات را روی رجیسترها انجام دهید بر روی پشته انجام می دهد
    مثلا برای جمع دو عدد به صورت زیر عمل می کنید
    ldc.i4 20
    ldc.i4 30
    add
    این دستورات دو عدد که در قالب 32 بیتی هستند را ابتدا درون پشته قرار داده سپس دستور add را می نویسیم ، این دستور دو تا مقداری که آخرین بار در پشته قرار داده شده است (اطلاعات بالای پشته) است را باهم جمع می کند (و از پشته خارج می کند) و نتیجه را درون پشته قرار می دهد
    هرچند این زبان نسبت به اسمبلی میکروها سخت تر است اما به ما قابلیت جدا شدن از بند 8 بیتی یا 32 بیتی یا چند رجیستر می توان استفاده کرد و ... رها می کند
    ضمنا برای هر زیربرنامه نیز ما یک مکان برای ذخیره داده موقت داریم .( که این کار رو در میکروها با استفاده از اختصاص یک پوینتر، مثلا در AVR ، پوینتر X انجام داد یا به شکلهای دیگر قابل پیاده سازی است)
    هر چند قرار نیست کل دستورات زبان میانی ماکروسافت یا همان MSIL یا به اختصار IL رو اجرا کنیم چون این زبان در واقع زبانی است که کاملا از مفاهیم شی گرایی مانند وراثت، تغییر شکل پذیری و ... که از قابلیتهای .NET شمرده می شود برخوردار است.
    طرح من هم تقریبا (99.99%) مانند ماکروسافت با این تفاوت که قرار از تایمر، A/D ، با حافظه های خیلی کم، و سایر مشخصاتی که متعلق به میکروکنترلر ها هست رو در خودش قرار بده
    در این صورت اگر شما بتوانید یک کتابخانه برای زبان میانی بنویسید می توانید از آن در همه میکروها و در همه زبانهای برنامه نویسی از آن استفاده کنید
    برای شروع همه ابتدا دستورات زبان میانی پیدا کرد که تمام خواسته های یک میکرو رو بتواند انجام دهد
    برای این کار با خودم گفتم همانند ماکروسافت عمل می کنم با این تفاوت که نوع داده ذخیره شده در پشته را نیز ذخیره کنیم ( چون بیس کار IL داده های 32 بیتی است) و همچنین بخشی نیز اضافه شود که کاری همانند I/O ها در میکرو پرسسورها انجام دهد و برای هر وسیله که می تواند ram یا حافظه flash یا Timer یا ... باشد یک آدرس مشخص در نظر گرفته شود مثلا اگر آدرس بین 1024 تا 1500 باشه این حتما یک ram داخلی یا اگر بین 2048 تا 3062 بود آدرس یک Flash یا بقیه ....
    حتما با خودتون میگید حافظه Flash یا Ram خیلی بیش از اینها آدرس نیاز داره ؟
    اما این آدرس خود ram یعنی می توانید چند تا حافظه رم داشته باشید و آدرس داخلی نیز باید علاوه بر آن داده شود یعنی اول باید آدرس نوع وسیله را بدهید سپس آدرس داخلی آن را در این صورت می توانید آدرسهای قطعه را ثابت نگه دارید
    همچنین بخشی دیگر نیز بهش اضافه کردم تحت عنوان پشته وقفه، اگر وقفه ای در یکی از دستگاه ها ایجاد شده باشد آدرس زیربرنامه هایی که باید اجرا شود در این بخش نوشته می شود

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

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

    این که طراحی یک کامپایلر برای میکرو های مختلف است
    بگذارید یک دورنما از طرحی که مد نظرم هست بدم موضوع کمی برایتان جا بیفتد
    چند سال بعد :rolleyes:
    به جای کامپایلر ، اسمش رو می زارم IDE
    محیط توسعه یا IDE محیطی است شامل ابزار که موجب سهولت کار توسعه و طراحی نرم افزار می شود (همانند Visual Studio)

    IDE من همانند Visual Studio دارای دو بخش مجزا است :1- کد نویسی 2- ویژوال (بصری)
    شما قسمت بصری همانند برنامه های کشیدن مدار، مدار خود را طراحی کرده به صورت بلوک دیاگرامی و IDE خودکار پیکربندی قطعات متصل به میکرو را انجام می دهد. و در قسمت کد می توانید فقط برنامه نویسی را انجام دهید فارغ از اتصال سخت افزار
    حتی می توانید در یک پروژ از چندین میکرو استفاده کرده و شما فقط پروتکل ارتباطیشان را تعیین می کنید بقیه کاره و برنامه ها با IDE (مثل شناساندن به یکدیگر)
    به راحتی می توانید میکروی جدید را همانند بقیه میکروها برنامه نویسی کنید فقط کافی است بدانید چه چیزی به میکرو اضافه شده است
    با یاد گیری یک برنامه برای همه میکروها برنامه نویسی کنید
    می توانید کتابخانه ای را بنویسید که دیگر دوستان با هر زبانی (C ، basic ، ...( و برای هر میکروی(تا جایی که از قابلیتهای منحصر به فرد میکرو محسوب نباشد) از آن براحتی استفاده کنند و دعاتون کنند. در این صورت اگر در کل عالم هر روز فقط 1 نفر یک کتابخانه بنویسد در سال 365 قطعه مختلف جدید را می توانید برای میکروها و زبانهای مختلف داشته باشید
    قسمت شبیه ساز داره که می توانید برنامه را اجرا کنید تا از مشکلات برنامه مطلع شوید
    توابع قطعه مورد نظر را به راحتی بدون اینکه نیاز به دانستن نام کتابخانه داشته باشید پیدا کرده و از آن استفاده می کنید و همه کتابخانه ها چه آنهایی که به پروژه ضمیمه شده اند چه در خود کامپایلر وجود دارند به صورت منظم دسته بندی شده هستند که استفاده از آنها را راحت تر می کند
    دارای Help قوی هست که با زدن کلید F1 و با توجه به مکان نما و دستوری که در آن هستید راهنمایی جامع همراه مثال به شما می دهد.
    می توانید به هر زبانی که دوست دارید در آن برنامه نویسی کنید بدون اینکه از نظر کارکرد تفاوت چندانی با هم داشته باشند
    و ....
    باز گشت به زمان حال :biggrin:
    همونطور که می بینید بیشتر طرح من کپی برداری شده از شرکت ماکروسافته ( که اگر ماکروسافت یک کم به این حوزه اهمیت می داد تا حال عملی شده بود)
    اولین قدم برای عملی شدن این ایده اینه که ما یک زبان میانی قوی تعریف کنیم که بتونه فارغ از چند بیتی بود دستورات (8بیتی ، 32 بیتی یا ...)، امکانات سخت افزاری ، نحوه آدرس دهی یا کار با رجیسترها ،در هر میکرو باشه
    برای درک بهتر علت استفاده از زبان میانی بهتر است از مثالی که در کتاب اصول طراحی کامپایلر نوشته جعفر پور امینی خواندم را برای شما عینا بیاورم . فرض کنید می خواهیم متن خبری را از زبان روسی به تمام زبانهای دنیا ترجمه کنیم واضح است که اگر تعداد کل زبانهای دنیا را n فرض کنیم در این صورت به n-1 (به جز زبان روسی) مترجم نیاز است تا این خبر را ترجمه کنند.
    اگر بخواهیم متن خبری را از هر زبانی به هر زبان دیگر ترجمه کنیم در این صورت به n(n-1)/2 مترجم نیاز است . در این صورت اگر n=100 باشد تعداد مترجمهای مورد نیاز 4950 می شود.
    راه حل این مشکل استفاده از یک زبان میانی است. به عنوان مثال زبان انگلیسی را به عنوان زبان میانی و بین المللی در نظر می گیریم هر متنی ابتدا به زبان انگلیسی ترجمه شده و سپس به زبان مقصد ترجمه می شود . در این حالت فقط به n مترجم نیاز است . که اگر n=100 باشد فقط به 100 مترجم نیاز است که بسیار کمتر از 4950 است.
    در لیست زیر دستورات موجود در زبان میانی ماکروسافت IL و زبانهای اسمبلی میکروکنترلهای AVR ، PIC و 8051 را برای مقایسه با هم می توانید ببینید
    من سعی کردم دستورات مشابه را در یک ردیف قرار بدهم (الزاما یک دستور زبان میانی ، به یک زبان اسمبلی تبدیل نمی شود و بلعکس)
    مواردی را که با رنگ قرمز مشخص کردم در دستورات IL نبود و به نظرم بهتر است به لیست دستورات خودمان اضافه کنیم
    البته من دستورات IL که مربوط به کار با شی و کلاس می شد را نیاوردم (آرایه و رشته هم جز شی ها محسوب می شوند، کلا تمامی کلاسها و اشیا موجود در .NET از شی پایه OBJECT که این زبان با آن کار می کند نمونه سازی شده اند)
    http://telec.persiangig.com/Compiler/INS.pdf

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

    دیدگاه


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

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

      http://www.harbaum.org/till/nanovm/index.shtml
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


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

        بله جناب طراح ، حق با شماست این کار یک تیم طراحی است. اما دور نمایی که ارائه دادم قرار نیست در یک بازه زمانی کم ایجاد شود و آن هم همه باهم و همچنین از بیان این ایده در جمع، پیدا کردن کسانی هستند که مشتاق باشند مرا در این امر یاری کنند .
        زبان های میانی مختلفی وجود داره اما برای اینکه کمتر دچار آزمون و خطا بشم ترجیح دادم از زبانهایی میانی استفاده کنم که قبلا کارایی خودشون رو اثبات کردند مثل زبان IL ماکروسافت که از روز ارائه تا کنون تغییر نکرده است (منظورم دستورات اسمبلی زبان ، نه موارد دیگر یا قسمتهای مربوط به شی ها) اما همان طور که میدانید این زبان برای کامپیوتر و کار با نرم افزارهای کار با داده بیشتر نوشته شده است که در آن کمتر دستکاری بیتی مد نظر است (چیزی که در میکروکنترلرها به وفور استفاده می شود) و فکر کنم در این قسمت است که کمی ضعف دارد (البته اینطور که بنظر من می آید)
        <<حتما این سوال قدیمی را شنیده اید: چطور یک فیل را می خورند؟ و البته جواب هم این است لقمه لقمه>> نوشته شده از کتاب قورباغه را قورت بده
        دقیقا حق با شماست
        دقیقا ، کاری که شما گفتید را تصمیم داشتم انجام دهم. یعنی بعد این که دستورات زبان میانی تعریف شده خودمون تمام شد، تثبیت شد، فقط برای میکروی AVR، نرم افزاری که زبان میانی (که بدست آوردیم) به زبان اسمبلی تبدیل کند خواهم نوشت (حتی نه تبدیل به Hex چون این کار را می توان با نرم افزار های اسمبلر که تحت دستور خط (Line Command)هستند (مانند AVRASM که توسط ATMEL ارائه می شود ) انجام داد
        گام بعدی دستورات دیگر که فراموش کردیم را دوباره اضافه می کنیم
        گام بعد بهینه کردن تبدیل دستورات میانی به دستورات اسمبلی که می توان بر حسب سرعت بیشتر، حجم کمتر، هم حجم مهم و هم سرعت مهم بهینه کرد
        گام بعد نوشتن چند کتابخانه ساده (شامل اجزای داخلی و خارجی مثل تایمرها، ADC داخلی، رابط سریال، lcd text، توابع ریاضی سینوس و کسینوس،..) تحت زبان میانی و سنجش کارایی در عمل (آیا کارایی که مد نظر بود رو داشته یا نه)
        گام بعد نوشتن مبدل برنامه زبان Basic به زبان میانی (البته اون بیسیکی که شما از Bascom می شناسید نه ، بلکه تقریبا شبیه به VB که بسیار راحت تر و کارا تر است (که در مرحله اول خیلی از قسمتها را نخواهد داشت)) که فکر کنم سخت ترین قسمت کار و مهمترین قسمت که می تونه کارایی رو نشون بدهد
        چون از اینجا به بعد است که می توان برنامه را برای آزمایش منتشر کنید که آیا واقعا جواب می دهد یا نه (بدلیل اینکه قبل از این زبان میانی در کاره بوده که فهم و کار باهاش سخته و کمتر کسی حاضر به وقت گذاشتن برای یاد گیری و تستش می کنه)
        و بقیه ماجرا شامل بهینه کردن تبدیل Basic به IL ، اضافه کردن کتابخانه های بیشتر، اضافه کردن زبانهای بیشتر ، اضافه کردن میکروهای بیشتر، یا در نهایت شبیه سازی و گذاشتن Help قوی و ....
        و در آخر ترکیب کردن همه این موارد کنار هم و در غالب یک نرم افزار جامع. راه درازی در پیش داریم
        علت اینکه اینقدر روی دستورات زبان میانی تاکید دارم که دقیق تر عنوان بشه این است که پی اصلی ماست و ما بر اساس اون داریم کل سیستم رو می چینیم و اگر بخواهیم یک دستور آن را بعدها تغییر بدهیم بیشترین تغییر را خواهیم داشت و باید از اول تبدیل ها چه به زبان میکرو و چه زبان سطح بالا ، کتابخانه ها و ... دوباره نوشته شود . پس وقت گذاشتن بیشتر روی این قضیه می تواند در حداقل کردن تغییرات در آینده را تضمین کند
        نمی دانستم تبدیل زبان Java به AVR هم نوشته شده است، بابت لینکی هم که گذاشتید ممنون
        هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

        دیدگاه


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

          فقط مورد اینکه کد مورد بحث یعنی nanovm کد خوبی نیست. باید روی اون کار بشه.
          دوم اینکه شما مجبور نیستین دوباره چرخ رو اختراع کنین. فقط کافیه یک JIT آماده کنین که کد دات نت شما رو به AVR یا هر میکروی دیگه ای تبدیل کنه. سوم پیاده سازی ساختار حجیم و سنگینی مشابه ساختار دات نت و MSIL روی میکرویی مانند AVR یا 8051 یا حتی یک PIC در خیلی موارد نشدنیه. چون برخورد کردن با MSIL و دات نت بدون در نظر گرفتن CLI عملا اصل و اساس دات نت رو زیر سوال میبره و MSIL فقط چهار تا دستور جمع و ضرب نیست. شاید با توجه به بار کم یک مفسر جاوا همون پیشنهاد جناب طراح بهتر از همه باشه. یعنی بیاین کد های حساس رو (مخصوصا حساس از لحاظ زمانی) با یک زبان native بنویسین اما منطق رو با زبانی مثل جاوا.

          این رو هم خدمتتون عرض کنم که در MSIL مثلا ما دستور add که داریم این دستور متعلق به نوع خاصی نیست. بلکه معادل عمل "+" برای دو مقدار است. در صورتیکه در جاوا برای جمع دو عدد صحیح یا دو عدد اعشاری دو دستور متفاوت داریم. و این مشخص میکنه که دید پشت جاوا یک "اسمبلی فرضی" بوده مشابه اسمبلی ماشین های موجود که با مقادیر و انواع داده ای پایه کار دارن در صورتیکه در MSIL فرض بر اینه که کسی که کد رو اجرا میکنه خودش "میتونه بفهمه" که در هر لحظه چی در evaluation stack هست.

          بنا براین ممکنه ایده کلی مایکروسافت همون ایده کلی شرکت Sun microsystems باشه ولی دقیقا همون نیست. و فقط دات نت اجرای کد نوشته شده به چند زبون نیست. جسارتا این یک تفسیر خیلی خیلی خام از تکنولوژی دات نت هست. در دات نت ما کد رو safe و managed مینویسیم. در صورتیکه در جاوا همچین تعبیری وجود نداره.
          دات نت بدون Reflection عملا خیلی از محسناتش رو از دست میده ولی ذخیره اطلاعات Reflection برای استفاده در یک میکرو یعنی سیستمی شدیدا محدود در میزان منابع موجود تا حد زیادی هدف نهایی استفاده از این کد مشترک رو زیر سوال میبره. در ساختار دات نت شما به هر زبانی برنامه بنویسین در کد اسمبلی هنوز ساختار شیء گرای برنامه حفظ شده. اما در کد جاوا (pcode) این ساختار حفظ نمیشه.
          دردسرتون ندم. این مورد خیلی چیز قشنگیه اما دقیقا مثل کارتون های ژاپنی میمونه قشنگ ولی اغلب اگر نگیم نشدنی ... بدون صرفه.

          دیدگاه


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

            رضا آقا شما درست می گوید، اگر من قرار باشه برنامه ای بنویسم که در .net کار کنه بهتر که یک JIT که بتونه کد میانی رو به کد ماشین تبدیل کنه و بقیه قضایای کنترل حافظه، ایجاد شی ، از بین بردن شی ، مدیریت خطا و خیلی کارهای دیگری که بخش JIT می کنه و من نمی دونم، را برای میکرو باید می نوشتم. که اون هم کار یک نفر نیست کار یک تیم بزرگی است که من اصلا خودم رو در اون حدی نمی بینم که بخواهم حتی جز این تیم باشم
            یا می شه یه تبدیل کننده کد bytecode (کد میانی java) به کد اسمبلی میکرو (مثل avr) بنویسم که اون هم مشکلات (هر چند کمتر( چون اون هم شی گراست)) خودش رو داره
            تازه اگر به فرض محال من میتونستم قسمت JIT را دوباره برای میکروکنترلرها بنویسم ، بله حجم برنامه فوق العاده بالا می رود و اصلا داخل حافظه میکروهای موجود (مثل avr، PIC یا...) جا نمی شه. چون اینها برای میکروهای مثل 8 بیتی یا 16 بیتی یا حتی در موارد نادر 4 بیتی (که قرار است مبدل این نوع میکروها هم در آینده دور اضافه بشود (موشه تو سوراخ نمی رفت جارو به دمش می بست)) بهینه نشده اند
            اما هدف من اینها نیست ، منظور من از کپی برداری از .NET فقط شکل دستور زبان میانی (تازه نه همه آنها) و ساختار کلی آن بود نه اینکه بخواهم دوباره آنها را بازنویسی کنم
            علت اینکه شما چنین تصوری کردید ، توضیحات ناقص من بوده، بگذارید اینجور بگم
            هدف من طراحی یک میکرویی خیالی است (زبان میانی) با منابع نا محدود و بدون وابستگی به ساختار 8 بیتی یا 16 بیتی یا 32 بیتی که بشود برنامه نوشته شده برای آن را به هر میکروی دیگر تبدیل کرد
            مثلا

            basic
            .localsbyte 10
            .
            .
            .
            test()
            .
            .
            .

            Sub test()
            Dim x As Int16
            Dim y As Int16
            x = y + x
            End Sub


            یا C
            void test(void)
            {
            int x,y;
            x=y+x;
            }

            کد میانی
            .method test()
            {
            // Code size 6 (0x6)
            .localsbyte 4
            .locals init ([0] int16 x,[1] int16 y)
            IL_0001: ldloc.1
            IL_0002: ldloc.0
            IL_0003: add
            IL_0005: stloc.0
            IL_0007: ret
            } // end of method
            [hr]
            کد اسمبلی
            test:
            adiw r28:r29,10 ; Y=Y+10
            ldd r16,Y+0
            ldd r17,Y+1
            ldd r18,Y+2
            ldd r19,Y+3
            add r16,r18
            adc r17,r19
            std Y+0,r16
            std Y+1,r17
            sbiw r28:r29 ; Y=Y-10
            ret



            کد بیسیک تبدیل به کد میانی شده سپس تبدیل به کد اسمبلی می شود. به جای بیسیک می توانست زبان c باشد

            ساختاری که شما گفتید هم کاملا درسته
            تو .NET اگر اعداد از نوع 8 بیت یا 16 بیت باشند و بخواهیم روی آنها محاسبات انجام دهیم نتیجه تبدیل به int32 می شود و درون پشته قرار می گیرد.کلا اعداد تعریف شده برای محاسابت در دات نت int32،int64،float32 و float64 است که اون هم خودش با توجه به نوع مقادیر وارد شده تشخیص می دهد (البته من اینطور فکر می کنم، و در ادامه توضیح خواهم داد چرا چنین فکری می کنم) که داده از چه نوع است و در محاسبات دو نوع داریم با ایجاد خطا (مثلا اگر داده ها به یک شکل نباشند خطا ایجاد شود ، این دستورات وصله .ovfدارند) یا بدون ایجاد خطا و در مواردی که مشخص نشده و نمی شود تشخیص داد داده چه نوع است فقط روی داده int32 عمل می کند (مثلا دستور cpblk) ولی در bytecode دقیقا برای هر نوع داده ای دستور خاصی مشخص شده است مثلا برای جمع

            add dadd value1, value2 → result adds two doubles
            fadd value1, value2 → result adds two floats
            iadd value1, value2 → result adds two ints together
            ladd value1, value2 → result add two longs

            چرا فکر می کنم می تواند تشخیص دهد
            اگر دقت کنید توی دستورات زبان میانی ماکروسافت دستوراتی که مربوط به انتقال داده هستند دقیقا مشخص هستند که چه نوع داده را قرار است درون پشته قرار بدهند پس با توجه به دو دستور قبلی که مقداری را درون پشته ریخته اند می توان حدس زدن که داده ها از چه نوع هستند و محاسبات قرار است روی چه داده هایی انجام گیرد
            در لینک زیر، ریز دستورات را در IL و bytecode java برایتان گذاشتم(البته به جز کار با اشیا و آرایه ها) تا مواردی که رضا آقا گفتند را مشاهده کنید (سعی کردم جدول رو تو همین تاپیک قرار بدم بلد نبودم و حجمش هم زیاد بود)
            http://telec.persiangig.com/Compiler/J.htm

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

            دیدگاه


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

              جسارتا این میکروی خیالی شما پاش از همین حالا لنگه. چون به عنوان مثال اگه به نسخ جدید Visual Studio نگاه کنین اینکه یک ماشین 32 بیتی یا 64 بیتی باشه در تولید کد نهایی برای دات نت فرق میکنه و این یعنی یه ت... سربالا تو روی خود دات نت که میخواست platform independent باشه. ولی من حرفم سر موضوع دیگه ای هست.
              موضوع اینه که چرا دات نت؟ اگر شما میخوای این کار رو بکنی چرا دات نت؟ چون دات نت برای گذاشتن این دستور مثلا dup نقطه نظراتی داشته و جاوا هم برای گذاشتن دستور dup نقطه نظرات خودش رو. در دات نت این دستور محتوای اولین خانه eval stack رو duplicate میکنه. فارغ از اینکه چی باشه. چون زبانی هست objective. ولی در جاوا میبینین که چندین و چند فرم متفاوت از این دستور موجوده چون اینکه چی در top پشته وجود داره از چه جنسیه براش مهمه.
              مسئله مهمی که در طرح اولیه (گفتم اولیه چون مشخصا این یک طرح اتودیه و ممکنه اشکالاتی داشته باشه ولی با توجه به اولیه بودنش بدیهیه) وجود داره اینه که خواستین کاری روئ انجام بدین ولی مشخصا هنوز کار تفسیری و توجیهی روی این طرح انجام نشده. از طرف دیگه معلوم نیست هزینه های این طرح و محاسنش چیه. چرا؟ چون تفسیر نیاز های اولیه صورت نگرفته. من اگه بخوام این طرح رو بکوبم میدونین چی میگم؟ من خیلی راحت میام روالهای حیاتی برنامه مو به یک زبان native مینویسم و روالهای منطقی رو بر اساس اونها و یک مفسر جاوا قرار میدم. اینهمه دنگ و فنگ هم نداره. همه کارهامو هم راه میندازه.
              ایده شما ایده قشنگیه ولی بایستی مشخص کنه که اگه قراره کسی یا کسایی کاری روی این انجام بدن در نهاین چی از دست میدن و چی بدست میارن. مثلا دات نت یکی از مسائلی که حل کرده یا به کمکش اومده مسئله versioning هست. اما خیلی ها از این مورد استفاده نمیکنند با اینکه اطلاع دارند. این تیپ طراحی ها و تز دادن ها با عرض معذرت تنها در حد همون طرح اتودیه و بدون یک تحلیل درست فقط ایدهء شما رو حروم میکنه و وقتتون رو تلف!
              پیشنهاد میکنم یک وقتی بذارین روی بررسی ساختاری میکرو های متفاوت تا تفاوت ها و محدودیت های احتمالی موجود در این میکرو ها دم دستتون بیادو از من میشنوین در این مرحله از خیر میکروهای 16 بیتی به بالا هم بگذرین چون اینا معمولا دارای امکانات بسیار بالا و قدرت بمراتب بیشتری نسبت به فرم های 4 و 8 بیتی هستن بنابراین میتونن ضعف های طرح شما رو براحتی قایم کنن و شما رو در زمان حمله به میکروهای 4 و 8 بیتی تو هچل بندازن.
              یک وقتی هم بذارین روی خود تکنولوژی دات نت و ساختار یک JVM تا بهتر درک کنین که طراح جاوا چی توی ذهنش بوده؟ شاید کمک کنه شما این طرح (در حال حاضر) قشنگ و رویایی رو به جایی برسونین که صد تای مثل من هم نتونن ایرادی روش بذارن.

              و در آخر باز هم میگم چرا جاوا و چرا دات نت. چرا مثلا MCL نباشه یه چیزی از خودتون. ممکنه توش از جاوا و دات نت هم بهره ای برده شده باشه. ولی باید یه چیز دیگه باشه.

              راستی یادم رفت. من تا بحال کد هایی رو که روی میکرو نوشتم از 8051 تا AVR و ARM احتیاجی به مدیریت حافظه پویا نداشتم. بنا بر این بحث Garbage Collection و Object Disposition محلی در این کد ها نداشته. از طرف دیگه روالهای من عمدتا دارن لوپ های کنترلی سریع و سبک رو انجام میدن. چه احتیاجی هست سراغ Exception Handling برم؟ همین جا برای من سه تا مورد خیلی زیر ذره بین توسط کاربر های این دو تا پلاتفرم حذف میشه. پس من چی رو قراره از این دو محیط استفاده کنم؟ فقط یک کد مجازی؟

              یک نگاهی به پز های شرکت اتمل بندازین وقتی میگه کد AVR نسبت به 8051 کوچیکتره. چه کد JIT شده و چه کد تفسیری این حجم نسبت به کد native عموما بزرگتر یا کند تر (یا هردو) میشه.

              راستی اون موردی هم که راجع به پسوند ovf فرمودین به overflow check برمیگرده و این یعنی همون خطایی که خود من اغلب دچارش میشم رو دچارش شدین: مراجعتون رو دقیقا مطالعه نکردین. یک مورد های مشابهی رو میتونین برای درک بهتر از این قضیه overflow در مطالعه مدارک مربوط به تکنولوژی MMX یا SSE بدست بیارین. مثلا خطای Saturation.

              وقت کردین یک سری هم به فیلمهای آموزشی میکرو سافت در channel-9 بزنین مخصوصا یادداشتهای خانم Susan Cook.

              ارادتمند.

              دیدگاه


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

                این که شما فرمودید این طرح خام است قبول دارم و هنوز باید روش بحث بشه، اما چرا من این قضیه را که هنوز خام است اینجا مطرح کردم
                راستش این طرح من مال الان یا دیروز نیست که به ذهنم رسیده ، تقریبا طراحی کامپایلر برای میکرو مال 4 سال پیشه (البته نه به این صورت ) وقتی که با کامپایلر FastAVR کار می کردم و تبدیل کد بیسیک به اسمبلی رو دیدم اوایل کار فقط چون زبان اسمبلی را دوست داشتم می خواستم خودم این کد ها را بنویسم و بدونم دقیقا چی به چی داره تبدیل می شه ، اما بعد ها که درباره مبانی طراحی کامپایلرها ، زبان اسمبلی x86، 8051 ، avr ، زبان vb.net و مبانی پلتفرم .NET و یک سری از مبانی برنامه نویسی که بلد نبودم آشنا شدم پایه های این طرح شکل گرفت . اما به دلایل تنبلی، در عمل کاری رو صورت ندادم و از اونجایی که بیشتر وقتها کاری رو که شروع می کنم تا مجبور نباشم (زور نمره،به کسی قول داده باشم و...) تا آخر انجام نمی دم ، واسه همین با خودم گفتم اینجا مطرح کنم که هم دوستانی که مشتاق هستند کمک کنند و هم من خودم را مجبور کنم کار رو پیش ببرم تا طرح عملی بشود
                چرا دات نت؟
                اگر دقت کنید در زبان های برنامه نویسی (اسمبلی) می توان گفت در 80 درصد موارد دستورات مشابه هم هستند (اگر قضیه نوع داده ها 8 بیتی،16 بیتی و ... و دستوراتی که مربوط به سخت افزارهای خاص می باشند مثل WDR،DES و ... را مطرح نکنیم) و بیشتر اختلافات آنها نیز در نوع بیان آدرس دهی ها و رجیسترها ( 8051 با دو رجیسترa,b در عملیاتهای حسابی کار می کنه و AVR با 32 رجیستر( و در مواردی 16 رجیستر) کار می کنه) ، آنها می باشد و در کل می توان گفت دستورات آنچنان تفاوتی با هم ندارند ( مواردی مانند اینکه در زبان اسمبلی x86 دستورات درون رم قرار می گیرند و بعد اجرا می شوند و یا در avr فضای آدرس دهی برای کد و رم جدا شده است و موارد مشابه را نیز در نظر نگیرید. راستی وسایل جانبی مثل تایمر ، ADC، ... را هم در نظر نگیرید )، بین مواردی که من دیدم دستورات IL (زبان میانی دات نت) شیوا تر از بقیه بود، مخصوصا برای بیان زبان سطح بالا و همچنین با توجه به وجود نرم افزار IL Disassembler که می تواند فایل exe نوشته شده برای .NET را به صورت زبان IL نشان دهد ، در آینده خیلی راحت تر می تونم زبانی مثل بیسیک را پیاده سازی کنم ، و مواردی را که در تبدیل مشکل دارم می توانم توسط این نرم افزار دیده و سعی کنم الگوریتم اون را شبیه سازی کنم و از آن یاد بگیرم (مثلا یک حلقه for )
                هزینه ها و محاسن این طرح؟ چرا شما بخواهیم با همچین نرم افزاری کار کنید
                اولا کسی که می خواهد برای میکرو برنامه بنویسد لازم نیست بداند اصلا این زبان میانی چکار می کند یا چی هست (مثل کسانی که با .NET کار می کنند) و این زبان قرار دادی است (یا همان میکرو خیالی است) که قرار است قرار است همه اول تبدیل به آن بشوند و سپس تبیدل به زبان اسمبلی میکرو
                ، بزارید چند سوال از شما بکنم
                آیا دستور ندارید برنامه ای که برای کد ویژن می نویسید داخل میکرو PIC استفاده کنید؟
                دوست ندارید برنامه نوشته شده در Bascom رو در ARM اجرا کنید؟
                دوست ندارید از کتابخانه داخل نرم افزار WinAVR درون پروژه خودتون با بیسیک استفاده کنید؟
                دوست ندارید با هر با میکروهای جدید بدون یادگیری نرم افزار جدید کار کنید؟
                دوست ندارید با نوشتن یک برنامه آن را در کلیه میکرو ها اجرا کنید؟
                دوست ندارید با هر زبانی که دوست دارید با میکرو مورد نظرتان کار کنید؟
                .
                .
                .
                بله ، قرار نیست فقط زبان بیسیک یا C (که بعدا قرار است تعریف شود) بتوانند از این زبان میانی استفاده کنند بلکه هر نرم افزاری با هر زبانی می تواند از قابلیتهای این زبان میانی استفاده کند،(کافی است که از پروتکلهای آن پیروی کند و به آن زبان تبدیل شود) یعنی برای جذب کاربران دیگر نرم افزارها مبدلهایی در آن قرار خواهد گرفت ( اما بعد از نهایی شدن کامپایلر).
                فکر می کنم محاسن این طرح به هزینه های آن بچربد
                هر چند برای نهایی شدن چنین طرحی نیاز به بکارگیری یک تیم بزرگ و مجرب هست. اما از آنجایی که چنین هزینه برای چنین تیمی ندارم، بهتر است خودمان دست بکار بشیم و آهسته آهسته کارها را پیش ببیریم.
                در دات نت این دستور محتوای اولین خانه eval stack رو duplicate میکنه. فارغ از اینکه چی باشه. چون زبانی هست objective.
                همونطور که قبلا گفتم قرار نیست یک دستور زبان میانی دقیقا به یک دستور اسمبلی تبدیل شود و بلعکس . و برای تبدیل با توجه به دستوراتی که درون پشته ریختن و دستوراتی که از پشته بعد از آن برداشت کرده اند تصمیم می گیرد که این add را چطور پیاده سازی کند
                بگذارید یک مثالی بزنم


                ….[0] int8

                ldc.i8 10
                ldc.i8 20
                add
                stloc.0
                ldi r16,10
                ldi r17,20
                add r16,r17
                std y+0,r16
                ….[0] int16

                ldc.i8 10
                ldc.i8 20
                add
                stloc.0

                ldi r16,10
                ldi r17,20
                add r16,r17
                cbr r17
                adc r17,r17
                std y+0,r16
                std y+1,r17

                ….[0] int8

                ldloc.0
                ldc.i8 20
                add
                stloc.0

                ldd r16,Y+0
                ldi r17,20
                add r16,r17
                std y+0,r16

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

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

                پس من چی رو قراره از این دو محیط استفاده کنم؟ فقط یک کد مجازی؟
                بله دقیقا ، تازه نه همش. همونطور که گفتم طرح کلی کپی برداری شده از ساختار .NET اما نه همش، شما درست می گویید قرار نیست من مدیریت خطا یا حافظه پویا داشته باشم.
                راستی اون موردی هم که راجع به پسوند ovf فرمودین به overflow check برمیگرده و این یعنی همون خطایی که خود من اغلب دچارش میشم رو دچارش شدین: مراجعتون رو دقیقا مطالعه نکردین
                بله شما درست می گویید ovf اختصار Overflow متشکر :nice:

                در صورتی که نتیجه عملیات نتواند در مقصد داده ها قرار بگیرد ایجاد یک استثنا می کند. مورد استفاده برای add.ovf, add.ovf.un, mul.ovf, mul.ovf.un, sub.ovf, sub.ovf.un در مواردی که سایه دار هستند قابل تایید نیستند ، و در مواردی که در جدول پر شده با * نشان دهنده توالی CIL نامعتبر است.
                در آخر لینکی گذاشتم تا دوستان بتوانند لیست کامل دستورات و معماری دات نت را که توسط سایت ECMA.ch برای عموم گذاشته شده است را مطالعه کنند
                http://www.ecma-international.org/pu...T/Ecma-335.pdf
                هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

                دیدگاه


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

                  سلام ، ببخشید بخاطر تاخیر در ارسال تاپیک جدید
                  پیرو توضیحات قبل بهتر دیدم که دستورات را برای زبانی میانی خودمون تعریف کنیم حالا کم یا زیاد بعدن سرو سامانش خواهیم داد
                  لینک زیر لیست این دستورات است
                  http://telec.persiangig.com/Compiler/INS.pdf
                  در کل قرار است از 13 فرم مختلف داده ای پشتیبانی کند



                  دستورات را می توان از دید کلی که چه ارتباطی با پشته برنامه دارند تقسیم بندی کرد
                  نکته : در کل دستورات هر نوع عملوندی مجاز است استفاده شود (bit، byte،int و ....) مگر اینکه در آن دستور امکان پذیر نباشد مثل And اعداد ممیز شناور
                  دستوراتی که برای انجام عملیات نیاز به سه عملوند دارند که درون پشته قرار گرفته است :cpblk و initblk
                  دستوراتی که برای انجام عملیات نیاز به دو عملوند موجود در پشته نیاز دارند : مثل Add ، and ، bge و ...
                  دستوراتی که برای انجام عملیات نیاز به یک داده موجود در پشته دارند : مثل conv، not ، ldindf و ...
                  دستوراتی که نیاز به هیچ عملوندی از پشته ندارند : مثل br، Reset و ...
                  دستوراتی که نیازی به پشته ندارند و داده درون پشته ذخیره می کنند مثل ldarg ، ldc و ...
                  در کل داده ها درون پشته فقط از یکی از حالتهای زیر می توانند درون پشته قرار بگیرند
                  1- نتیجه عمل قبلی باشد (مثلا نتیجه دستور Add )
                  2- از فضای IO درون پشته ریخته شده باشد (توسط دستور ldind.io)
                  3- از حافظه برنامه درون پشته ریخته شده باشد (توسط دستور ldind.f)
                  4- از حافظه داده درون پشته ریخته شده باشد (توسط دستور ldind.r)
                  5- متغییر محلی درون پشته قرار بگیرد (توسط دستور ldloc)
                  6- آرگومان درون پشته قرار بگیرد (توسط دستوز ldarg)
                  7- یک عدد ثابت درون پشته قرار بگیرد (مثل دستور ldc)
                  نکته : آدرسها نیز جز اعداد ثابت محسوب می شود که نوع آنها توسط کامپایلر با توجه به نوع IC انتخاب شده تعیین می گردد مثلا برای AVR-Mega32 آدرس ها یک عدد از نوع uint2 تعیین می شوند
                  همان گونه که در بالا می بینید در 7 حالت بالا دقیقا نوع داده ای که قرار است درون پشته ریخته شود مشخص و معلوم است بطوری که برای 2 تا 7 دقیقا برای هر نوع داده یک دستور وجود دارد و برای شماره1 نیز کاملا با توجه به نوع عملیات مشخص می باشد
                  چگونگی تبدیل کدها ی زبان میانی به کدهای ASM برای میکرو AVR
                  ما یک صفحه متن برای نوشتن معادل دستورات ASM نیاز داریم
                  برای انجام عملیات دو عملوند اصلی داریم
                  که قرار است عملوند اول برای متغییرهای 1 ، 4 , و 8 بیتی zl و عملوند دوم را r24 ایفا کند
                  برای متغیرهای 16 بیتی عملوند اول zl,zh وعملوند دوم r24,r25
                  و برای عملوند 32 بیتی عملوند اول zl,zh,r18,r19 و عملوند دوم r24,r25,r16,r17 خواهد بود
                  از متغیرهای r2 تا r5 برای تعریف متغیرهای بیتی
                  و از سایر متغییرها برای انجام عملیات در زیربرنامه ها و یا تعریف متغیر محلی که بیشترین استفاده را دارد، می توان استفاده کرد
                  ***نتیجه یک عمیات درون عملوند اولی ذخیره می شود
                  کامپایلر دستورات را به ترتیب خوانده و
                  اگر دستورات load کردن درون پشته هستند فقط آنها را درون یک آرایه که به صورت پشته به نام XX تعریف شده قرار می دهد
                  دستورات با فرمت خاصی درون XX ذخیره خواهند شد که در آن نام دستور، نوع داده، اگر داده ای پارامتر ورودی داشته باشد (مثلا ldc.i2 30، مقدار 30) با هم ذخیره می شود


                  اگر دستور هیچ کاری با پشته ندارد (مثل دستور br) معادل ASM را درون صفحه متن ASM قرار بده ولی درون آرایه پشته XX هیچ چیز قرار نده
                  اگر دستوری نیاز به داده های پشته دارد صدا زده شد
                  چند حالت به وجود می آید
                  فرض کنید دستور از نوعی باشد که با دو عملوند کار می کند مثل دستور Add
                  نکته :مکان پشته که آخرین دستور قبلی انجام شده است و نوع داده ایی که روی آن عملیات انجام شده است ذخیره می شود
                  مثلا در شکل بالا 2 و int8 در متغییری در کامپایلر ذخیره می شود
                  ابتدا باید عملوندها را مقدار مقدار دهی کنیم اکنون دو مقدار آخری که درون پشته وجود دارد را Pop کرده و با توجه به نوع دستور آن تصمیم گیری می کنیم
                  1- داده ای در پشته XX وجود نداشته باشد -<-<در این صورت تولید خطا خواهد کرد
                  2- اگر یکی نتیجه عمل قبلی باشد (مثل Add) و دیگری غیر از نتیجه قبلی باشد (مثل ldc)- در نتیجه عملیات قبلی درون درون علموند یک قرار دارد و نیازی به قرار دادن یا تغییر آن نیست و کافی است عملوند دوم را با توجه به دستور و نوع آن مقدار دهی کرد مثلا برای دستوری که می بینید معادل زیر را قرار دهید
                  ldi r24,byte1(50)
                  ldi r25,byte2(50)
                  ldi r16,byte3(50)
                  ldi r17,byte4(50)
                  اکنون با توجه به نوع دو متغییر زیربرنامه نوشته شده مخصوص آن را صدا می زنیم و درون صفحه متن ASM معادل آن دستورقرار می گیرد
                  برای دستوراتی که به دو داده پشته نیاز دارند 169 ، و به یکی داده پشته نیاز دارند 13 تا زیربرنامه باید نوشته تا همه حالتهای ممکن را پوشش دهد (مثل in8باin32،bitبا float64،int16باint8 و...( البته همه دستورات به کل حالتها نیاز ندارند
                  مشخصات زیربرنامه در قسمت بعدی توضیح خواهم داد.
                  3- اگر هر دو دستور موجود در پشته XX از نوع داده ثابت باشند-- در این صورت خود کامپایلر عملیاتی که قرار است روی آن دو عدد ثابت انجام شده را با توجه به دستورعملیاتی انجام داده و معادل دستور آن را Push می کند (مثلا دستور Add بعد از دو دستور ldc.i1 7 و ldc.i1 18 آورده شده باشد معادل آن را یعنی ldc.int8 25 را در پشته XX قرار می دهد)
                  4- اگر هر دو دستور غیر از نتیجه عملیات قبلی باشد -- در این صورت اگر مکان پشته که قبلا ذخیره کردیم با مکان فعلی آن بیشتر از 2تا باشد (برای دستورات دو عملوندی یا بیشتر از 1 باشد برای دستور تک عملوندی) کامپایلر با توجه به نوع داده (که به همراه آدرس پشته ذخیره کردیم،) دستور Push برای قرار دادن zl و zh و r18 و r19(اگر داده 4 بایتی باشد) در پشته میکرو کنترلر را درون صفحه متن ASM قرار می دهد . سپس آخرین داده را درون عملوند دوم و قبلتر آن را درون عملوند اول قرار داده و یکی از زیربرنامه های دستور عملیاتی (منظور دستوری که می خواهیم روی این دو داده پیاده کینم) را با توجه به نوع دادهای دستوراتی که درون پشته بودند (منظور دو دستور آخر که از پشته XX ، pop کردیم(
                  صدا می زنیم
                  5- اگر هر دو دستور موجود در پشته XX نتیجه محاسبات قبلی باشد -- داده های موجود در عملوند اول را درون عملوند دوم کپی کن سپس درون عملوند اول مقادیر را از پشته میکرو pop کن و معادل دستورات لازم را نیز درون صفحه متن ASM قرار بده و بعد زیر برنامه مناسب با نوع داده ها را صدا بزن
                  در آخر اگر هر یک از موارد 2 تا 5 باشد یک نتیجه نیز درون پشته XX ذخیره می کند که شامل داده خروجی ، نوع دستور و پارامتر (هیچی است) را ذخیره می کند
                  زیربرنامه ها
                  در کل زیربرنامه ها ی که در کامپایلر نوشته می شود (منظور با زبان برنامه نویسی مثل VB.NET یا C# که برای طراحی کامپایلر از آن استفاده خواهیم کرد) دارای سه بخش کلی است
                  1- دادن مقادیر اولیه یا مجموعه دستورات اولیه
                  2- دستورات معادلی که در همان خطی که دستور قرار می گیرد ، نوشته می شود (یعنی به ازای هر دستور دوباره تکرار می شود)
                  3- زیربرنامه های نوشته شده به زبان اسمبلی که در بخش دوم از آنها استفاده می شود که می توان در ابتدا فقط اسمهای آنها ذکر شود درون یک لیست و پس از تمام شدن برنامه در آخر برنامه کپی شود
                  می دونم که خیلی بد توضیح دادم و پراکنده تو تاپیک بعدی جبران می کنم

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

                  دیدگاه


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

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

                    به عنوان مثال:

                    برای دستوراتی که به دو داده پشته نیاز دارند 169 ، و به یکی داده پشته نیاز دارند 13 تا زیربرنامه باید نوشته تا همه حالتهای ممکن را پوشش دهد (مثل in8باin32،bitبا float64،int16باint8 و...
                    اینجوری بنظر میاد که میخوایین مثلا برای جمع دو عدد 8 و 16 بیتی یک روال جمع و برای دو عدد 16 بیتی یک روال دیگه داشته باشین. من تا جایی که میدونم اینجور مواقع همیشه (بسته به نوع عبارتی که نوشته میشه) عدد 8 بیتی به 16 بیتی تبدیل میشه و بعد این دو تا با هم جمع میشن. چون اگه این جوری بخوایین در نظر بگیرین جمع یک عدد 8 بیتی با یک عدد 16 بیتی متفاوت هست با جمع یک عدد 16 بیتی با یک عدد 8 بیتی. که خوب تا حدودی مسخره بنظر میاد. چون مسلما روال جمع a و b با b و a فرق میکنه وگرنه 13 در 13 عمل یا 169 عمل متفاوت در نظر گرفته نمیشد و فقط با یک exchange ساده به چیزی حدود نصف این میزان کاهش پیدا میکرد (فکر کنم میشد 91 روال) تازه روالهای جابجایی هم اضافه میشه.

                    از طرف دیگه این زبون فقط قراره یک کد واحد ایجاد کنه؟ اینجا ما مقادیر منطقی نداریم؟ اگه bit فقط مقدار صفر و یک داره یعنی منطقیه یا عددی یا هر دو؟؟ راستی!! شما که نوع float رو که گذاشتین double هم که دارین پس چرا real و long double رو هم پوشش نمیدین؟غیر از اون fixed point چی؟ اصلا چرا زبونتون محدود به نوعه؟ چرا مثل دات نت مستقل نیست؟ یکی از مواردی که زبونتون رو مستقل نمیکنه همین مثلا 169 روال عملیات دودویی هست.

                    راستی میدونین انجام عمل روی دو عدد 64 بیتی مثلا ضربشون در یک میکروی چهار بیتی چه مصیبتیه؟ و اصلا عقلانیه همچین امکانی رو روی همچین میکرویی ایجاد کنیم؟ اگر نیست که این برای همه میکروها نمیشه و اگه هست تا بحال فکرشو کردین برای یک میکرو مثلا attiny13 چطوری میخوایین کد ضرب float رو جا بدین؟

                    غیر از اون این قضیه IO چیه؟ مسلما شما تا بحال چیزی راجع به memory mapped IO نشنیدین. در این صورت عملا فضای حافظه فیزیکی هم قابلیت دسترسی مستقیم داره (مثل AVR) و این یعنی چی؟

                    علاوه بر اون یعنی من مجاز هستم در حافظه برنامه داده متغیر بذارم؟ چیزی که راجع به ممنوعیت این موارد اینجا قید نشده. لطفا چپ چپ هم نگاه نکنین! چون باید این تیپ قوانین ولو از نظر شما بدیهی؛ اینجا قید بشه. راستی راجع به مقادیر ثابت و متغیر هم اینجا هیچ صحبتی نشده. از من میشنوین یک سری به زبونهایی مثل جاوا بزنین و ببینین که آیا اونجا هم اومدن تقسیم بندی حافظه به کد و داده رو پیش کشیدن؟ اصلا زبون چه ربطی به اینا داره؟

                    ...

                    میبینین که الزاما با داشتن حتی یک زبان مشترک نمیشه به پوشش دهی همه میکروها فکر کرد. یعنی مثلا شما نمیتونین روی marc4 که یک میکروی 4 بیتی هست کار کنین. این میکرو موجوده ها! ضمنا نیازی که از یک میکروی چهار بیتی انتظار میره نسبت به یک میکروی 32 بیتی متفاوته و من باب اطلاعتون هیچ کدوم از اینا نمیتونن جای اون یکی رو بگیرن. کد ها هم بسته به انتظارات نوشته میشن. پس تا حد زیادی غیر منطقیه بخواییم همه میکروهای موجود رو با یه چوب برونیم.

                    جسارتا میخوام عرض کنم (بدتون نیاد) طرحتون واقعا قشنگه....ولی بدون یک حلاجی درست و حسابی و دیدن همه جوانب؛ فقط قشنگه!!! (نظر کاملا شخصی)

                    دیدگاه


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

                      سلام
                      دوستان به جای انتقاد کمک کنند که این ایده به یک محصول کامل تبدیل بشه. می دونم هدف انتقاد سازنده است ولی بجای اینکه فکر کنید چه انتقادی بکنید فکر کنید چطور میشه این ایده رو کاربردی کرد.

                      دیدگاه


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

                        جناب فاضل!
                        بهترین کار برای زمین خوردن یک فرد در طی یک مسیر تایید بی چون و چرای اونه. چون چشمش به روی حقایق باز نمیشه و عین چشم بسته راه رفتن در میدان مین میمونه. خواهی نخواهی دیر یا زود پاشو روی مین میذاره.
                        من از شکست این دوستمون نفعی نمیبرم و به نوعی ضرر هم میکنم. چون عمر این فرد متعلق به همه ما ها هست. ما جزء جامعه انسانی هستیم ها! (لا اقل که من اینطوری فکر میکنم) اما این تجربه ای که این دوستمون داشته رو من به نوعی دیگه قبلا داشتم. اگر اینا رو مینویسم فقط به خاطر اینه که چشمهاشو بیشتر باز کنه و مشکلات ولو غیر عینی جلوی پاشو بهتر ببینه. حتی اگر از من بدش بیاد. حداقل عمرش کمتر تلف میشه. ضمنا اگه قراره کاری انجام بده. یک کار خوب باشه. نه فقط یک کار.

                        اگر منظور کاربردی کردن این ایده باشه. با همین محدودیت ها و امکانات موجود خیلی مورد خاصی نیست. دو راه حل خیلی راحت داره. استفاده از جاوا یا MSIL. فقط باید یک cross jit compiler براش نوشته بشه. به همراه یک Framework برای پوشش دهی تمام میکروهای موجود. اما این دوستمون میخواد به نوعی چرخ رو دوباره اختراع کنه. چون فکر میکنه ایده جدیدی داره. پس بهتره ولو بنده به عنوان یک فرد غرغرو و منفی باف بهش کمک کنم چشماشو بیشتر باز کنه و طرحشو پخته تر کنه. یا حتی برای این روزها محدودتر؛ تا اینکه بی محابا به جلو بره.
                        چون هر چقدر فردی سریعتر بدوه موقع زمین خوردن محکم تر زمین میخوره. دویدن به صرف حرکت دادن دست و پاها مهم نیست. برنده شدن هم مهم نیست. مهم سعی به خط پایان رسیدن به بهترین وجهه.

                        دیدگاه


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

                          تشکر ویژه از رضا آقا دارم که تاپیک های من رو دنبال می کند و خیلی خوشحالم که می توانم از نظرات ایشون بهرمند بشم
                          اتفاقا جناب فاضل زمانی که رضا آقا این مسائل را می گویند چون می خواهم یک جوری جواب بدهم و مسائلی که من اصلا بهش فکر کردم یا برام کم اهمیت بود رو با دید دیگری می بینم ،ایده های بهتری به ذهنم می رسه و من از ایشون واقعا سپاسگزارم حقیقتش من فقط به عشق رضا آقا سعی می کنم این تاپیک را بروز کنم
                          من هم مثل شما اطلاعات چندانی ندارم اما طرحی که به ذهنم اومد و اعلام کردم به نظر من کاملا عملی و هیچ دلیلی برای انجام نشدنش نمی بینم و و سعی می کنم که تا اول دی نمونه اولیه که برای حداقل 4 داده از 13 داده که بتواند یک 20 دستور از 131 دستور را انجام دهد با همین روش را می نویسم و ارائه خواهم کرد تا ببینید به اون سختیها که شما فکر می کنید نیست (مگر اینکه طرح بهتری به ذهنم برسد یا دوستان پیشنهاد کنند)
                          من تا جایی که میدونم اینجور مواقع همیشه (بسته به نوع عبارتی که نوشته میشه) عدد 8 بیتی به 16 بیتی تبدیل میشه و بعد این دو تا با هم جمع میشن. چون اگه این جوری بخوایین در نظر بگیرین جمع یک عدد 8 بیتی با یک عدد 16 بیتی متفاوت هست با جمع یک عدد 16 بیتی با یک عدد 8 بیتی. که خوب تا حدودی مسخره بنظر میاد.
                          حق با شماست اما بهتر بود کل اون عبارت را به عنوان نقل قول می آوردید من در ادامه اش نوشته بودم که البته همه دستورات به کل حالتها نیاز ندارند ، که یکی از این موارد همین دستور Add که فرمودید یا دستورات منطقی مانند OR، ANDو ....
                          در مورد اینکه فرمودید در این جور مواقع تبدیل صورت می گیرد ، باز شما درست می فرماید اما این یکی از راه هاست ، فرض کنید دستور مقایسه ای بزرگتر بین دو مقدار باشد مثلا بین 32 بیتی و 64 بیتی (از یک نوع)در این صورت این که من بخواهم تبدیل کنم و بعد مقایسه کنم فقط اضافه کردن بیخودی دستور Convert و می توان با مقایسه کردن 32 بیت بالای متغیر 64 بایتی (بایت به بایت) این مقایسه را انجام داد بدون تبدیل ، پس همیشه اینطور نیست که بخواهیم تبدیل کنیم سپس روی داده ها عملیات انجام دهیم و من حالت کلی را در نظر گرفتم و بدترین شرایط را.

                          از طرف دیگه این زبون فقط قراره یک کد واحد ایجاد کنه؟ اینجا ما مقادیر منطقی نداریم؟ اگه bit فقط مقدار صفر و یک داره یعنی منطقیه یا عددی یا هر دو؟؟
                          بله قرار یک زبان واحد را ایجاد کنه که در تبدیل به آن کمترین دستورات نوشته شود
                          منظورتان را از مقادیر منطقی متوجه نشدم ، اما اگر منظورتان این است که عملیات منطقی روی اعداد می توان انجام داد باید بگویم بله (به جز اعداد شناور که ماهیتشان فرق دارد) و عملیات محاسباتی را نیز می توان انجام داد
                          راستی!! شما که نوع float رو که گذاشتین double هم که دارین پس چرا real و long double رو هم پوشش نمیدین؟غیر از اون fixed point چی؟
                          single یا Float4 همان real است این اسامی در زبانهای مختلف متفاوت است (مثلا در زبان c ، اسمش float گذاشتند در VB اسمش را گذاشتن Single و در زبان SQL اسمش را گذاشتند real) ولی در ماهیت از یک استاندارد پیروی می کنند به نام IEEE754
                          بهتر یک توضیح کوچکی درباره اعداد ممیز شناور بدم
                          استانداردی که اکثر کامپیوترها و زبانهای برنامه نویسی برای اعداد ممیز شناور پذیرفته اند استاندارد IEEE 754 که خود شامل دو گونه است IEEE754-1985 و IEEE754-2008 (1985 و 2008 سال ارائه این استانداردهاست)
                          به طوری که استاندارد IEEE754-1985 (بخش بیسیک)از دو نوع داده float32bit و float64 پشتیبانی می کند در پایه 2 ولی استاندارد IEEE754-2008 پیروی از پروتکل قبلی float128bit و در دو پایه 2 و 10را پشتبیانی می کند و نیز الگوریتمهای سریعتری نسبت به قبلی برای داده های بزرگ (128بیتی و 64 بیتی) ارائه کرده است.
                          یک عدد با ممیز شناور از سه قسمت تشکیل شده است. 1- علامت عدد 2- یک توان علامت دار 3- رشته ای از اعداد (مقدار عددی)


                          p= تعداد بیتهای که عدد را تعریف می کند (دقت)
                          =E_max حداکثر توان
                          〖=E〗_min حداقل توان
                          s = می تواند 0 یا 1 باشد (یعنی یک بیت است)
                          E=exp = هر عدد صحیح بین E_max و E_min می تواند شامل شود
                          〖=b〗_i می تواند 0 یا 1 باشد (منظور از Bi مثل b0،b1 و ... می باشد)
                          همچنین علامتهای ∞- و ∞+ و دو نوع NaN برای آن تعریف شده است
                          NaN به معنای عدد نیست، یک سمبل برای محتوای کد شده در فرمت ممیز شناور است. دو نوع NaN وجود دارد.یکی علامت خطای یک عملیات اشتباه و دیگری هر گاه آنها در عملوند ظاهر شود.
                          در اعداد ممیز شناور شده توسط استاندارد IEEE754 دو نوع اصلی اعداد ممیز شناور وجود دارد بیسیک و گسترش یافته (در اکثر کامپایلرهای کامپیوتر و یا میکرو از فرم بیسیک استفاده می کنند و تعداد بیتهای استفاده شده در آن نیز 32 یا 64 است که در سیستمهای ما راحت تر پیاده سازی می توانند بشوند)

                          توجه داشته باشید که روشهایی که گفته می شود یک روش استاندارد می باشد و تنها فرمتهای مجاز نیستند و شرکتها و ارگانهای مختلف بر حسب نیازشان اعداد ممیز شناور برای خودشان توصیف می کنند و مورد استفاده قرار می دهند برای اطلاعات بیشتر درباره انواع فرمتهای ممیز شناور به سایت زیر مراجعه کنید
                          http://www.mrob.com/pub/math/floatformats.html
                          راستش من خودم کامل مطالعاشون نکردم اما در آن نحوه روند کردم انجام عملیات ضرب و تقسیم و تبدیل به باینری و رشته را در pdf های زیر که مربوط به استاندارد IEEE754 است توضیح داده شده است
                          http://telec.persiangig.com/float/IEEE754.pdf
                          http://telec.persiangig.com/float/IEEE_2008.pdf
                          در مورد Long Double این همان Float128bit است و فعلا در برنامه نیست
                          از اعداد که ممیز آنها ثابت است (مانند دستورات FMUL میکرو AVR ) در این زبان میانی پشتیبانی نمی شود

                          زبونتون محدود به نوعه؟ چرا مثل دات نت مستقل نیست؟ یکی از مواردی که زبونتون رو مستقل نمیکنه همین مثلا 169 روال عملیات دودویی هست.
                          در .NET نیز ما در کل دو نوع داده داریم داده های عددی مثل همین مواردی که من ذکر کردم (به جز نیبل ها) و object که شی است که محتوای آن نا مشخص است و می تواند هر نوع داده ای در آن قرار بگیرد از جمله همین اعداد تعریف شده (البته دستوری برای لود کردن متن یا تعریف آرایه هم دارد که جز شی ها محسوب می شوند). Object که کلاس پایه تمامی کلاسهای .NET است مربوط به مباحث شی گرایی که فعلا از اونها صرف نظر کردیم (نداشتن اطلاعات زیاد در موردشان و نحوه پیاده سازی آنها)

                          راستی میدونین انجام عمل روی دو عدد 64 بیتی مثلا ضربشون در یک میکروی چهار بیتی چه مصیبتیه؟
                          مطمئنا کار سختی اما راحترین الگوریتم ضرب، تبدیل کردن آن به حاصل جمع که در هر میکرویی می توان آن را پیاده سازی کرد (البته برای اعداد صحیح)
                          و اصلا عقلانیه همچین امکانی رو روی همچین میکرویی ایجاد کنیم؟
                          همیشه در کارها این طور است که شما یک استاندارد کلی یک پروتکل کلی ایجاد می کنید ،حال باید کسانی که می خواهند از قابلیتهای این استاندارد پشتیبانی کنند باید کلی دستورالعملها را اجرا کنند در ضمن شما این امکان را ایجاد می کنید اینکه آیا عقلانیه یا نه بستگی به کاربر داره ، اگر لازم داشته باشه استفاده می کنه و اگر نه اصلا کاری باهاش نداره، مثل این می مونه که شما یک اسلحه ساختید مسئول شما نیستید که خریدار اسلحه بخواهد با آن شکار کند یا خودکشی.
                          اگر نیست که این برای همه میکروها نمیشه و اگه هست تا بحال فکرشو کردین برای یک میکرو مثلا attiny13 چطوری میخوایین کد ضرب float رو جا بدین؟
                          راستش تا حالا فکرش رو نکردم اما می دانم که می شه، این چیزی است که الان کامپایلرهای میکرو برای اعداد Float انجام می دهند (البته float32)
                          غیر از اون این قضیه IO چیه؟
                          میشه گفت این IO هم به میکرو بستگی دارد و هم نه
                          البته من اشتباه کردم که دستورات ldind.io و stindloc.io و cpblk.io را بدین صورت تعریف کردیم باید این دستورات دارای پارامتر آدرس باشند نه اینکه از پشته آدرس را بگیرند.
                          IO وسایل جانبی میکروها را تعریف می شوند. که می توانند شامل دو بخش امکانات داخلی و امکانات خارجی گذاشت
                          هر چند در باره پروتکلش هنوز فکر نکردم اما در کل به این صورت می شود
                          امکانات داخلی که به زبان اسمبلی برای هر میکرو جداگانه نوشته می شود (اونهایی را که دارند و اگر ندارند در صورتی که بشود با نرم افزار آن شبیه سازی کرد مثل پورت RS232 معادل آن قرار می گیرد به همراه یک هشدار که از شبیه سازی استفاده شده است یا ایجاد خطا می کند که همچین امکان داخلی وجود ندارد)
                          آدرس پورت1 ، 100
                          آدرس پورت2 ، 200
                          .
                          .
                          آدرس تایمر1 ، 10100
                          آدرس تایمر2، 10200
                          .
                          .
                          آدرس ADC1 ، 20100
                          .
                          ................ امکانات خارجی (که توسط زبان میانی قابل تعریف است)
                          مسلما شما تا بحال چیزی راجع به memory mapped IO نشنیدین.
                          من درباره Memory Map که حاظه لازم برای میکرو پرسسور را (اعم از Ram و Rom) را تقسیم بندی می کردیم و آدرس هر یک را تعیین می کردیم را می دونم و همچنین آدرس دهی IO استاندارد که برای هر وسیله ای در کامپیوتر در نظر گرفته شده است مثلا آدرس کیبورد 60H یا سرویس روتین این قضایا را می دونم چیه اگه منظورتون همیناست می دونم و اگر نه خیر نمی دونم لطفا توضیح بدهید
                          در این صورت عملا فضای حافظه فیزیکی هم قابلیت دسترسی مستقیم داره (مثل AVR) و این یعنی چی؟
                          درسته ، میکروپرسسورهای X86 شما در کل دو فضای برای آدرس دهی دارید یکی IO و دیگری حافظه
                          هنگامی که شما برنامه ای را اجرا می کنید سیستم عامل برنامه داده را از حافظه Rom یا حافظه جانبی را درون حافظه Ram قرار می دهد و سپس برنامه اجرا می شود و در اجرای برنامه از همان آدرس Ram برای ذخیره موقت داده و تعریف متغییر استفاده می کند
                          اما ما در میکروکنترلرها ممکن است دارای دو فضای آدرس دهی باشیم (مثل AVR) و اگر بخواهیم مثل برنامه های کامپیوتر عمل کنیم و هر دو را در یک آدرس قرار دهیم ، زمانی که بخواهیم از آدرس دهی غیر مستقیم استفاده کنیم (که مقدار موجود در پشته معلوم نیست) نمی توانیم آدرس آن را تشخیص داده و دستور معادل آن را قرار بدهیم. برای همین هر دو را از هم جدا کردم
                          اما اینکه دسترسی مستقیم به حافظه؟ این دستورات در زبان میانی .NET (ldind) هم وجود دارد و مشکلی ندارد هر چند در آنجا هر آدرسی نیست و فقط آدرسهای خاص اما اینجا به کل آدرس حافظه دسترسی دارد
                          علاوه بر اون یعنی من مجاز هستم در حافظه برنامه داده متغیر بذارم؟ چیزی که راجع به ممنوعیت این موارد اینجا قید نشده.
                          بله شما مجاز هستید متغییر در حافظه Ram تعریف کنید که به عنوان متغیرهای سراسری نام برده خواهند شد یا از حافظه کد (همان Flash) برای دسترسی به داده مثلا یک جدول ، دست پیدا کرد و یا آن را به صورت ثابت تعریف کرد
                          توصیف متغیر ها و ثابتهایی (که در حافظه کد قرار دارند) مروبط به قابلیتهای یک زبان اسمبلی نمی شود بلکه جز قابلیتهای اسمبلر است . همان طور که می دانید متغییرها آدرسی بیش نیستند
                          راستی راجع به مقادیر ثابت و متغیر هم اینجا هیچ صحبتی نشده
                          متغیرهایی که می توانید تعریف کنید می تواند هر یک از 13 داده تعریف شده باشد و همچنین اعداد ثابت هم به همین شکل
                          برای استفاده از آن باید دستور مناسب را بکار ببرید مثلا اگر دستور indld.r.i2 را بنویسید (با توجه به میکروی که انتخاب کردید تقسیم بندی حافظه تغییر می کند) در نتیجه مثلا اگر AVR که 8 بیتی است استفاده کنید مقدار داده موجود و داده بعدی را درون پشته قرار می دهد ولی اگر از 80196 استفاده کنید که 16 بیتی است فقط داده موجود در آن آدرس را در پشته قرار می دهد
                          مثل جاوا بزنین و ببینین که آیا اونجا هم اومدن تقسیم بندی حافظه به کد و داده رو پیش کشیدن؟ اصلا زبون چه ربطی به اینا داره؟
                          می دانم اصلا جاوا از این چیزها ندارد دلیل اصلی را در بالا ذکر کردم ، ضمنا زبانهای مثل جاوا کاری با محل ذخیره شده برنامه (که در میکروها حافظه Flash است ) ندارند چون در آنها سیستم عامل این کار را انجام می دهد و تازه آنها فقط با حافظه سروکار دارند و پس برای آنها معنی ندارد و اگر هم به وسیله جانبی مثل اطلاعات هارد یا دستگاه متصل به USBنیاز داشته باشد با استفاده از سرویس روتین وقفه به سیستم عامل اطلاع و این کارها را انجام می دهد ولی ما نه سیستم عاملی این وسط داریم و نه سیستم روتینی (وقفه نرم افزاری) که بخواهیم آن را شبیه سازی کنیم
                          پس تا حد زیادی غیر منطقیه بخواییم همه میکروهای موجود رو با یه چوب برونیم.
                          البته من هنوز اعتقاد دارم که این کار می شه هر چند نمی توان همانند زمانی که با زبان اسمبلی خود میکرو مربوطه برنامه را نوشت ، (منظورم با همان سرعت و با حجم کم) اما می توان با روشهای بهینه کردن دستورات اسمبلی بدست آمده این عمل رو انجام داد . هر چند الان نمی دونم دقیقا چطور ولی
                          مطمئنا همیشه یک راهی وجود داره
                          هیچ کس و هیچ چیز نمی تونه مانع رسیدنت به آرزوهات بشه مگر خودت

                          دیدگاه


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

                            single یا Float4 همان real است
                            شرمنده. یک سری به مدارک توربو پاسکال بزنین. نوع real یک نوع 6 بایتی از اعداد ممیز شناور هست که البته در نسخ بعدی میتونه مشابه single بشه. (منظورم اینه که بجای اون single رو استفاده کرد). ولی با single 32 بیتی فرق میکنه.

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

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

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

                            تا حالا فکرش رو نکردم اما می دانم که می شه
                            این میزان بالای اعتماد به نفس شما من رو کشته! میدونین برای یک همچین کاری شما به حدود یکی دو کیلو بایت کد احتیاج دارین و اصلا این میکرو این میزان فلش در اختیار نداره؟؟ درست مثل یک سری مسایل فیزیک کوانتومی. راه حل موجوده. مسئله هم حل شدنیه. اما با سریعترین کامپیوتر های فعلی چیزی حدود 40 هزار سال طول میکشه تا حل بشه. فکر میکنین خیلی پر بیراهه که در همچین شرایطی بگیم "حل نشدنی"؟

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

                            و در انتها...
                            چون در آنها سیستم عامل این کار را انجام می دهد
                            بد نیست یک سری به همان NanoVM که ذکر خیرش رفت یک سری بزنین. جاوا داریم. ولی سیستم عاملش کو؟

                            نهایتا:
                            مطمئنا همیشه یک راهی وجود داره
                            البته با این طرز تفکر موافقم چون نتیجه این طرز تفکره که "هیچ وقت نبایستی مایوس شد" ولی بذارین راجع به موضوعی یه چیزی بگم. چند سال پیش ها خبر نگاری با رییس یک شرکت کامپیوتر سازی مصاحبه ای کرد و گفت: میشه بگین دستگاههای سال آینده چه امکاناتی دارن؟ رییس جواب داد: فلان و بهمان و بیسار... خبر نگار که کلی ذوق زده شده بود گفت یعنی شما یه همچین کامپیوترهایی درست کردین؟ رییس گفت: نه! ولی هر مشکلی رو میشه حل کرد. خبر نگار گفت: چطوری؟ رییس هم با خونسردی جواب داد: با مهندس های بیشتر!

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

                            دیدگاه


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

                              نوع real یک نوع 6 بایتی از اعداد ممیز شناور هست
                              بله شما درست می گوید اما Real فقط به 6 بایتی که شما گفتید محدود نمی شود و انواع مختلف دارد 4 بایتی، 8 بایتی و 10 بایتی دارد اشتباه من این بود کل را در نظر نگرفتم و بر جز استنباط کردم که نوشته بود Real 4 بایت است و و همانند Single که من گفته بودم بود بر اساس سایت زیر
                              http://msdn.microsoft.com/en-us/library/ms173773.aspx
                              بر خلاف دات نت pcode جاوا شی گرا نیست
                              می بخشید ولی دارین اشتباه می کنید در opcode جاوا نوع داده ای وجود دارد به نام refrence که می تواند آرایه ، کلاس و یا interface باشد و این یعنی پشتیبانی کردن از اشیا و کلاسها لطفا سایت زیر را مشاهده کنید
                              http://java.sun.com/docs/books/jvms/...cepts.doc.html
                              ایجاد امکانی برای ضرب 64 بیتی (به عنوان مثال) روی میکرویی که نه از بابت سرعت و نه امکانات در حد و توانش نیست یه کمی با این لفظ "همه میکروهای موجود" منافات داره.
                              نه اصلا منافات ندارد، مثل این می مونه بگید چون شترمرغ نمی تواند پرواز کند پس کل پرندگان نمی تواند پرواز کنند .چون یک دستور سرعت زیادی برای پیاده سازی در این میکرو می خواهد پس کل دستورات سرعت زیادی برای اجرا در میکرو می خواهد. هر میکرویی در حد توانش از امکانات این زبان میانی استفاده کنید مثلا در قسمت IO قرار است آدرس تعریف شود که کل ADC ها به آن مراجعه کنند ، وقتی یک میکرویی ADC ندارد ما که نمی توانیم یک ADC داخلی با نرم افزار تهیه کنیم . این چیزها جز محدودیت های خود میکرو
                              این مثالهایی که نوشتم برای 32 بیتی پس 64 بیتیش هم گیر میاد
                              این هم یک ضرب 32 بیتی در 32 بیتی از نوع long

                              ;- ----l3= l1*l2--
                              lds r24,l1
                              lds r25,l1+1
                              lds r16,l1+2
                              lds r17,l1+3
                              lds zl,l2
                              lds zh,l2+1
                              lds r18,l2+2
                              lds r19,l2+3
                              rcall Mul32
                              sts l3,zl
                              sts l3+1,zh
                              sts l3+2,r18
                              sts l3+3,r19

                              ;////// 32x32 signed multiplay ////////////
                              Mul32: clr r6
                              clr r23
                              clr r22
                              Sub r21,r21
                              ldi r20,0x20
                              m32s1: brcc m32s2
                              add r21,r24
                              Adc r22,r25
                              Adc r23,r16
                              Adc r6,r17
                              m32s2: sbrc zl,0
                              Sub r21,r24
                              sbrc zl,0
                              sbc r22,r25
                              sbrc zl,0
                              sbc r23,r16
                              sbrc zl,0
                              sbc r6,r17
                              asr r6
                              ror r23
                              ror r22
                              ror r21
                              ror r19
                              ror r18
                              ror zh
                              ror zl
                              dec r20
                              brne m32s1
                              ret
                              ;System Global Variables: 0 bytes
                              ;User Global Variables: 12 bytes
                              ;58 words
                              این هم یک ضرب 32 بیتی در 32بیتی از نوع float در هم و ریختن در یک عدد Float دیگر
                              ;- ----f3= f1*f2--
                              lds r18,f1
                              lds r19,f1+1
                              lds r20,f1+2
                              lds r21,f1+3
                              lds r22,f2
                              lds r23,f2+1
                              lds r24,f2+2
                              lds r25,f2+3
                              rcall _Fmul
                              sts f3,r22
                              sts f3+1,r23
                              sts f3+2,r24
                              sts f3+3,r25
                              ;This code is free software, you can redistribute it And/Or modify it
                              ;under the terms of the GNU General Public License As published by the
                              ;Free Software Foundation, either version 2, Or any later version.

                              _Fwrk1: mov r0,r21
                              eor r0,r25
                              bst r0,0x07
                              _Fwrk2: add r20,r20
                              Adc r21,r21
                              cpi r21,0xff
                              breq _Fwrk0
                              clr xl
                              cp xl,r21
                              brcs _Fwrk4
                              ldi r21,0x01
                              _Fwrk4: ror r20
                              _Fwrk3: add r24,r24
                              Adc r25,r25
                              cpi r25,0xff
                              breq _Fwrk0
                              eor xh,xh
                              cp xh,r25
                              brcs _Fwrk5
                              ldi r25,0x01
                              _Fwrk5: ror r24
                              ret
                              _Fwrk0: pop r25
                              pop r25
                              _Fnan: ldi r25,0xff
                              ldi r24,0xC0
                              ret

                              _Fbck1: dec r25
                              add xh,xh
                              Adc r22,r22
                              Adc r23,r23
                              Adc r24,r24
                              _Fback: clr r7
                              tst r25
                              breq _Fclr
                              tst r24
                              brpl _Fbck1
                              cpi r25,0xff
                              breq _Fbck3
                              add xh,xh
                              brcc _Fbck3
                              brne _Fbck2
                              tst r0
                              brne _Fbck2
                              sbrs r22,0x00
                              rjmp _Fbck3
                              _Fbck2: subi r22,0xff
                              sbci r23,0xff
                              sbci r24,0xff
                              sbci r25,0xff
                              _Fbck3: ROL r24
                              ror r25
                              ror r24
                              bld r25,0x07
                              ret

                              _Fclr: clr r22
                              clr r23
                              clr r24
                              _Fclr1: clr r25
                              ret

                              _Fus2f: clt
                              rjmp _Fs2f1
                              _Fs2f: bst r25,0x07
                              brtc _Fs2f1
                              rcall _Fneg
                              _Fs2f1: mov xh,r22
                              mov r22,r23
                              mov r23,r24
                              mov r24,r25
                              ldi r25,0x9e
                              clr r0
                              rjmp _Fback

                              _Fxsf: bst r25,0x07
                              rcall _Fwrk3
                              cpi r25,0x7F
                              brcs _Fxsf1
                              ldi zh,0x9e
                              Sub zh,r25
                              mov r25,r24
                              mov r24,r23
                              mov r23,r22
                              mov r22,xh
                              rjmp _Fxsf3

                              _Fxsf1: rjmp _Fclr
                              _Fxsf2: LSR r25
                              ror r24
                              ror r23
                              ror r22
                              _Fxsf3: subi zh,0x01
                              brcc _Fxsf2
                              brtc _Fneg1
                              _Fneg: Com r25
                              Com r24
                              Com r23
                              neg r22
                              sbci r23,0xff
                              sbci r24,0xff
                              sbci r25,0xff
                              _Fneg1: ret

                              _Fba: mov r21,r25
                              mov r20,r24
                              mov r19,r23
                              mov r18,r22
                              ret

                              _Fpow2: mov r21,r25
                              mov r20,r24
                              mov r19,r23
                              mov r18,r22
                              _Fmul: rcall _Fwrk1
                              rcall _FmulD
                              rjmp _Fback
                              _FmulD: tst r25
                              breq _Fmul3
                              _Fmul1: tst r21
                              breq _Fmul3
                              _Fmul2: subi r25,0x7F
                              subi r21,0x7F
                              add r25,r21
                              brvc _Fmul4
                              brmi _Fmu11
                              _Fmul3: rjmp _Fclr1
                              _Fmul4: subi r25,0x81
                              cpi r25,0xff
                              breq _Fmul3
                              mov xl,r22
                              clr r0
                              clr r7
                              clr xh
                              clr r22
                              clr r21
                              ldi zh,0x08
                              _Fmul5: LSR xl
                              brcc _Fmul6
                              add r0,r18
                              Adc r7,r19
                              Adc xh,r20
                              Adc r22,r21
                              _Fmul6: add r18,r18
                              Adc r19,r19
                              Adc r20,r20
                              Adc r21,r21
                              dec zh
                              brne _Fmul5
                              ldi zh,0x08
                              mov zl,r23
                              clr r23
                              ldi zh,0x08
                              _Fmul7: LSR zl
                              brcc _Fmul8
                              add r7,r19
                              Adc xh,r20
                              Adc r22,r21
                              Adc r23,xl
                              _Fmul8: add r19,r19
                              Adc r20,r20
                              Adc r21,r21
                              Adc xl,xl
                              dec zh
                              brne _Fmul7
                              mov zh,r24
                              clr r24
                              _Fmul9: LSR zh
                              brcc _Fmu10
                              add xh,r20
                              Adc r22,r21
                              Adc r23,xl
                              Adc r24,zl
                              _Fmu10: add r20,r20
                              Adc r21,r21
                              Adc xl,xl
                              Adc zl,zl
                              tst zh
                              brne _Fmul9
                              tst r24
                              BRPL _Fmu12
                              INC r25
                              brne _Fmu13
                              _Fmu11: rjmp _Fnan
                              _Fmu12: add r0,r0
                              Adc r7,r7
                              Adc xh,xh
                              Adc r22,r22
                              Adc r23,r23
                              Adc r24,r24
                              _Fmu13: Or r0,r7
                              ret

                              ;System Global Variables: 14 bytes
                              ;User Global Variables: 12 bytes
                              ;215 words
                              دو کد زیر را من از نرم افزار FastAVR برایتان کپی برداری کردم
                              این نرم افزار کد اسمبلی برنامه نوشته شده به بیسیک را نیز به ما می دهد و می تواند یکی از ابزار راهنما برای نوشتن کد اسمبلی باشد
                              ولی سیستم عاملش کو؟
                              درست می گوید سیستم عامل به معنایی که شما فکر می کنید ندارد اما درون حافظه پایدار کد هایی برای کارکردن اولیه ، پیکربندی قطعات مختلفی که با گوشی در ارتباط هستند از جمله lcd، keyboard و ..وجود دارد که امکاناتی را فراهم می کنند تا جاوا از آن استفاده کند که در این حالت باز می توان گفت جاوا مستقیم با وسایل خارجی در ارتباط نیست. می شود گفت تو مایه های Baios کامپیوتر است تو بایاس کامپیوتر پیکربندی اولیه برای استفاده از امکانات سیستم ایجاد می شود که برنامه هایی مثل سیستم عامل ویندوز یا برنامه های مثل بک پ بتوانند به قسمتهای فیزیکی کامپیوتر دسترسی یا راحتتر با آن کار کنند.

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

                              دیدگاه

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