close
دانلود فیلم
آشنایی با زبان برنامه نویسی D - بخش اول

چشم انداز

D چیست؟
D یک زبان برنامه سازی سیستمی و کاربردی همه منظوره است . D یک زبان سطح بالاتر از ++C است اما توانایی نوشتن کدهای قدرتمند و تعامل مستقیم با APIهای سیستم عامل و سخت  افزار را حفظ می کند.D به خوبی برای نوشتن برنامه های متداول و برنامه های بزرگ چند میلیون خطی با تیمهای برنامه نویسی مناسب است . D به آسانی قابل آموختن است ، توانائیهای زیادی را برای کمک به برنامه  نویس فراهم می کندوبه خوبی برای فناوری پرتکاپوی بهینه سازی کامپایلر مناسب است.
D یک زبان اسکریپتی(متنی) یا دارای مفسر(interpreter ) نیست. همچنین دارای ماشین مجازی ، مذهب خاص یا فلسفه برتری جویی نمی باشد. بلکه یک زبان عملی است برای برنامه  نویسان حرفه ای که به انجام سریع و قابل اعتماد پروژه و کد قابل فهم آسان نیاز دارند و مسئول عملکرد صحیح برنامه هستند.
D اوج چند دهه تجربه به کارگیری کامپایلرهایی از زبانهای گوناگون و تلاش برای بنانهادن پروژه های بزرگ توسط آن زبان ها است.
D از زبانهای دیگر مخصوصاً ++C الهام می گیرد و آن را با تجربه و کاربرد به معنای واقعی درهم می آمیزد.



چرا D ؟
واقعاً چرا؟ چه کسی نیاز به زبان برنامه  نویسی جدید دارد؟
صنعت نرم  افزار راه درازی از زمان اختراع زبان C تا کنون پیموده است. به وسیله ++C تعداد زیادی مفاهیم جدید به زبان C افزوده شد. اما سازگاری با گذشته C در آن ادامه یافت ، شامل سازگاری با تقریباً تمام ضعفهای طراحی اصلی زبان C .
تلاشهای زیادی برای برطرف ساختن آن ضعفها تاکنون صورت گرفته است اما در پی پا فشاری بر حفظ سازگاری با گذشته خنثی شده است. در ضمن هر دوی C و ++C دستخوش یک رشد پیوسته خصوصیات جدید شده  اند.
این خصوصیات جدید باید به دقت و بدون نیاز به بازنویسی کد قدیمی به ساختار موجود خورانده شود. نتیجه نهایی بسیار پیچیده است ؛ C استاندارد تقریباً 500 صفحه است و ++C استاندارد حدود 750 صفحه ! در زمینه کامپایلر های ++C واقعیت این است که تعداد اندکی از کامپایلر های موجود ،استاندارد این زبان را به صورت مؤثر و کامل پیاده سازی می کنند.
برنامه نویسان ++C گرایش می  یابند که در جزایر خاصی از زبان برنامه بسازند ، از بعضی خصوصیات ماهرانه بهره می گیرند در حالی که از به کار بردن بسیاری از خصوصیات دیگر اجتناب می کنند. با وجود اینکه کد ++C از یک کامپایلر به کامپایلر دیگر قابل حمل است می تواند به سختی از برنامه نویسی به برنامه نویس دیگر منتقل شود.
توانایی بزرگ ++C این است که می تواند تعداد زیادی سبک های اصلی برنامه نویسی را پشتیبانی کند. اما در کاربرد طولانی مدت ، سبکهای دارای اشتراک یا تناقض یک مانع و در نتیجه وقت گیرند.
ناامید کننده است که زبانی چنین قدرتمند ، اعمال پایه ا ای مانند تغییر اندازه آرایه ها و الحاق رشته ها را انجام نمی دهد. البته ++C توانایی برنامه نویسی قدرتمند برای پیاده سازی آرایه های قابل تغییر اندازه و رشته ها را فراهم می کنند (مانند نوع بردار در STL ) . اما به هرحال چنین خصوصیات بنیادی ، بایستی جزء قسمتهای زبان باشد. آیا قدرت و قابلیتهای ++C ، قابل گسترش ، طراحی مجدد و پیاده سازی به یک زبان ساده وارتگنال (منحصر به فرد و مستقل) و کاربردی می  باشد؟ آیا تمامی آنها می  تواند داخل بسته  ای قرار گیرد که برای کامپایلرنویسان به آسانی قابل پیاده سازی صحیح باشد و کامپایلرها را قادر کند که به نحوی کارا ، کدهای بهینه شده و پرتکاپو ایجاد کند؟

فناوری پیشرفته کامپایلر به نقطه ای رسیده است که خصوصیاتی از زبان که به منظور جبران کردن ناتوانی فناوری ابتدایی کامپایلر وجود دارند ، می توانند حذف شوند. (مثالی ازاین نمونه می تواند واژه کلیدی 'register ' در C باشد ، مثالی ظریفتر ماکروی پیش پردازنده در C است) . ما می توانیم به فناوری پیشرفته ی بهینه سازی کامپایلر اعتماد کنیم تا دیگر به خصوصیاتی از زبان که برای دست یافتن به کیفیت کد قابل قبول (جدای از کامپایلرهای ابتدائی) لازم است نیاز نداشته باشیم.
D درنظر دارد که هزینه های گسترش نرم افزار را حداقل %10 کاهش دهد توسط افزودن خصوصیات بهینه سازی بالابرنده میزان سودمندی و تولید ، همچنین با تعدیل کردن خصوصیات زبان ، به طوری که اشکالات وقت گیر متداول از ابتدا حذف می شوند.
منظره کلی D شبیه C و ++C است . این موضوع آموختن D و انتقال کد به آن را آسانتر می کند. گذر از C/++C به سوی D باید طبیعی حس شود و برنامه نویس مجبور نخواهد بود که یک راه کاملاً جدید انجام کارها را فراگیرد. استفاده از D به این معنا نیست که برنامه نویس به یک ماشین مجازی خاص زمان اجرا محدود شود مانند ماشین مجازی جاوا یا Smalltalk . هیچ ماشین مجازی D وجود ندارد .D یک کامپایلر سرراست است که Objectfile های قابل پیوند (Link ) تولید می کند. D دقیقاً مانند C به سیستم عامل متصل می شود . ابزارهای آشنای متداول مانند make مستقیماً در برنامه نویسی D گنجانده شده است.
منظره عمومی و احساس موجود در C/++C ابقا خواهد شد . همان املای جبری به کار خواهد رفت و اغلب عبارات و فرمهای دستورات و طرح بندی عمومی. برنامه های D هم به سبک C (توابع و داده ها) و هم در سبک ++C (شیءگرا) یاترکیبی از هردو قابل نوشتن است .

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

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

D برای چه کسانی مناسب نیست؟
۱. به طور واقع بینانه ، هیچکس قصد تبدیل میلیونها خط از C/++C به D ندارد و از آنجا که D کد منبع اصلاح نشده C/++C را کامپایل نمی کند ، برای این مورد مناسب نیست. (D به هرحال API های C را به خوبی پشتیبانی می کند).
۲. برنامه های خیلی کوچک : یک زبان اسکریپتی یا دارای مفسر مانند Perl , Dmdscript , Python احتمالاً مناسبتر است.
۳. به عنوان زبان برنامه نویسی برای شروع: برای مبتدی ها Python یا java مناسبتر است . D برای برنامه نویسان متوسط تا پیشرفته یک زبان دوم عالی است .
۴. زبان به کاربرد کلمات صحیح وسواس دارد. D یک زبان عملی است و هر خصیصه از آن ترجیحاً قابل مقایسه و ارزیابی در همان حداست تا در حد ایده آل . به طور مثال D ساختارها و مفاهیمی دارد که به طور مجازی نیاز به اشاره گرها را برای امور پیش  پا افتاده ازبین می برد. به طور مشابه تغییر نوعها هنوز وجود دارد برای آن جایی که سیستم نوع ، نیاز به نادیده گرفتن دارد.

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

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

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

مثال:

class ABC
{
   int func() { return 7 ; }
   static int z = 7 ;
}
int q ;

دیگر نیاز به تعریف جدای توابع عضو، اعضای استاتیک ، extern ها یا املاهایی مانند زیر نیست:

int ABC::func() { return 7 ; }
int ABC::z = 7 ;
   extern int q ;

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

class Foo
{
   int foo(Bar *c) { return c->bar ;
} ; 
class Bar 
{
   public: int bar() { return 3 ;
} ;

اما کد هم ارز در D کار می کند: 

class Foo 
{
   int foo(Bar c) { return c.bar ;
}
class Bar 
{ 
   int bar() { return 3 ;
}

اینکه یک تابع D به صورت inline است یا نه توسط تنظیمات بهینه ساز قابل کنترل است .

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

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

تعریف نوعهای واقعی
تعریف نوعهای C و ++C در حقیقت نام مستعار نوع هستند طوریکه هیچ نوع جدیدی به طور واقعی مطرح نمی شود. D ، تعریف نوعهای واقعی پیاده سازی می کند جایی که:

typedef int handle ;

به طور واقعی یک نوع جدید به نام handle ایجاد می کند . بر کنترل نوع تأکید شده است و تعریف نوعها در تعریف مجدد توابع شریک می شوند. برای مثال :

int foo(int i) ;
int foo(handle h)

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

bit [ ] foo ;

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

توابع تودرتو
توابع می توانند درون توابع دیگر قرار گیرند. این امر در ساخت کد ، خاصیت locality و تکنیکهای بسته بندی توابع بسیار مفید است.

لفظ های توابع Functionliterals
توابع بی نام می توانند به طور مستقیم در یک عبارت جای داده شوند.

وکالت(Closure ) دینامیک
توابع محصور شده و توابع عضو کلاس بوسیله وکالت (delegate ) می توانند ارجاع داده شوند که این باعث آسان تر شدن و type safe شدن برنامه سازی عمومی می شود.

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

آرایه ها
آرایه های C اشتباهات متعددی دارند که می توانند تصحیح شوند:
۱. اطلاعات بعد با آرایه همراه نیست و بنابراین باید ذخیره شده و جداگانه ارسال شود . مثال کلاسیک این مورد پارامترهای argc و argv هستند که به main فرستاده می شوند.

main (int argc , char*argv [] )

۲. آرایه ها اشیاء سطح اول نیستند. وقتی یک آرایه به عنوان پارامتر به یک تابع فرستاده می شود به یک اشاره گر برگردانده می شود . حتی با اینکه الگوی تابع به طور گیج کننده ای می گوید که این آرایه است. وقتی این برگرداندن انجام می شود تمام اطلاعات نوع آرایه گم می شود.

۳.آرایه های C قابل تغییر اندازه نیستند . این بدان معنی است که حتی چیزهای ساده ،انبوه و متراکم می گردد. مانند یک پشته که نیازدارد به عنوان یک کلاس پیچیده ساخته شود.

۴.مرز یک آرایه C قابل کنترل نیست چون اصلاً مرز آرایه مشخص نیست.

۵.آرایه ها در C با علامت [ ] پس از شناسه اعلان می شوند . این به یک املای بی خود و گیج کننده در اعلان اشیایی مانند اشاره گر به یک آرایه می انجامد :

int (*array ) [3] ;

در D علامت [ ] در سمت چپ قرار می گیرد که فهم آن بسیار ساده تر است.
int [3] * array ; // اعلان یک اشاره گر به یک آرایه سه تایی از اعداد صحیح
Long [ ] func (int x ); //تابعی که آرایه ای از اعداد صحیح بلند را برمی گرداند
آرایه های D در چهار نوع می آیند : اشاره گرها ، آرایه های استاتیک ، آرایه های دینامیک و آرایه های شرکت پذیر ، قسمت آرایه ها را ببنید !

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

کنترل منابع
جمع آوری زباله (Grabage Collection )
تخصیص حافظه در D کاملاً با جمع آوری زباله همراه است. تجربه شهودی بیان می کند که تعداد زیادی از خصوصیات ++C برای کنترل رهاسازی حافظه لازم است .با وجود جمع آوری زباله، زبان بسیار ساده تر می شود.
گروهی می گویند جمع آوری زباله برای جوجه برنامه نویس ها و تنبل ها است. زمانی این حرف در مورد ++C گفته می شد. اما شاید هیچ چیز در ++C نیست که با C یا اسمبلر قابل انجام نباشد .
جمع آوری زباله ، کد خسته کننده پیگیری تخصیص حافظه های مستعد خطا که در C و ++C لازم است را حذف می کند. این نه تنها بدین معناست که گسترش برنامه ها سریعتر انجام می گیرد و هزینه های نگهداری کاهش می یابد ، بلکه برنامه به میزان زیادی در دفعات اجرا سریع تر است.

کنترل حافظه ساده و واضح
با وجود اینکه D یک زبان دارای جمع آوری زباله است ، اعمال new و delete می توانند طوری تعریف شوند که به عنوان یک تخصیص دهنده حافظه ی سفارشی به کار  روند.

RAII
RAII یک تکنیک پیشرفته گسترش نرم افزار برای کنترل تخصیص منابع و آزادسازی آنها است ، D از RAII در یک روش کنترل شده قابل پیش بینی که مستقل از چرخه جمع آوری زباله است پشتیبانی می کند.

کارایی
توده سبک وزن
D ساختمان های سبک ساده C را پشتیبانی می کند هم برای سازگاری با ساختمان داده های C و نیز به خاطر اینکه آنها در جاهایی که قدرت کامل کلاسها کارایی ندارد مفیدند.

Inline Assembler
درایور سخت افزار ، کاربردهای سیستمی با کارایی بالا ، سیستم های تعبیه شده و کدهای خصوصی شده ، بعضی وقتها نیاز به غرق شدن در زبان اسمبلی دارند تا کار انجام شود . در حالی که پیاده سازی های D نیاز به کارگیری اسمبلر خطی ندارند ، این خصوصیت،در زبان تعریف شده و قسمتی از آن است . اغلب نیازهای کد اسمبلی به وسیله این بخش قابل برآوری است که نیاز به اسمبلرهای جداگانه و DLL ها را مرتفع می سازد .
همچنین بسیاری از پیاده سازی های D توابع اصلی را (شبیه به پشتیبانی ذاتی C از پردازش درگاههای ورودی خروجی ، دسترسی مستقیم به عملیاتهای ممیز شناور و …) پشتیبانی می کند .

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

معاهدات ( Contracts )
طراحی به وسیله کنتراکت (اختراع B.Meyer ) یک تکنیک انقلابی برای کمک به مطمئن شدن از صحت برنامه است و نسخه DBC زبان D شامل پیش شرطهای توابع ، پس شرطهای توابع ، یکسانی های کلاس و کنتراکتهای ثابت کننده است .

آزمایش واحد
آزمایش قسمت ها می تواند به یک کلاس افزوده شود طوری که به صورت خودکار در آغاز اجرای برنامه ، اجرا شود . این در هشدار دادن اینکه پیاده سازی کلاس در هر بار ساخته شدن ، سهواً         با شکست مواجه نشده است مفید است . آزمایش واحد قسمتی از کد کلاس را تشکیل می دهد. ایجاد آنها یک بخش طبیعی پروسه ی گسترش کلاس ها خواهد شد برخلاف پشت گوش انداختن کد تمام شده از دسترس گروه آزمایش.
آزمایش واحد در دیگر زبان ها قابل انجام است. اما تا خود زبان شامل این مفهوم نباشد، نتیجه جالب از آب در نمی آید . آزمایش واحد یک خصوصیت اصلی و بارز در D است . برای توابع کتابخانه ای به خوبی عمل می کند، هم ضمانت می کند که تابع حقیقتاً کار می کند و هم با مثال بیان می کند که تابع چگونه کار می کند . خیل کثیرمنابع کدهای کاربردی و کتابخانه های ++C موجود در اینترنت برای دانلود را در نظر بگیرید . چه تعداد از آنها با تستهای کلی همراه است ( تست واحد را هم در نظر نگیرید ) ؟ کمتر از یک درصد . روش معمول این است که اگر کامپایل شده است اجرا هم می شود و شگفت زده خواهیم شد اگر هشدارهای کامپایلر اشکالات واقعی باشند .
در کنار طراحی با کنتراکت ، آزمایش واحد ، D را به مراتب به بهترین زبان برای نوشتن قابل اعتماد و کاربردهای سیستمی قدرتمند تبدیل می کند.

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

پردازش استثناء
مدل برتر try–catch-finally به جای مدل فقط try–catch به کار رفته است .دیگر هیچ نیازی نیست که اشیای زائد ایجاد کنیم فقط برای اینکه معناهای نهایی را توسط مخرب ( destructor ) پیاده سازی کنیم .

هماهنگی و هم روندی(Synchronization )
برنامه سازی چند رشته ای (Multi Thread Programming ) متداول تر می شود و D مبناهایی برای ساخت برنامه های چند رشته ای فراهم می کند . هم روند سازی می تواند هم در سطح متد و هم در سطح شیئ انجام شود .
synchronize int func( ){.}
توابع هم روند (سنکرون) در هر زمان فقط به یک رشته (Thread ) اجازه می دهند که آن تابع را اجرا کند . عبارت synchronize در اطراف قطعه ای از عبارات انحصار متقابل(mutex )ایجاد می کند و دسترسی به وسیله شیئ یا به صورت عمومی را کنترل می کند .

پشتیبانی تکنیک های قدرتمند
۱. آرایه های دینامیک به جای اشاره گر ها
۲. متغیرهای ارجاعی به جای اشاره گر ها
۳. اشیای ارجاعی به جای اشاره گرها
۴.جمع آوری زباله به جای کنترل دستی حافظه
۵. مبانی پیش ساخته موجود برای هم روندی رشته ها
۶. عدم وجود ماکرویی که به طور غیر عمدی به کد آسیب بزند .
۷. توابع inline به جای ماکروها
۸. کاهش وسیع نیاز به اشاره گرها
۹. سایز انواع مرکب واضح و مشخص است
۱۰. عدم شک در مورد علامت دار بودن کاراکتر ها
۱۱. عدم نیاز به دو بار اعلان در کد منبع و فایلهای header
۱۲. پشتیبانی واضح از تجزیه و تحلیل برای افزودن کد اشکال زدایی

کنترل های زمان کامپایل
۱. کنترل نوع قوی تر
۲. مقدار دهی اولیه به صورت واضح مورد نیاز است
۳. مجاز نبودن متغییرهای محلی به کار نرفته
۴. عدم ' ; ' تکی در بدنه حلقه ها
۵. عمل انتساب ،مقادیر بولی بر نمی گرداند.
۶. از رده خارج کردن API های متروک

کنترل زمان اجرا
۱. عبارات اثبات صحت ( )assert
۲. کنترل مرزهای آرایه
۳. case تعریف نشده در استثنای switch
۴. استثنای تجاوز از اندازه حافظه
۵. ورودی ، خروجی و طراحی یکسان کلاس به وسیله کنتراکت

لینک کوتاه پست
مطالب مرتبط با پست جاری
  • نکات مهم
    1- لطفا نظر خود را با زبان فارسی بیان کنید
    2- رایتم نظرات اسپم و تبلیغی شما را تایید نمی کند
    3- لطفا نظرات شما بدون ابهام و واضح باشد
  • نام
    ایمیل (منتشر نمی‌شود) (لازم)
    وبسایت
    :):(;):D;)):X:?:P:*=((:O@};-:B/:):S
    نظر خصوصی
    مشخصات شما ذخیره شود ؟[حذف مشخصات] [شکلک ها]
    کد امنیتی
به کانال تلگرام سایت ما بپیوندید