Tag Archives: برنامه نویسی

زباله روبی Garbage Collection – GC

زباله روبی یا جمع آوری زباله (Garbage Collection) چیست؟

زباله روبی (Garbage Collection یا به اختصار GC) اصطلاحی در حوزه مدیریت و بازیابی خودکار حافظه (مموری) است و به فرایندی اشاره می‌کند که طی آن فضای اشغال شده توسط اشیائی که مورد نیاز برنامه نیستند به صورت خودکار آزاد می‌شود.

وظیفه انجام این کار بر عهده عاملی موسوم به زباله روب یا جمع آوری کننده زباله (Garbage Collector) است. این عامل تلاش می‌کند فضایی از حافظه که حین ایجاد و استفاده از یک شئ به آن اختصاص داده (Allocate) شده است و دیگر برنامه به آن نیازی ندارد را برای استفاده مجدد آزاد کند (از این رخداد با عنوان Deallocate کردن یا نابود کردن (Destroy) شئ نیز یاد می‌شود). اشیاء مذکور اصطلاحا با نام زباله (Garbage) یا اشیاء مرده (Dead Objects) شناخته می‌شوند.

جالب است بدانید Garbage Collection اولین بار توسط جان مک کارتی (John McCarthy) در سال 1959 برای زبان Lisp طراحی شد.

زباله روبی در نقطه مقابل مدیریت دستی حافظه (Manual Memory Management) قرار می‌گیرد که در آن شخص برنامه نویس وظیفه دارد اشیائی که دیگر به آن‌ها نیازی نیست را مشخص و حافظه منتسب به آن‌ها را آزاد کند.

در اغلب زبان های برنامه نویسی سطح بالا از قابلیت Garbage Collection به صورت پیشفرض یا درونی ساز (built-in) پشتیبانی می‌شود. البته برخی از زبان های امروزی علاوه بر زباله روبی خودکار از قابلیت‌هایی برای مدیریت دستی حافظه نیز برخوردار هستند. در مورد تعدادی از زبان های سطح پایین‌تر نظیر C و C++ که در آن‌ها اساسا برنامه نویس مسئول جمع آوری کردن زباله هاست امکان استفاده از پیاده سازی های Garbage Collection وجود دارد.

در بسیاری از زبان های برنامه نویسی متدی موسوم به Destructor (مخرب یا نابودساز) یا Finalizer (نهایی ساز) در کلاس ها قابل تعریف است که هنگام نابودی شئ فراخوانی می‌شود. این تابع برخلاف تابع سازنده نمی‌تواند هیچ پارامتری داشته باشد.

مزایا و معایب زباله روبی

زباله روبی علاوه بر تسهیل برنامه نویسی به جلوگیری از بروز مشکلات و باگ های مربوط به مدیریت دستی حافظه نیز کمک می‌کند. برای مثال فراموش کردن یا نادیده گرفتن آزادسازی فضای متعلق به زباله ها توسط برنامه نویس یکی از مشکلات مدیریت دستی حافظه به شمار می‌رود که می‌تواند به کمبود حافظه بیانجامد. آزادسازی مضاعف (Double free) حافظه‌ای که قبلا آزاد شده است نیز یکی دیگر از باگ هایی است که حین انجام این کار توسط برنامه نویس ممکن است رخ دهد.

در عین حال این نکته را نیز در نظر داشته باشید که جمع آوری زباله می‌تواند معایبی همچون کاهش سرعت اجرای برنامه و مصرف منابع بیشتر را نیز به همراه داشته باشد. همچنین معمولا زمان دقیق Garbage Collection غیرقابل پیش بینی و تقریبا غیر قابل کنترل است.

روش های جمع آوری زباله

موضوعی که در Garbage Collection از اهمیت بالایی برخوردار است شناسایی اشیاء بلااستفاده یا به عبارت بهتر اشیائی است که شایسته زباله روبی هستند.

زباله روبی با کمک ردیابی (Tracing garbage collection)، رایج‌ترین و اصلی‌ترین روش برای شناسایی و جمع آوری زباله ها به شمار می‌رود. در این روش پس از ردیابی اشیاء قابل دسترسی (Reachable) در زنجیره‌ای از ارجاعات، سایر اشیاء به عنوان گزینه‌هایی که می‌بایست حافظه تخصیصی به آن‌ها آزاد شود شناسایی می‌شوند.

در روشی دیگر موسوم به شمارش ارجاعات (Reference Counting garbage collection) تعداد ارجاعات به هر شئ نگه داری می‌شود و در صورتی که برای یک شئ، این عدد برابر با صفر باشد به عنوان زباله تشخیص داده می‌شود و حافظه تخصیصی به آن آزاد خواهد شد.

در تصویر زیر می‌توانید نمایی مفهومی از مراحل انجام یک Garbage Collection فرضی را مشاهده کنید. همان‌طور که در این تصویر می‌بینید زباله روب مورد مثال پس از شناسایی و آزادسازی فضای اشغال شده توسط زباله ها، فضای مربوط به اشیاء قابل دسترس (یا زنده) را در کنار یکدیگر مرتب (اصطلاحا کامپکت Compact) می‌کند تا سرعت اجرای برنامه افزایش یابد.

زباله روبی Garbage Collection
نمایی مفهومی از یک فرایند متداول Garbage Collection

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

مبهم سازی Obfuscation

مبهم سازی یا Obfuscation چیست؟

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

مبهم سازی ممکن است به صورت دستی یا با کمک ابزارهای مخصوصی موسوم به مبهم ساز (Obfuscator) انجام شود. این ابزارها بسته به زبان های مورد پشتیبانی قادر هستند روی فایل کامپایل شده یا سورس کد با روش های مختلف به ایجاد ابهام بپردازند. فراموش نکنید در هر حال با اِعمال مبهم سازی نباید عملکرد برنامه تغییر پیدا کند. علاوه بر این، تکنیک ها و ابزارهایی نیز وجود دارد که تلاش می‌کنند معکوس عمل مبهم سازی (Deobfuscation) را انجام دهند و از روی فایل اجرایی مبهم شده یا سورس کد مبهم شده به سورس اصلی و قابل درک دست پیدا کنند.

مبهم سازی کد Obfuscation
ایجاد ابهام در سورس کد، درک آن را دشوارتر می‌کند.

جالب است بدانید مسابقات برنامه نویسی معتبری (نظیر International Obfuscated C Code Contest) وجود دارد که در آن‌ها به بهترین کدهای مبهم شده و خلاقانه‌ترین روش‌ها جوایزی داده می‌شود.

در نظر داشته باشید حتی اگر سورس برنامه را منتشر نمی‌کنید در بسیاری از موارد (نظیر برنامه های نوشته شده به زبان های دات نت و اپلیکیشن های اندروید) به راحتی می‌توان با کمک دیکامپایلرها به سورس کد برنامه دست پیدا کرد. از همین رو پیش از انتشار یک نرم افزار اختصاصی، توصیه می‌شود از ابزارهای محافظت از کد استفاده کنید.

تکنیک ها و اهداف مبهم سازی

در مبهم سازی معمولا از عباراتی استفاده می‌شود که به افزایش پیچیدگی سورس کد می‌انجامد. نام گذاری متغیرها و توابع به صورت گمراه کننده یا بی‌معنا، استفاده از کامنت های فریب دهنده یا نگارش بخشی از کد به شکلی که به نظر یک کامنت بیاید، کدگذاری رشته ها، حذف فراداده های راهنمایی کننده، حذف یا افزودن فاصله، ایجاد ابهام در Control Flow، اضافه کردن کدهای بی‌ربط و نوشتن کد با فرم و شکلی جالب از جمله روش‌هایی است که برای این منظور به کار می‌رود.

در تصویر زیر مثالی از انجام یک مبهم سازی ساده به صورت خودکار را مشاهده می‌کنید که در آن صرفا با تغییر نام تابع و برخی از متغیرها همراه با رمزنگاری رشته، درک عملکرد کد دشوارتر شده است.

مبهم سازی Obfuscation
نمونه‌ای از یک قطعه کد ساده قبل و پس از انجام مبهم سازی توسط نرم افزار Dotfuscator

افزون بر جنبه های سرگرمی، چالش های ذهنی، محافظت در برابر مهندسی معکوس (تبدیل فایل کامپایل شده به سورس کد) و جلوگیری از ایجاد تغییرات در سورس کد به منظور استفاده در پروژه‌های نرم افزاری دیگر، مبهم سازی سورس کد در حوزه امنیت نیز مزایایی به همراه دارد. پنهان سازی بخش‌های مهم امنیتی و دشوارسازی کشف آسیب پذیری ها یا راه‌های نفوذ از جمله این مزایا به شمار می‌روند.

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

در سایر حوزه ها

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

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

الحاق Concatenation

الحاق یا Concatenation چیست؟

الحاق (Concatenation) یا الحاق رشته ای (String Concatenation) در زبان های برنامه نویسی به عملی گفته می‌شود که طی آن رشته هایی از کاراکترها به یکدیگر متصل می‌شوند.

حاصل این عمل که معمولا به عنوان عملی دوتایی تعریف می‌شود رشته ای است که از قرار دادن محتوای عملوند دوم پس از محتوای عملوند اول به دست می‌آید. به عنوان مثال حاصل عمل الحاق روی دو رشته “سلام ” و “دنیا!” رشته‌ای تازه به صورت “سلام دنیا!” خواهد بود. به وجود کاراکتر فاصله در انتهای رشته اول توجه کنید؛ در صورتی که این کاراکتر را حذف کنید نتیجه به صورت “سلامدنیا!” درمی‌آید.

الحاق Concatenation
عمل الحاق در زبان های برنامه نویسی برای ایجاد رشته ای از ترکیب دو رشته دیگر به کار می‌رود.

الحاق در زبان های برنامه نویسی

عملگر الحاق در زبان های برنامه نویسی معمولا یک عملگر دوتایی یا باینری به شمار می‌رود. در بسیاری از زبان ها نظیر جاوا (Java) و جاوا اسکریپت (JavaScript) و سی شارپ (C#) و سی پلاس پلاس (C++) از نماد + برای این عملگر استفاده می‌شود. از جمله نمادهای رایج دیگری که به عنوان عملگر Concatenation در زبان های برنامه نویسی مورد استفاده قرار می‌گیرد می‌توان به نماد نقطه (یا .) در زبان های پی اچ پی (PHP) و پرل (Perl) یا نماد & در زبان ویژوال بیسیک (Visual Basic) اشاره کرد.

در قطعه کد زیر که به زبان جاوا نوشته شده است می‌توانید نحوه الحاق دو رشته معمولی برای نمایش در خروجی را مشاهده کنید.

System.out.println("Today is " + "Saturday");

همان‌طور که در مثال بالا مشخص است می‌توان از همان ابتدا این دو رشته را در قالب رشته “Today is Saturday” و بدون استفاده از عملگر الحاق نوشت. اما در مواردی که حداقل یکی از عملوندها دارای مقداری متغیر است استفاده از این عملگر به کمک برنامه نویس خواهد آمد. به عنوان نمونه اگر getWeekDay() تابعی باشد که متناسب با تاریخ فعلی، روز هفته را به شکل یک رشته برمی‌گرداند قطعه کد زیر برای آن مناسب خواهد بود:

System.out.println("Today is " + getWeekDay());

به عنوان مثالی دیگر فرض کنید در حال توسعه بخشی از یک وب اپلیکیشن هستید و قرار است در بخشی از صفحه با کمک یک اعلان، کاربر را از داشتن یا نداشتن پیام جدید با خبر سازید. در چنین حالتی ممکن است از عمل الحاق برای ایجاد متن اعلان کمک گرفته شود. عملوند اول را می‌توانید در قالب رشته ای ثابت با عبارت “پیام جدیدی ” درنظر بگیرید اما عملوند دوم متغیری از نوع رشته خواهد بود و متناسب با اینکه در صندوق ورودی کاربر، پیام جدیدی وجود دارد یا خیر به ترتیب با مقدار “دارید.” یا “ندارید!” ست می‌شود. پس از الحاق این دو عملوند، متن اعلان به صورت “پیام جدیدی دارید.” یا “پیام جدیدی ندارید!” ساخته می‌شود.

علاوه بر این در برخی از زبان ها به جای استفاده از عملگر می‌توان از متدهای ویژه‌ای برای اتصال رشته ها به یکدیگر کمک گرفت. برای مثال در زبان جاوا متد concat() از کلاس String برای همین منظور در نظر گرفته شده است.

مفاهیم مرتبط

عمل الحاق به برخی از حوزه های دیگر نیز به شکلی مشابه تعمیم داده می‌شود. به عنوان مثال در نظریه زبان فرمال، عمل الحاق زبان ها (یا مجموعه هایی از رشته ها) به این ترتیب تعریف می‌شود که اگر A و B دو زبان فرمال باشند آنگاه عمل الحاق آن ها شامل تمام رشته هایی به صورت vw خواهد بود که v رشته ای از A و w رشته ای از B باشد. با فرض اینکه A={ab,ac,c} و B={e,ef} باشد حاصل عمل فوق روی این دو زبان به صورت AB={abe,ace,ce,abef,acef,cef} خواهد بود.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

کامنت Comment

کامنت یا Comment چیست؟

کامنت (Comment) در حوزه برنامه نویسی به توضیحاتی اطلاق می‌شود که برای بخش‌های مختلف سورس کد نوشته می‌شود و در کاربردهای غیرفنی به نظرات و بازخوردهایی گفته می‌شود که کاربران در واکنش به یک مطلب یا پست درج می‌کنند.

مفهوم کامنت در کاربردهای عادی

همانطور که گفته شد به نظرات و بازخوردهایی که کاربران در یک شبکه اجتماعی یا سایت در واکنش به محتوای یک مطلب یا پست درج می‌کنند و یا در مورد تجربه خود از خرید یک محصول در صفحات فروشگاه‌های اینترنتی بیان می‌کنند Comment گفته می‌شود. حتی در برخی از واژه پردازها (نظیر Microsoft Word) کاربران می‌توانند روی بخشی از متن یک سند برای همکاران یا نویسنده اصلی سند، نظر و پیشنهاد خود را در قالب کامنت ثبت کنند.

در مورد رسانه‌های آنلاین برای جلوگیری از انتشار خودکار مطالب نامناسب یا اسپم های کامنتی (Comment Spam)، معمولا نظرات کاربران پس از تأیید یک اپراتور یا صاحب رسانه منتشر می‌شود. با اینحال در رسانه‌های با فضای نظردهی گسترده امکان انتشار خودکار نظرات در کنار قابلیت‌هایی نظیر فیلتر کردن و شناسایی اسپم ها وجود دارد.

کامنت اینستاگرام Instagram Comment
دو Comment در یک پست اینستاگرامی

مفهوم کامنت در برنامه نویسی

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

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

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

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

لازم است بدانید در فرایند کمینه سازی (Minification)، کامنت ها از جمله اجزائی هستند که برای کاهش حجم نهایی فایل از سورس کد حذف می‌شوند.

انواع کامنت ها

در اغلب زبان‌ها از دو نوع کامنت خطی و چندخطی در سورس کدها پشتیبانی می‌شود که معمولا از علائم مختلفی برای تعیین محدوده هرکدام از آن‌ها استفاده می‌شود.

کامنت خطی (Line Comment) با یک تعیین کننده آغاز می‌شود و تا پایان خط ادامه می‌یابد. در بسیاری از زبان های برنامه نویسی، Comment های تک خطی می‌توانند برای افزودن توضیحات در ادامه همان خطی نوشته شوند که دستور قرار دارد و به آن‌ها کامنت اینلاین یا در خط (Inline Comment) نیز گفته می‌شود. به عبارت بهتر در چنین زبان‌هایی هر چیزی که در یک خط پس از این تعیین کننده‌ها مشاهده می‌شود Comment محسوب می‌شود.

از سوی دیگر، کامنت های چند خطی (Multi-line Comment) که به کامنت های بلاکی (Block Comments) نیز مشهور هستند ناحیه‌ای از سورس کد – متشکل از تعدادی خط – را معین می‌کنند و معمولا برای بیان هدف و عملکرد کلی یک متد، کلاس یا هر قطعه کد نسبتا پیچیده (که نیازمند توضیحی طولانی در تعدادی خط است) به کار می‌روند. محدوده این ناحیه توسط یک نماد آغازین و یک نماد انتهایی معین می‌شود و هر چیزی که مابین آن‌ها قرار بگیرد یک Comment به شمار می‌رود.

نوع دیگری از کامنت ها موسوم به کامنت های مستندات (Documentation Comments) نیز وجود دارد که در سورس کد برخی از زبان های برنامه نویسی (از جمله زبان جاوا و سی شارپ) پشتیبانی می‌شود. از این نوع Comment ها برای ایجاد خودکار مستندات توسط ابزارهایی موسوم به تولید کننده مستندات (Documentation Generator) استفاده می‌شود (Javadoc از جمله این ابزارهاست که برای کدهای به زبان جاوا مورد استفاده قرار می‌گیرد). در این کامنت ها معمولا از تگ های مختلفی برای تعیین نویسنده، نسخه و … پشتیبانی می‌شود که از این تگ ها به هنگام تولید مستندات استفاده می‌شود.

کامنت ها در زبان های برنامه نویسی مختلف

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

کامنت Comment
نمونه‌ای از Comment های خطی و چندخطی در زبان برنامه نویسی جاوا که به انگلیسی نوشته شده است.

در جدول زیر می‌توانید لیستی از علائم مورد استفاده به عنوان تعیین کننده‌های Comment خطی و چندخطی را در برخی از زبان های برنامه نویسی و نشانه گذاری مشاهده کنید:

زبانتعیین کننده کامنت خطیتعیین کننده کامنت چندخطی
تعیین کننده ابتداتعیین کننده انتها
 Java, JavaScript, C++, C#, PHP///**/
Cاز همان ساختار چندخطی استفاده می‌کند/**/
HTML, XMLاز همان ساختار چندخطی استفاده می‌کند<!––>
Visual Basicاین زبان فاقد ساختار مجزا برای نوع چند خطی است
Ruby#=begin=end

کاربردها و محتوای کامنت ها

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

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

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

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

در بسیاری از محیط های یکپارچه توسعه، برنامه نویسان می‌توانند به سرعت با کمک آیتم‌های موجود در منو، نوار ابزار یا کلیدهای میانبر بخشی از کد انتخاب شده را به صورت Comment درآورند یا آن را از حالت Comment خارج کنند (Uncomment).

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

کمینه سازی Minification

کمینه سازی یا Minification چیست؟

کمینه سازی سورس کد یا به اختصار کمینه سازی (Minification) اصطلاحی در حوزه برنامه نویسی است و به فرایندی گفته می‌شود که طی آن تمامی اجزا و کاراکترهای غیرضروری از سورس کد حذف می‌شود. کمینه سازی علاوه بر اینکه در نتیجه اجرای سورس کد اختلال یا تغییری به وجود نمی‌آورد، حجم فایل مربوطه را نیز کاهش می‌دهد. گاهی اوقات از واژه Minimization نیز به عنوان معادلی برای این اصطلاح استفاده می‌شود.

کاراکترهای غیر ضروری (شامل کاراکتر فاصله و خط جدید) و همچنین المان هایی نظیر کامنت ها (که برای توصیف عملکرد قسمت‌های مختلف کد استفاده می‌شوند) در حین انجام فرایند Minification از سورس کد حذف می‌شوند. از آنجایی که این اجزا و کاراکترها غالبا برای خواناتر کردن سورس کد به کار می‌روند حذف آن‌ ها تاثیری روی نتیجه اجرای کد نخواهد داشت.

فرایند کمینه سازی به خصوص در مورد سورس کدهای مرتبط با صفحات وب نظیر فایل های جاوا اسکریپت (JavaScript) به عنوان یک زبان برنامه نویسی تفسیری، شیوه نامه های آبشاری (CSS) و فایل های اچ تی ام ال (HTML) به کار می‌رود. کاهش حجم این منابع باعث می‌شود فایل ها با سرعت بیشتری به دست کلاینت ها (برای مثال مرورگرهای وب) برسد و درنتیجه منجر به کاهش زمان لازم برای لود شدن صفحات وب خواهد شد.

ممکن است کمینه سازی کد تنها چند درصد از حجم یک فایل را کاهش دهد اما همین میزان اندک – به خصوص زمانی که مساله افزایش سرعت بارگیری صفحات وب در میان است – از اهمیت بالایی برخوردار خواهد بود. این افزایش سرعت نه تنها برای کلاینت ها مفید است بلکه میزان مصرف پهنای باند و ازدحام روی سرور را نیز کاهش خواهد داد.

فارغ از روش‌های ساده‌ای نظیر حذف کامنت ها و فاصله ها از سورس کد، ممکن است تکنیک‌های پیشرفته‌تری نیز برای کمینه سازی مورد استفاده قرار گیرد. جایگزینی نام‌های طولانی متغیرها و توابع با نام‌هایی با تعداد کاراکتر کمتر (و حتی تک کاراکتری) در سورس کدهای بسیاری از زبان‌ها (به خصوص JavaScript) و جایگزینی ویژگی‌های مرتبط با یک ویژگی خلاصه شده (Shorthand Property) و حذف قانون‌ها یا ویژگی‌های تکراری در CSS از جمله این موارد هستند.

معکوس این فرایند که به Unminification موسوم است قادر است سورس مینیفای شده را به یک نسخه معمولی و خواناتر تبدیل کند.

ابزارهای Minification

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

برای برخی از زبان ها ابزارهای نرم افزاری متعددی در دسترس توسعه دهندگان قرار گرفته است که با روش‌های ساده تا پیشرفته به مینیفای کردن سورس کد می‌پردازند. از جمله مشهورترین این ابزارها می‌توان به HTMLMinifier برای اچ تی ام ال، CSSO برای سی اس اس و Google Closure Compiler و UglifyJS برای جاوا اسکریپت اشاره کرد.

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

کمینه سازی و فشرده سازی

با وجود اینکه کمینه سازی و فشرده سازی (Compression) داده ها هر دو می‌توانند باعث کاهش حجم فایل سورس کد شوند اما نباید آن‌ها را یکسان دانست. در واقع سورس کد کمینه شده می‌تواند بدون نیاز به انجام مرحله‌ای اضافه بلافاصله تفسیر و اجرا شود؛ این در حالیست که سورس کد فشرده شده پیش از اجرا شدن لازم است از حالت فشرده خارج شود. در عین حال مفسر می‌تواند با نسخه اصلی یا نسخه کمینه سازی شده کار کند بدون اینکه تغییری در مفسر ایجاد شود.

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

مثال هایی از کمینه سازی

در مثال زیر می‌توانید نمونه‌ای از یک قانون CSS را قبل و پس از انجام Minification مشاهده کنید. همانطور که می‌بینید در این قانون علاوه بر اینکه کامنت، سمی کلن اختیاری انتهایی، کاراکترهای اضافی فاصله و خط جدید حذف شده‌اند، ویژگی خلاصه شده border نیز جایگزین سه ویژگی مجزای border-width و border-style و border-color شده است.

کمینه سازی Minification
نمونه‌ای از انجام Minification روی یک قانون CSS

در مثال زیر نیز یک قطعه کد جاوا اسکریپت و نسخه حاصل از اعمال فرایند Minification توسط Google Closure Compiler را مشاهده می‌کنید:

کمینه سازی Minification
نمونه‌ای از انجام Minification روی یک قطعه کد جاوا اسکریپت

مزایا و معایب Minification

همانطور که پیشتر به آن اشاره شد Minification قادر است با کاهش حجم سورس کد به ویژه در مورد منابع وب به لود شدن سریعتر صفحات وب و کاهش پهنای باند مورد نیاز برای انتقال داده ها منجر شود.

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

برخی از متخصصین معتقدند کمینه سازی را می‌توان روشی برای مبهم سازی (Obfuscation) سورس کد به شمار آورد؛ با این وجود مشابه با ابزارهایی که برای انجام خودکار Minification به کار می‌روند، ابزارهای ویژه‌ای نیز برای Unminification طراحی و منتشر شده است.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

لیبل Label

لیبل یا Label چیست؟

واژه لیبل (Label) به طور کلی به معنای برچسبی است که برای کمک به توصیف یا شناسایی یک شئ یا محتوای آن به کار می‌رود. با اینحال این واژه در حوزه‌های مختلف رایانه از زبان های برنامه نویسی گرفته تا واسط های کاربری گرافیکی، دستورات خط فرمان و … مفاهیم و کاربردهای ویژه‌ای دارد.

کاربردها و مفاهیم تخصصی Label

در حوزه زبان های برنامه نویسی، لیبل به دنباله‌ای از کاراکترها گفته می‌شود که مکانی را در سورس کد مشخص می‌کند. مشخصه (Identifier) این لیبل‌ها معمولا به یک نماد کلن یا : ختم می‌شود. در اغلب زبان‌ها از این قابلیت برای مشخص نمودن مقصد دستور GOTO استفاده می‌شود. به همین دلیل مشخصه‌ای که برای تعریف یک لیبل استفاده می‌شود می‌بایست در کل بلاک مربوط به تابع دربرگیرنده آن منحصربفرد باشد.

در قطعه کد زیر که به زبان C++ نوشته شده است نحوه ایجاد لیبل و استفاده از آن در دستور GOTO نمایش داده شده است:

...
label:
...
goto label;
...

label در برخی از سیستم عامل ها (از جمله DOS و Microsoft Windows)، به عنوان یک دستور خط فرمان شناخته می‌شود که از آن برای ایجاد یا تغییر برچسب یک پارتیشن استفاده می‌شود. در مثال زیر نحوه استفاده از این دستور برای تغییر برچسب پارتیشن D به Software نمایش داده شده است:

label D: Software

در زبان HTML نیز تگی به نام <label> وجود دارد که از آن برای تعریف و اختصاص دادن یک برچسب به برخی از المان‌های دیگر نظیر <input> و <textarea> استفاده می‌شود. در مثال زیر، نحوه استفاده از این تگ نمایش داده شده است:

لیبل label
نمونه استفاده از تگ label در یک قطعه کد HTML

نتیجه اجرای قطعه کد فوق را می‌توانید در ادامه مشاهده کنید:


 

به علاوه Label در حوزه واسط های کاربری گرافیکی نیز عنوان نوعی المان یا کنترل (Control) است که معمولا برای نمایش برچسب یک کنترل دیگر (نظیر text box) به کار می‌رود. در تصویر زیر دو کنترل Label با متن‌های Name و Mail را مشاهده می‌کنید. این برچسب ها همانند آنچه در مثال مربوط به المان‌های HTML گفته شد به کاربر کمک می‌کنند تا متوجه شود المان متناظر با هر برچسب برای چه کاربردی در نظر گرفته شده است.

کنترل لیبل Label Control
نمونه‌ای از دو کنترل Label که برچسب‌هایی به دو کنترل Text box اختصاص داده‌اند. کاربر با توجه به این برچسب ها متوجه می‌شود در فیلد متنی اول می‌بایست نام و در فیلد دوم نشانی ایمیل خود را وارد نماید.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

حلقه بی نهایت Infinite Loop

حلقه بی نهایت یا Infinite Loop چیست؟

حلقه بی نهایت (Infinite Loop) یا حلقه بی پایان (Endless Loop) به گونه‌ای از حلقه ها گفته می‌شود که در آن مجموعه‌ای از دستورات به صورت نامتناهی تکرار می‌شوند. به عبارت بهتر دستوراتی که در بدنه این نوع حلقه قرار می‌گیرد تا زمانی که برنامه در حال اجراست تکرار می‌شود.

نحوه شکل گیری حلقه های بی نهایت

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

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

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

به عنوان نمونه هایی از حلقه های بدون پایان از نوع While می‌توان به دو قطعه کد ساده زیر که به زبان برنامه نویسی جاوا نوشته شده‌اند اشاره کرد. نتیجه ارزیابی شرط در این حلقه ها همواره صحیح (true) باقی می‌ماند و دستورات بدنه تا زمانی که اجرای برنامه متوقف نشود تکرار می‌شوند. در مثال سمت چپ، متغیر y همواره برابر با عدد 1 باقی می‌ماند و در نتیجه شرط y < 20 همواره صحیح خواهد بود. در مثال سمت راست (که یکی از رایج‌ترین روش‌های ایجاد حلقه بی پایان می‌باشد) حاصل ارزیابی متغیر b همواره صحیح (true) بوده و تنها دستور بدنه حلقه به طور مداوم تکرار می‌شود.

حلقه بی نهایت Infinite Loop
دو نمونه حلقه بی نهایت از نوع While. در این دو مثال متغیر y و b هیچگاه تغییری نمی‌کنند و شرط همواره برقرار می‌ماند.

پیوندهای پیشنهادی تک دیک

صفحه واژه در ویکیپدیا

حلقه While

حلقه While چیست؟

حلقه While (یا While Loop) در اغلب زبان های برنامه نویسی امروزی به عنوان یکی از پرکاربردترین حلقه های مبتنی بر شرط شناخته می‌شود و برای اجرای دنباله‌ای از دستورات به صورت تکراری تا زمانی که یک شرط مشخص صحیح باشد به کار می‌رود.

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

در تصویر زیر، یا کمک یک مثال ساده نحوه استفاده از حلقه While در زبان برنامه نویسی جاوا نمایش داده شده است. در این مثال، شرط x <= 5 به عنوان شرط لوپ به کار رفته است و بدنه آن شامل دو دستور است. در آغاز حلقه از آنجایی که مقدار متغیر x برابر با 1 است شرط حلقه صحیح بوده و دستورات بدنه برای اولین بار اجرا می‌شود. به این ترتیب مقدار کنونی متغیر x (یعنی 1) در خروجی نوشته می‌شود و یک واحد به آن افزوده می‌شود (x = 2). مجددا شرط Loop بررسی می‌شود و از آنجایی که همچنان x <= 5 برقرار است برای بار دوم دستورات آن اجرا می‌شوند. به همین ترتیب در انتهای تکرار پنجم، مقدار متغیر x برابر 6 می‌شود و با توجه به اینکه شرط به هنگام بررسی، نادرست خواهد بود درنتیجه تکرار ششم اجرا نخواهد شد و خروجی این قطعه برنامه اعداد 1 تا 5 خواهد بود.

حلقه While
نمونه‌ای از حلقه While به زبان جاوا

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

در نتیجه به طور معمول از While Loop ها در مواقعی استفاده می‌شود که قرار است دستوراتی تا رسیدن به یک هدف مشخص (رسیدن به حالتی که شرط برقرار نباشد) تکرار شوند و در مواردی که می‌خواهیم دستورات به تعداد مشخص اجرا شوند غالبا از حلقه‌های For استفاده می‌شود.

توجه داشته باشید همانند دو نمونه‌ای که در تصویر زیر مشاهده می‌کنید می‌توان شرط (یا دستورات بدنه) را به شکلی تعیین نمود که برای همیشه، شرط حلقه برقرار باقی بماند که در این حالت، یک حلقه بی نهایت (Infinite Loop) تشکیل می‌شود.

حلقه While بی پایان Infinite While Loop
دو نمونه While Loop بی پایان. در این دو مثال متغیر y و b هیچگاه تغییری نمی‌کنند و شرط همواره برقرار می‌ماند.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

حلقه Loop

حلقه یا Loop چیست؟

حلقه (Loop) در زبان های برنامه نویسی برای اجرای دنباله‌ای از دستورات به صورت تکراری مورد استفاده قرار می‌گیرد. بدنه حلقه (Loop Body) شامل دستوراتی است که قرار است تکرار شوند؛ این دستورات تنها یک بار نوشته می‌شوند اما ممکن است چندین بار به صورت پشت سرهم اجرا شوند. بخش دیگری از Loop که به آن هدر (header) نیز گفته می‌شود نوع Loop و ویژگی‌های آن را مشخص می‌کند.

انواع رایج حلقه ها

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

1- For Loop

حلقه‌های For از جمله رایج‌ترین حلقه‌هایی هستند که معمولا تعداد اجرای دستورات در آن‌ها به صورت مستقیم مشخص می‌شود. البته توجه داشته باشید این مفهوم بدان معنا نیست که تعداد دفعات اجرای دستورات می‌بایست به صورت ثابت هنگام برنامه نویسی مشخص شود بلکه به عنوان مثال تعداد تکرارها می‌تواند وابسته به مقدار یک متغیر باشد که هنگام اجرا از کاربر گرفته شده است و یا حاصل ارزیابی یک عبارت حسابی باشد.

در تصویر زیر می‌توانید دو نمونه For Loop را به زبان های جاوا (سمت چپ) و ویژوال بیسیک (سمت راست) مشاهده کنید. دستورات موجود در هر دو مثال 5 بار تکرار می‌شوند. متغیرهای index در این حلقه‌ها را متغیرهای شمارنده حلقه (Loop Counter) می‌نامند. در تکرار اول مقدار این متغیرها برابر با 1 می‌باشد (مقدار آغازین) و در هر تکرار یک واحد به آن‌ها افزوده می‌شود (گام شمارش در هر دو مثال برابر 1 است که در تصویر سمت چپ با i++ و در تصویر سمت راست به دلیل آنکه گام شمارش در زبان ویژوال بیسیک به صورت پیشفرض برابر با 1 است حذف شده است). در هر تکرار، مقدار کنونی متغیر شمارنده در خروجی نوشته می‌شود. زمانی که مقدار این متغیرها به 5 می‌رسد دستورات بدنه Loop برای آخرین بار اجرا می‌شوند. همانطور که مشاهده می‌کنید پایان لوپ در مثال سمت چپ با کمک شرط index <= 5 و در مثال سمت راست براساس مقداری که پس از کلمه To آمده است مشخص شده است. خروجی نهایی این دو مثال، اعداد 1 تا 5 خواهند بود.

حلقه For
نمونه‌هایی از حلقه‌های For به زبان‌های جاوا (سمت چپ) و ویژوال بیسیک (سمت راست)

2- While Loop

در حلقه‌هایی که توسط یک شرط کنترل می‌شوند معمولا دستورات تا زمانی که شرط صحیح باشد اجرا می‌شوند. بسته به نوع این حلقه‌ها، ممکن است شرط در ابتدا یا در انتهای حلقه بررسی شود؛ چنانکه شرط صحیح باشد برای بار دیگر دستورات حلقه تکرار می‌شوند. توجه داشته باشید در صورتی که این تست در انتهای ساختار Loop انجام شود حتی اگر شرط از همان ابتدا صحیح نباشد دستورات حداقل یک بار اجرا می‌شوند اما اگر شرط در همان ابتدای حلقه مورد بررسی قرار گیرد ممکن است دستورات بدنه هیچگاه اجرا نشوند.

حلقه‌های While (در اغلب زبان ها) و Do While و Do Until نمونه‌هایی از این نوع لوپ‌ها به شمار می‌روند با این تفاوت که در حلقه‌های While، شرط را تنها می‌توان در ابتدای حلقه بررسی نمود اما در حلقه‌های Do While و Do Until می‌توان شرط را در ابتدا یا انتهای حلقه بررسی کرد. به علاوه در حلقه‌های While و Do While تنها در صورتی که شرط صحیح باشد دستورات اجرا می‌شوند اما Do Until تا زمانی دستورات بدنه خود را اجرا می‌کند که شرط نادرست باشد و به محض صحیح بودن نتیجه تست شرط، حلقه متوقف می‌شود.

در تصویر زیر، از یک حلقه While برای ایجاد همان خروجی که در مثال قبل با استفاده از حلقه For به دست آمد استفاده شده است. در این نمونه شرط x <= 5 به عنوان شرط لوپ به کار رفته است و در بدنه هر تکرار یک واحد به متغیر x افزوده می‌شود (این درحالیست که در ساختار For این متغیر در هدر حلقه تغییر می‌کرد نه در بدنه آن).

حلقه While
نمونه‌ای از حلقه While به زبان جاوا

3- For each Loop

در بسیاری از زبان‌های برنامه نویسی افزون بر این حلقه‌ها از ساختارهای تکرارشونده ویژه‌ای برای مجموعه (Collection) ها پشتیبانی می‌شود. در این نوع حلقه‌ها که معمولا به حلقه‌های For each موسوم هستند دستورات برای هر عنصر از مجموعه مورد نظر تکرار می‌شود. در تصویر زیر نمونه حلقه For each را به زبان جاوا برای ایجاد خروجی مشابه با مثال‌های قبل مشاهده می‌کنید.

حلقه For each
نمونه‌ای از حلقه For each به زبان جاوا

4- Infinite Loop

حلقه های بی نهایت یا بی پایان (Infinite Loop) به حلقه‌هایی گفته می‌شود که دستورات بدنه آن‌ها تا زمان اجرای برنامه تکرار می‌شوند. این نوع از loop ها ممکن است به خاطر استفاده از شرایطی که هیچ پایانی برای تکرارها رقم نمی‌زنند به وجود بیاید (برای مثال یک While Loop که شرط آن true باشد). نمونه‌ای از کاربرد عمدی این نوع حلقه‌ها را می‌توان در مواردی دانست که لازم است برنامه به صورت مدوام وقوع رخدادی را چک کند.

ادامه حلقه و خروج زودهنگام از آن

در برخی موارد ترجیح داده می‌شود مابقی دستورات برای تکرار کنونی Loop نادیده گرفته شود و دنباله دستورات برای تکرار بعدی اجرا شوند. دستوراتی مانند continue (در اغلب زبان‌ها) و next (در زبان Perl) به همین منظور استفاده می‌شوند.

در برخی موارد نیز ممکن است موقعیتی پیش بیاید که لازم شود پیش از آنکه Loop به صورت طبیعی اتمام شود اجرای تکرارهای بعدی نادیده گرفته شود و حلقه به صورت پیش از موعد پایان یابد. به عنوان مثال هنگام جستجو در میان مجموعه‌ای از عناصر به محض اینکه عنصر موردنظر پیدا می‌شود اساسا نیازی به تکمیل فرایند جستجو در میان عناصر باقی‌مانده وجود ندارد. دستوراتی مانند break (در اغلب زبان‌ها)، last (در زبان Perl) و Exit (در زبان ویژوال بیسیک) به این منظور استفاده می‌شوند.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

عملگر بیتی Bitwise Operator

عملگر بیتی یا Bitwise Operator چیست؟

عملگر بیتی (Bitwise Operator) به عملگرهایی گفته می‌شود که عملی را روی یک یا چند عدد باینری در سطح بیت هایشان انجام می‌دهند. این اعمال را عملیات بیتی (Bitwise Operation) می‌نامند و از آنجایی که بسیار ساده هستند توسط پردازنده به صورت مستقیم نیز پشتیبانی می‌شوند. عملیات بیتی معمولا برای انجام اعمالی نظیر مقایسه، محاسبه و … مورد استفاده قرار می‌گیرد.

عملگرهای بیتی متداول

عملگرهای بیتی رایجی که در اغلب زبان های برنامه نویسی (و نه تمامی آن‌ها) پشتیبانی می‌شود شامل عملگرهای NOT (نقیض یا نفی)، AND (و)، OR (یا) و XOR (یای مانعه الجمع، یای انحصاری) بیتی و همچنین تعدادی از شیفت‌های بیتی پرکاربرد می‌باشد.

عملگر NOT بیتی، نوعی عملگر بیتی یکانی (تک عملوندی) است که تمام بیت‌های عملوند خود را تغییر می‌دهد. به عبارت بهتر، این عملگر، عمل نفی منطقی را روی تک تک بیت‌های عملوند انجام می‌دهد (بیت‌هایی که صفر هستند را به یک و بیت‌هایی که یک هستند را به صفر تبدیل می‌کند). یکی از کاربردهای این عملگر، محاسبه مکمل یک (1’s Complement) اعداد باینری می‌باشد.

عملگرهای AND و OR و XOR، عملگرهای باینری (دوتایی یا دو عملوندی) هستند. عملوندهایی که توسط این عملگرها بر روی آن‌ها عملیات بیتی انجام می‌شود می‌بایست دارای طول (تعداد بیت) یکسان باشند چرا که این اعمال روی بیت‌های متناظر عملوندها انجام می‌شود. توجه داشته باشید در فرم متدول نمایش باینری، سمت چپ‌ترین موقعیت بیتی را با ارزش ترین (یا مهم‌ترین) بیت (Most significant bit یا MSB) و سمت راست‌ترین موقعیت بیتی را کم ارزش ترین (یا کم اهمیت ترین) بیت (Least significant bit یا LSB) می‌نامند.

عملگر AND بیتی، عمل AND (و) منطقی را روی هر جفت از بیت‌های متناظر در عملوندهایش انجام می‌دهد. در صورتی که هر دو بیت در موقعیت‌های متناظر از دو عملوند برابر با یک باشند بیت متناظر در حاصل عملگر نیز برابر با یک و در غیراینصورت برابر با صفر خواهد بود.

عملگر OR بیتی عملگری است که عمل OR (یا) منطقی را روی هر جفت از بیت‌های متناظر در عملوندهایش انجام می‌دهد. اگر دو بیت در موقعیت‌های متناظر از دو عملوند برابر با صفر باشند بیت متناظر در حاصل عملگر نیز برابر با صفر و در غیراینصورت برابر با یک خواهد بود.

عملگر XOR بیتی نیز عمل یای مانعه الجمع (یای انحصاری) منطقی را روی هر جفت از بیت‌های متناظر در عملوندهایش انجام می‌دهد. به این معنا که اگر هر دو بیت در موقعیت‌های متناظر از دو عملوند برابر با صفر یا هر دو برابر با یک باشند بیت متناظر در حاصل عملگر برابر با صفر و در غیراینصورت (یکی صفر و دیگری یک باشد) برابر با یک خواهد بود.

عملگر بیتی Bitwise Operator
نمونه‌ای از انجام چهار عملیات بیتی. در این تصویر، حاصل عملگرهای بیتی NOT و AND و OR و XOR را روی عملوندهای مشخص شده مشاهده می‌کنید.

عملگرهای شیفت بیتی، ارقام عملوند خود را براساس نوع شیفت، به سمت چپ یا راست جابجا می‌کنند. از آنجایی که ثبات‌ها در پردازنده دارای طول ثابتی هستند بنابراین در هر عمل شیفت، بیت‌هایی از یک سمت حذف (یا خارج) می‌شوند (Shift out) و بیت‌هایی نیز از سمت دیگر برای تکمیل موقعیت آزاد شده وارد می‌شوند (Shift in). به عنوان مثال در شیفت تک بیتی به سمت راست، سمت چپ‌ترین موقعیت بیتی آزاد می‌شود و لازم است یک بیت دیگر در این مکان قرار داده شود. تفاوت انواع مختلف عملگرهای شیفت بیتی در نحوه تعیین مقدار بیتی است که می‌بایست در موقعیت آزاد شده قرار گیرد.

عملگر بیتی شیفت Bit Shift
مقایسه انواع شیفت بیتی روی عدد باینری 00010111 – شیفت‌ها نوعی عملگر بیتی به شمار می‌روند که ارقام عملوند خود را براساس نوع شیفت، به سمت چپ یا راست جابجا می‌کنند.

در شیفت حسابی (Arithmetic Shift) به سمت چپ، بیت‌های صفر از سمت راست به منظور تکمیل موقعیت آزاد شده وارد می‌شوند. اما در شیفت حسابی به سمت راست مقدار باارزش‌ترین بیت، موقعیت آزاد را از سمت چپ تکمیل می‌کند. با توجه به اینکه در اعداد باینری علامت‌دار، با ارزش‌ترین بیت، تعیین‌کننده علامت عدد می‌باشد بنابراین شیفت حسابی به سمت راست، علامت عدد را تغییر نمی‌دهد.

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

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا