<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های DRSDavidSoft</title>
        <link>https://virgool.io/feed/@DRSDavidSoft</link>
        <description>blog.refoua.me/profile</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:51:03</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/106812/avatar/jQKmzR.png?height=120&amp;width=120</url>
            <title>DRSDavidSoft</title>
            <link>https://virgool.io/@DRSDavidSoft</link>
        </image>

                    <item>
                <title>در انتقاد از کد ویژن: معایب بدترین IDE برای توسعه AVR</title>
                <link>https://virgool.io/@DRSDavidSoft/codevisionavr-vs-gcc-in-iran-hr8fef0ba4ao</link>
                <description>مقدمهممکن است گاهی اوقات به عنوان یک برنامه‌نویس با سایر همکاران به بحث و گفتگو در رابطه با اینکه چه ابزار توسعه‌ای بهتر است و کدام نرم‌افزار نامناسب است پرداخته باشید.  موضوع بحث این مقاله هم بررسی تخصصی یکی از این نرم‌افزار ها است که برای برنامه نویسی میکروکنترلر ها به زبان C انجام می‌شود.به نظر من برای توسعه نرم‌افزار در ایران، معمولاً برنامه نویسان عامه به دو دسته تقسیم می‌شوند:افرادی که به دنبال راحت‌ترین و ساده‌ترین روش برای انجام پروژه می‌روند،سایر افرادی که هر آنچه مرسوم و رایج است را استفاده و از آن پیروی میکنند.همین قضیه هم باعث شده تا فقط درصد کمی از برنامه نویسان میکروکنترلر ها به کامپایلر های توانمند تری مانند gcc روی بیاورند، که اکثر آن‌ها هم از خط مشی پروژه‌های منبع باز پیروی می‌کنند. در ادامه سعی می‌کنم توضیح دهم که علت محبوبیت کدویژن در ایران چیست، و چرا من توصیه می‌کنم که برای کدنویسی AVR به سمت این نرم‌افزار نروید و از کامپایلر ها و IDE های بهتری استفاده کنید.معرفی نرم افزار کد‌ویژن و استفاده از آن در ایرانمیکروکنترلر های خانواده AVR مانند سری ATmega و ATtiny به دلایل بسیاری جزو محبوب ترین میکروکنترلر های 8 بیتی هستند. در ایران هم با توجه به قیمت نسبتاً پایین و راحتی استفاده از این میکروکنترلر ها و همچنین تدریس در دانشگاه، این میکروکنترلر جزو انتخاب اول بسیاری از طراحان الکترونیک و برنامه نویسان است.یکی از نرم‌افزار هایی هم که در حوزه برنامه‌نویسی برای میکروکنترلر های AVR در ایران استفاده می‌شود، کدویژن است که یک کامپایلر و IDE کامل مبتنی بر ANSI C است که برای کدنویسی به زبان C برای میکروکنترلر های AVR استفاده می‌شود.(اگر تفاوت ANSI C با نگارش‌های جدیدتر C و مزایای آن‌ها را نمی‌دانید، در ادامه به شرح آن می‌پردازم.)این نرم‌افزار به دلیل سادگی استفاده، امکان تولید خودکار کد با Wizard و ارائه کتابخانه برای موارد بدیهی (مانند LCD متنی و...) و همچنین کرک شدن در ایران (به خصوص دانشگاه‌های آزاد، شرکت‌ها و...) بسیار معروف شده است و تقریباً از بدو نوشتن کد به زبان C برای AVR در ایران تدریس می‌شود و توسط شرکت‌ها هم مورد استفاده قرار می‌گیرد.این نرم‌افزار به‌عنوان یک IDE یا محیط یکپارچه توسعهٔ نرم‌افزار، دارای تمامی بخش‌های لازم مانند ویرایشگر متنی کد، کامپایلر، لینکر و پروگرامر است. نکته جالب توجه این است که تمامی این بخش ها توسط برنامه‌نویسی به نام Pavel Haiduc توسعه داده شده که توسط شرکتی که به نام HP InfoTech S.R.L دارد آن را به قیمت 178 یورو عرضه می‌کند.قیمت این نرم‌افزار در ایران معادل 10 ملیون تومان در زمان نگارش این مقاله است، که در قیاس با پلتفرمی مانند GCC-AVR که به‌صورت رایگان در ادامه به آن خواهم پرداخت مبلغ بسیار بالایی به نظر می‌رسد، چراکه سطح کیفی و تجربه کاربری برای برنامه نویس هم در این نرم‌افزار بسیار ضعیف است.به گزارش سایت سیسوگ، بر اساس آمار رسمی سایت کد ویژن، ایران بیشترین استفاده کننده از این نرم‌افزار استچرا از کدویژن در ایران استفاده می‌شودسایت سیسوگ چند مورد از دلایل استفاده این نرم‌افزار در ایران را توضیح داده است که من آن را نقل قول می‌کنم:مساله بعدی که موجب محبوبیت این نرم افزار شده است، وجود کدویزارد می باشد. کدویزارد بخشی از این نرم‌افزار است که به شما اجازه می‌دهد پیکربندی اولیه میکروکنترلر را به صورت گرافیکال و ویژوال انجام دهید و نیازی به انجام این پیکر بندی ها به صورت دستی و کدی نداشته باشید.پنجره کدویزارد برای تولید خودکار کدبله، قطعاً این قابلیت جذابیت ویژه ای برای افراد مبتدی و حتی حرفه ای دارد، وقتی که به‌راحتی و با چند کلیک درگاه SPI یا UART یا I2C را پیکربندی می کنید بدون این که درگیر رجیسترها و بیت ها شده باشید، در نگاه اول این فرایند بسیار فریبنده است و آدم خیال می کند که از شر رجیسترها و دستکاری بیت ها راحت شده است، اما واقعیت چیز دیگری است، چرا که تجربه ثابت کرده است در مسیر توسعه برنامه نیاز خواهید داشت که با تک تک بیت ها دست و پنجه نرم کنید و کدویزارد کمکی به شما نمی‌کند.یک نکته مهم که من اضافه می‌کنم این است که به نظر من اساساً تعاریف این درگاه‌ها به‌صورت دستی یا حتی کدویزارد یک راهکار و طرز فکر اشتباه است، زمانی که شما کتابخانه‌های با کیفیت بسیار بالا، آسان جهت استفاده، و High-Performance دارید که امکان شخصی سازی خوبی را هم برای استفاده در پروژه‌هایتان به شما می‌دهند.به عنوان مثال: SPI.h، HardwareSerial.h و غیره که در AVR Toolchain وجود دارند و با استفاده از آن ها شما نیازی ندارید که به عنوان مثال پورت SPI یا UART میکروکنترلر را خودتان راه اندازی کنید یا با Timer های سخت افزاری درگیر شوید.این کتابخانه‌های دائماً در حال به‌روز شدن توسط برنامه نویسان هستند و در هر ورژن جدید از قابلیت‌ها و بهبود های مدرن بهره می‌برند، درحالی که کدویزارد در کدویژن محدود به آن میکروکنترلر و تفکرات یک برنامه نویس در آن دوران است. پس هیچ دلیلی ندارد که شما چه کد پیکربندی را خودتان بنویسید یا از کدویزارد استفاده کنید وقتی برای تمامی این بخش ها، کتابخانه‌های عالی و به‌صورت منبع-باز وجود دارد.از دیگر موارد محبوبیت کامپایلر کدویژن وجود کتابخانه های آماده آن است که کاربر را در راه اندازی دستگاه های کناری یاری می کند، مثلاً برای راه اندازی یک LCD کاراکتری جز این که کاربر در کدویزارد چند کلیک کند و پیکر بندی اولیه را انجام دهد، کار دیگری لازم نیست و خود کدویژن کتابخانه مربوطه رو در برنامه صدا میزند و کار پیکر بندی را برای شما انجام می دهد.به دلیل اینکه برنامه‌نویس عامه‌ی ایرانی دنبال سریع‌ترین، ساده‌ترین و راحت‌ترین روش می‌رود،‌ به استفاده از این کتابخانه‌های قدیمی و به‌روز نشده اکتفا می‌کند، در حالی که نسخه‌های متن‌باز کتابخانه راه‌انداز LCD متنی (مانند LiquidCrystal که در آردوینو نیز استفاده شده است) هر سال از به‌روز رسانی‌های مفیدی بهره‌مند می‌شوند که دارای قابلیت‌های جدید تر و حذف اشکالات نرم‌افزاری و باگ‌هایی است که حتماً‌ به آن بر خورده‌اید.مشکلات استفاده از نرم‌افزار کدویژن چیست؟اولین و مهم ترین مسئله این است که کدویژن ساختار یک کامپایلر استاندارد را ندارد و از آن پشتیبانی نمی کند. در یک کامپایلر استاندارد ابتدا فایل ها به صورت مجزا به فایل آبجکت تبدیل می شوند و بعد از آن با استفاده از یک دستورالعمل به هم لینک می شوند و فایل خروجی برنامه حاصل می شود.نمودار یک Toolchain که شامل کامپایلر و لینکر می‌باشداگر نمی‌دانید که یک Linker چه‌کاری انجام می‌دهند و فقط معنای Compiler را می‌دانید، شما تنها نیستید. متأسفانه سیستم آموزشی ناقصی که بر دانشگاه‌های ایران (مانند دانشگاه آزاد) حکمفرا است نسبت به توضیح دادن کلیه‌ی بخش‌های یک Toolchain یا زنجیره افزار مبادرت می‌کنند و کلیه قسمت تبدیل کد به فایل هکس را به‌طور کلی &quot;کامپایل&quot; خطاب می‌کنند.به‌صورت کوتاه در زمینه لینکر می‌توان این تور توضیح داد که یک فایل اجرایی نهایی، حاوی بخش‌های مختلفی از کد کامپایل شده می‌باشد که معمولاً این بخش‌های مختلف به‌صورت جداگانه کامپایل و تبدیل به فایل o (که یک آبجکت هست) تبدیل می‌شوند. سپس به کمک ابزار لینکر، این فایل‌های آبجکت در کنار همدیگر قرار می‌گیرند تا خروجی اجرایی نهایی تولید شود.یکی از مهم‌ترین دلایل استفاده از لینکر به این صورت است که شما فقط منبع یا سورس کد پروژه خودتان را در این حالت کامپایل می‌کنید، و هر بار نیاز به کامپایل تمامی کتابخانه‌های استفاده شده (مانند libc ندارید.) تصور کنید اگر هر بار که کلید Compile پروژه را میزدید، لازم بود که همه‌ی بخش‌های پروژه کامپایل شود! حتی بخش‌های که شما در آن هیچ تغییراتی نداده باشید.اگر شما یک کامپیوتر Workstation با پردازنده Core i9 و تعداد زیادی هسته داشته باشید و کامپایلر از قابلیت Multi-threaded برای کامپایل استفاده کند شاید برای شما مهم نباشد که هر دفعه کل پروژه را Build کنید، ولی برای تمامی برنامه‌نویسان حرفه‌ای و نیمه حرفه این مسئله که فقط قسمت‌های تغییر پیدا کرده از سورس کد کامپایل شود قطعاً از اهمیت ویژه‌ای برخوردار است.یکی دیگر از مزایای لینکر هم به این صورت است که شما می‌توانید فایل کتابخانه خود را به صورت کامپایل شده منتشر کنید، یا از فایل های منتشر شده‌ی کامپایل شده استفاده کنید که در کنار محافظت از منبع کد کتابخانه، سرعت Build فایل خروجی را نیز به نحو احسن افزایش می‌دهد.این ساختار علاوه بر اصولی بودن مزایا خیلی زیادی دارد که به عنوان نمونه به سرعت کامپایل اشاره شد، زیرا که فقط فایل های تغییر کرده نیاز به کامپایل مجدد دارند و نیاز نیست هر سری کل فایل ها کامپایل شوند (بر خلاف چیزی که در کدویژن اتفاق می افتد). وقتی شما بتوانید فایل ها به صورت مجزا کامپایل کنید یعنی در واقع می‌توانید کار گروهی بهتری در روال انجام پروژه داشته باشید، یا این که می‌توانید به راحتی از کتابخانه های آماده ای که دیگران نوشته اند بدون کمترین تغییری استفاده کنید. در ضمن برنامه شما میتواند ترکیبی از فایل های اسمبلی و C و C++ باشد.مسئله مهم بعدی، همانطور که در سایت خود کدویژن به آن اشاره شده است، عدم پشتیبانی کامل از زبان C مدرن است.اگر در رابطه با تفاوت ANSI C با نگارش‌های مدرن این زبان برنامه نویسی اطلاعات ندارید، این توضیح را بدهم که ANSI C اولین ورژن استاندرد زبان C است که بیش از 50 سال پیش در سال 1972 استاندارد سازی شد.این نگارش از زبان برنامه‌نویسی تا مدت‌ها تا سال 1990 استفاده شد و به دلیل پیشرفت تکنولوژی، سخت‌افزار کامپیوتر و حتی خود مکانیزم کامپایلر ها ورژن های کاملتری از این زبان ارائه شد: مثل C98,C90,C95,C99,C11 که هر کدام بین سال‌های 1990 تا 2011 ارائه شده اند.متأسفانه کدویژن هیچ کدام از این نگارش‌های به‌روز را پشتیبانی نمی‌کند؛ پس در واقع وقتی که از کدویژن استفاده میکنید شما مجبور هستید از نسخه اولیه زبان C استفاده کنید که همین امر باعث می‌شود که بسیار به سختی کدنویسی کنید، زیرا هیچ‌کدام از قابلیت‌های روزمره، سریع و مدرنی که انتظارش را دارید در دسترس شما نیستند! حتی خیلی از کتابخانه های آماده موجود برای شما غیر قابل استفاده می‌شوند، زیرا توسعه دهنده‌های این کتابخانه ها هم از از قابلیت‌ها استفاده کرده اند.مثال اول: عدم پشتیبانی از آرایه‌هایی که تعداد متغیر دارند:// Variable-length array (C99 feature)
// CodeVisionAVR will give an error: &amp;quotarray size must be constant&amp;quot
void foo (int n) {
  int arr[n]; // array size depends on n
  // do something with arr
}همانطور که در این مثال مشاهده می کنید، کدویژن قابلیت تعریف کردن یک آرایه که تعداد متغیری داشته باشد را ندارد! شاید شما به عنوان برنامه‌نویس از این مسئله چشم پوشی کنید یا به نحو دیگری نیازمندی خود را برطرف سازید، اما بیشتر اوقات این کار از لحاظ حفظ منابع محدود و اندک میکروکنترلر AVR به ضرر شما است.مثال دوم: تعریف مقادیر بر اساس خلاف ترتیب struct با designator// Designated initializer (C99 feature)
// CodeVisionAVR will give an error: &amp;quotinvalid initializer&amp;quot
struct point {
  int x;
  int y;
};

struct point p = {.y = 5, .x = 10}; // initialize y before xدر این مثال، ما یک struct تعریف کرده‌ایم که در آن به y پیش از x مقدار داده ایم. در این حالت، که به عنوان برنامه‌نویس باید برای شما امری بدیهی باشد، کدویژن خطای invalid initializer می دهد!مثال سوم: استفاده از instruction اسمبلی در کد C// Inline assembly (GCC extension)
// CodeVisionAVR will give an error: &amp;quotunknown identifier&amp;quot
asm volatile(&amp;quotnop&amp;quot); // insert a no-operation instructionباز هم در این مثال از قابلیت ساده و پیش پا افتاده ای مانند استفاده از دستور اسمبلی NOP یا No Operation در کد ذکر شده است، که کدویژن حتی این قابلیت را نیز پشتیبانی نمی‌کند!در واقع کدویژن از تمام قابلیت های زبان ANSI C هم استفاده نمی کند، به عنوان مثال شما در کدویژن قادر به تعریف اشاره گر به یک فانکشن نیستید (البته شاید در نسخه های جدید اضافه شده باشد.)و نیز قابلیت‌های بسیار دیگری مانند استفاده از attribute ها که در کدویژن هیچ پشتیبانی‌ای از آن صورت نگرفته.بیشترین مسئله‌ای که من را شخصاً در کدنویسی بسیار کلافه کرده بود این بود که در کامپایلر مزخرف کدویژن شما نمی‌توانید یک متغیر را در وسط فانکشن تعریف کنید و حتماً باید در ابتدا تعریف شده باشد.خب پس فایده استفاده از Dynamic Memory Allocation چیست وقتی که این امر در میکروکنترلر امکان پذیر است! یا مثال ساده تر، در صورتی که شما یک For Loop نوشته اید، ممکن است بخواهید که متغیر اندیس را به‌صورت موقت در وسط تابع به‌صورت U8 (همان Unsigned Byte) تعریف کنید. این وظیفه باید به یک کامپایلر خوب محول شود تا Initialization متغیر را به صورت خودکار انجام دهد و حتی با Optimization Pass انجا شده در کد، از افزودن متغیر های اضافی خودداری کند.ولی در کد ویژن باید این شما باشید که همواره متغیر های اندیس را در بالای تابع لحاظ کنید تا خدای نکرده، کد ویژن از Initialize کردن یک متغیر توسط شما در وسط برنامه شگفت زده و ناراضی نشود! تصویر نمونه از وضعیت برنامه نویس در مواجهه با کدویژنمثال از کدی که من میخواهم استفاده کنم:void foo() {
  int a = 10; // declare and initialize a variable
  printf(&amp;quota = %d\n&amp;quot, a); // statement
  int b = 20; // declare and initialize another variable - ERROR
  printf(&amp;quotb = %d\n&amp;quot, b); // statement
}مثال از نحوه تغییری که باید به دلیل استفاده از کدویژن بدهم:void foo() {
  int a = 10; // declare and initialize a variable
  int b = 20; // declare and initialize another variable
  printf(&amp;quota = %d\n&amp;quot, a); // statement
  printf(&amp;quotb = %d\n&amp;quot, b); // statement
}علت این محدودیت هم این است که در استاندارد ANSI C89 که کدویژن از آن تبعیت می‌کند، نمی‌توان یک متغیر را در وسط یک تابع تعریف کرد.برای آن دسته از دوستانی هم که الآن می پرسند «خب این قابلیت چه فایده‌ای دارد؟» من علت‌های زیر را لحاظ می‌کنم:این قابلیت می‌تواند به بهبود خوانایی و قابلیت نگهداری کد (maintainability) بسیار کمک کند، زیرا متغیر‌ها نزدیک به جایی که استفاده می‌شوند تعریف شده‌اند.این کار می‌تواند از مقداردهی اولیه غیرضروری متغیرها جلوگیری کند، مخصوصاً جایی که در برخی از شاخه های کد مورد نیاز نیستند (مانند If و Else ها). این ویژگی می‌تواند دامنه یا همان Scope و طول عمر متغیرها را کاهش دهد، که می تواند به جلوگیری از خطاهای انسانی و Memory Leakage یا همان نشت حافظه کمک کند.هر برنامه‌نویس C که در طی 20 سال گذشته (منظور از زمان C99) کد نویسی می‌کرده است قطعاً به مزایای قابلیت‌هایی که من نام بردم (به خصوص Scope متغیر ها) برخورده است. توجه شما را به کد زیر جلب می‌کنم:void bar(int n) {
  printf(&amp;quotn = %d\n&amp;quot, n); // statement
  if (n &gt; 0) {
    int a = n + 1; // declare and initialize a variable only if n is positive
    printf(&amp;quota = %d\n&amp;quot, a); // statement
  }
  else {
    int b = n - 1; // declare and initialize a variable only if n is negative or zero
    printf(&amp;quotb = %d\n&amp;quot, b); // statement
  }
}اکنون شما همین کد را به صورت &quot;کدویژنی&quot; مشاهده می‌کنید. لطفاً خودتان قضاوت کنید کدام خوانا تر، آسان تر، بهتر و راحت تر است:void bar(int n) {
  int a; // declare a variable at the beginning of the function
  int b; // declare another variable at the beginning of the function
  printf(&amp;quotn = %d\n&amp;quot, n); // statement
  if (n &gt; 0) {
    a = n + 1; // initialize a variable only if n is positive
    printf(&amp;quota = %d\n&amp;quot, a); // statement
  }
  else {
    b = n - 1; // initialize a variable only if n is negative or zero
    printf(&amp;quotb = %d\n&amp;quot, b); // statement
  }
}همانطور که مشاهده کردید، ما مجبور شدیم متغیر های a و b را هر دو به بالای تابع ببریم. علاوه بر این که این متغیر ها از عملکرد تابع ما دورتر شدند، اکنون متغیر b در شاخه if و متغیر a در شاخه else قابل دسترسی است که این امر ممکن است موجب خطای انسانی و نیز نشت حافظه گردد.مسئله حائز اهمیت بعدی، وجود خطا ها و باگ های اساسی در این برنامه است که معلوم نیست به دلیل کرک شدن به وجود آمده اند یا به دلیل خطای برنامه نویسی، باگ هایی که گاهاً کلافه کننده و سرگردان کننده هستند، به عنوان مثال شاید ساعت ها و روز ها با برنامه کلنجار رفته باشید و بعد فهمیده باشید که خطا از برنامه نیست و از کامپایلر است، هیچ چیز به این اندازه کلافه کننده نخواهد بود.به‌عنوان برنامه‌نویس، این مسئله به نظر من بدترین مورد استفاده از کدویژن است. من شخصاً بر این باور نیستم که مشکل از کرک برنامه باشد و این نظر همکاران من است، ولی صرف نظر از اینکه علت باگ چه است، در مورد اینکه باگ ها وجود دارند هیچ شکی نیست! بار ها من این تجربه را داشته ام که برنامه میکروکنترلر درست نوشته شده است ولی به دلیل  وجود یک باگ ناشناس (که ممکن است در نسخه بعدی برنامه مرتفع شده باشد) تیم ما خروجی ای گرفته است که ساعت‌ها وقت را هدر داده تا در انتها به این نتیجه برسیم که مشکل از کد ما نیست،‌ بلکه مشکل خود کدویژن است!مسئله بعدی این است که وقتی شما از کدویژن استفاده می کنید، مجبور هستید که از ویرایشگر کد خود کدویژن استفاده کنید و قادر نخواهید بود که از ویرایشگر های پیشرفته ای مانند VS Code استفاده کنید. وقتی از ویرایشگر های پیشرفته استفاده می کنید هم توسعه برنامه خیلی سریعتر خواهد بود و هم پیدا کردن خطا های احتمالی برنامه راحت تر خواهد بود.دقیقاً این مشکل دیگر من با برنامه کدویژن است، یک ویرایشگر کد داخلی یا Internal Code Editor که حتی به پای Notepad++ نمی‌رسد!وقتی شما از ویرایشگر کد درست و معتبری مانند VS Code استفاده می‌کنید، یعنی تمامی قابلیت‌هایی که این ویرایشگر بسیار منحصر به فرد دارد را در اختیار دارید و در غیر از اینصورت،‌ مانند استفاده از کد ویژن، آن ها از دست می‌دهید. قابلیت‌هایی نظیر:پشتیبانی از افزونه‌های مختلف که روند توسعه نرم‌افزار را تسریع می‌کنندپشتیبانی از IntelliSense که بر خلاف Autocomplete ساده، معیارهایی مانند آرکومنت ها و پارامتر های توابع را در نظر میگیردپشتیبانی از C Language Server که خطاهای احتمالی شما را حین برنامه‌نویسی به‌سرعت می‌گیرد، و نیز امکاناتی مانند Show References و Go To Symbol و حتی موارد ساده ای مانند Rename Symbol را در اختیار شما می‌گذارداستفاده از محیط سریع، ساده،‌ آسان و راحت که دارای Tab به روشی است که شما گرگیجه نمی‌گیرید!پشتیبانی از Git برای کنترل درست و حسابی سورس کد شما، چون برخلاف برنامه‌نویسان غارنشین که با کپی و پیست از سایت‌های ایرانی مانند eca و برنامه نویس پروژه را سرهم می‌کنند، یک برنامه نویس مدرن و حرفه‌ای نسبت به Version Control پروژه خود توجه می‌کند!دارا بودن از محیط Debugger بسیار عالی و پشتیبانی از Breakpoint ها، که هم در شبیه سازی کد AVR و هم در دیباگ میکروکنترلر واقعی با دستگاه به شما کمک می‌کند.قابلیت Customize کردن ویرایشگر، و همچنین منو ها و Dialog هایی که درست کار می کنند (مانند قابلیت Search &amp; Replace که در کد ویژن موجب ریزش  و کندن مو می‌شود) و نیز پشتیبانی از Multiple Cursors و Regular Expressions که در کدنویسی AVR دقیقاً به درد می‌خورد!پشتیبانی از Keyboard Shortcut های مختلف و کاربردی و نیز قابلیت Zoom، Split View، Zen Mode و...محیط کاربری بسیار جذاب و زیبا و قابلیت نصب پوسته‌های متفاوت که کار را لذت بخش می‌کند، و از همه مهم تر....قابلیت Dark Mode: زیرا بدون این قابلیت چگونه می‌خواهید کد نویسی کنید؟یک مسئله مهم برای من در مورد کدویژن هم UI آن است که از زمان Windows XP تا کنون بهبودی نداشته است.برخی از مواردی که بسیار آزار دهنده هستند، Freeze شدن محیط کاربری کد ویژن حین انجام عملیات کامپایل است که هر بار موجب بالا رفتن فشار خون و ضربان قلب می شود، و همچنین عدم پشتیبانی از High-DPI scaling بر روی نمایشگر های رزولوشن بالا موجب کدر شدن و بلور بودن متن و محیط کاری برنامه و اعمال درد به چشم می شود.اگر شما هم مانیتوری داشته باشید که به عنوان مثال 125% یا 150% برای Scaling آن تعریف شده باشد، متوجه بلور شدن محیط نرم افزار می‌شوید. تنها راه جلوگیری از این مشکل، غیر فعال کردن System Scaling است که موجب کوچک شدن کلیه آیکون‌های Toolbar برنامه و نازک شدن فونت می‌شود.در صورتی که شما از یک لپ تاپ برند DELL یا Lenovo قدیمی که فاقد High Pixel Density می‌باشد استفاده کنید (که احتمالاً هنوز از ویندوز 7 هم استفاده می‌کنید) متوجه این نقطه ضعف در UI نخواهید شد، ولی هر برنامه‌نویس دیگری که از مانیتور‌های با Scaling بالا استفاده می‌کند قطعاً متوجه این مشکل آزار دهنده خواهد شد.مسئله نهایی، عدم منبع باز بودن نرم‌افزار کدویژن و هزینه‌ی بالای آن در مقایسه با گزینه‌های دیگر است.به نظر من، در ازای دریافت 178 یورو از کاربر حداقل انتظار می رود که برنامه نویس این پروژه نسبت به رفع این مشکلات اقدام کند، ولی مشخصاً این دسته از موارد خارج از حیطه اولویت‌های وی است، و به دلیل اینکه این نرم افزار به صورت متن بسته و اصطلاحاً Commercial است، امکان اینکه سایر برنامه‌نویسان به برطرف کردن این مشکلات اقدام کنند هم وجود ندارد.سوالی که همچنان باقی می ماند این است که اگر کدویژن نه، پس از چه جایگزینی می‌توانیم استفاده کنیم، که در ادامه با معرفی AVR Toolchain و GCC به آن خواهیم پرداخت.معرفی زنجیره ابزار AVR Toolchain و کامپایلر GCCاز نظر بسیاری (من جمله خودم)، کامپایلر GCC، بهترین کامپایلر دنیا هست، نه حتی یکی از بهترین‌ها، بلکه تنها بهترین کامپایلر برای C و C++. شاید برخی ها این رأی را به LLVM یا Microsoft Visual C Compiler یا MSVC بدهند، ولی من در ادامه توضیحاتم را مبنی بر اینکه چرا از این کامپایلر استفاده کنیم را ارئه می‌دهم.نکته حائز اهمیت این است که GCC یا Gnu C Compiler، یک کامپایلر همه کاره یا General Purpose و مربوط به پروژه GNU است که احتمالاً اسم آن در پروژه‌هایی مانند کرنل لینوکس به گوشتان خورده باشد.این کامپایلر قابلیت Target کردن (یا خروجی گرفتن) برای پلتفرم‌های متعددی را دارد، مانند X86 و X86_64 که CPU های اینتل و AMD هستند و برای تولید برنامه ویندوز به کار می‌روند، ARM که محبوب‌ترین ISA دنیا برای دستگاه‌های embedded (از جمله گوشی موبایل، روتر، رزپری پای و...) است، و نهایتاً AVR که ISA مورد بحث امروز ما است.به دلیل گستردگی استفاده از GCC در زمینه‌های مختلف و در طی 35 سال استفاده از این کامپایلر، اکنون این کامپایلر به درجه ای از بلوغ رسیده است که به هیچ‌عنوان قابل قیاس با سابقه کمتر از 20 سال کدویژن نیست.این به معنای این است که پیدا کردن باگ در این کامپایلر تقریباً غیر ممکن است.از دیگر مزایای استفاده از این کامپایلر هم می توان به موارد زیر اشاره نمود:به دلیل منبع باز بودن و رایگان بودن، شما می‌توانید هر زمان و به هر شکلی و با هر تغییراتی که خواستید از این کامپایلر استفاده کنید.این کامپایلر از ورژن های جدید و مدرن C و C++ پشتیبانی می‌کند که در بالا اهمیت استفاده از آن ها را توضیح دادم.با توجه به اینکه این کامپایلر به صورت وسیع تری در دنیا مورد استفاده قرار می‌گیرد، منابع بیشتر و به‌روز تری برای آن وجود دارد، بنابراین شما راحت‌تر و با کیفیت بیشتری می‌توانید پروژه‌های خود را جلو ببرید.به دلیل این موارد، تمامی جایگزین‌های برنامه نویسی به زبان C برای AVR از همین کامپایلر استفاده می‌کنند، حتی نرم افزار رسمی خود شرکت Atmel یا همان Microchip!Atmel Studio (Microchip Studio)WinAVRmikroC PROIARAtmanAcrو بسیاری از IDE های دیگر.اگر اسم نرم‌افزار Arduino یا همان آردوینو به گوشتان خورده باشد، لازم به ذکر است که این محیط هم از GCC برای کامپایل سورس کد استفاده می‌کند!در نتیجه، با استفاده از این کامپایلر، ویژگی بسیار مفید سازگاری یا انطباق بیشتر کد شما با سایر IDE هم به جمله موارد مفید استفاده از این کامپایلر اضافه می‌شود.ضمناً، این کامپایلر دارای Optimizer بسیار مفیدی است که می‌تواند کد شما را بدون خطا تا چندین مرحله بهینه کند که بعد تر به آن خواهیم پرداخت.قبلاً با چند تن از دوستان در خصوص همین مسئله تبادل‌نظر داشتیم. دوستان معتقد بودند که کدویژن در کامپایل و بهینه‌سازی کدِ خروجی خیلی موفق‌تر از GCC عمل می‌کند و در استاندارد نبودن آن مهم نیست و بهینه بودن کدِ خروجی از درجه اهمیت بالاتری برخوردار است. هرچند به نظر بنده، استاندارد بودن از درجه اهمیت بالاتری برخوردار است؛ چرا که کد قابل‌ حمل و توسعه می‌شود. اگر کد شما قابل‌حمل باشد، برای انتقال آن از AVR به ARM نیازی به بازنویسی و حذف بخش‌های غیراستاندارد نیست.در ادامه این نقل قول لازم است بیان کنم که GCC دارای Code Optimizer بسیار هوشمند تر و &quot;قوی تری&quot; نسبت به کدویژن است و علت اینکه برخی از دوستان فکر میکنند که کدویژن بهتر عمل می‌کند را نمی‌دانم، ولی فقط به دلیل نبود باگ در کدویژن که شده باشد استفاده از این کامپایلر کار دوستانه و انسانی ای است.منظور از کد قابل حمل یا Port-able، کدی است که به راحتی بین پلتفرم‌ها یا ISA قابل حمل باشد، یا اصطلاحاً &quot;Port&quot; شود. یعنی مثلاً شما کد یا کتابخانه‌ای نوشتید که می‌توانید همان را بین پروژه ARM و AVR استفاده کنید که خودش قابلیت مهم و کاربردی‌ای هست. (در زمینه Keil IDE که برای ARM هست فعلاً حرف نمی‌زنم ولی از نظر من، Keil دست کمی از کدویژن ندارد.)مقایسه GCC با کدویژناز طرفی برتری داشتن یک شبه کامپایلر که توسط یک شرکت با تعداد افراد محدود ایجاده شده (یعنی کدویژن)، از یک کامپایلر اپن سورس که جامعه‌ای از برنامه‌نویسان آزاد برای توسعه آن‌وقت گذاشته‌اند (یعنی gcc)، قابل‌پذیرش نیست. ولی از آنجایی‌که هیچ ‌چیز غیرممکن نیست، حتی خود غیرممکن (!) قرار بر این شد که قابلیت اپتیمایز کد و همچنین سرعت اجرای کد ایجادشده توسط این دو کامپایلر را بررسی کنیم تا بتوان راحت‌تر در خصوص آن‌ها قضاوت کرد.برای انجام تست‌ها نیاز به یک سخت‌افزار پایه است که کدهای ایجادشده توسط هر کامپایلر را بر روی آن پروگرام کرد و بتوان نتیجه آن را مشاهده کرد.برای مقایسه این دو کامپایلر، از میکروکنترلر بسیار محبوب ATmega328P استفاده می‌کنیم که بر روی برد هایی مانند Arduino Uno R3 و Arduino Nano استفاده شده، و بر خلاف میکروکنترلر ATmega32 که متأسفانه در دانشگاه‌های ایران حکمفرمایی می‌کند، از هر لحاظ (غیر از تعداد پین ها) بهتر است. (این صحبت هم با استناد به صفحه رسمی معرفی محصول و مقایسه آن ها در سایت خود شرکت سازنده بیان می شود.)این برد از پردازنده Atmega328p استفاده می‌کند که توسط کریستال 16 مگاهرتز کلاک آن تأمین می‌شود. برای این‌که بتوان نتیجه را ملموس‌تر احساس کرد، فرکانس کاری میکرو را با تقسیم فرکانس ورودی بر 16 به یک مگاسیکل کاهش دادیم. در تمام برنامه‌ها برای اندازه‌گیری سرعت اجرای برنامه، به کمک یک لاجیک آنالایز، سرعت صفر و یک شدن پایه PORTB.4 را اندازه‌گیری می‌کنیم که درواقع ملاکی از سرعت اجرای برنامه است؛ هرچه این پایه با سرعت بیشتری صفر و یک شود یعنی سرعت اجرای برنامه بیشتر و عملکرد کامپایلر در کامپایل کد بهتر است.این نسخه کرک شده کدویژن توسط سایت سیسوگ از کامپایلر داخلی ورژن 3.12 کدویژن استفاده می‌کندبرای انجام این تست، از کدویژن ورژن 3.12 و نیز gcc ورژن 3.5 استفاده خواهد شد.شرایط یکسان برای کامپایلرهاایجاد شرایط یکسان برای اینکه به نتیجه مناسبی برای بهترین کامپایلر AVR برسیم با توجه به تفاوت‌های کلیدی بین این دو کامپایلر مقداری سخت است اما ما سعی کردیم که دو کامپایلر را در بهترین حالت اپتیمایز کد قرار دهیم.همان‌طور که در عکس فوق مشاهده می‌کنید، هر دو کامپایلر در حالت اپتیمایز حجم کانفیگ شده‌اند. در این کانفیگ، کامپایلر به نحوی تنظیم می‌شود که کمترین حجم ممکن را ایجاد کند.در ادامه، پنج برنامه تست از سایت سیسوگ گردآوری شده اند:int main(void) {
  CLKPR = (1 &lt;&lt; CLKPCE);
  CLKPR = (0 &lt;&lt; CLKPCE) | (0 &lt;&lt; CLKPS3) | (1 &lt;&lt; CLKPS2) | (0 &lt;&lt; CLKPS1) | (0 &lt;&lt; CLKPS0);

  DDRB |= 1 &lt;&lt; 4;

  while (1) {
    PORTB ^= 1 &lt;&lt; 4;
  }
}در این برنامه خروجی Toggle شده و از هیچ تأخیری هم استفاده نشده است.int main(void) {
 	float Var = 0;
 	CLKPR=(1&lt;&lt;CLKPCE);
 	CLKPR=(0&lt;&lt;CLKPCE) | (0&lt;&lt;CLKPS3) | (1&lt;&lt;CLKPS2) | (0&lt;&lt;CLKPS1) | (0&lt;&lt;CLKPS0);

	DDRB |= 1&lt;&lt;4;
 
 	while(1)
 	{
 		Var += 0.1f;
 		PORTB = ((uint8_t)Var) &lt;&lt; 4;
 	}
}در این برنامه علاوه بر تغییر وضعیت خروجی، محاسبات ساده‌ی اعداد اعشاری نیز صورت گرفته است.uint8_t foo(uint32_t x)
{
    x = x - ((x &gt;&gt; 1) &amp; 0x55555555);
    x = (x &amp; 0x33333333) + ((x &gt;&gt; 2) &amp; 0x33333333);
    x = (x + (x &gt;&gt; 4)) &amp; 0x0F0F0F0F;
    x = x + (x &gt;&gt; 8);
    x = x + (x &gt;&gt; 16);
    return x &amp; 0x0000003F;
}
int main(void)
{
	uint32_t x = 0xFAFAFAFA;
	CLKPR=(1&lt;&lt;CLKPCE);
	CLKPR=(0&lt;&lt;CLKPCE) | (0&lt;&lt;CLKPS3) | (1&lt;&lt;CLKPS2) | (0&lt;&lt;CLKPS1) | 
0&lt;&lt;CLKPS0);
	
	DDRB |= 1&lt;&lt;4;
	
	while(1)
	{
		PORTC = foo(x++);
		PORTB ^= 1&lt;&lt;4;
	}
}در این برنامه علاوه بر تغییر وضعیت خروجی، یک سری عملیات ریاضی و منطقی بر روی متغیرهای 32 بیتی انجام‌شده به همراه فراخواندن یک متد.uint8_t foo(uint64_t x)
{
    x = x - ((x &gt;&gt; 1) &amp; 0x5555555555555555);
    x = (x &amp; 0x3333333333333333) + ((x &gt;&gt; 2) &amp; 0x3333333333333333);
    x = (x + (x &gt;&gt; 4)) &amp; 0x0F0F0F0F0F0F0F0F;
    x = x + (x &gt;&gt; 8);
    x = x + (x &gt;&gt; 16);
    return x &amp; 0x000000000000003F;
}

int main(void)
{
	uint64_t x = 0xFAFAFAFAFAFAFAFA;
	CLKPR=(1&lt;&lt;CLKPCE);
	CLKPR=(0&lt;&lt;CLKPCE) | (0&lt;&lt;CLKPS3) | (1&lt;&lt;CLKPS2) | (0&lt;&lt;CLKPS1) | (0&lt;&lt;CLKPS0);
	
	DDRB |= 1&lt;&lt;4;
	
	while(1)
	{
		PORTC = foo(x++);
		PORTB ^= 1&lt;&lt;4;
	}
}این برنامه همانند برنامه سوم است، با این تفاوت که عملیات ریاضی و منطقی بر روی متغیرهای 64 بیتی انجام شده است.int main(void)
{
    uint32_t aaa , bbb, ccc;
    CLKPR=(1&lt;&lt;CLKPCE);
    CLKPR=(0&lt;&lt;CLKPCE) | (0&lt;&lt;CLKPS3) | (1&lt;&lt;CLKPS2) | (0&lt;&lt;CLKPS1) | (0&lt;&lt;CLKPS0);
    DDRB |= 1&lt;&lt;4;

    while(1)
    {
        aaa++;
        bbb++;
        ccc = aaa*(bbb^2);
        ccc = ccc/bbb;
        PORTB ^= 1&lt;&lt;4;
    }
}در این برنامه یک سری عملیات ریاضی بر روی متغیرها انجام‌ شده و هم زمان خروجی تغییر وضعیت داده شده است.خب کم کم داریم به جواب این سؤال که بهترین کامپایلر AVR چه کامپایلری است نزدیک می‌شویم.نمودار فوق نشان‌دهنده‌ی حجم خروجی کامپایلر برای هر یک از برنامه‌ها است. نمودار نارنجی مربوط به کامپایلر کدویژن و نمودار آبی مربوط به کامپابلر GCC است. دقت داشته باشید هر چه برنامه با حجم کمتری ایجاد شده باشد، بهینه‌تر است؛ چراکه شما قادر هستید برنامه‌ی بیشتری را روی حافظه‌ی مشخصی ذخیره کنید. پس نمودار کوچک‌تر یعنی عملکرد بهتر.دقت داشته باشید شبه کامپایلر کدویژن اصلاً قادر به کامپایل کد نمونه 4 نبود. چراکه این شبه کامپایلر، از متغیرهای 64 بیتی پشتیبانی نمی‌کند.همانطور که از نتایج به دست آمده مشخص است، در این بخش، کامپایلر GCC به صورت 100 درصد عملکرد بهتری نسبت به شبه کامپایلر کدویژن دارد.نمودار آبی مربوط به کامپایلر GCC و نمودار نارنجی مربوط به شبه کامپایلر کدویژن است. جواب‌ها، فرکانس ایجادشده بر روی خروجی است و واحد آن کیلوهرتز است. جواب برنامه‌های 2 و 3 و 4 در 10 و 100 ضرب شده‌اند تا در نمودار به خوبی مشخص باشند. هرچه مقدار این نمودار بیشتر باشد، نشان‌دهنده‌ی عملکرد بهتر کامپایلر است چراکه قادر است در واحد زمان تعداد کدهای بیشتری را اجرا کند.توضیح در خصوص جواب برنامه 5 و اختلاف فاحش آن :کامپایلر GCC دارای هوشمندی زیادی در اپتیمایز کد است. این کامپایلر با تشخیص قسمت‌های غیرضروری در برنامه و حذف آن‌ها، هم سرعت اجرا بالا می‌برد و هم در حافظه‌ی برنامه صرفه‌جویی می‌کند. اگر دقت کنید در برنامه شماره 5 یک سری عملیات ریاضی روی سه متغیر aaa و bbb و ccc انجام شده است که نتیجه عملیات فوق هیچ جا مورداستفاده قرار نگرفته است؛ به همین دلیل کامپایلر این عملیات را غیرضروری فرض و تمام روال آن را از برنامه حذف کرده است. به همین دلیل سرعت و حجم برنامه شماره 5 و 1 یکی است. اما شبه کامپایلر کدویژن دارای این هوشمندی نیست و نمی‌تواند قسمت‌های غیرضروری برنامه را تشخیص دهد و آن‌ها را حذف کند.دقت داشته باشید شبه کامپایلر کدویژن اصلاً قادر به کامپایل کد نمونه 4 نبود. چراکه این شبه کامپایلر، از متغیرهای 64 بیتی پشتیبانی نمی‌کند.بهترین کامپایلر AVR کدام است؟همان‌طور که انتظار می‌رفت کامپایلر GCC در تمام موارد عملکردی به‌مراتب بهتری از شبه کامپایلر کدویژن دارد. یکی از دلایل موفقیت صد درصدی کامپایلر GCC، متن‌باز بودن و توسعه‌ی آن توسط برنامه نویسان مجرب و کارکشته سراسر جهان است. کامپایلر GCC در برنامه‌های زیادی مورد استفاده قرار گرفته است؛ ازجمله: AVR Studio یا Arduino و… . این نیز خود نشان‌دهنده‌ی برتری این کامپایلر است.توصیه می‌کنم اگر از کدویژن استفاده می‌کنید، آن را کنار بگذارید و برای حرفه‌ای‌تر شدن، با GCC شروع به کدنویسی کنید. برای مثال، کدویژن یک کامپایلر کرک شده غیر استاندارد است و تنها آپشن ویرایشگر آن این است که وقتی یک پرانتز یا آکولاد را انتخاب می‌کنید، ابتدا و انتهای آن را برای شما به رنگ زرد در می‌آورد!(از سایت سیسوگ جهت بررسی و مقایسه تخصصی این دو کامپایلر سپاسگزارم.)در ادامه، چند نکته قابل ذکر است:در صورتی که بخواهید از AVR Toolchain برای GCC استفاده کنید، باید طرز تفکر را اصطلاحاً Mindset خودتان را از کدویژن خارج کنید. چرا که کدویژن یک نرم افزار بکپارچه جامع IDE با ویرایشگر متن و کامپایلر داخلی خودش است که صرفاً جهت کار راه انداختن به درد میخورد، در صورتی که یک Toolchain حاوی همه‌ی ابزار های لازم نظیر Compiler، Linker، Assembler و... می باشد، و معمولاً شما باید از یک IDE یا Code Editor استفاده کنید که من VS Code را بهترین ویرایشگر کن می دانم. ولی شاید برای کسی که علاقه‌ی چندانی به برنامه نویسی ندارد و صرفاً میخواهد که کارش راه بیفتد علاقه‌ای به راه اندازی Toolchain نداشته باشد و دنبال ساده ترین و راحت ترین راه بگردد که خب قطعاً کدویژن علی رغم تمامی مشکلات عنوان شده و باگ هایی که دارد، دقیقاً مناسب این دسته از افراد است.به‌عنوان مثال، کد ویژن تعدادی کتابخانه داخلی دارد و کدویزارد این نرم‌افزار هم به درد بسیاری از افراد می‌خورد که سر رشته ای از کتابخانه‌های جدید ندارند.بلاخره تیم توسعه این نرم افزار هم زحمت کشیده و بخش های Code Editor و Compiler و... را برای این نرم افزار توسعه داده، ولی همانطور که ذکر کردم، کدویژن به معنای واقعی کلمه، بدترین IDE برای توسعه کد AVR هست و به نظر من فقط به دلیل تدریس در دانشگاه آزاد و استفاده در شرکت های ایرانی معروف شده است، ولی برنامه معتبری نمی باشد.در صورتی که شما بخواهید از GCC استفاده کنید، می‌توانید که Toolchain را جداگانه راه اندازی کنید و IDE شخصی مورد علاقه تان را راه اندازی کنید، اما همچنین می‌توانید از IDE هایی که به صورت آماده این کار را انجام داده اند و در بالا ذکر شده اند استفاده کنید، مانند Atmel Studio و حتی آردوینو.لازم به ذکر است که پلتفرم آردوینو صرفاً محدود به برد های آردوینو نیست! شما می توانید از نرم افزار آردوینو برای پروگرام بورد خودتان استفاده کنید، و تازه از مزایای Optiboot Bootloader، کتابخانه Wiring، و هزاران کتابخانه موجود در این پلتفرم که منبع باز هستند استفاده کنید. در بسیاری از منابع ذکر شده که در آردوینو دستورات فرق دارد، اما این جمله صحت ندارد زیرا آردوینو کماکان با GCC-AVR کامپایل می شود و کلیه Language Structure و Syntax استاندارد را پشتیبانی می کند.حقیقت این است که به دلیل استفاده از کتابخانه‌هایی مانند Wiring در آردوینو، شما دسترسی به توابع بیشتری مانند digitalWrite و analogWrite برای PWM دارید که افراد مبتدی وجود این دسته از توابع را با عدم پشتیبانی از Syntax استاندارد اشتباه میگیرند، در حالی که شما به راحتی می‌توانید به عنوان مثال از ساختار PORTA تا PORTF در آردوینو نیز استفاده کنید و حتی این Syntax ها را همزمان با کتابخانه Wiring استفاده کنید!نکته قابل توجه این است که gcc صرفاً یک کامپایلر است و برخلاف کدویژن که تعدادی متابخانه قدیمی در خودش دارد، gcc دارای هیچ کتابخانه ای برای قطعات و ماژول ها (مانند LCD) نیست و وظیفه نصب و استفاده از بهترین و به‌روز ترین کتابخانه‌ها (مانند LCD) را به عهده خود برنامه‌نویس گذاشته است.مسئله بعدی هم این است که به‌عنوان یک مهندس برنامه‌نویس توصیه می‌شود به‌جای اینکه خود را به تعدادی برنامه سطح پاین یک بار مصرف مانند کدویژن محدود کنید، تکنولوژی اصلی زیر ساخت (مانند GCC) را فرا بگیرید تا امکان برنامه نویسی برای پلتفرم‌های مختلف (حتی ARM را داشته باشید).به عنوان مثال، فراگیری VS Code در آینده به شما به توسعه هر نوع کد (که حتی نامربوط به میکروکنترلرها باشد، مانند پایتون) کمک می‌کند، در صورتی که کدویژن و ویرایشگر آن تنها در زمینه AVR کاربردی است.یک IDE که بر مبنای VS Code است و حاوی GCC و کتابخانه‌های Arduino که در بالا ذکر شد است، نرم افزار PlatformIO است که توسعه برای میکروکنترلر ها را بسیار لذت بخش و برای افراد مبتدی و حتی حرفه ای بسیار آسان و راحت کرده است. می‌توانید به سراغ آموزش استفاده از این IDE بروید.و توصیه آخر هم این است که در دنیای منبع باز یا اُپن-سورس سرمایه گذاری کنید! اگر به فکر پیشرفت و توسعه هستید، دیگر نرم افزار‌های متن بسته و خسته که پولی هستند و کرک آن را دانلود می‌کنید به زودی کنار می‌روند و مشابه سایر محتوا هایی که در دانشگاه به شما تدریس می‌کنند به درد نخواهد خورد. پس بهتر است که هر چه سریع‌تر از جو بسته، تکراری، مرسوم و منسوخ توسعه برای این میکروکنترلر ها خارج شوید.</description>
                <category>DRSDavidSoft</category>
                <author>DRSDavidSoft</author>
                <pubDate>Tue, 23 May 2023 03:02:34 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه دامنه‌های مخرب و تبلیغاتی را با DNS مسدود کنیم؟</title>
                <link>https://virgool.io/@DRSDavidSoft/%D8%A8%D9%84%D8%A7%DA%A9-%DA%A9%D8%B1%D8%AF%D9%86-%D8%AF%D8%A7%D9%85%D9%86%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%D8%A8%D9%84%DB%8C%D8%BA%D8%A7%D8%AA%DB%8C-%D8%A8%D8%A7-dns-yemcqdgfrvpl</link>
                <description>اگر این روزها از افزونه‌های ضد تبلیغات و پاپ آپ بر روی مرورگر خود استفاده نمی‌کنید، وقت آن فرا رسیده است که هرچه سریع‌تر طعم شیرین تجربه دنیایی از وب بدون هرگونه تبلیغات را بچشید!  ? ?افزونه‌هایی مانند uBlock Origin و Adblock Plus و AdGuard به شما کمک می‌کنند که تبلیغات مزاحم و آزاردهنده بی‌کاربرد وب‌سایت‌ها مختلف را تنها با 1 کلیک برای همیشه مسدود کنید.افزونه uBlock Origin، معروف‌ترین افزونه حذف تبلیغاتبهترین این افزونه‌ها هم uBlock Origin می‌باشد، و در صورتی که از افزونه‌ای به‌غیر این سه استفاده می‌کنید، می‌توانید ویژگی‌های این دو را مقایسه کنید و تجربه‌ای از مصرف منابع بهینه و برتری مسدودسازی تبلیغات توسط uBlock Origin را کسب کنید.من در گذشته، کدی مخصوص وبلاگ‌های سرویس‌دهی رایگان نوشته بودم که با نصب بر روی وبلاگ نویسنده، از نمایش این تبلیغات جلوگیری می‌کرد.  اما در بیشتر مواقع، استفاده از افزونه‌ی ضد تبلیغات بر روی مرورگر نه‌تنها ساده‌تر و آسان‌تر می‌باشد، بلکه جامع‌تر و کاربردی تر نیز هست.چرا باید از ریشه با استفاده از DNS، دامنه‌های تبلیغات و مخرب را مسدود کنیم؟ ?استفاده از افزونه‌های مسدودسازی تبلیغات نیز گاهی به‌تنهایی کافی‌نیست و یا در مواردی، مانند استفاده در گوشی موبایل، تلویزیون‌های هوشمند و کنسول‌های بازی به‌طور کلی اصلاً امکان‌پذیر نیست.به‌عنوان مثال، حتماً‌ شما هم بر روی گوشی اندروید و iOS خود بازی‌هایی نصب کرده‌اید که پر از تبلیغات مزاحم هستند و حتی با اینکه نیازی به ارتباط به اینترنت ندارند، در صورت ارتباط با اینترنت بلافاصله اقدام به نمایش این تبلیغات می‌کنند.حتی ممکن است بر روی رایانه و این دستگاه‌ها سهواً دامنه‌ای را باز کنید که منجر به آلوده شدن سیستم‌شما به ویروس‌ها، باج افزار ها و دامنه‌های مخرب شود.در چنین شرایطی، استفاده از نرم‌افزارهای DNS server که دارای قابلیت مسدود سازی کلی دامنه‌های تبلیغات و مخرب را دارند، می‌تواند بسیار مفید و کمک کننده واقع شود.  زیرا با مسدود کردن دائمی این دامنه‌های آزار دهنده، از اتصال نرم‌افزارها به طور کلی به سایت‌های نامفید جلوگیری می‌کنید!با توجه به اینکه بسیار از کاربران و توسعه‌دهندگان تاکنون آشنایی با این سازوکار پیدا نکرده اند، قصد دارم که کمی به‌صورت تکنیکال به نحوه کارکرد این راهکار اشاره کنم.در صورتی که به نحوه کارکرد چندان علاقه‌ای ندارید، می‌توانید قسمت بعدی را دنبال نمایید که به نحوه راه‌اندازی و استفاده از این نرم‌افزار ها می‌پردازد. (در آینده منتشر خواهد شد).نرم‌افزار معروف Pi-hole که بر روی سیستم‌عامل های لینوکس و مک نصب می‌گرددتصویری که در بالا مشاهده می‌کنید، لوگوی نرم‌افزار بسیار معروفی به نام Pi-hole می‌باشد (که شبیه به کلمه Blackhole یا سیاهچاله می‌باشد.) چراکه Pi-hole مانند یک سیاهچاله، تمامی دامنه‌های مخرب را به تله می‌اندازد!این نرم‌افزار ابتدا جهت اجرا بر روی مینی کامپیوتر (یا رایانه‌های کوچک) به نام رزبری پای ایجاد شد، رایانه‌ای کوچک، اما قدرتمند که در دستان شما جا می‌شود و می‌تواند طیف گسترده‌ای از نرم‌افزار ها را اجرا کند.  هرچند شما می‌توانید این نرم‌افزار را روی هر کامپیوتر لینوکسی، توسط راهنمای این صفحه اجرا کنید.(? راستی، خود رزبری پای، تاپیک بسیار جالبی است که در اینجا به آن پرداخته شده، و می‌تواند برای شما کاربردی واقع شود! تاریخچه رزبری پای هم اینجا هست.)اما برای دوستانی که از ویندوز استفاده می‌کنند، یا تمایل به استفاده از سرور های آماده دارند هم نرم‌افزار هایی مانند Simple DNSCrypt وجود دارد که با یک محیط گرافیکی ساده، امکان بستن این دامین ها را فراهم می‌کنند.من شخصاً نرم‌افزار DNSCrypt-proxy را مستقیماً بر روی سرور شخصی‌ام نصب کرده‌ام، و از آن در خانه و محیط کار استفاده می‌کنم. این نرم‌افزار قابلیت‌های فوق‌العاده جالبی نیز به‌غیر از مسدود سازی دامنه‌ها دارد که در قسمت بعدی نوشته، به آن خواهم پرداخت.می‌توانید از هرکدام برنامه‌های DNS server برای راه‌اندازی این سیستم استفاده کنید، یا حتی از ارائه دهندگان DNS ای که لیست مسدودی را اعمال کرده‌اند استفاده نمایید.برای دوستانی که علاقه‌مند هستند که مسدود کردن از روش دامنه دقیقاً به چه‌صورت عمل می‌کنه، توضیحات فنی در ارتباط با نحوه سازوکار این روش رو شرح میدم.در مثال های زیر، از دامنه doubleclick.net استفاده کردم که یک دامنه تبلیغات واقعی و آزار دهنده هست.? نکته: دامنه نامبرده، یکی از دامنه‌های تبلیغاتی Google است که به طور گسترده در صفحات وب، اپلیکیشن‌ها و تقریباً هر جایی که فکرش را بکنید حضور دارد، گاهی اوقات به‌صورت نامحسوس و مخفیانه در پس‌زمینه برنامه‌ها!  در نتیجه، مسدود کردن این دامنه (و تمامی ساب‌دامنه‌های تحت آن) از طری این روش بسیار مفید است.تفاوت Domain Blocking با URL Blocking چیست: به طور کلی، درخواست‌های HTTP هنگام ارسال نیاز به به‌دست آوردن آدرس آی‌پی سرور مورد نظر را دارند؛ به عنوان مثال زمانی که دامنه doubleclick.net را بخواهیم باز نماییم لازم است که ابتدا آدرس آی‌پی 142.250.185.206 توسط DNS Server بازگردانی شود.زمانی که این درخواست HTTP توسط مرورگر ایجاد شده باشد (به‌عنوان مثال توسط URL زیر)، امکان این وجود دارد که توسط افزونه uBlockOrigin، نسبت به جلوگیری از ارتباط با دامنه و یا آدرس URL فراخوانی شده اقدام کنیم:Example: http://doubleclick.net/foo/bar
                ˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜ ˜˜˜˜˜˜˜
                       ↑          ↑    
Domain name ───────────┘          │    
                                  │    
                                  │    
Path ─────────────────────────────┘   در صورتی که این درخواست از جایی به‌جز مرورگر ایجاد شده باشد (به‌عنوان مثال، اپلیکیشن موبایل، کنسول بازی، تلویزین هوشمند و...)، معمولاً امکان نصب افزونه uBlockOrigin و مشابه آن وجود ندارد -- در نتیجه، امکان مسدود نمودن دامنه‌های تبلیغاتی به این شکل نیز سلب می‌گردد.در چنین شرایطی، می‌توان از DNS سروری به غیر از سرور ارائه شده توسط ISP و یا 8.8.8.8 و 4.2.2.4 رایج استفاده کرد.نرم‌افزار هایی مانند AdGuard Home، Pi-hole و DNScrypt-proxy ابن قابلیت را دارند که به‌صورت local، از ارائه آی‌پی به درخواست دامنه‌های تبلیغاتی جلوگیری نمایند، و به این‌صورت دامنه‌های Adware، Tracking، Malware و غیره، پیش از این‌که به افزونه‌های مرورگر برسند اگر به‌صورت عامیانه بیان کنم، از بیخ بلاک شوند.? نکته: این مکانیزم مسدود سازی معمولاً هم جامع‌تر هست، و هم مؤثر تر. من شخصاً هر دو متد (افزونه و مسدود کردن دامنه) را با هم استفاده می‌کنم، که یک مزیت آن این است که در دستگاه‌هایی که فاقد قابلیت استفاده از uBlockOrigin هستند نیز می‌توان به‌راحتی از دسترسی به این نوع دامنه‌ها جلوگیری کرد.? نکته: کمپانی هایی نظیر Cloudflare، به‌غیر از ارائه سرور های DNS اصلی (مانند 1.1.1.1)، آدرس‌های فرعی‌ای نیز ارائه می‌دهند که ویژگی‌شان این است که برخی از انواع دامنه‌های مخرب را مسدود می‌کنند (اما نه همه را).به‌عنوان مثال، این DNS دامنه‌های Malware و یا Adult را بلاک می‌کند -- اما متأسفانه دامنه های Advertising و Tracking را مسدود نمی‌کند.https://1.1.1.1/family/به‌طور کلی، اگر می‌دانیم که دامنه‌ای مانند doubleclick.net تبلیغاتی است و کاربردی به غیر از این هم نداره، بهتر هست که دامنه به طور کلی مسدود بشه، حتی با اینکه افزونه‌هایی مانند uBlockOrigin همزمان قسمت‌هایی یا کل این دامنه‌رو در مرورگر مسدود کرده باشه.فرمت فایل Block List جهت مسدود کردن دامنه‌ها به چه‌صورتی هست؟معمولاً جهت مسدود کردن دامنه‌ها از این روش کافی است که لیستی از دامنه‌های مورد نظر را به‌صورت متنی و بدون چیز اضافه‌ای به نرم‌افزار ارائه دهید، مثلاً:example.com
badwebsite.com
doubleclick.netاما شاید فرمت دیگری را نیز قبلاً مشاهده کرده باشید که مانند لیست بالا است، با این تفاوت که هر خط پیشوندی مانند 0.0.0.0 یا 127.0.0.1 در ابتدای آن دارد. مثلاً:0.0.0.0 example.com
0.0.0.0 badwebsite.com
0.0.0.0 doubleclick.netدر ارتباط با اینکه کدام یک از این دو فرمت جهت ارائه به نرم‌افزار لازم است، این مورد بستگی به نحوه کار برنامه مورد‌نظر دارد.نرم‌افزار هایی مانند Pi-hole و DNScrypt-proxy نیازی به اشاره 0.0.0.0 در ابتدای entry ندارند (و در حقیقت نبایستی این‌کار انجام گردد، و  تنها ارائه نام دامنه در هر خط -- مانند مثال اول -- کافی است.)علت اینکه پیشوند 0.0.0.0 یا 127.0.0.1 را در ابتدای خطوط بعضی از فرمت‌ها مشاهده می‌کنید، این است که از فایل hosts سیستم‌عامل، برخی اوقات به‌جای نرم‌افزار های مناسب این کار (که در بالا به‌آن اشاره شد) استفاده می کنند.فایل hosts چیست، در کجا قرار گرفته و چه کاربردی دارد؟فایل hosts بر روی سیستم‌عامل، فایل خاصی می‌باشد که از آن پیش از ارتباط به DNS Server جهت دریافت آدرس آی‌پی سایت مورد نظر استفاده می‌شود و از این ترفند می‌توان استفاده نمود تا به‌جای نصب این دسته از نرم‌افزار ها، سیستم‌عامل مستقیماً آدرس آی‌پی مورد نظر را بازگردانی نماید.به زبان ساده‌تر، در صورتی که اسم یک دامنه را در فایل hosts قرار دهیم، سیستم‌عامل دیگر برای بدست آوردن آی‌پی آن دامنه کاری به DNS تنظیم شده ندارد؛ پس با این روش می‌توان تعدادی از دامنه ها را مسدود کرد.? نکته: فایل hosts بر روی تمامی سیستم‌عامل های رایج وجود دارد! ویندوز، لینوکس، مک، اندروید و...فقط مسیر قرار گیری فایل در هر سیستم‌عاملی متفاوت هست و ممکنه دسترسی برای ویرایش کردنش رو نداشته باشید.به عنوان مثال در این مورد:12.34.56.78  example.testبا قرار گیری این خط در فایل hosts سیستم‌عامل باعث می‌گردد که فرامینی نظیر &#x60;ping example.test&#x60; و &#x60;nslookup example.test&#x60;، آدرس آی پی &#x60;12.34.56.78&#x60; را برای این دامنه بازگردانی نمایند.(توجه: شما می‌توانید هم با دستور ping و هم با دستور nslookup جهت بدست آوردن آی‌پی یک سرور اقدام کنید!)اکنون با استفاده از آدرس آی‌پی &#x60;0.0.0.0&#x60; (که یک آدرس غیر معتبر می‌باشد) می‌توان از دسترسی به دامنه‌ها جلوگیری کرد، زیر به‌جای آدرس آی‌پی سرور مورد نظر، این آدرس توسط سیستم‌عامل بازگردانی می‌شود.(در گذشته از آدرس &#x60;127.0.0.1&#x60; که آدرس localhost یا loopback بوده نیز استفاده می‌شده که به‌دلایلی این کار درست نیست و استفاده از آدرس 0.0.0.0 برای این مضمون معمولاً توصیه می‌گردد.)حال برخی از لیست‌ها بر روی GitHub نسخه شامل این پیشوند را (جهت راحتی کاربر) ارائه می‌دهند که بدون نیاز به تغییرات دیگر، می‌توان مستقیماً از آن استفاده نمود تا دامنه‌های مورد نظر بلاک گردد.من به دو دلیل این کار را توصیه نمی‌کنم:1- استفاده از نرم‌افزار هایی مانند Pi-hole و DNScrypt-proxy معمولاً بهتر است از استفاده از فایل hosts2- در صورتی که شخصی نیاز و یا تمایل به استفاده از فایل hosts داشته باشد با برنامه‌هایی نظیر Domains to Hosts converter می‌توان به‌راحتی این پیشوند را قرار داد.ضمناً استفاده از فایل hosts ایراد دیگری دارد و آن این است که تنها دامنه اشاره شده به‌صورت کامل مسدود می‌گردد، و هیچ ساب دامنه‌ای از آن با این روش بلاک نمی‌گردد که قطعاً جهت بلاک نمودن بسیار از دامنه‌هایی که مختص تبلیغات هستند، کار مناسبی نیست.سطح بلاک نمودن توسط دامنهدر ارتباط با این مورد، دو نکته حائز اهمیت می‌باشد:1. نرم‌افزارهای نامبرده (Pihole, DNScrypt-proxy, AdGuard Home) و غیره این توانایی را دارند (و معمولاً به‌صورت پیش‌فرض نیز این‌طور تنظیم شده اند) که دامنه و تمامی ساب دامنه‌های آن را مسدود نمایند.  به‌طور مثال:Domain: doubleclick.net
Blocks: *.doubleclick.netexample 1: foo.doubleclick.net
example 2: foo.bar.doubleclick.netدر نتیجه ارائه لیست برای این دسته از نرم‌افزار ها، لازم به ارائه ساب‌دامنه نمی‌باشد و Top-level domain جهت بلاک نمودن تمامی ساب دامنه‌های مذکور کافی است.همانطور که در بالا ذکر شد، استفاده از فایل hosts سیستم‌عامل فاقد قابلیت مسدود سازی این دسته از ساب‌دامنه‌ها است.2. به‌طور کلی، استفاده از Hosts/Domain Blocking به منزله این است که از بازگردانی آی‌پی سرور مقصد جلوگیری می‌شود. این مسئله به‌صورت باینری عمل می‌کند (یا دامنه بلاک است؛ یا خیر) و در نتیجه، کلیه آدرس URL های میزبانی شده بر روی دامنه مورد نظر یا همگی مسدود خواهند شد، یا قابل دسترس خواهند بود.با توجه به اینکه مسیر URL مورد نظر به‌هیچ‌عنوان به سرور DNS ارسال نمی‌گردند (چون نیازی به این‌کار هم نیست) در نتیجه سرور DNS نمی‌تواند بر بلاک نمودن تنها بخشی از آن دامنه تأثیر گذار باشد.  به عبارت دیگر:doubleclick.net/some/path/tobe/blockedدر این مثال، در زوش بلاک دامنه، نمی‌توان مسیر &#x60;some/path/tobe/blocked/&#x60; را به صورت جداگانه تشخیص داد و آن را مسدود نمود.در نتیجه این روش زمانی مفید واقع می‌شود که قصد بلاک کل دامنه را داشته باشیم، و در نتیجه برای بلاک نمودن یک مسیر استفاده نمی‌شود -- در نتیجه، مواردی که شامل مسیر URL هستند در لیست‌های مسدود سازی دامنه قرار نمی‌گیرند.? یک نکته جالب (Fun fact): ابزار های مرتبط به کرک و کیجن معمولاً لازم دارند که از دسترسی نرم‌افزار کرک شده به دامنه‌ی سایت سازنده جلوگیری نمایند، تا از از کار افتادن برنامه جلوگیری شود.یک راه حل ساده و مؤثر که در این مورد رایج می‌باشد استفاده از همین فایل hosts سیستم‌عامل می‌باشد، زیرا این فایل بر روی همه سیستم‌عامل‌ها موجود است، نیاز به تغییرات خاصی ندارد و اعمال آن نیز بسیار ساده می‌باشد.به‌طوری که چنانچه از سیستم‌عامل ویندوز استفاده می‌نمایید، می‌توانید فایل hosts خود را باز نمایید و به احتمال قوی چندین خط را مشاهده خواهید نمود که مرتبط به همین مسئله activation نرم‌افزارهای پولی می‌باشد.C:\Windows\System32\drivers\etc\hostsدریافت لیست‌های مسدودسازی دامنهبر روی GitHub، لیست‌های بسیار وجود دارند که جهت مسدود سازی دامنه‌ها از این روش ارائه شده اند.علاوه بر لیست‌های موجود، من هم تعدادی لیست منتشر کرده ام که تحت عنوان additional-hosts در لینک زیر می‌توانید مشاهده و استفاده نمایید:https://github.com/DRSDavidSoft/additional-hostsچند نکته در ارتباط با فرمت لیست‌های من:- با توجه به موارد اشاره شده، بنده تصمیم گرفتم که پیشوند &#x60;0.0.0.0&#x60; و &#x60;127.0.0.1&#x60; را در لیست خود نگنجانم.- با توجه به پشتیبانی اکثر نرم‌افزارهای DNS server از قابلیت مسدود سازی ساب دامنه، من می‌توانستم که ساب‌دامین‌ها را به‌طور کلی از لیست خود حذف کنم، اما به دلیل اینکه می‌توان از لیست بنده در فایل hosts نیز استفاده برد (پس از انجام تغییرات ذکر شده) تصمیم‌گرفتم که ساب‌دامنه‌های مهم را علی‌رغم redundent بودن، لحاظ کنم.- یکی از لیست‌های بنده additional-hosts/activation است که مانند کاری که برنامه‌های کرک و کیجن می‌کنند جهت جلوگیری از از کار افتادن کرک برنامه‌های پولی طرح شده، و بخشی از آن نیز بر مبنای فایل‌های hosts رایج جمع آوری شده است.از اینکه تا اینجای نوشته همراه من بودید از شما متشکرم، و در قسمت بعدی نوشته به نحوه راه‌اندازی و استفاده از این سیستم خواهم پرداخت. چنانچه پرسشی دارید خوشحال می‌شوم که پاسخ دهم، و امیدوارم مطالبی که نوشتم برای شما مفید واقع شده باشد!</description>
                <category>DRSDavidSoft</category>
                <author>DRSDavidSoft</author>
                <pubDate>Wed, 08 Jun 2022 05:15:20 +0430</pubDate>
            </item>
            </channel>
</rss>