اسکلت (برنامه نویسی کامپیوتری)

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

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

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

یک **کلاس اسکلت** یک طرح کلی از یک کلاس است که در مهندسی نرم افزار استفاده می شود. این شامل توصیفی از نقش های کلاس است و اهداف متغیرها و متدها را توصیف می کند، اما آنها را پیاده سازی نمی کند. کلاس بعداً از اسکلت پیاده سازی می شود. اسکلت همچنین می تواند به عنوان یک رابط یا یک کلاس انتزاعی شناخته شود، با زبان هایی که از یک پارادایم چند شکلی پیروی می کنند.

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

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

## ارتباط با شبه کد
کد شبه معمولاً هنگام توسعه ساختار یک نرم افزار جدید یافت می شود. این یک تصویر انگلیسی ساده از یک عملکرد خاص در یک سیستم بزرگتر است، یا حتی می تواند نمایشی از یک برنامه کامل باشد. شبه کد شبیه به برنامه نویسی اسکلت است، با این حال از این واقعیت منحرف می شود که شبه کد در درجه اول یک روش غیررسمی برنامه نویسی است.  کد ساختگی نیز بسیار شبیه به این است، جایی که کد صرفاً به عنوان یک مکان نگهدار یا برای نشان دادن وجود مورد نظر یک متد در یک کلاس یا رابط استفاده می شود.

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

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

## پیاده سازی
برنامه نویسی اسکلت را می توان در طیف وسیعی از برنامه های برنامه نویسی مختلف پیاده سازی کرد.

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

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

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

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

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

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

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

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

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

public skeletonExample();

یک کلاس انتزاعی تقریباً مشابه پیاده سازی کلاس است، اما بسته به زبان، حداقل یک متد به عنوان انتزاعی تعریف می شود. این بدان معناست که هر فرزند این کلاس (هر کلاسی که گسترش یا پیاده سازی می کند) باید متدی برای این کار تعریف شده باشد. کلاس‌های انتزاعی سبک تعریف بسیار مشابهی با رابط‌ها دارند، با این حال از کلمه کلیدی «abstract» معمولاً برای شناسایی این واقعیت استفاده می‌شود که باید در کلاس‌های فرزند پیاده‌سازی شود.

public abstract skeletonExample();

این مثال ها از نحو جاوا استفاده می کنند.

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

چارچوب های اسکلت الگوریتمی در برنامه نویسی موازی برای توصیف انتزاعی روش های مورد بحث برای توسعه بعدی استفاده می شود. فریمورک ها به یک نوع محدود نمی شوند و هر کدام از این انواع اهداف متفاوتی برای افزایش کارایی برنامه توسعه دهنده دارند. اینها را می توان به سه نوع اصلی دسته بندی کرد: داده موازی ، وظیفه موازی و وضوح. 

### داده موازی
این الگوریتم‌های اسکلت برای توسعه برنامه‌هایی استفاده می‌شوند که روی نرم‌افزارهای مبتنی بر داده‌های بزرگ کار می‌کنند و معمولاً ارتباطات بین داده‌ها را برای استفاده بعدی شناسایی می‌کنند. الگوریتم‌های موازی داده شامل «نقشه‌ها»، «چنگال» و «کاهش» یا «اسکن» هستند.

* «نقشه‌ها» متداول‌ترین الگوریتم‌های موازی داده‌های مورد استفاده هستند و معمولاً شامل یک عملیات واحد است که روی مجموعه بزرگی از داده‌ها تکمیل می‌شود. برای افزایش کارایی، تعدادی از مجموعه داده‌ها این عملیات را به طور همزمان روی آنها اعمال می‌کنند، قبل از اینکه داده‌ها در پایان دوباره با هم ساختار شوند.
* "Forks" شبیه به "نقشه" است اما از یک عملیات متفاوت برای انواع داده های خاص استفاده می کند. این به عنوان موازی سازی داده های چندگانه شناخته می شود. 
* "کاهش" یا "اسکن" برای اعمال پیشوندها به مجموعه ای از داده ها، قبل از اعمال عملیات بر روی داده ها استفاده می شود. اینها با «نقشه‌ها» متفاوت هستند زیرا مجموعه‌ای از نتایج جزئی در طول زمان اجرای خود روش دارند.

### وظیفه موازی
این عملیات، همانطور که از نامشان پیداست، بر روی وظایف کار می کنند. هر نوع الگوریتم تحت این به دلیل تغییر در رفتار بین کارها متفاوت است. الگوریتم‌های موازی کار شامل «squentials»، «farms»، «pipes»، «if»، «for» و «while» هستند.

* "Sequential" مجموعه تودرتویی از الگوریتم‌های اسکلت را می‌بندد و پایان می‌دهد. روش ها و برنامه هایی که بخشی از اسکلت ها هستند به عنوان جنبه های پایانی برنامه، قبل از بسته شدن گنجانده شده اند.
* "مزارع" به عنوان گروهی از وظایف، یک کارگر، یا به عنوان ارباب یا برده یک عملکرد دیگر شناخته می شوند. وظایف داده شده را با تکرار وظایف در چندین رشته و اجرای همزمان آنها تکمیل می کند. این کار بار را برای یک رشته خاص تقسیم می کند و به طور موثر یک رابطه master / slave بین thread ها ایجاد می کند.
* «لوله‌ها» شکل‌های سنتی‌تر الگوریتم‌ها هستند که در آن هر روش یا تابع در یک دنباله اجرا می‌شود. این به ترتیبی است که برنامه نویس کد خود را نوشته است. این به موازات محاسبه وظایف مختلف بر روی مجموعه ای از داده ها، معمولاً ورودی، به طور همزمان برای بهبود عملکرد و سرعت انجام می شود. هر محاسبات همزمان به عنوان یک مرحله شناخته می شود. الگوریتم لوله را می توان تو در تو قرار داد، جایی که یکی در دیگری قرار دارد، هر کدام مسئولیت ها را برای افزایش سرعت و همچنین تعداد مراحل تقسیم می کنند.
* "If" به برنامه یک تقسیم مشروط از وظایف می دهد، که در آن مجموعه ای از کدهای اسکلت به دو بخش اصلی تقسیم می شود. یک دستور شرطی به برنامه داده می شود، بنابراین به آن یک الگوریتم مشخص برای دنبال کردن داده می شود.
* "For" یک کار را چندین بار انجام می دهد، هر دو توسط برنامه نویس مشخص شده است، و اجازه می دهد مجموعه ای کارآمدتر از کدها را ارائه دهد. تعداد دفعاتی که کد اجرا می شود یک مقدار از پیش تعیین شده است، که نشان می دهد در زمان اجرا ، این مقدار قابل تغییر نیست. باید کار را به تعداد دفعات داده شده تکمیل کند.
* "While" الگوریتمی است که بسیار شبیه به عملکرد یک الگوریتم "برای" است که در آن یک کار چند بار تکمیل می شود. با این حال، در الگوریتم‌های «while»، برنامه چندین بار قبل از برآورده شدن یک دستور شرطی، کار را محاسبه می‌کند. این بدان معناست که الگوریتم "while" می تواند برای هر بار اجرا، وظایف خود را چندین بار انجام دهد.

## اسکلت های رزولوشن
این اسکلت ها با اسکلت های معمولی که در بالا یافت می شوند بسیار متفاوت هستند. الگوریتم های 'Resolution' از ترکیبی از روش ها برای حل یک مشکل مشخص استفاده می کنند. مسئله داده شده الگوریتم می تواند "خانواده ای از مسائل" باشد.  دو نوع اصلی از این اسکلت ها وجود دارد، «تقسیم کن و غلبه کن» یا «برند و محدود کن».

* «تقسیم کن و تسخیر کن» از یک اسکلت نقشه به عنوان اساس خود استفاده می کند و این اسکلت را با یک اسکلت برای حل مشکل ترکیب می کند. در الگوریتم های نقشه، توابع روی داده ها به طور همزمان اعمال می شوند. در «تقسیم کن و غلبه کن» مجموعه داده‌های ارائه‌شده دارای تابعی است که با استفاده از اسکلت نقشه بر روی آن اعمال می‌شود، با این حال این می‌تواند به صورت بازگشتی با استفاده از الگوریتم «while» اعمال شود. «در حالی که» تنها زمانی خراب می شود که کل مشکل حل شود.
* « Branch and Bound » الگوریتمی است که از الگوریتم‌های نقشه نیز استفاده می‌کند، اما به جای اعمال الگوریتم «while» برای اجرای همزمان وظایف، این الگوریتم وظایف را به شاخه‌ها تقسیم می‌کند. هر شاخه یک هدف خاص یا 'bound' دارد، جایی که دستور شرطی باعث توقف آن می شود.

## مراجع

# 
# 
# 
# 
# 
# 
# 
# 
# 
# 


رده:مقاله‌های ایجادشده توسط ایجادگر
رده:برنامه‌نویسی
رده:موضوعات مربوط به زبان‌های برنامه‌نویسی
رده:نرم‌افزار