From Shabgard.ORG

Programming
زبان برنامه سازی D تحت لینوکس قسمت دوم
By
Dec 31, 2004, 17:09

 برای چه کسانی مناسب است؟
برنامه نویسانی که به طور مداوم از ابزارهای تجزیه و تحلیل کد استفاده می‌کنند تا خطاها را حتی قبل از کامپایل شدن ازبین ببرند.
افرادی که عمل کامپایل را با بالاترین سطح هشدارها انجام می‌دهند یا از کامپایلر می‌خواهند که هشدارها را به منزله خطا تلقی کند
.
مدیران برنامه‌نویسی که مجبورند به راهنماییهای سبک برنامه‌نویسی برای اجتناب از اشکالات معمول C اعتماد کنند
.
افرادی که براین باورند که وعده‌های سبک شیءگرای C++ به خاطر پیچیده‌گیهایش برآورده نمی‌شود
.
برنامه‌نویسانی که از قدرت بیانگر C++ لذت می‌برند اما به خاطر نیاز به صرف تلاش زیاد برای اداره حافظه و یافتن اشکالات اشاره‌گرها ، ناامید شده‌اند
.
پروژه‌هایی که نیاز به تست همراه و تصدیق و تأیید دارند
.
برنامه‌نویسانی که فکر می کنند زبان باید دارای خصوصیات کافی باشد . برای رفع نیاز دائمی اداره دستی و مستقیم اشاره‌گرها
.
برنامه‌نویسان محاسبات عددی . D دارای خصوصیات زیادی برای پشتیبانی مستقیم اعمال مورد نیاز برنامه نویسان محاسبات می‌باشد ، مانند پشتیبانی مستقیم از نوع داده مرکب و اعمال تعریف شده برای بی‌نهایت و NAN’S (این خصوصیات در استاندارد C99 اضافه شد ولی در C++ نه
)
بخش تجزیه لغوی و تجزیه نحوی D از یکدیگر در نهایت مجزا هستند و همچنین از تجزیه‌گر معنایی
.
این بدین معناست که نوشتن ابزارهای ساده برای اداره کردن کد منبع D بر سطح عالی آسان است بدون اینکه مجبور به ساختن یک کامپایلر کامل باشیم . همچنین بدین معناست که کد منبع ، قابل انتقال به فرم tokenها است برای کاربردهای خاص
.

D
برای چه کسانی مناسب نیست؟

به طور واقع بینانه ، هیچکس قصد تبدیل میلیونها خط که از C++/C به D ندارد و از آنجا که D کد منبع اصلاح نشده C++/C را کامپایل نمی‌کند D برای apps اشاره مناسب نیست. (به هرحال D ، CAPF های ارث را به خوبی پشتیبانی می‌کند).
برنامه های خیلی کوچک ـ یک زبان اسکریپتی یا دارای مفسر مانند Perl , Dmdscript , Python احتمالاً مناسبتر است
.
به عنوان زبان برنامه‌نویسی برای شروع ـ برای مبتدی‌ها basivc یا java مناسبتر است D یک زبان دوم عالی است برای برنامه نویسان متوسط تا پیشرفته
.
زبان به کاربرد کلمات صحیح وسواس دارد. D یک زبان عملی است و هر خصیصه از آن ترجیحاً قابل مقایسه و ارزیابی در همان حداست تا در حد ایده‌آل . به طور مثال D ساختارها و مفاهیمی دارد که به طور مجازی نیاز به اشاره‌گرها را برای امور پیش‌پا افتاده ازبین می‌برد. به طور مشابه تغییر نوعها هنوز وجود دارد برای آن جایی که سیستم نوع نیاز به نادیده گرفتن دارد
.

خصوصیات اصلی
D
این قسمت برخی خصوصیات جالب‌تر C را در دسته‌های مختلف طبقه‌بندی می‌کند
.
برنامه‌نویسی شیءگرا

کلاسها : طبیعت شیءگرای D از کلاسها آغاز می‌شود. مدل وراثت ، وراثت یگانه است که با روابط تقویت می‌شود. شیء کلاس در ریشه‌ی شجره وراثت می نشیند. بنابراین تمام کلاسها یک مجموعه متداول تابعی را اجرا می‌کنند. کلاسها به وسیله ارجاع معرفی می‌شوند و چنان که پیچیده‌ای برای آنکه پس‌از استثناها پاک شود نیاز نیست.
تعریف مجدد عملگرها: می‌توان کلاس را برآن واداشت که با استفاده از عملگرهای موجود ، سیستم نوع را برای پشتیبانی نوعهای جدید گسترش دهند. مثلاً ایجاد کلاس اعداد بزرگ و سپس تعریف مجدد عملگرهای (/,*,_,+) برای توانایی استفاده از آنها در املای عبارات جبری معمولی
.

خاصیت فراوری
Productivity
پیمانه‌ها : فایلهای منبع دارای ارتباطی یک‌به‌یک با پیمانه‌ها هستند. به جای #include نمودن یک فایل از اعلان ها فقط پیمانه را import می‌نماییم. هیچ نگرانی در مورد importهای متعدد از همان پیمانه نیست همچنین نیازی به پوشاندن فایلهای header با #ifndef یا #endif یا #pragma once و از این قبیل نیست
.

اعلان در برابر تعریف

++C
معمولاً نیاز دارد که توابع و کلاسها دوبار اعلان شوند یک اعلان که در فایلهای header صورت می‌گیرد و تعریف که در فایل منبع با پسوند “C.” . این یک روند مستعد خطا و کسل کننده است . به طور واضح برنامه‌نویس فقط نیاز دارد که یک بار آن را بنویسید و سپس کامپایلر باید داده‌های اعلان را بسط دهد و برای وارد کردن نمادین در دسترس قرار دهد. دقیقاً آن گونه که D می‌کند:
مثال
:
دیگر نیاز به تعریف جدای توابع عضو، اعضای استاتیک ، externها یا املاهایی مانند زیر نیست
:

تذکر : البته در ++C توابع جزیی مانند {return 7;} به صورت inline هم نوشته می‌شوند اما توابع پیچیده نه. علاوه برآن اگر یک ارجاع بعدی موجود باشد تابع نیاز به الگو دارد که از قبل موجود باشد مثال زیر در C++ کار نمی کند
.
اما کد هم‌ارز در D کار می کند
:
اینکه یک تابع D به صورت inline است یا نه توسط تنظیمات بهینه‌ساز قابل کنترل است
.

قالب‌ها

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

آرایه‌های شرکت‌پذیر

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

تعریف نوعهای واقعی

تعریف نوعهای C و C++ در حقیقت نام مستعار نوع هستند طوریکه هیچ نوع جدیدی به طور واقعی مطرح نمی‌شود. D ، تعریف نوعهای واقعی پیاده‌سازی می‌کند جایی که:
type def int handle;
به طور واقعی یک نوع جدید به نام handle ایجاد می‌کند . بر کنترل نوع تأکید شده است و تعریف نوعها در تعریف مجدد توابع شریک می‌شوند. برای مثال
:
int foo (int I );
int foo (handle h);

نوع
bit
نوع داده پایه بیت است و D یک نوع داده با نام bit دارد . این امر بیش از همه در ساخت آرایه‌هایی از بیتها مفید است
:
bit [ ] foo;
توابع

D
توقع پشتیبانی از توابع معمول از جمله توابع عمومی ، توابع مجدد تعریف شده ، توابع inline ، توابع عضو ، توابع مجازی ، اشاره‌گرها به توابع و … را داشته است علاوه برآن :
توابع تودرتو

توابع می‌توانند درون توابع دیگر قرار گیرند. این امر در ساخت کد ، خاصیت locality و تکنیکهای بسته‌بندی توابع بسیار مفید است.
لفظ‌های توابع
Fune tionliterals
توابع بی‌نام می‌توانند به طور مستقیم در یک عبارت جای داده شوند
.
وکالت دینامیک

توابع محصور شده و توابع عضو کلاس بوسیله وکالتها می‌توانند ارجاع داده شوند (delegates) که این باعث آسانتر شدن برنامه‌سازی عمومی و type safe می‌شود.
پارامترهای ورودی، خروجی ، ورودی خروجی

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

آرایه‌های C اشتباهات متعددی دارند که می‌توانند تصحیح شوند:
اطلاعات بعد با آرایه همراه نیست و بنابراین باید ذخیره‌شده و جداگانه ارسال شود . مثال کلاسیک این مورد پارامترهای argc و argr هستند که به main فرستاده می‌شوند
.
Main (int argc , char*argr[ ])
آرایه‌ها اشیاء سطح اول نیستند. وقتی یک آرایه به عنوان پارامتر به یک تابع فرستاده می‌شود به یک اشاره‌گر برگردانده می‌شود حتی با اینکه الگوی تابع به طور گیج کننده‌ای می گوید که این آرایه است. وقتی این برگرداندن انجام می‌شود تمام اطلاعات نوع آرایه گم می‌شود
.
آرایه‌های C قابل تغییر اندازه نیستند . این بدان معنی است که حتی چیزهای ساده انبوه و متراکم می‌گردد مانند یک پشته که نیازدارد به عنوان یک کلاس پیچیده ساخته شود
.
مرز یک آرایه C قابل کنترل نیست چون اصلاً مرز آرایه مشخص نیست
.
آرایه‌ها با علامت [ ] پس از شناساننده اعلان می‌شوند . این به یک املای بی‌خود و گیج کننده در اعلان اشیایی مانند اشاره‌گر به یک آرایه می‌انجامد
:
int (*array ) [3];
در D علامت [ ] در سمت چپ قرار می‌گیرد که فهم آن بسیار ساده‌تر است
.
اعلان یک اشاره‌گر به یک آرایه سه‌تایی از اعداد صحیح
int [3] * array ;
اعلان یک تابع که آرایه‌ای از longها را برمی‌گرداند
. Long [ ] func (int x);
آرایه‌های D در چهار نوع می‌آیند : اشاره‌گرها بر آرایه‌های استاتیک ، آرایه‌های دینامیک و آرایه‌های شرکت‌پذیر ،‌قسمت آرایه‌ها را ببنید
!
رشته‌ها

پردازش رشته‌ها آن قدر متداول است و آن قدر در C و ++C زمخت و بدترکیب که در زبان نیازمند پشتیبانی مستقیم است. زبانهای مدرن ، الحاق رشته‌ها ، کپی کردن و … را در دست می‌گیرند و D نیز رشته‌ها رهاورد مستقیم در دست گیری بهینه شده آرایه‌ها هستند

حمید نصیبی (hamidnsaba@yahoo.com)



Copyright by Shabgard.ORG