Geek الکترونیک

آشنایی با میکروپایتون – بخش اول: مقدمه ای بر زبان های اسکریپتی!

نوشته شده توسط احسان وارسته

مقدمه؛ کامپایلر ها!

چه (تو حوزه برنامه نویسی) قدیمی باشین و چه جدید، چه الکترونیکی باشین و چه نه! اگه این مطلب رو میخونین پس حتما به الکترونیک و بوردهای آردوینو  و رزبری پای علاقه دارین! یا حداقل اسمشون رو شنیدین! برای الکترونیکی ها اسم CodeVision AVR خیلی آشناس! یه پکیج شامل یه IDE و کامپایلر و یکسری کتابخونه های از پیش تعریف شده برای اینکه کار برنامه نویسی با میکروهای AVR رو راحت بکنه! توی IDE هم یه ویزارد خیلی خوب داره که میتونین بدون کد زدن خیلی از تنظیمات اولیه سیستمتون رو انجام بدین(اون جای شما کدهارو مینویسه)! البته خیلی مخالف داره، خصوصا کسایی که بعد ها با winavr و avr-gcc و بعدم IDE های Eclipse و NetBeans و … آشنا شدن و این چند ساله هم که از وقتی VSCode اومده همه رو به هیجان آورده، شروع کردن به نفی کردن CodeVision AVR ! حق هم دارن البته چون کامپایلر بهینه نشده ای داره، قدیمیه، باگ داره و مشکلات ریز و درشت کم نداره. کامپایلرهای دیگه مثل IAR و ImageCraft هم وجود دارن که هرکدوم ویژگی های خودشون رو دارن. مثلا کامپایلر IAR از int64 یا مقادیر صحیح 64 بیتی روی میکروهای 8 بیتی avr پشتیبانی میکنه!

کار اصلی کامپایلر ها یه چیزه، و اونم تبدیل کد شما به کد ماشین و باینری. حتی اگه توی زبان اسمبلی هم کد بزنین، باز به کامپایلر احتیاج دارین تا کدتون رو تبدیل به کد باینری بکنه. ما توی کامپایلر های C و BASIC (که شناخته شده ترینشون برای AVR ها BASCOM هست) کدمون رو که تحویل کامپایلر میدیم، انتظار داریم (اگه کدمون خطا نداشته باشه) به ما یه فایل bin یا hex تحویل بده. توی کامپایلر gcc یا GNU C Compiler که یه کامپایلر برای زبان C هست، کد C مارو تبدیل به کد اسمبلی (assembly) میکنه و بعد کد اسمبلی رو تبدیل به کد ماشین میکنه که همون باینری هست (برای اینکه بتونیم پروگرم بکنیم احتیاج به فایل هگز (hex) داریم که در حقیقت همون باینری هست که بصورت text نوشته شده، میتونین فایل hex رو با notepad باز بکنین و تمام کدهای باینری رو ببینین). کد اسمبلی که توسط کامپایلر ایجاد میشه مخصوص اون پردازنده هست، یعنی اگه شما برای avr کد نوشتین کد اسمبلی و کد ماشینی که به شما در نهایت میده فقط و فقط روی avr قابل اجرا هست! تازه نه هر avrی، چون همونطور که احتمالا مطلع هستین پردازنده avr معماری های مختلفی داره!! پس ما اینجا یه محدودیت بزرگ داریم! کدی که مینویسیم فقط برای یک میکروئه، یا نهایتا خیلی هنر کنیم از قابلیت preprocess کامپایلر استفاده کنیم(مثلا از define های متعدد استفاده کنیم) و کدمون رو جوری بنویسیم که قابلیت Config برای میکروهای مختلف رو داشته باشه. ولی این کارم مستلزم اینه که تغییراتی توی کدمون بدیم و خیلی کدهای اضافه بنویسیم که برای بعضی از معماری ها پردازنده فعال بشه و شرایط مختلف رو در نظر بگیریم و واقعا بعضی وقت ها به دردسر و زمانش نمی ارزه و احتمال خطا رو هم بالا میبره!

سطح زبان ها

زبان های برنامه نویسی سطح های مختلفی دارن. زبان های سطح های پایین، همون زبان هایی هستن که به کد ماشین نزدیکترن. مثلا زبان اسمبلی پایین ترین سطح زبان رو داره. بعد میتونه C/C++ باشه، بعد از اون شاید BASIC و همینجور میره بالا. هر چی سطح زبان بالاتر میره به زبان انسان نزدیکتر میشه و برای انسان قابل فهم تر میشه! خب یه مزیت بزرگ وجود داره برای زبان های سطح بالا، اینکه شما مثلا به میکرو (یا پردازنده کامپیوترتون) میگین که “من میخوام LED شماره 1 رو برام روشن کنی” (در حقیقت یک پین خروجی رو مقدارش رو 1 کنی)، توی زبان سطح بالا همین جمله کفایت میکنه. بسته به اینکه به کی این جمله رو میگین، اتفاق های مختلفی میوفته! مثلا، اگه این جمله رو به یه Arduino IDE بگین، باید بگم که شما دارین با یه کامپایلر C صحبت میکنین، با کلی کتابخونه های متعدد و یه IDE خیلی خوب که بر اساس اینکه بورد شما چیه، خودش تصمیم میگیره از چه کتابخونه هایی استفاده کنه که خواست شما رو اجرا کنه. اگه بخواین به gcc بگین، یکم سختی کارتون بیشتره و باید رجیسترهای میکرو رو خودتون ست کنین. اگه بخواین به اسمبلی بگین (که توی پکیج gcc، ما as رو برای تبدیل کد اسمبلی به باینری داریم چون همونطور که پیش تر گفتم، کامپایلر های C اول کد رو به اسمبلی و بعد به باینری تبدیل میکنن پس توی پکیجشون حتما اسمبلر دارن)، دیگه شما کاملا تنهایین! فقط عدد دارین و یکسری opcode های پردازنده تون که باید همه رو حفظ باشین 😊 البته اسمبلر ها هم یسری راهکار ها برای راحت کردن کار ایجاد کردن، مثلا از چیزی شبیه define توی C پشتیبانی میکنن و خصوصا برای دسترسی به رجیسترها کاربردی ان. ولی باز از کد زدن توی C سختتره!

کلام آخر اینه که، هرچی سطح زبان پایین تر باشه، شما بیشتر درگیر کار با پردازنده و بهینه کردن کدتون هستین و طبعا میتونین با سیکل کلاک کمتر و دستورات کمتر، کارهاتون رو انجام بدین ولی شما خیلی درگیر پردازنده میشین و کدتون صرفا برای اون پردازنده کار میکنه؛ برای یک پردازنده دیگه، روز از نو روزی از نو میشه! ولی توی زبان های سطح بالاتر، شما بیشتر درگیر کارتون میشین تا پردازنده، یعنی مهم نیست اون LED با 1 خط کد اسمبلی و یه opcode پردازنده روشن میشه یا 5 خط، مهم اینه که روشن بشه، پس شما دیگه به این فکر نمیکنین چه اتفاقی توی پردازنده میوفته و فقط به هدفتون فکر میکنین. خب این یه مزیت خیلی بزرگه، میتونین ایده های نابی که به ذهنتون میرسه رو خیلی سریع پیاده کنین و تست کنین، اگه به نتیجه مطلوب رسیدین و حالا احساس کردین سرعت براتون مهمه و بهینه بودن برنامه براتون مهم شد، میتونین بعضی جاهای برنامه رو توی اسمبلی بنویسین (توی کامپایلرهای C این قابلیت رو بهتون میده). ولی توی همه زبان های سطح بالا این امکان رو ندارین و شاید هم نیازی بهش نداشته باشین، با گذر زمان و ورود میکروهای با فرکانس کلاک های سرسام آور(!) دیگه سرعتی کم نمیاد!

زبان های اسکریپتی!

قبل اینکه بخوام بحث میکروپایتون رو شروع کنم، باید راجع به پایتون بگم، یا حتی عمیق تر بشم و راجع به اسکریپت ها صحبت کنم. اینکه اسکریپت ها عموما چی هستن؟ خب به نظر نقطه خوبی میاد! اسکریپت ها چی هستن! اسکریپت (Script) ها در حقیقت کد هایی هستن که نوشته میشن تا توسط یک مفسر یا Interpreter خونده و تبدیل به کد ماشین مجازی (Virtual Machine) بشن و این کدها توسط ماشین مجازی اجرا بشن! دقیقا فرقش با C و BASIC و … که به ما کد Binary میدن چیه؟

فرق اسکریپت ها با زبان های برنامه نویسی مثل C و BASIC اینه که، به کد ماشین که مخصوص پردازنده اس تبدیل نمیشن! بلکه به کد ماشین مجازی اون موتور اجرایی کامپایل میشن. مثلا، برای پایتون به bytecode های پایتون کامپایل  میشن. برای اسکریپت Lua، به کد های باینری برای اجرا توسط ماشین مجازی Lua کامپایل میشن. پس نیاز دارن که همیشه یه ماشین مجازی وجود داشته باشه که این کدهارو اجرا کنه. به نظرم ایده اولیه همه اینها از Java اومده، یا حداقل Java قدیمی ترین زبانی هست که من میشناسم که این ایده رو پیاده کرده. اگه با برنامه های تحت Java کار کرده باشین میدونین که شما به JRE یا Java Runtime Enviroment احتیاج دارین که کدتون رو اجرا کنین. برای هر سیستم عاملی هم JRE وجود داره و یه کد java میتونه توی سیستم عامل های مختلف اجرا بشه و اون هم بخاطر وجود مبارک JRE هست که برای سیستم عامل های مختلف کامپایل شده!

حالا که تقریبا میدونین اسکریپت ها چطور کار میکنن، باید Lua رو هم بهتون معرفی کنم! Lua یه زبان برنامه نویسی خیلی عجیبه که آفست آرایه هاش از 1 شروع میشه و این منو بعنوان یه برنامه نویس خیلی عذاب میده! از OO یا Object Oriented و کلاس ها پشتیبانی نمیکنه و همه چیز توی table هست! البته از metatable پشتیبانی میکنه که خیلی زیاد روش زمان نذاشتم سردربیارم ولی میگن با کمی تلاش میتونین چیزی شبیه کلاس هارو توش پیاده کنین! خوشم هم ازش نیومد حقیقت، خیلی باهاش کلنجار رفتم ولی در مقایسه با میکروپایتون به نظرم حرفی برای گفتن نداره.

پایتون، یه مار خوش خط و خال!

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

خب داشتن کتابخونه های زیاد کم مزیتی نیست! شما دوران قبل آردوینو و رزبری رو یادتون میاد؟ اون زمون کتابخونه مگه گیر میومد؟ اصلا قبلتر، قبلتر از اونکه حتی گیت هابی هم باشه(گیت هاب سال 2008 در دسترس عموم قرار گرفته، یعنی 13 سالشه!)، یجور محیط بسته و خفگان پیچیده ای توی خصوصا الکترونیکی ها موج میزد. من یادمه ما استاد داشتیم درس رو یاد نمیداد میگفت مگه چقدر به ما حقوق میدن!! آخه … بگذریم.

اینکه شما هر زمان اراده کنی، بدون داشتن اطلاعات کافی راجع به مثلا SSD1963 یا یه درایور دیگه، یا یه ماژول یا یه سنسور I2C، فقط با کپی کردن چند تا فایل (یا توی آردوینو فقط زدن روی دکمه Install) به راحتی میتونین برای اون قطعه کد بنویسین و باهاش کار بکنین واقعا کم مزیتی نیست! همین شده که نرم افزاری ها، گیک (geek) ها از هر رشته ای و یا حتی بدون تحصیلات وارد اینجور کارهای فان الکترونیکی شدن و این یه مزیت بزرگه، باعث رشدش شده، باعث شده در دسترس باشه، آدم های خلاق؛ خیلی ها کارهای خیلی زیبایی رو که تا قبل ظهور آردوینو نمیتونستن انجام بدن رو انجام دادن که واقعا آدم از اینهمه ایده های خوب و خلاقانه حیرت میکنه! چقدر دستگاه CNC که با آردوینو ساخته نشده! الان شما یه DIY (Do-It-Yourself یا خودت-انجامش-بده!) سرچ کنی حداقل 10 مدل مختلف دستگاه CNC پیدا میکنی که هیچ کدوم شبیه هم نیستن ولی همشون کاربردی و در نوع خودشون عالی ان! انگار یه پتانسیل خیلی زیادی رو با ارائه یه سری محصول؛ آزاد کرده باشی توی جامعه! و من خیلی خوشحالم، بر عکس یه عده ای که ترس زیاد شدن دست توی حوزه الکترونیک رو دارن من خوشحالم چون هرچی جامعه با الکترونیک آشنا تر بشه صنعت هم به تبع اون به الکترونیکی شدن بیشتر رو میاره و اتفاقا بازار خیلی بهتر و متنوع تری خواهیم داشت! چه بخوایم چه نه، این مسیریه که داره طی میشه.

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

حالا آدم های خوش ذوقی پیدا شدن (ظاهرا 7 ساله پیدا شدن من تازه دیدمشون یا برام جذاب شده موضوع) که اومدن پایتون رو، این زبان جذاب رو برای میکرو ها کامپایل کردن و اسمشو گذاشتن میکروپایتون! جالبه اگه توی ویکی پدیا در مورد میکرو پایتون بخونین نوشته که تمام امکانات کامپایلر پایتون توی میکروپایتون هم هست! تنها کمبودش بعضی از کتابخونه های استانداردشه، که خب طبیعتا برای اجرا و جا گرفتن توی یه میکرو با فلش 1 مگابایتی مثل  ماژول esp8266 که کلا 1 مگابایت حافظه فلش خارجی داره باید یکسری از امکانات جانبیش رو کم کنن. ولی همین هم خیلی عالیه!

اگه این مطلب رو خوندین، امیدوارم تونسته باشم به وجد بیارمتون!! 😊 ولی اگه هنوز به وجد نیومدین باید بهتون بگم با پایتون خیلی راحت میتونین وارد دنیای هوش مصنوعی بشین و حتی کمتر از یه نصفه روز کامپیوترتون رو به یه سیستم deep learning تبدیل کنین! یعنی همون چیزی که باهاش deep faking میکنن، یعنی همون ویدئوهایی که صورت آدم هارو جای همدیگه میندازن!!!

تو قسمت بعدی این مطلب، با هم وارد بحث جذاب میکروپایتون میشیم و میبینیم که چطور کار میکنه و باهاش یه کارای کوچیکی هم انجام میدیم! 🙂

درباره نویسنده

احسان وارسته

یه علاقمند به حوزه علم و فناوری که دوست داره با به اشتراک گذاشتن دانشش قدم کوچکی برای کمک به جامعه فنی برداره :)
حمایت مالی

2 نظر

نظر بگذارید