تفاوت میان نسخه‌های «آبجکتیو-سی»

۲۲۴ بایت اضافه‌شده ،  ۱۲ سال پیش
فارسی سازی
(رفع چند اشکال نگارشی)
(فارسی سازی)
آبجکتیو-سی {{انگلیسی|Objective-C}} یک [[برنامه‌نویسی شیءگرا|زبان شی‌گرا]] است که با اضافه کردن مفاهیم ارسال پیام از [[زبان اسمال‌تاک]] به [[زبان سی]] ایجاد شده‌است. در حال حاضر استفادهٔ اصلی آن در محیط‌های Mac OS X و iPhone OS است. برنامه‌هایی از این زبان که از کتابخانه‌های خاص این محیط‌ها استفاده نکرده باشند در همهٔ محیط‌هایی که کامپایلر جی‌سی‌سی (GCC) استفاده می‌شود قابل استفاده‌اند.
 
برنامه‌هایی از این زبان که از کتابخانه‌های خاص این محیط‌ها استفاده نکرده باشند در همهٔ محیط‌هایی که کامپایلر جی‌سی‌سی (GCC) استفاده می‌شود قابل استفاده‌اند.
 
==تاریخچه==
راه حل جدید پیشنهاد شده روش [[برنامه‌نویسی شیءگرا|برنامه‌سازی شی‌گرا]] بود. زبان‌هایی مانند اسمال‌تاک بر مبنای آن ساخته شدند.
 
Brad Cox و Tom Love زبان Objectiveآبجکتیو-Cسی را در سال‌های اولیهٔ ۱۹۸۰ در کارخانه‌شان تولید کردند. Cox با الهام از زبان Smalltalkاسمال‌تالک با تغییر در کامپایلر C توانست امکانات شی‌گرایی را به آن اضافه کند. او نام این زبان را OOPC مخفف Object Oriented Programming in C گذاشت. بعدها با کمک Love محصول جدیدی به نام Productivity Products International یا PPI را ساخت که یک کامپایلر Objective-C با کتابخانهٔ کلاس‌های قدرت‌مند بود.
 
در سال ۱۹۸۸ شرکت NeXT مالکیت Objectiveآبجکتیو-Cسی را از StepStone خرید و کامپایلر و کتابخانه‌های خاص خودش را منتشر کرد.
پروژهٔ GNU نیز ورژن خودش به نام GNUStep را از کامپایلر این زبان منتشر کرد. بعد از خریده شدن NeXT توسط Apple این شرکت ابزارهایی برای کار با این زبان را منتشر کرد.
 
==دستور زبان==
 
زبان Objectiveآبجکتیو-Cسی یک لایهٔ بسیار نازک روی زبان Cسی است. هر برنامهٔبرنامه Cبه زبان سی را می‌توان با کامپایلر Objectiveآبجکتیو-Cسی کامپایل کرد. اکثر دستورات از زبان C به ارث رسیده‌اند و تعدادی دستور برای ارسال پیغام به آن‌ها اضافه شده‌است.
 
===پیام‌ها===
 
زبان Objectiveآبجکتیو-Cسی روش‌هایی برای انتقال پیام به Cزبان سی اضافه کرد. در این زبان از مدل اسمال‌تالک برای فرستادن پیام استفاده می‌شود. در این روش یک پیام برای یک object فرستاده می‌شود و در صورتی که object گیرنده بخواهد آن را اجرا می‌کند. این روش برعکس روش ++C است که گیرنده باید حتماً یک متد را پیاده‌سازی کرده باشد تا شی‌ای بتواند آن را صدا بزند.
 
فرستادن یک پیام به یک شی در این زبان به شکل زیر است:
</source>
 
پیام‌های Objectiveآبجکتیو-Cسی نیازی ندارند که اجرا شوند.اگر به شیئی پیامی بدهیم و آن شی متد مربوطه را پیاده‌سازی کرده باشد. اجرا می‌شود و در غیر این صورت اجرا نمی‌شود. حتی می‌توان به nil نیز پیام فرستاد.
 
===واسط‌ها و پیاده‌سازی‌ها===
 
Objectiveآبجکتیو-Cسی نیاز دارد که واسط و پیاده‌سازی یک کلاس در بلوک‌های کد جداگانه قرار بگیرند. به طور قراردادی، واسط در یک فایل سرآیند با پسوند h. و پیاده‌سازی در یک فایل کد، معمولاً با پسوند m. قرار می‌گیرد.
 
===واسط===
</source>
 
یکی از موارد قابل توجه instanceMethod2WithParameter است. در Objectiveآبجکتیو-Cسی امکان استفاده از پارامتر‌دهی بانام‌ وجود دارد که در حال زیاد بودن تعداد پارامترها کد را تمیز نگاه می‌دارد. ولی در ++C چنین امکانی وجود ندارد.
 
مقادیر بازگشتی می‌توانند انواع C، یک اشاره‌گر به یک شی Objective-C و یا یک اشاره‌گر به انواع خاص مانند *NSArray یا *NSImage یا *NSString باشد. مقدار بازگشتی پیش‌فرض نوع عمومی Objective-C به نام id است.
</source>
 
در پیاده‌سازی این زبان، هریک از این ارسال پیام‌ها تبدیل به یک functionفراخوانی callتابع می‌شود.
 
===نمونه‌ گرفتن از یک کلاس===
 
بعد از نوشتن کلاس Objectiveآبجکتیو-Cسی می‌توان از آن نمونه گرفت. برای این کار باید ابتدا برای شی حافظه بگیریم و سپس به آن مقدار اولیه بدهیم. این دو کار با دستوری مانند
 
<source lang="objc">
</source>
 
قابل انجام‌اند. Allocalloc سبب می‌شود که به اندازه‌ی متغیرهای این کلاس حافظه گرفته شود و با init می‌توان به این متغیرها مقدار اولیه داد.
 
متد init معمولاً به صورت زیر نوشته می‌شود:
===پروتکل‌ها===
 
پروتکل‌ها در زبان Objectiveآبجکتیو-Cسی برای معرفی مفهوم وراثت چندگانه به وجود آمدند. در این زبان وراثت چندگانه‌ی توصیفات وجود دارد وولی نهوراثت چند‌گانه‌ی پیاده‌سازی‌ها وجود ندارد. این همان مفهومی است که در ++C با وراثت از یک کلاس abstract و در Javaجاوا به عنوان مفهوم interface وجود دارد.
 
در این زبان دو نوع پروتکل وجود دارد ad-hoc protocol که informal protocol نیز خوانده می‌شود و formal protocol.
Informal protocol لیست متدهایی است که یک کلاس می‌تواند پیاده‌سازی کند. توی مستندات می‌آید زیرا هیچ معادلی در زبان ندارد. معمولاً شامل متدهای اختیاری نیز هست.
 
===تعیین نوع پویا===
 
Objectiveآبجکتیو-Cسی از تعیین نوع پویا پشتیبانی می‌کند. یک شی می‌تواند پیامی دریافت کند که در واسط آن مشخص نشده است که می‌تواند آن را دریافت کند. به این ترتیب انعطاف‌پذیری زبان افزایش می‌یابد.
 
در این‌جا یک شی می‌تواند یک پیام را دریافت کرده و با توجه به نوع آن، به یک شی دیگر ارسالش کند یا آن را به مدیر خطا بسپارد. همچنین می‌توان با اضافه کردن تعیین نوع استاتیک امکان چک کردن انواع ارسالی به یک شی در زمان کامپایل را به یک شی اضافه کرد.
* ++C شامل کتابخانه‌ها و استاندارد‌هایی برای برنامه‌سازی شی‌گرا، برنامه‌سازی عمومی است. در حالی که Objective-C تنها یک لایه برای برنامه‌سازی شی‌گرا به C اضافه می‌کند.
 
* Objectiveآبجکتیو-Cسی امکانات reflection برای برنامه‌نویس به وجود می‌آورد که در زمان اجرا آدرس بعضی توابع معلوم می‌گردد حال آن‌که در C++ امکانات reflection وجود ندارد. یعنی Objectiveآبجکتیو-Cسی از ++C امور بیشتری در زمان اجرا تعیین می‌شود که باعث انعطاف بیشتر زبان می‌شود ولی سرعت اجرای آن را کاهش می‌دهد.
 
==تحلیل زبان==
 
* Objectiveآبجکتیو-Cسی برخلاف اکثر زبان‌های شی‌گرا که هم‌زمان با آن ساخته شدند از ماشین مجازی برای اجرای برنامه استفاده نمی‌کند.
این زبان می‌تواند روی یک کامپایلر زبان C پیاده‌سازی شود. به این ترتیب که اول به صورت پیش‌پردازشی کدهای خاص Objective-C تبدیل به کدهای C متناسب شوند.
 
۹

ویرایش