موضوع مقاله: اسکلت (برنامه‌نویسی رایانه‌ای) | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # اسکلت (برنامه‌نویسی رایانه‌ای) | مقدمه: "این مقاله در حال ترجمه از ویکی انگلیسی است لطفا حذف نشود." کد ساختگی در اسکلت برنامه قرار داده می‌شود تا فرآیند پردازش را شبیه‌سازی کرده و از نمایش پیام‌های خطای ترجمه جلوگیری کند. | ## بخش 1: اسکلت (برنامه‌نویسی رایانه‌ای) | این کد ممکن است شامل اعلان توابع خالی باشد یا توابعی که فقط در یک حالت آزمایشی ساده که پاسخ مورد انتظار آن از پیش مشخص است، نتیجه‌ی درستی بازمی‌گردانند. برنامه‌نویسی اسکلت‌وار، طراحی به سبک بالا به پایین را تسهیل می‌کند؛ به این معنا که یک سیستم نیمه‌عملیاتی با ساختارهای سطح‌بالای کامل طراحی و پیاده‌سازی می‌شود و سپس به‌تدریج گسترش یافته و نیازهای پروژه را برآورده می‌سازد. اسکلت کلاس (Class Skeleton) در مهندسی نرم‌افزار، چارچوبی کلی از یک کلاس است که شامل توصیفی از نقش‌های کلاس و هدف متغیرها و متدها می‌باشد، اما این متدها و متغیرها هنوز پیاده‌سازی نشده‌اند. این پیچیدگی می‌تواند به این معنا باشد که توسعه‌ی نرم‌افزار تنها توسط یک برنامه‌نویس ممکن نیست، یا اینکه بخش‌ها و ماژول‌های دیگر باید به صورت جداگانه وارد (import) شوند. برخی برنامه‌ها به‌تنهایی نیز ممکن است بسیار پیچیده باشند؛ مانند برنامه‌هایی که چندین تابع به‌طور هم‌زمان به یک متغیر دسترسی دارند یا حتی پیکسل‌هایی را برای نمایشگر تولید می‌کنند. کد اسکلت‌وار برای کمک به برنامه‌نویسان در جهت توسعه‌ی کدهایشان با کم‌ترین خطا در زمان ترجمه (کامپایل) استفاده می‌شود. همچنین ممکن است برای اجرای موقت یک تابع کوچک در درون یک برنامه‌ی بزرگ، بدون نیاز به عملکرد کامل، استفاده شود. این روش برنامه‌نویسی از نوشتن یک تابع کامل آسان‌تر است، چرا که توابع اسکلت‌وار لازم نیست تمام عملکردهای اصلی را داشته باشند و می‌توانند در مرحله‌ی توسعه، به‌صورت ثابت (hardcoded) تعریف شوند. این کدها معمولاً شامل کدی با نحو (syntax) درست هستند که متد را معرفی می‌کند، و همچنین توضیحاتی (کامنت) برای بیان عملکرد بخش‌های مختلف برنامه دارند. این روش، توصیفی ساده و به زبان انگلیسی از عملکرد خاصی در یک سیستم بزرگ‌تر است، یا حتی ممکن است نماینده‌ای از کل برنامه باشد. شبه‌کد شباهت‌هایی با برنامه‌نویسی اسکلت‌وار دارد، اما تفاوت اصلی آن‌ها در این است که شبه‌کد روشی غیررسمی برای برنامه‌نویسی محسوب می‌شود. برنامه‌نویسان به شدت به شبه‌کد وابسته‌اند، به‌طوری‌که این موضوع تأثیر روانی قابل‌سنجشی بر آن‌ها دارد. یک برنامه‌نویس معمولی آن‌قدر با نوشتن کدهای ساده‌شده – چه از طریق شبه‌کد، چه اسکلت کد، یا حتی فقط رسم یک دیاگرام – خو گرفته که این روند روی کیفیت پیاده‌سازی نهایی آن‌ها تأثیر مستقیم دارد. این موضوع در پروژه‌های مختلف، زبان‌های برنامه‌نویسی متنوع و با پارادایم‌های گوناگون بررسی و اثبات شده است. طراحی به روش شبه‌کد معمولاً روی کاغذ و خودکار انجام می‌شود؛ یعنی در مرحله‌ای دور از پیاده‌سازی واقعی قرار دارد. اما برنامه‌نویسی اسکلت‌وار برخلاف آن، معمولاً در محیط توسعه (IDE) یا ویرایشگرهای متنی نوشته می‌شود، و همین موضوع امکان توسعه آسان‌تر برنامه را پس از مرحله طراحی فراهم می‌سازد. همچنین، برنامه‌های اسکلت‌وار این قابلیت را دارند که توابع ساده‌ای را حتی در همین مرحله اولیه اجرا کنند. مستندسازی زبان‌های برنامه‌نویسی تقریباً تمامی زبان‌های برنامه‌نویسی — اگر نگوییم همه — از کدهای اسکلت‌وار برای کمک به تعریف توابع و متدهای داخلی استفاده می‌کنند. این کار، راهی ساده برای برنامه‌نویسان تازه‌کار فراهم می‌کند تا با نحو (syntax) و نحوه‌ی پیاده‌سازی مورد انتظار توابع نوشته‌شده آشنا شوند. در صفحات مستندات جاوا، متدهای مربوط به هر شیء که بخشی از پکیج‌های جاوا هستند، به‌صورت کاملاً جداگانه و منظم تعریف شده‌اند. در این زبان‌ها، «اشیاء (objects)» داده‌ها و متغیرها را در خود نگه می‌دارند و این امکان را فراهم می‌سازند تا برنامه‌هایی کارآمدتر نوشته شوند. این اشیاء دارای توابعی هستند که می‌توانند به متغیرهای داخلی دسترسی پیدا کنند، که به آن‌ها متد (method) گفته می‌شود. در مستندات جاوا، هر متد به شکلی مشخص تعریف می‌شود: نام متد و نحوی که باید در محیط توسعه (IDE) نوشته شود، در بالای هر بلوک قابل مشاهده است. | ## بخش 2: اسکلت (برنامه‌نویسی رایانه‌ای) | در ادامه‌ی هر تعریف، توضیحی دقیق از عملکرد متد و خطاهای احتمالی نیز ارائه می‌شود. زبان پایتون نیز رویکردی مشابه برای مستندسازی متدهای درونی خود دارد، اما این رویکرد بازتابی از سادگی پایتون و عدم تمرکز آن بر روی محدوده‌ها و انواع داده است. مستندات پایتون شامل نحوی از هر متد، توضیحی کوتاه، و مثالی کاربردی برای استفاده معمول آن متد یا تابع است. کد اسکلت‌واری که در این مثال‌ها ارائه می‌شود، به برنامه‌نویسان این امکان را می‌دهد که در نگاه اول، درک خوبی از عملکرد آن تابع یا متد پیدا کنند. تعریف کلاس کلاس‌هایی که توسط توسعه‌دهندگان شخص ثالث (third-party) به‌عنوان بخشی از کتابخانه‌ها نوشته می‌شوند، معمولاً به شکل کد اسکلت‌وار ارائه می‌گردند. این کار به کاربران تازه‌وارد به کتابخانه کمک می‌کند تا درک بهتری از نحوه‌ی عملکرد توابع و متدهای موجود داشته باشند. به‌عنوان نمونه، کتابخانه‌ی P5.js از همین ساختار در مستندات خود استفاده می‌کند تا کاربرد موردنظر برخی توابع از پیش تعریف‌شده را نمایش دهد. این روش با مستندسازی زبان‌های برنامه‌نویسی متفاوت است، زیرا در این‌جا تمرکز روی نمایش پارامترهای ورودی هر تابع است، نه تمام کاربردهای ممکن آن متد. واسط‌های زبان طبیعی بیشتر در مواردی دیده می‌شوند که برنامه‌نویسان می‌خواهند ورودی‌ای را از کاربر دریافت کنند — ورودی‌ای که اغلب به‌صورت محاوره‌ای (و بدون اصطلاحات خاص برنامه‌نویسی) بیان می‌شود — و بر اساس آن، یک برنامه یا تابع تولید کنند. در برخی پیاده‌سازی‌ها، یک مجموعه کوچک از کد اسکلت‌وار به‌کار می‌رود تا عملکردی را که در پس‌زمینه در حال اجراست، شبیه‌سازی یا نمایندگی کند. دیگر شکل‌های واسط زبان طبیعی نیز از انواع مختلف ورودی استفاده می‌کنند: از ورودی‌های گفتاری در زبان‌های مختلف، گرفته تا حرکات فیزیکی (gesture-based input) — همه‌ی این‌ها در نهایت با هدف تولید یک نتیجه مشابه یعنی تولید کد هستند. از آنجا که اکثر زبان‌های برنامه‌نویسی مدرن به زبان انگلیسی طراحی شده‌اند، افرادی که به زبان‌های دیگر صحبت می‌کنند، ممکن است در یادگیری و توسعه نرم‌افزار با دشواری مواجه شوند. در برخی مطالعات، واسط‌های زبان طبیعی برای کمک به این دسته از افراد مورد استفاده قرار گرفته‌اند. یکی از این مطالعات نشان داد که چگونه کلاس‌هایی به زبان جاوا از طریق ورودی‌های زبان طبیعی ساخته شده‌اند. در این حالت، نیازی به یادگیری قواعد نحوی (syntax) زبان برنامه‌نویسی نبود، اما در عوض، کلاس‌ها بر پایه‌ی یک مجموعه‌ی ساده از کد اسکلت‌وار نوشته شدند. در این مفهوم، متدها می‌توانند بازنویسی (Override) یا بارگذاری مجدد (Overload) شوند؛ به این معنا که یک متد با همان نام در کلاس فرزند تعریف می‌شود و اولویت اجرا با متد کلاس فرزند خواهد بود، حتی اگر در کلاس والد متدی با همان نام وجود داشته باشد. تعریف این متدها بر پایه‌ی چهارچوب اسکلت‌واری است که توسط نحو (syntax) زبان برنامه‌نویسی تعیین می‌شود. مشابه پیاده‌سازی کلاس‌ها، از کد اسکلت‌وار برای تعریف متدهایی که بخشی از یک رابط (interface) هستند نیز استفاده می‌شود.Interface در واقع نقشه‌ی اولیه‌ای برای یک کلاس است که در زبان‌های شی‌گرای سخت‌گیر مانند Java، امکان استفاده از کلاس‌هایی در پکیج‌های مختلف را فراهم می‌کند بدون نیاز به دانستن جزییات درونی عملکرد آن‌ها. رابط‌ها فقط نام و قالب متدهایی را تعریف می‌کنند که باید در کلاس پیاده‌سازی شوند، و این اجازه را می‌دهند تا برنامه‌نویسان دیگر، آن کلاس را متناسب با نیازهای خود گسترش دهند یا از متدهای تعریف‌شده استفاده کنند. برنامه‌نویسی موازی برنامه‌نویسی موازی به معنای اجرای هم‌زمان چندین تابع است که معمولاً برای افزایش بهره‌وری مورد استفاده قرار می‌گیرد. این نوع برنامه‌ها معمولاً از سخت‌ترین انواع نرم‌افزارها برای توسعه هستند، زیرا علاوه بر پیچیدگی ذاتی، ارتباط تنگاتنگی نیز با سخت‌افزار مورد استفاده دارند. بسیاری از توسعه‌دهندگان تلاش کرده‌اند برنامه‌هایی با این عملکرد اصلی بنویسند، اما نتایج به‌دست‌آمده متفاوت بوده است. در برنامه‌نویسی موازی، از چهارچوب‌های اسکلت الگوریتمی استفاده می‌شود تا روش‌های موردنظر به‌صورت انتزاعی توصیف شوند و در مراحل بعدی توسعه یابند. | ## بخش 3: اسکلت (برنامه‌نویسی رایانه‌ای) | این چهارچوب‌ها به یک نوع خاص محدود نمی‌شوند و هرکدام هدف متفاوتی برای افزایش بهره‌وری برنامه توسعه‌دهنده دارند. این الگوریتم‌ها معمولاً شامل انجام یک عملیات واحد بر روی یک مجموعه‌ی بزرگ از داده‌ها می‌شوند. برای افزایش بهره‌وری، این عملیات به‌طور هم‌زمان بر روی چندین مجموعه‌داده اعمال می‌شود و سپس داده‌ها در پایان دوباره با هم ترکیب می‌شوند. "انشعاب" مشابه maps هستند، با این تفاوت که از عملیات‌های متفاوت برای انواع مختلف داده‌ها استفاده می‌کنند. "کاهش / پویش" برای افزودن پیشوند (prefix) به یک مجموعه داده قبل از اعمال یک عملیات اصلی استفاده می‌شوند. این الگوریتم‌ها با maps تفاوت دارند، زیرا در طول زمان اجرای متد، مجموعه‌ای از نتایج جزئی تولید می‌شود. وظیفه‌موازی همان‌طور که از نام آن پیداست، این نوع عملیات بر اساس وظایف (Tasks) انجام می‌شود. هر نوع الگوریتم در این دسته با دیگری متفاوت است، زیرا رفتار میان وظایف مختلف تغییر می‌کند. "ترتیبی" برای پایان دادن به مجموعه‌های تودرتوی الگوریتم‌های اسکلت‌وار به‌کار می‌رود. متدها و برنامه‌هایی که بخشی از اسکلت هستند، پیش از بسته‌شدن برنامه، به‌عنوان بخش نهایی و خاتمه‌دهنده اجرا می‌شوند. در این الگوریتم، وظایف داده‌شده با تکرار آن‌ها در چندین نخ (thread) به‌طور هم‌زمان انجام می‌گیرد. این کار باعث تقسیم بار کاری بین نخ‌ها می‌شود و ساختاری مانند ارباب/برده میان آن‌ها ایجاد می‌کند. "لوله‌ها" فرم سنتی‌تری از الگوریتم‌ها هستند که در آن هر متد یا تابع به‌ترتیب اجرا می‌شود، دقیقاً همان‌گونه که برنامه‌نویس آن را نوشته است. این عملیات با اجرای وظایف متفاوت به‌صورت هم‌زمان روی مجموعه‌ای از داده‌ها (معمولاً ورودی) به حالت موازی در می‌آید تا سرعت و کارایی افزایش یابد. در این حالت، اسکلت کد به دو بخش اصلی تقسیم می‌شود و بر اساس یک عبارت شرطی، مسیر اجرای الگوریتم تعیین می‌شود. "For" وظیفه‌ای را برای تعداد دفعات مشخصی که توسط برنامه‌نویس تعیین شده اجرا می‌کند. وظیفه تا زمانی که یک عبارت شرطی برقرار نباشد تکرار می‌شود، بنابراین هر بار اجرا ممکن است تعداد تکرارها متفاوت باشد. اسکلت‌های حل مسئله این نوع اسکلت‌ها با اسکلت‌های معمولی که پیش‌تر معرفی شدند تفاوت زیادی دارند. تقسیم و غلبه: در این روش، از اسکلت map به‌عنوان پایه استفاده می‌شود و با اسکلت while ترکیب می‌گردد تا مسئله حل شود. در الگوریتم تقسیم و غلبه، مجموعه‌ای از داده‌ها گرفته می‌شود و با استفاده از اسکلت map، یک تابع روی آن اعمال می‌گردد، اما این فرآیند می‌تواند به‌صورت بازگشتی و با استفاده از اسکلت while انجام شود. شاخه و کران: این الگوریتم نیز از اسکلت map استفاده می‌کند، اما به‌جای استفاده از الگوریتم while برای اجرای هم‌زمان وظایف، وظایف به شاخه‌هایی تقسیم می‌شوند. | ## جمع‌بندی | هر شاخه دارای یک هدف مشخص یا "کران" (bound) است، و هنگامی که یک عبارت شرطی برقرار شود، آن شاخه متوقف می‌شود.