Tag Archives: کدنویسی

مبهم سازی Obfuscation

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

کامنت 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).

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

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

کد Code

کد یا Code چیست؟

اصطلاح کد (Code) در دانش رایانه دارای دو مفهوم متمایز در حوزه‌های برنامه نویسی و ارتباطات می‌باشد.

1. در برنامه نویسی، منظور از این اصطلاح دستوراتی است که توسط یک برنامه نویس و براساس قواعد یک زبان برنامه نویسی نوشته می‌شود. به عبارت بهتر می‌توان واژه Code را در این کاربرد معادل با اصطلاح Source Code دانست. نوشتن کد (کدنویسی) که در زبان انگلیسی معادل فعل Code (یا Coding) می‌باشد نیز به عمل نوشتن این دستورات اطلاق می‌شود.

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

به فرایند تبدیل اطلاعات به فرم Code شده، کدگذاری یا انکودینگ (Encoding) می‌گویند. هدف از این عمل معمولا حفظ امنیت یا فشرده نمودن داده‌ها برای ذخیره‌سازی یا انتقال از طریق یک کانال ارتباطی می‌باشد. به عکس فرایند کدگذاری که طی آن، Code به فرم قابل فهم توسط گیرنده تبدیل می‌شود نیز کدگشایی یا دیکودینگ (Decoding) می‌گویند. به عنوان مثال ممکن است در نوعی کد ساده، حروف الفبا طی الگوریتمی به ارقام باینری کدگذاری شوند. فرض کنید در این نوع Code فرضی حرف “آ” به 0 و حرف “ب” به 01 کد شود. بنابراین واژه “آب” در این سیستم باید به صورت 001 کدگذاری و ارسال یا ذخیره شود.

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

لازم به ذکر است یکی از مشهورترین انواع کدها، کد مورس نام دارد که در گذشته برای ارسال پیام مورد استفاده قرار می‌گرفته است. QR Code و کدهای همینگ و هافمن نیز از جمله کدهای مشهور به شمار می‌روند.

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

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

سورس کد Source Code

سورس کد یا Source Code چیست؟

سورس کد (Source Code) مجموعه‌ای از دستورالعمل‌های رایانه‌ای است که معمولا در قالب متن ساده و به یک زبان برنامه نویسی کامپیوتری نوشته می‌شود. در واقع برنامه نویسان با نوشتن سورس کد، اعمالی که باید توسط رایانه انجام شود را مشخص می‌کنند.

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

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

جالب است بدانید الزاما تمام سورس کد یک برنامه به یک زبان برنامه نویسی نوشته نمی‌شود. برای مثال ممکن است بخش‌هایی از یک برنامه به زبان C# نوشته شود و بخشی دیگر از آن برای اجرای بهینه‌تر به زبان C++ نوشته شده و در قالب یک فایل dll در سورس کد اصلی مورد استفاده قرار گیرد.

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

در تصویر زیر می‌توانید نمونه‌ای از سورس کدهای ساده برنامه سلام دنیا را به زبان‌های PHP و C++ همراه با کامنت های تک خطی (خطوط سبز رنگ) مشاهده کنید.

سورس کد Source Code
نمونه‌ای از Source Code ساده برنامه سلام دنیا به زبان‌های برنامه نویسی C++ (قطعه کد بالایی) و PHP (قطعه کد پایینی)

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

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