لینک کوتاه مطلب : https://hsgar.com/?p=3488

Microvium بسیار کوچک است – Coder Mike

TL; DR: موتور جاوا اسکریپت Microvium برای میکروکنترلرها تقریباً طول می کشد 8.5 کیلوبایت رام و 34 بایت از رم به ازای هر VM در حالت بیکار، احتمالاً آن را به کوچکترین موتور جاوا اسکریپت تا به امروز با ویژگی های زبانی بیشتری نسبت به موتورهایی با اندازه 5 برابر آن تبدیل می کند.


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

اندازه اغلب در دستگاه های کوچک MCU مهم است. بخش بزرگی از مدل‌های میکروکنترلر موجود در بازار هنوز کمتر از ۶۴ کیلوبایت فلش و کمتر از ۲ کیلوبایت رم دارند. اینها هنوز هم استفاده می شوند زیرا کوچکتر، ارزانتر و قدرت کمتری نسبت به همتایان بزرگتر خود دارند. تمام میکروکنترلرهایی که در حرفه خود به عنوان یک مهندس سیستم‌افزار با آنها کار کرده‌ام دارای رم ≤ 16 کیلوبایتی بوده‌اند.

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

حتی در دستگاه‌های بزرگ‌تر، آیا واقعاً می‌خواهید بخش بزرگی از آن را به یک موتور جاوا اسکریپت اختصاص دهید؟ یک موتور کوچکتر تعهد کوچکتری است – مانعی کمتر برای ورود.

اگر «کوچکترین موتور جاوا اسکریپت برای میکروکنترلرها» را در گوگل جستجو کنم، اولین مورد در لیست است الک. الک واقعاً بسیار کوچک است. برای من فقط 11.5 کیلوبایت فلش کامپایل می شود1. اما Microvium با همان تنظیمات کامپایل شده تا فقط 8.5 کیلوبایت است.

رم چطور؟

میزان استفاده از RAM Elk از قبل تعریف نشده است – شما یک بافر از RAM با هر اندازه ای که می خواهید به آن می دهید، اما برای حالت هسته VM باید حداقل 96 بایت باشد. Microvium برای حالت هسته 54 بایت می گیرد.

اما جایی که تفاوت زیادی در نیاز به حافظه وجود دارد این است که Elk به تمام حافظه خود نیاز دارد که از قبل تخصیص داده شود، و آن را برای طول عمر VM نگه می دارد. اگر حداکثر حافظه اسکریپت شما در Elk 1 کیلوبایت است، باید در هنگام راه اندازی یک بافر 1 کیلوبایتی به آن بدهید، بنابراین میزان استفاده از حافظه بیکار آن 1 کیلوبایت است. از طرف دیگر Microvium از malloc و free برای تخصیص در مواقع مورد نیاز و رایگان در مواقعی که نیاز نیست استفاده می کند. میزان استفاده از حافظه بیکار آن می تواند تا 34 بایت کم باشد. همانطور که در آخرین پستم توضیح دادم، در سیستم عامل معمولی، حافظه بیکار بسیار مهمتر از حافظه اوج است.

در مورد مجموعه ویژگی ها چطور؟ این منطقه دیگری است که در آن Microvium و Elk به طور قابل توجهی از هم جدا می شوند. جدول زیر تفاوت ها را نشان می دهد:

میکروویوم الک
var، const (Elk پشتیبانی می کند let فقط)
do، switch، for
دسترسی محاسبه شده اعضا a[b]
عملکردهای پیکان، بسته شدن
ماژول ها
عکس فوری
از بایت کد متوسط ​​(عملکرد بهتر) استفاده می کند
تجزیه کننده در زمان اجرا
رام 8.5 کیلوبایت 11.5 کیلوبایت
رم بیکار 36 ب مقدار زیادی
اوج رم هسته 54 ب 96 ب
اندازه اسلات (اندازه متغیرهای ساده) 2 ب 8 ب

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

اما Cesanta، سازنده Elk، یک موتور JS بزرگتر با ویژگی های بیشتر نیز ساخت: mJS، که احتمالاً از نظر مجموعه ویژگی، نزدیکترین مطابقت با Microvium است. mJS به شما امکان می دهد برای مثال برای حلقه ها بنویسید و عبارات سوئیچ کنید.

از آنجایی که آنها از نظر هدف و ویژگی‌ها کاملاً مطابقت دارند، من جزئیات بیشتری را انجام دادم مقایسه mJS و Microvium در اینجا. اما در اینجا خلاصه ای وجود دارد:

میکروویوم mJS الک
var، const (mJS پشتیبانی می کند let فقط)
رشته های الگو
عملکردهای پیکان و بسته شدن
ماژول های ES
(اما mJS یک غیر استاندارد را پشتیبانی می کند load عملکرد)
do، switch، for
دسترسی محاسبه شده اعضا a[b]
از بایت کد متوسط ​​(عملکرد بهتر) استفاده می کند
برخی از توابع داخلی
تجزیه کننده در زمان اجرا
رام 8.5 کیلوبایت 45.6 کیلوبایت 11.5 کیلوبایت
اندازه اسلات 2 ب 8 ب 8 ب

من “بعضی از توابع داخلی” را در یک جعبه جمع کرده ام زیرا این ویژگی زبان نیست. mJS تعدادی توابع داخلی دارد که Microvium ندارد – مهمترین آنها print، ffi، s2o، JSON.stringify، JSON.parse و Object.create. شما می توانید این موارد را خودتان در Microvium به راحتی و بدون تغییر موتور پیاده سازی کنید (یا پیاده سازی ها را به صورت آنلاین بیابید)، و این به شما این امکان را می دهد که آنچه را که می خواهید انتخاب کنید به جای اینکه تمام آن فضا به شما تحمیل شود.2.

از نظر ویژگی‌ها، mJS یک موتور جاوا اسکریپت واقعی‌تر در مقایسه با رویکرد حداقلی Elk است. من نمی خواهم هیچ جاوا اسکریپت قابل توجهی در دنیای واقعی بدون حلقه for بنویسم. مانند Microvium، mJS نیز اسکریپت ها را به بایت کد از پیش کامپایل می کند و سپس بایت کد را اجرا می کند که نتیجه آن عملکرد بسیار بهتری نسبت به تجزیه و تحلیل در جریان است. موتورهایی مانند Elk که در حین اجرا تجزیه می شوند نیز دارای ویژگی غیرمنتظره ای هستند که نظرات و فضای خالی آنها را کاهش می دهد در زمان اجرا

اما ویژگی های اضافه شده در mJS به این معنی است که از نظر فضای ROM بسیار بیشتر هزینه می کند – حدود 4 برابر بیشتر از Elk و 5 برابر بیشتر از Microvium.

Microvium هنوز ویژگی‌های زبان اصلی بیشتری نسبت به mJS دارد، که مسلماً آن را به زبانی دلپذیرتر برای کار کردن تبدیل می‌کند. این ویژگی‌ها در واقع در سناریوهای خاصی کاملاً مفید هستند:

  • پشتیبانی مناسب ماژول ES برای سازماندهی کد مهم است و بدین معنی است که ماژول های Microvium شما نیز می توانند به آن وارد شوند یک محیط node.js یا مرورگر. می‌توانید الگوریتم‌های مشابهی را که توسط دستگاه‌های لبه (میکروکنترلر)، سرورهای پشتیبان و رابط‌های وب به اشتراک گذاشته شده‌اند، داشته باشید تا تجربه‌ای یکپارچه به کاربران خود بدهید.
  • همانطور که در پست قبلی توضیح دادم، بسته شدن برای کدهای ناهمزمان به سبک callback ضروری است.

بدیهی است که من تا حدودی مغرضانه هستم زیرا Microvium ساخته خودم است، اما تصویر کلی که دریافت می کنم این است:

  • Microvium کوچکترین موتور جاوا اسکریپتی است که من از آن اطلاع دارم3
  • در این اندازه کوچک، Microvium در واقع از ویژگی های زبان اصلی بیشتری نسبت به موتورهایی با اندازه بیش از 5 برابر آن پشتیبانی می کند. برخی از این ویژگی ها هستند واقعا برای نوشتن برنامه های JS در دنیای واقعی مفید است.
  • با این اوصاف، Microvium عملکردهای داخلی کمتری دارد – این بیشتر یک فلسفه پرداختی است که در آن تعهد اولیه شما بسیار کمتر است و در زمانی که به آن نیاز دارید، پشتیبانی را برای آنچه نیاز دارید ارائه می دهید.
  • معامله بزرگ این است که Microvium تجزیه کننده در زمان اجرا ندارد. در موارد نادری که در زمان اجرا واقعاً به تجزیه کننده نیاز دارید، Microvium به سادگی برای شما کار نخواهد کرد.

چیزی که باعث شد من لبخند بزنم این یادداشت توسط یکی از نویسندگان mJS در پست های وبلاگ است:

این باعث می شود mJS در آن جا شود کمتر از 50 هزار فضای فلاش (!) و کمتر از 1k رم (!!). شکست دادن آن سخت است.

https://mongoose-os.com/blog/mjs-a-new-approach-to-embedded-scripting/

من برای نویسندگان mJS و کارهایی که انجام داده‌اند احترام زیادی قائلم، و این باعث می‌شود که من بیش از پیش به خود ببالم که Microvium می‌تواند آن را از میدان مسابقه حذف کند و آنچه را که حرفه‌ای‌های باتجربه «شکست دادن سخت» می‌نامند، شکست دهد. البته، این با برخی معاوضه ها همراه است (بدون تجزیه کننده و بدون توابع داخلی)، اما من به هدف خود دست یافته ام که یک موتور جاوا اسکریپت بسازم که تعهد اولیه بسیار کمی داشته باشد و در کوچکترین فضاهای آزاد فشرده شود، در حالی که هنوز هنوز است. از جمله بسیاری از ویژگی های زبانی که من فکر می کنم برای برنامه های جاوا اسکریپت در دنیای واقعی مهم هستند.

لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.