خانه / بایگانی برچسب: کامپایلر

بایگانی برچسب: کامپایلر

وب اسمبلی (WebAssembly) — به زبان ساده

در این مقاله به بررسی وب اسمبلی خواهیم پرداخت. مفهوم آن را معرفی می‌کنیم و می‌گوییم که قرار است چه مشکلاتی را حل کند. وب‌اسمبلی که به اختصار WASM نامیده می‌شود، یک قالب دستورهای باینری است که برای ماشین مجازی مبتنی بر پشته استفاده می‌شود. وب‌اسمبلی به عنوان یک هدف پرتابل برای کامپایل زبان‌های سطح بالایی مانند C/C++/Rust طراحی شده است و به این ترتیب امکان توسعه اپلیکیشن‌های کلاینت و سرور را روی وب ممکن می‌کند. ما در این راهنما برای این که درک بهتری از این فناوری داشته باشیم، یک الگوریتم نوشتیم که امکان مقایسه عملکرد WASM را در برابر جاوا اسکریپت محض (Vanilla JS) فراهم می‌سازد. بازی زندگی (Life Game) برای اثبات مفاهیم ارائه شده از بازی زندگی طراحی شده از سوی Conway به عنوان مسئله استفاده کرده‌ایم. این بازی بدون بازیکن است و قواعد ساده‌ای دارد: دنیا از یک ماتریس تشکیل یافته است که در آن هر سلول دو حالت زنده یا مرده دارد. تنها ورودی بیرونی، حالت اولیه است. تعامل سلول جاری با سلول همجوار افقی، عمودی و قطری حالت کنونی سلول را تعیین می‌کند. یک سلول زنده که کمتر از دو همسایه آن زنده باشند، ..

توضیحات بیشتر »

بازگشت مقادیر چندگانه از تابع های ++C — راهنمای کاربردی

شاید تاکنون برایتان پیش آمده باشد که بخواهید مقادیر چندگانه‌ای را از یک تابع ++C بازگشت دهید. بهترین روش برای این کار کدام است؟ در ادامه چند روش برای این کار ارائه کرده‌ایم: استفاده از پارامترهای خروجی auto output_1(int &i1) { i1 = 11; return 12; } 2. استفاده از ساختار محلی auto struct_2() { struct _ { int i1, i2; }; return _{21, 22}; } 3. استفاده از یک std::pair auto pair_2() { return std::make_pair(31, 32); } 4. استفاده از یک std::tuple auto tuple_2() { return std::make_tuple(41, 42); } در این نوشته تلاش می‌کنیم بررسی کنیم که کدام یک از روش‌های فوق برای بازگشت دادن مقادیر چندگانه‌ در تابع‌های ++C بهتر است. اصولاً چرا باید بخواهیم مقادیر چندگانه‌ای بازگشت دهیم؟ یک مثال معمول برای این حالت ()std::from_chars است که یک تابع در ++C نسخه 17 است و شباهت زیادی به ()strtol دارد؛ اما ()from_chars تابعی است که 3 مقدار بازگشت می‌دهد. یک عدد تجزیه‌شده، یک کد خطا و یک اشاره‌گر به کاراکتر نخست نامعتبر. این تابع از ترکیبی از تکنیک‌ها استفاده می‌کند. عدد به صورت یک پارامتر خروجی بازگشت می‌یابد؛..

توضیحات بیشتر »

چگونه یک سیستم عامل طراحی کنیم؟ — به زبان ساده

اگر تاکنون با رایانه کار کرده باشید، احتمالاً در مورد طرز کار سیستم عامل در سطوح پایین کنجکاو شده‌اید و یا حتی ممکن است خواسته باشید در مورد این که چگونه می‌توان یک سیستم عامل ایجاد کرد سؤالاتی به ذهنتان رسیده باشد. این که گفته شود توسعه کرنل کار دشواری است، به هیچ وجه حق مطلب را ادا نمی‌کند. در واقع این کار اوج برنامه‌نویسی محسوب می‌شود. در این راهنما ابزارهای پایه‌ای مورد نیاز برای این منظور را معرفی کردیم و یک سیستم عامل ساده را در C و x86 Assembly پیاده‌سازی خواهیم کرد. این تصویری از صفحه سیستم عامل Basilica است که در این نوشته قصد داریم آن را ایجاد کنیم. سیستمی که قصد داریم توسعه دهیم، به افتخار Terry Davis، توسعه‌دهنده تازه درگذشته TempleOS به صورت Basilica OS نامگذاری شده است. این سیستم بسیار ساده خواهد بود و به عنوان یک مقدمه برای توسعه سیستم عامل محسوب می‌شود. از این رو قصد نداریم هیچ موضوع مرتبط با نظریه سیستم عامل مانند قالب‌های اجرایی، ارتباط سریال و غیره را مطرح کنیم. ما پشتیبانی از کیبورد را در سیستم خود نخواهیم داشت؛ با این حال، یک سیستم عامل اولیه می‌سازیم. شروع به پیا..

توضیحات بیشتر »

معماری میکروسرویس چیست؟ — به زبان ساده

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

توضیحات بیشتر »

بهینه سازی کد های C و ++C — راهنمای کاربردی

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

توضیحات بیشتر »

آموزش زبان C با یک پروژه ساده — راهنمای مقدماتی

یادگیری برنامه‌نویسی یک تجربه تجمّعی است. در مسیر یادگیری ساختار زبان برنامه‌نویسی منتخب باید با مفاهیم عمومی که همه زبان‌های برنامه‌نویسی به خدمت گرفته‌اند نیز آشنا شد. درک و یادگیری زبان C ممکن است کار ملال‌آوری باشد؛ اما چند ایده اساسی وجود دارند که هنگام آغاز این یادگیری بهتر است با آن‌ها آشنا باشید. در این نوشته یک پروژه ساده به عنوان روشی عالی برای یادگیری مفاهیم بنیادی زبان C معرفی شده است. اگر می‌پرسید باید از کجا شروع کرد، پاسخ ما این است که آغاز هر کاری «سلام» است! سلام دنیا (!Hello, World) سرآغاز تقریباً هر دوره یادگیری زبان برنامه‌نویسی برنامه Hello, World است. در این مسیر ما با برخی جنبه‌های تمایز C از دیگر زبان‌های برنامه‌نویسی نیز آشنا می‌شویم. برای آغاز کار یک ویرایشگر متنی یا IDE مورد علاقه خود را باز کنید و کد زیر را در آن وارد کنید: #include /* this is a Hello World script in C */ int main(void) { printf("Hello, World! n"); return 0; } این قطعه کوتاه از کد عبارتی را پیش از خاتمه برنامه در کنسول نشان می‌دهد. آن را جایی که بتوانید به راحتی به خاطر بیاورید ب..

توضیحات بیشتر »

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

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

توضیحات بیشتر »

ترسیم داده های جغرافیایی در پایتون — راهنمای جامع

یکی از مسائل مهم در کار «علم داده» (Data Science)، بصری‌سازی داده‌ها در یک نقشه جغرافیایی است و برای انجام این کار، «بسته‌های» (Packages) گوناگونی برای «زبان برنامه‌نویسی پایتون» (Python Programming Language) قابل استفاده هستند که از جمله آن‌ها می‌توان به «جئوپانداس» (GeoPandas) (+) اشاره کرد. اما گاهی نیز نصب این بسته‌ها، متناسب با محیطی که کاربر استفاده می‌کند ممکن است کار دشواری باشد. راهکار دیگر، استفاده از کدهایی است که توسط خود کاربر نوشته می‌شوند. در این مطلب «راه سخت» چگونگی ساخت «توابع نقشه‌های جغرافیایی» با استفاده از «Shapefiles» و کتابخانه‌های پایه‌ای پایتون آموزش داده خواهد شد. پس از مطالعه این راهنما کاربر قادر به ترسیم داده های جغرافیایی در پایتون است. 1. فایل‌های دارای فرمت Shapefiles Shapefiles یک فرمت محبوب داده‌های بردار جغرافیایی برای نرم‌افزارهای «سیستم‌های اطلاعات جغرافیایی» (Geographic Information System | GIS است. این فرمت توسط «مؤسسه پژوهش سامانه‌های زیست‌محیطی | اِرزی» (Environmental Systems Research Institute | Esri) به عنوان یک «استاندارد باز» (Open Standa..

توضیحات بیشتر »

۸ کتابخانه یادگیری ماشین پایتون — راهنمای کاربردی

«پایتون» (Python)، همچنان هنگامی که صحبت از «یادگیری ماشین» (Machine Learning)، «هوش مصنوعی» (Artificial Intelligence)، «یادگیری عمیق» (Deep Learning) و وظایف «علم داده» (Data Science) می‌شود پیشگام است. مطابق آمار ارائه شده توسط سایت «builtwith» (+)، بالغ بر ٪4۵ از شرکت‌های فناوری استفاده از پایتون را برای پیاده‌سازی هوش‌مصنوعی و یادگیری ماشین ترجیح می‌دهند. به همین دلیل، در این مقاله ۸ کتابخانه یادگیری ماشین پایتون معرفی شده‌اند. البته، این کتابخانه‌ها ممکن است برای موضوعات گوناگونی کاربرد داشته باشند. برای مثال، کتابخانه نرم‌افزاری متن‌باز «تنسورفلو» (Tensorflow) در حوزه یادگیری ماشین کاربرد دارد و «کِرَس» (Keras) یک کتابخانه متن‌باز شبکه عصبی و قابل اجرا روی تنسورفلو یا «ثینو» (Theano) است. این در حالی است که با وجود معرفی کردن کِرَس در این مطلب، تنسورفلو در این مطلب معرفی نشده و در لیست «13 کتابخانه برتر پایتون برای یادگیری عمیق» آورده شده است. دلیل این امر آن است که کِرَس مانند «سایکیت لِرن» (scikit-learn) بیشتر یک کتابخانه برای «کاربر نهایی» است، در حالیکه تنسورفلو بیشتر توسط ا..

توضیحات بیشتر »

مدیریت حافظه در سیستم عامل — راهنمای جامع

مدیریت حافظه یکی از کارکردهای سیستم عامل است که به مدیریت حافظه اصلی و جابجایی پردازش‌ها بین حافظه اصلی و دیسک در طی اجرا می‌پردازد. مدیریت حافظه صرف نظر از این که موقعیت‌های مختلف حافظه به پردازشی تخصیص یافته‌اند یا نه، همه آن‌ها را مدیریت می‌کند. این فرایند میزان حافظه‌ای که باید به پردازش‌ها تخصیص باید را تعیین می‌کند. مدیریت حافظه تصمیم می‌گیرد که در هر زمان کدام پردازش به حافظه دسترسی داشته باشد. مدیریت حافظه به ردگیری مقدار حافظه تخصیص یافته یا آزاد شده پرداخته و وضعیت‌های متناظر با آن‌ها را به‌روزرسانی می‌کند. در این بخش از راهنمای جامع سیستم عامل، مفاهیم مقدماتی مرتبط با مدیریت حافظه را بررسی می‌کنیم. فضای آدرس پردازش فضای آدرس پردازش به مجموعه‌ای از آدرس‌های منطقی گفته می‌شود که یک پردازش در کد خود مورد ارجاع قرار می‌دهد. برای نمونه وقتی آدرسی 32 بیتی مورد استفاده قرار می‌گیرد، آدرس‌ها می‌توانند از 0 تا 0x7fffffff باشند که $$2^{31}$$ عدد را شامل می‌شود و اندازه تئوریکی کلی برای آدرس‌دهی دو گیگابایت است. سیستم عامل وظیفه نگاشت آدرس‌های منطقی به آدرس‌های فیزیکی را در زمان تخص..

توضیحات بیشتر »