بایگانی برچسب‌ها : برنامه نویسی

حلقه بی نهایت 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) نام دارد که در آن مقدار همان بیتی که هنگام شیفت به راست یا چپ خارج شده است از سمت دیگر وارد می‌شود به گونه‌ای که می‌توانید تصور کنید دو سر رشته بیتی همانند یک دایره به یکدیگر متصل شده است.

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

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

زبان برنامه نویسی سطح بالا High-level Programming Language

زبان برنامه نویسی سطح بالا یا High-level Programming Language چیست؟

زبان برنامه نویسی سطح بالا (High-level Programming Language) به گونه‌ای از زبان های برنامه نویسی گفته می‌شود که از میزان انتزاع (Abstraction) بالایی نسبت به جزئیات رایانه و زبان ماشین برخوردار هستند. به عبارت بهتر در این زبان‌ها نسبت به زبان‌های سطح پایین (Low-level Programming Language)، برنامه نویسان با پیچیدگی‌های سیستم های رایانه ای (آنچه به طور مستقیم توسط پردازنده ها و رایانه ها قابل فهم و اجرا می‌باشد) کمتر دست و پنجه نرم می‌کنند.

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

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

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

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

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

از جمله زبان های برنامه نویسی سطح بالا می‌توان به ویژوال بیسیک (Visual Basic)، سی شارپ (C#پی اچ پی (PHP)، دلفی (Delphi) و بسیاری از زبان های پرکاربرد دیگر اشاره کرد.

نحوه اجرای کدهای نوشته شده به یک زبان سطح بالا

معمولا به منظور اجرای کد نوشته شده به یک زبان سطح بالا و تبدیل آن به دستورات قابل فهم (یا قابل اجرا) توسط پردازنده از کامپایلر یا مفسر استفاده می‌شود. در مدل اول، کد نوشته شده پیش از اجرا توسط نرم افزاری به نام کامپایلر به فرم قابل اجرا توسط پردازنده تبدیل می‌شود و در مدل دوم دستورات به طور مستقیم با کمک نرم افزاری به نام مفسر اجرا می‌شوند. البته گفتنی است نوعی معماری نادر به نام معماری کامپیوتر زبان سطح بالا (High-level Language Computer Architecture) نیز وجود دارد که امکان اجرای مستقیم کدهای این نوع زبان ها را فراهم می‌آورد.

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

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

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

آرایه انجمنی Associative array

آرایه انجمنی یا Associative array چیست؟

آرایه انجمنی (Associative array) در زبان‌های برنامه‌نویسی یک نوع داده‌ی انتزاعی است متشکل از مجموعه‌ای از دوتایی‌های (کلید، مقدار) یا (Key, Value) به طوری که هر مقدار با یک کلید در تناظر می‌باشد و کلیدهای موجود در مجموعه نیز تکراری نباشند. آرایه‌های انجمنی با نام‌هایی همچون نقشه (Map) و لغت نامه (Dictionary) نیز شناخته می‌شوند.

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

دو روش مهم برای ایجاد آرایه‌های انجمنی، استفاده از جدول درهم سازی (Hash table) و درخت جستجو (Search tree) می‌باشد. بسیاری از زبان‌های برنامه‌نویسی امروزی از آرایه‌های انجمنی تحت عناوین متفاوتی در قالب کتابخانه‌های استاندارد خود پشتیبانی می‌کنند (برای مثال در بسیاری از زبان‌ها از جمله C++، آرایه‌های انجمنی با عنوان map شناخته می‌شوند).

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

در مثال زیر نحوه‌ی ایجاد یک آرایه انجمنی به نام $weight در زبان PHP نمایش داده شده است. در این نمونه، 3 جفت کلید و مقدار در مجموعه مشاهده می‌شود که عبارات Alex و Rory و Paul کلیدهای این آرایه انجمنی هستند و مقادیر 40 و 50 و 45 به ترتیب به آنها تخصیص داده شده است. در این مثال عبارت $weight[‘Paul’] مقدار متناظر با کلید Paul یعنی 45 را خواهد داشت.

$weight = array("Alex"=>"40", "Rory"=>"50", "Paul"=>"45");
echo "Paul weighs" . $weight['Paul'] . " kilograms.";

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

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

آرایه Array

آرایه یا Array چیست؟

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

ساده‌ترین نوع آرایه، آرایه‌ی خطی (Linear) یا تک بُعدی است. به عنوان مثال آرایه‌ای از نوع اعداد صحیح (Integer) با تعداد 5 عنصر را در زبان C++ در نظر بگیرید. این عناصر به اندیس‌های 0 تا 4 این آرایه منتسب می‌شوند. در صورتی که آدرس شروع آرایه در مموری برابر 1000 باشد با درنظر گرفتن اینکه هر مقدار Integer، چهار بایت حافظه نیاز دارد بنابراین پنج عنصر فوق آدرس‌های 1000 تا 1019 حافظه رم را اشغال خواهند کرد.

نوع متداول دیگری از آرایه‌ها که دو بعدی هستند با عنوان ماتریس نیز شناخته می‌شوند. معمولا برای دسترسی به هر عنصر در این آرایه‌ها از دو اندیس استفاده می‌شود، یکی برای سطر و دیگری برای ستون. به عنوان مثال اگر A یک آرایه‌ی دوبعدی با 3 سطر و 3 ستون باشد و اندیس شروع برابر 0 باشد A[1][2] به عنصر موجود در سطر دوم و ستون سوم اشاره می‌کند.

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

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

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

در اغلب زبان‌های برنامه نویسی، اندیس پیش فرض اولین عنصر آرایه برابر با 0 (نظیر خانواده زبان ‌های C و بیسیک) یا 1 (نظیر MATLAB و Fortran) می‌باشد و کران بالای اندیس‌ها براساس نیاز تعیین می‌شود.

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

int Length[5] = {16, 20, 27, 40, 45};

به منظور تجسم این Array می‌توان تصویر زیر را در نظر گرفت. اعداد بالای خانه‌های این تصویر نمایانگر اندیس عنصر متناظر هستند.

آرایه Array
تجسم تصویری یک Array با 5 عنصر

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

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

متغیر Variable

متغیر یا Variable چیست؟

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

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

در ساختار اکثر زبان‌های برنامه نویسی قراردادهایی که برای نامگذاری متغیرها درنظر گرفته شده است تقریبا مشابه یکدیگر است. به عنوان مثال عموما نام یک متغیر نمی‌تواند با رقم شروع شود، هم‌چنین استفاده از فاصله و برخی کاراکترهای خاص در اکثر زبان‌ها ممنوع است. با اینحال استفاده از علامت _ برای ایجاد نام‌های چندکلمه‌ای امکان‌پذیر است. همچنین اغلب زبان‌های برنامه نویسی مدرن در مورد نام متغیرها به بزرگی و کوچکی حروف حساس (Case-Sensitive) هستند. به عنوان مثال اگر متغیری با نام xVar تعریف شده باشد باید برای دسترسی به آن دقیقا از همین نام (با حرف V بزرگ) استفاده شود.

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

نحوه‌ی تعریف متغیرها بسته به زبان برنامه نویسی مورد استفاده می‌تواند متفاوت باشد. به عنوان مثال در زبان C++ دستور int result=0; متغیری به نام result از نوع int (عدد صحیح) با مقدار اولیه 0 ایجاد می‌کند.

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

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

بایت Byte

بایت یا Byte چیست؟

بایت (Byte) یکی از واحدهای اندازه‌گیری اطلاعات دیجیتال است که معمولا از 8 بیت (bit) تشکیل شده است. در گذشته تعداد بیت‌های لازم برای کدگذاری یک کاراکتر در رایانه را بایت می‌نامیدند.

استاندارد رایج 8 بیتی برای بایت، امکان نمایش باینری اعداد صفر تا 255 را در یک بایت فراهم می‌آورد. البته در گذشته اندازه بایت متغیر و وابسته به سخت افزار بوده است. به همین دلیل در برخی مواقع برای از بین بردن ابهام Byte، از واژه‌ی اختصاصی‌تر Octet (اکتت) با نماد o به عنوان واحدی متشکل از 8 بیت استفاده می‌شود.

لازم به ذکر است نماد Byte، حرف B بزرگ می‌باشد. این در حالی است که معمولا از حرف b کوچک به عنوان نماد بیت استفاده می‌شود. اما به منظور جلوگیری از بروز تداخل میان این دو نماد، استفاده از نماد bit برای واحد بیت توصیه می‌شود.

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

همانند بیت، برای Byte نیز از پیشوندهای کیلو (یا Kilo با نماد K معادل هزار)، مگا (یا Mega با نماد M معادل میلیون)، گیگا (یا Giga با نماد G معادل میلیارد)، ترا (یا Tera با نماد T معادل 10 به توان 12) و … استفاده می‌شود. بر این اساس 1KB معادل 1000 بایت، 1MB معادل یک میلیون بایت و … خواهد بود. به طور مشابه پیشوندهای باینری نظیر کیلوباینری (Ki معادل 1024 یا 2 به توان 10)، مگاباینری (Mi معادل 2 به توان 20) و … برای بایت نیز قابل استفاده هستند. در جدول زیر می‌توانید نماد تعدادی از واحدهای رایج و ضریبی که به آن‌ها منتسب شده است را مشاهده کنید.

ضریبنمادنام نمادضریبنمادنام نماد
103KBkilobyte210KiBkibibyte
106MBmegabyte220MiBmebibyte
109GBgigabyte230GiBgibibyte
1012TBterabyte240TiBtebibyte
1015PBpetabyte250PiBpebibyte
1018EBexabyte260EiBexbibyte
1021ZBzettabyte270ZiBzebibyte
1024YByottabyte280YiByobibyte

نوع داده بایت

در بسیاری از زبان‌های برنامه نویسی (از جمله جاوا، ویژوال بیسیک و سی شارپ) نیز نوع داده‌ای به نام Byte وجود دارد که 8 بیت فضا را اشغال می‌کند و معمولا برای نگه‌داری اعداد صحیح بدون علامت از 0 تا 255 یا اعداد صحیح علامتدار از -128 تا 127 استفاده می‌شود.

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

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

کلاس Class

کلاس یا Class چیست؟

کلاس (Class) در برنامه نویسی شئ گرا، نوعی قالب برنامه نویسی قابل گسترش است که برای ایجاد اشیاء، تعیین مقادیر اولیه‌ی وضعیت و مشخص نمودن رفتار آن‌ها مورد استفاده قرار می‌گیرد.

شئ (یا آبجکت Object) هایی که از روی کلاس ساخته می‌شوند را یک نمونه (Instance) از آن کلاس می‌نامند. به عنوان مثالی ساده می‌توان کلاسی تحت عنوان Circle را در نظر گرفت که خصوصیات و اعمال (یا رفتار) اشیائی به نام دایره را تعریف می‌کند. با کمک این کلاس، برنامه‌نویس می‌تواند اشیاء (دایره‌های) مختلفی با خصوصیات (مرکز و شعاع) متفاوت ایجاد کند و اعمالی نظیر محاسبه شعاع و مساحت یا ترسیم دایره را روی هرکدام انجام دهد در حالی که تعریف و پیاده‌سازی تمامی این خصوصیات و اعمال یک بار حین تعریف کلاس صورت گرفته است.

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

متغیرهایی که برای هر آبجکت متمایز و متفاوت هستند متغیرهای نمونه (Instance Variable) نامیده می‌شوند و وضعیت و خواص آن آبجکت را مشخص می‌کنند. متغیرهای دیگری نیز در Class ها تعریف می‌شوند که برای تمام اشیاء به اشتراک گذاشته می‌شود و به آن‌ها متغیرهای کلاس (Class Variable) می‌گویند (طبیعتا با تغییر مقدار این متغیرها توسط یک آبجکت مقدار آن در تمام آبجکت‌ها به همان صورت تغییریافته مشاهده می‌شود).

رفتار یک Class یا نمونه‌های آن توسط متدها (Method) یا توابع عضو (Member Function) مشخص می‌شود. متدها را نیز می‌توان به دو گروه متدهای نمونه و متدهای کلاس دسته‌بندی نمود. در واقع متدها عملی را روی آبجکت یا کلاس انجام می‌دهند.

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

نمونه‌ای از تعریف یک Class ساده با دو متغیر عضو و تابع سازنده آن به زبان Visual Basic .Net:

Public Class Employee
    Public FirstName As String
    Public LastName As String
       
    Public Sub New(ByVal f_name As String, ByVal l_name As String)
        FirstName = f_name
        LastName = l_name
    End Sub
End Class   

تغییردهنده‌های سطح دسترسی امکان کنترل سطح دسترسی به کلاس‌ها، متدها و اعضای آن‌ها را فراهم می آورد. به عنوان مثال تنها متدهای یک کلاس می‌توانند به اعضای خصوصی (Private) آن کلاس دسترسی داشته باشند.

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

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

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

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