خانه > فناوری اطلاعات, آموزش, آموزش کامپیوتر > زبان برنامه نویسی d قسمت اول

زبان برنامه نویسی d قسمت اول


قسمت اول D زبان برنامه نویسی
یک زبان D . یک زبان برنامه سازی سیستمی و کاربردی ھمه منظوره است D ؟ چیست D چشم انداز
ھای سیستم API است اما توانایی نوشتن کدھای قدرتمند و تعامل مستقیم با C++ سطح بالاتر از
به خوبی برای نوشتن برنامه ھای متداول و برنام هھای بزرگ چند D. عامل و سخت افزار را حفظ می کند
به آسانی قابل آموختن است ، توانائیھای D . میلیون خطی با تیمھای برنامه نویسی مناسب است
زیادی را برای کمک به برنامه نویس فراھم می کندوبه خوبی برای فناوری پرتکاپوی بھینه سازی کامپایلر
نیست. ھمچنین دارای (interpreter) یک زبان اسکریپتی(متنی) یا دارای مفسر D . مناسب است
ماشین مجازی ، مذھب خاص یا فلسفه برتری جویی نمی باشد. بلکه یک زبان عملی است برای
برنامه نویسان حرفه ای که نیاز به انجام سریع و قابل اعتماد پروژه دارند و به کد قابل فھم آسان نیاز
اوج چند دھه تجربه به کارگیری کامپایلرھایی از D . دارند و مسئول عملکرد صحیح برنامه ھستند
از زبانھای دیگر D . زبانھای گوناگون و تلاش برای بنانھادن پروژه ھای بزرگ توسط آن زبا نھا است
واقعاً ؟ D الھام م یگیرد و آن را با تجربه و کاربرد به معنای واقعی درھم می آمیزد. چرا C++ مخصوصاً
C چرا؟ چه کسی زبان برنامه نویسی دیگری نیاز دارد؟ صنعت نرم افزار راه درازی از زمان اختراع زبان
افزوده شد. اما سازگاربا C تعداد زیادی مفاھیم جدید به زبان C++ تاکنون پیموده است. به وسیله
تلاشھای . C در آن ادامه یافت ، شامل سازگاری با تقریباً تمام ضعفھای طراحی اصلی زبان C گذشته
زیادی برای برطرف ساختن آن ضعفھا تاکنون صورت گرفته است اما در پی حفظ سازگاری با گذشته
دستخوش یک رشد پیوسته خصوصیات جدید شده اند. C++ و C خنثی شده است. در ضمن ھر دوی
این خصوصیات جدید باید به دقت و بدون نیاز به بازنویسی کد قدیمی به ساختار موجود خورانده شود.
استاندارد حدود ٧۵٠ C++ استاندارد تقریباً ۵٠٠ صفحه است و C ؛ نتیجه نھایی بسیار پیچیده است
این است که کامپایلرھای اندکی به طور مؤثر استاندارد را ++C صفحه ! حقیقت شلوغی کامپایلر
گرایش می یابند که در جزایر خاصی از زبان برنامه ++C دست نخورده به کار م یگیرند. برنامه نویسان
بسازند و در نظر م یگیرند کاربرد بسیار خوب بعضی خصوصیات را در حالی که از دیگر مجموع هھا
اجتناب م یکنند . با وجود اینکه کد از یک کامپایلر به کامپایلر دیگر قابل حمل است م یتواند مشکل
این است که ++C باشد که از برنامه نویسی به برنامه نویسی دیگر منتقل شود. توانایی بزرگ
می تواند تعداد زیادی سبکھای اصلی برنامه نویسی را پشتیبانی کنند . در کاربرد طولانی مدت سبکھای
دارای اشتراک و متناقض یک مانع و در نتیجه سبب تأخیر ھستند. ناامید کننده است که زبانی چنین
++C قدرتمند ، اعمال پایه ا ای مانند تغییر اندازه آرایه ھا و الحاق رشته ھا را انجام نم یدھد.البته
توانایی برنامه نویسی قدرتمند برای پیاده سازی آرایه ھای قابل تغییر اندازه و رشته ھا را فراھم
اما به ھرحال چنین خصوصیات بنیادی ، بایستی جزء قسمتھای . ( STL می کنند (مانند نوع بردار در
قابل گسترش ، طراحی مجدد و پیاده سازی به یک زبان ساده ، ++C زبان باشد. آیا قدرت و قابلیتھای
وارتگنال (متمایز و مستقل )و کاربردی می باشد؟ آیا تمامی آنھا می تواند داخل بسته ای قرار گیرد که
برای کامپایلرنویسان به آسانی قابل پیاد هسازی صحیح باشد و کامپایلرھا را قادر کند که به نحوی کارا ،
کدھای بھینه شده و پرتکاپو ایجاد کند؟ فناوری پیشرفته کامپایلر به نقط های رسیده است که
خصوصیاتی از زبان که به منظور جبران کردن فناوری ابتدایی کامپایلر وجود دارند ، می توانند حذف شوند.
باشد ، مثالی ظریفتر ماکروی پیش پردازنده در C در ”Register“ (مثالی ازاین نمونه می تواند واژه کلیدی
است) . ما م یتوانیم به فناوری پیشرفت هی بھینه سازی کامپایلر اعتماد کنیم تا دیگر به خصوصیاتی C
از زبان که برای دست یافتن به کیفیت کد قاب لقبول (جدای از کامپایلرھای ابتدائی) لازم است نیاز
درنظر دارد که ھزینه ھای گسترش نرم افزار را حداقل % ١٠ کاھش دھد توسط افزودن D . نداشته باشیم
خصوصیات بھینه سازی بالابرنده میزان سودمندی و تولید و ھمچنین با تعدیل کردن خصوصیات زبان ، به
منظره ++C/C طوری که اشکالات وقت گیر متداول از ابتدا حذف م یشوند. خصوصیات حفظ شده از
و انتقال کد به آن را آسانتر م یکند. گذر از D است . این موضوع آموختن ++C و C شبیه D کلی
باید طبیعی حس شود و برنامه نویس مجبور نخواھد بود که یک راه کاملاً جدید D به سوی ++C/C
به این معنا نیست که برنامه نویس به یک ماشین مجازی خاص D انجام کارھا را فراگیرد. استفاده از
وجود ندارد یک D ھیچ ماشین مجازی . Smalltalk زبان اجرا محدود شود مانند ماشین مجازی جاوا یا
به سیستم عامل متصل D . تولید می کند (Link) ھای قابل پیوند Objectfile کامپایلر سرراست است که
گنجانده D مستقیماً در برنامه نویسی ”MAKE“ ابزارھای آشنای متداول مانند . C می شود دقیقاً مانند
ابقا خواھد شد . ھمان املای جبری به کار ++C/C شده است. ١.منظره عمومی و احساس موجود در
C ھم به سبک D خواھد رفت و اغلب عبارات و فرمھای دستورات و طرح بندی عمومی. ٢.برنامه ھای
برای چه D . نه شیءگرا) یاترکیبی از ھردو قابل نوشتن است ) ++C (توابع و داده ھا) و ھم در سبک
کسانی مناسب است؟ ١.برنامه نویسانی که به طور مداوم از ابزارھای تجزیه و تحلیل کد استفاده
می کنند تا خطاھا را حتی قبل از کامپایل شدن ازبین ببرند. ٢.افرادی که عمل کامپایل را با بالاترین
سطح ھشدارھا انجام می دھند یا از کامپایلر می خواھند که ھشدارھا را به منزله خطا تلقی کند.
٣.مدیران برنامه نویسی که مجبورند به راھنماییھای سبک برنام هنویسی برای اجتناب از اشکالات
به خاطر ++C اعتماد کنند. ۴.افرادی که براین باورند که وعده ھای سبک شیءگرای C معمول
لذت م یبرند اما به خاطر ++C پیچیده گیھایش برآورده نمی شود. ۵.برنامه نویسانی که از قدرت بیانگر
نیاز به صرف تلاش زیاد برای اداره حافظه و یافتن اشکالات اشاره گرھا ، ناامید شد هاند. ۶.پروژه ھایی که
نیاز به تست ھمراه و تصدیق و تأیید دارند. ٧.برنامه نویسانی که فکر می کنند زبان باید دارای خصوصیات
کافی باشد . برای رفع نیاز دائمی اداره دستی و مستقیم اشاره گرھا. ٨.برنامه نویسان محاسبات
دارای خصوصیات زیادی برای پشتیبانی مستقیم اعمال مورد نیاز برنامه نویسان محاسبات D . عددی
NAN’S می باشد ، مانند پشتیبانی مستقیم از نوع داده مرکب و اعمال تعریف شده برای ب ینھایت و
از D نه) ٩.بخش تجزیه لغوی و تجزیه نحوی ++C ٩٩ اضافه شد ولی در C (این خصوصیات در استاندارد
یکدیگر در نھایت مجزا ھستند و ھمچنین از تجزی هگر معنایی. این بدین معناست که نوشتن ابزارھای
در سطح عالی آسان است بدون اینکه مجبور به ساختن یک کامپایلر D ساده برای اداره کردن کد منبع
ھا token کامل باشیم . ھمچنین بدین معناست که کد منبع ،برای کاربردھای خاص قابل انتقال به فرم
است.
قسمت دوم D زبان برنامه نویسی
C/C++ برای چه کسانی مناسب نیست؟ ١.به طور واقع بینانه ، ھیچکس قصد تبدیل میلیونھا خط از D
اشاره مناسب apps برای D را کامپایل نم یکند C/C++ کد منبع اصلاح نشده D ندارد و از آنجا که D به
ھای ارث را به خوبی پشتیبانی م یکند). ٢.برنامه ھای خیلی کوچک : CAPF ، D نیست. (به ھرحال
احتمالاً مناسبتر است. ٣.به عنوان Perl , Dmdscript , Python یک زبان اسکریپتی یا دارای مفسر مانند
برای برنامه نویسان D مناسبتر است java یا Python زبان برنامه نویسی برای شروع: برای مبتدی ھا
یک زبان . D متوسط تا پیشرفته یک زبان دوم عالی است . ۴.زبان به کاربرد کلمات صحیح وسواس دارد
عملی است و ھر خصیصه از آن ترجیحاً قابل مقایسه و ارزیابی در ھمان حداست تا در حد ایده آل . به
ساختارھا و مفاھیمی دارد که به طور مجازی نیاز به اشاره گرھا را برای امور پی شپا افتاده D طور مثال
ازبین م یبرد. به طور مشابه تغییر نوعھا ھنوز وجود دارد برای آن جایی که سیستم نوع نیاز به نادیده
را در دسته ھای C) نسبت به D( این قسمت برخی خصوصیات جالب تر D گرفتن دارد .خصوصیات اصلی
از کلاسھا آغاز D مختلف طبقه بندی م یکند. برنامه نویسی شیءگرا کلاسھا : طبیعت شیءگرای
می شود. مدل وراثت ، وراثت یگانه است که با روابط تقویت م یشود. شیء کلاس در ریش هی شجره
وراثت می نشیند. بنابراین تمام کلاسھا یک مجموعه متداول تابعی را اجرا می کنند. کلاسھا به وسیله
ارجاع معرفی می شوند و چنان کد پیچیده ای برای آنکه پس از استثناھا پاک شود نیاز نیست. تعریف
مجدد عملگرھا: می توان کلاس را برآن واداشت که با استفاده از عملگرھای موجود ، سیستم نوع را
برای پشتیبانی نوعھای جدید گسترش دھند. مثلاً ایجاد کلاس اعداد بزرگ و سپس تعریف مجدد
عملگرھای (/,*,_,+) برای توانایی استفاده از آنھا در املای عبارات جبری معمولی.
پیمانه ھا : فایلھای منبع دارای ارتباطی ی کبه یک با پیمانه ھا ھستند. به جای ( Productivity) فراوری
می نماییم. ھیچ نگرانی در مورد import نمودن یک فایل از اعلان ھا فقط پیمانه را include#
یا ifndef# با header ھای متعدد از ھمان پیمانه نیست ھمچنین نیازی به پوشاندن فایلھای import
معمولاً نیاز دارد که توابع و C++ و از این قبیل نیست. اعلان در برابر تعریف pragma once # یا endif#
صورت می گیرد و تعریف که در فایل منبع با 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;
ھم نوشته می شوند اما توابع inline به صورت {;return توابع جزیی مانند { 7 C++ تذکر : البته در
پیچیده نه. علاوه برآن اگر یک ارجاع بعد از آن موجود باشد تابع نیاز به الگو دارد که از قبل موجود باشد
کار نمی کند . 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; } }
است یا نه توسط تنظیمات بھینه ساز قابل کنترل است . قالب ھا inline به صورت D اینکه یک تابع
روشی واضح برای پشتیبانی برنام هسازی عمومی ھمراه با قدرت اختصاصی سازی به صورت D قالبھای
قسمت به قسمت ، پیشنھاد می کند. آرایه ھای شرکت پذیر آرایه ھای شرکت پذیر آرای هھایی ھستند با
یک نوع داده قراردادی (اختیاری) به عنوان ایندکس به جای آنکه به یک ایندکس از نوع اعداد صحیح
ھستند. این آرایه ھا ساختن سریع ، کارا و hash محدود باشند. در اصل آرایه ھای شرکت پذیر جدولھای
در C++ و C خالی از اشکال جدول ھای سمبل را آسان می نماید. تعریف نوعھای واقعی تعریف نوعھای
تعریف ،. D حقیقت نام مستعار نوع ھستند طوریکه ھیچ نوع جدیدی به طور واقعی مطرح نمی شود
نوعھای واقعی پیاد هسازی می کند جایی که :
;type def int handle
ایجاد می کند . بر کنترل نوع تأکید شده است و تعریف نوعھا handle به طور واقعی یک نوع جدید به نام
در تعریف مجدد توابع شریک می شوند. برای مثال :
int foo(int i); int foo(handle h);
دارد . این امر بیش از ھمه در ساخت bit یک نوع داده با نام D نوع داده پایه بیت است و bit نوع
آرایه ھایی از بیتھا مفید است :
;bit [ ] foo
، inline توقع پشتیبانی از توابع معمول از جمله توابع عمومی ، توابع مجدد تعریف شده ، توابع D توابع
توابع عضو ، توابع مجازی ، اشاره گرھا به توابع و … را داشته است علاوه برآن : توابع تودرتو توابع
و تکنیکھای بسته بندی locality می توانند درون توابع دیگر قرار گیرند. این امر در ساخت کد ، خاصیت
توابع بی نام می توانند به طور مستقیم در یک Functionliterals توابع بسیار مفید است. لفظ ھای توابع
دینامیک توابع محصور شده و توابع عضو کلاس بوسیله وکالت (Closure) عبارت جای داده شوند. وکالت
شدن برنامه سازی type safe می توانند ارجاع داده شوند که این باعث آسانتر شدن و (delegate)
عمومی می شود. پارامترھای ورودی، خروجی ، ورودی خروجی این خصوص یسازی نه تنھا کمک
می کند که توابع خود مستندتر شوند بلکه بسیاری از موارد لزوم اشار هگرھا را بدون قربانی کردن ھیچ
چیز حذف و امکاناتی را برای کمک بیشتربه کامپایلر در پیدا کردن اشکالات کد فراھم م یکند. بدین
ھای بیگانه ارتباط برقرار API این امکان فراھم میشود که مستقیماً با یک بازه وسیعتری از D ترتیب برای
C کند. و ھیچ نیازی برای کارھای جانبی مانند زبانھای تعریف ارتباطات وجود ندارد. آرایه ھا آرایه ھای
اشتباھات متعددی دارند که م یتوانند تصحیح شوند. 1 :اطلاعات بعد با آرایه ھمراه نیست و بنابراین باید
ھستند که به argr و argc ذخیره شده و جداگانه ارسال شود . مثال کلاسیک این مورد پارامترھای
فرستاده می شوند . main
main (int argc , char*argv[])
2آرایه ھا اشیاء سطح اول نیستند .وقتی یک آرایه به عنوان پارامتر به یک تابع فرستاده می شود به یک .
اشاره گر برگردانده می شود حتی با اینکه الگوی تابع به طور گیج کنند های می گوید که این آرایه است.
قابل تغییر اندازه C وقتی این برگرداندن انجام می شود تمام اطلاعات نوع آرایه گم م یشود. 3 .آرایه ھای
نیستند . این بدان معنی است که حتی چیزھای ساده ،انبوه و متراکم م یگردد مانند یک پشته که
قابل کنترل نیست چون اصلاً مرز C نیازدارد به عنوان یک کلاس پیچیده ساخته شود. ۴.مرز یک آرایه
آرایه مشخص نیست. ۵.آرایه ھا با علامت [ ] پس از شناسه اعلان می شوند . این به یک املای بی خود
و گیج کننده در اعلان اشیایی مانند اشاره گر به یک آرایه م یانجامد :
int (*array ) [3];
اعلان . int [3] * array ; علامت [ ] در سمت چپ قرار م یگیرد که فھم آن بسیار ساده تر است D در
تابعی که آرایه ای از اعداد Long [ ] func (int x); یک اشاره گر به یک آرایه سه تایی از اعداد صحیح
در چھار نوع می آیند : اشاره گرھا ، آرایه ھای استاتیک ، D صحیح بلند را برمی گرداند آرایه ھای
آرایه ھای دینامیک و آرای هھای شرکت پذیر ، قسمت آرایه ھا را ببنید ! رشته ھا پردازش رشت هھا آن قدر
زمخت و بدترکیب) که نیازمند پشتیبانی مستقیم در زبان برنامه C++ و C متداول است (و آن قدر در
الحاق رشته ھا ، کپی کردن و … را در دست می گیرند . ، D سازی است. زبانھای مدرن از جمله
رشته ھا رھاورد مستقیم پردازش بھینه شده آرایه ھا ھستند.
بخش سوم D زبان برنامه نويسی
(Collection Grabage) کنترل منابع
کاملاً با جمع آوری زباله ھمراه است. تجربه شھودی بیان می کند که تعداد زیادی D تخصیص حافظه در
برای کنترل رھاسازی حافظه لازم است . با جمع آوری زباله زبان بسیار ساد هتر C++ از خصوصیات
می شود.
حکمی ھست که م یگوید جمع آوری زباله برای جوجه برنامه نویسھا و تنب لھا است. من به یاد دارم
قابل C نیست که در C++ گفته می شد. بعد از ھمه ھیچ چیز در C++ زمانی را که این حرف در مورد
انجام نباشد یا در اسمبلر برای آن منظور.
C++ و C خصوصیات جمع آوری زباله کد خسته کننده پیگیری تخصیص حافظه ھای مستعد خطا که در
لازم است را حذف می کند. این نه تنھا بدین معناست که گسترش برنام هھا سریعتر انجام م یگیرد و
ھزینه ھای نگھداری کاھش می یابد بلکه برنامه به میزان زیادی در دفعات اجرا سریعتر است.
کنترل حافظه ساده و واضح
می توانند در کلاسھای delete و new یک زبان دارای جمع آوری زباله است ، اعمال D با وجود اینکه
خاص اجرا شوند ھمانگونه که یک تخصیص دھنده سفارشی به کار م یرود.
RAII
از D ، یک تکنیک پیشرفته گسترش نر مافزار برای کنترل تخصیص منابع و آزادسازی آنھا است RAII
در یک روش کنترل شده قابل پیش بینی که مستقل از چرخه جم عآوری زباله است پشتیبانی RAII
می کند .
کارایی
توده سبک وزن
و نیز C را پشتیبانی م یکند ھم برای سازگاری با ساختمان داد هھای C ساختمان ھای سبک ساده D
به خاطر اینکه آنھا در جاھایی که قدرت کامل کلاسھا کارایی ندارد مفیدند.
Assembler Inline
درایور سخت افزار ، کاربردھای سیستمی با کارایی بالا ، سیستم ھای تعبیه شده و کدھای خصوصی
شده بعضی وقتھا نیاز به غرق شدن در زبان اسمبلی دارند تا کار انجام شود . در حالی که پیاده سازی
نیاز به کارگیری اسمبلر خطی ندارند ، این خصوصیت تعریف شده و قسمتی از زبان است . D ھای
اغلب نیازھای کد اسمبلی به وسیله این بخش قابل برآوری است که نیاز به اسمبلرھای جداگانه و
ھا را مرتفع می سازد . DLL
از پردازش درگاھھای C توابع اصلی را شبیه به پشتیبانی ذاتی D ھمچنین بسیاری از پیاده سازی ھای
ورودی خروجی ، دسترسی مستقیم به عملیاتھای ممیز شناور و … پشتیبانی می کند .
قابلیت اعتماد
یک زبان پیشرفته باید برنامه نویس را در رفع تمامی اشکالات از کد یاری کند . این کمک به چندین
صورت می تواند ارائه شود . از آسان سازی کاربرد تکنیکھای قدرتمند تر ، تا گوشزد کردن کد غلط
آشکارا توسط کمپایلر و کنترل زمان اجرا .
( Contracts ) معاھدات
یک تکنیک انقلابی برای کمک به مطمئن شدن از صحت ( B.Meyer طراحی به وسیله کنترات ( ساخته
شامل پیش شرطھای توابع ، پس شرطھای توابع ، یکسانی ھای D زبان DBC برنامه است و نسخه
کلاس و کنتراکتھای ثابت کننده است .
آزمایش واحد
آزمایش قسمتھا می تواند به یک کلاس افزوده شود طوری که به صورت خودکار در لحظه شروع اجرای
برنامه اجرا شوند . این در ھشدار دادن اینکه پیاده سازی کلاس در ھر بار ساخته شدن ، سھو اً با
شکست مواجه نشده است مفید است آزمایش واحد قسمتی از کد کلاس را تشکیل می دھد . ایجاد
آنھا یک قسمت طبیعی پر دارد گسترش کلاس خواھد شد برخلاف پشت گوش انداختن کد تمام
شده از گروھھای آزمایش.
آزمایش واحد در دیگر زبانھا قابل انجام است اما نتیجه جالب از آب در نمی آید زیرا این زبانھا با این فکر
است . برای توابع کتابخانه ای به خوبی D عجین نیستند . آزمایش واحد یک خصوصیت اصلی و بارز در
عمل می کند ھم ضمانت می کند که تابع حقیقتاً کار می کند و ھم با مثال بیان می کند که تابع
موجود در اینترنت برای C++ چگونه کار می کند . خیل کثیر کدھای منشاء کاربردی و کتابخانه ھای
دانلود را در نظر بگیرید . چه تعداد از آنھا با تستھای کلی ھمراه است ( تست واحد را ھم در نظر
نگیرید ) ؟ کمتر از یک درصد . روش معمول این است که اگر کامپایل شده اجرا ھم می شود و شگفت
زده خواھیم شد اگر ھشدارھای کامپایلر اشکالات واقعی باشند .
را به مراتب به بھترین زبان برای نوشتن قابل اعتماد و D ، در کنار طراحی با کنتراکت ، آزمایش واحد
کاربردھای سیستمی قدرتمند تبدیل می کند.
خصوصیات و شرح اشکال زدایی
که در زمان کامپایل قابل فعال یا غیر فعال . ( debug ) اکنون اشکال زدایی بخشی از املای زبان است
یک قابلیت تشخیص سازگار debug شدن است بدون کاربرد دستورات پیش پردازنده یا ماکروھا . املای
– استوار و قابل حمل و قابل فھم را فعال می کند که آیا کد منبع حقیقی قابل ایجاد در کامپایل اشکال
زدایی و کامپایل نھایی ھست ؟
پردازش استثناء
به کار رفته است . نیاز نیست که اشیای try – catch به جای مدل فقط finally – try – catch مدل برتر
پیاده سازی کنیم . ( destructor ) زائد ایجاد کنیم فقط برای اینکه معناھای نھایی را توسط مخرب
ھماھنگی و ھم زمانی
مبناھایی برای ساخت برنامه ھای چند رشته ای D برنامه سازی چند رشته ای متداولتر می شود و
فراھم می کند . ھم زمان سازی می تواند ھم در سطح متد و ھم در سطح شیئی انجام شود .
{.} ( ) synchronize int func
توابع ھمزمان شده ( سنکرون شده ) در ھر زمان فقط به یک رشته اجازه می دھند که آن تابع را اجرا
در اطراف قطعه ای از عبارات احاطه می کند و دسترسی به وسیله شیئی synchronix\ze کند . عبارت
یا به صورت عمومی را کنترل می کند .
پشتیبانی تکنیکھای قدرتمند
آرایه ھای دینامیک به جای اشاره گر ھا
متغییرھای ارجاعی به جای اشاره گر ھا
اشیای ارجاعی به جای اشاره گرھا
جمع آوری زباله به جای کنترل واضح و دستی حافظه
مبانی موجود برای ھمزمانی رشته ھا
عدم وجود ماکرویی که به طور غیر عمدی به کد آسیب بزند .
به جای ماکروھا inline توابع
کاھش وسیع نیاز به اشاره گرھا
سایز انواع مرکب واضح و مشخص است
عدم شک در مورد علامت دار بودن کاراکتر ھا
header عدم نیاز به دوبار اعلان در کد منبع و فایلھای
پشتیبانی واضح از تجزیه و تحلیل برای افزودن کد اشکال زدایی
قسمت چھارم D آشنایی با زبان
کنترل ھای زمان کامپایل
کنترل نوع قوی تر
• انتساب مقادیر به صورت واضح مورد نیاز است
• مجاز نبودن متغییرھای محلی به کار نرفته
• عدم ؛ خالی در بدنه حلقه ھا
• انتساب ؛ مقادیر بولی بر نمی گرداند
ھای متروک API • نپسندیدن
کنترل زمان اجرا
( ) assert • عبارات اثبات صحت
• کنترل مرزھای آرایه
switch تعریف نشده در استثنای case •
• استثنای خارج از حافظه
• ورودی ، خروجی و طراحی یکسان کلاس به وسیله کنتراکت
سازگاری
تقدم عملگر و قوانین سنجش
و قوانین تقدم آنھا را حفظ می کند ھمچنین ترتیب قوانین سنجش و قوانین تقدم . این C عملگرھای D
از اشکالات ریز که از ابتدای برنامه نمایان می شود جلوگیری می کند .
C ھای API دسترسی مستقیم به
را فراھم می سازد . C دارد ھمچنین دسترسی مستقیم به توابع C نوع داده ھای مطابق با D نه تنھا
ھیچ نیازی نیست که توابع بسته بندی شده نوشته شود یا کدی برای کپی کردن اجزای متراکم یک
توده به صورت یک به یک
C پشتیبانی از تمام نوع داده ھای
٩٩ را در بر می C ممکن است . این پشتیبانی تمام انواع C و یا کد کتابخانه ای C زبان API ارتباط با ھر
شامل توانایی صف بندی اعضای ساختمان است برای مطمئن شدن از سازگاری با فرمتھای D . گیرد
داده خارجی .
پردازش استثنای سیستم عامل
متصل به روشی است که سیستم عامل در سطح زیرین استثناھا را D مکانیسم پردازش استثناھای
در یک کاربرد پردازش می کند .
ابزارھای موجود را به کار می گیرد .
ایجاد می کند که باعث امکان استفاده از اسمبلرھا ، لینکرھا Object کد را در فرمت استاندارد فایل D
و دیگر تحلیل کننده ھای استاندارد به خوبی لینک exe فشرده سازھای ، ( debugger ) ، اشکال زداھا
کردن کدی که دیگر زبانھا نوشته شده است می شود.
کنترل پروژه
نسخه سازی
و # if # تکنیک D . به صورت درونی امکان ایجاد نسخه ھای متعدد از یک برنامه یا ھمان متن را دارد D
را جایگزین می کند . C پیش پردازنده ی end if
نبود ھشدار
ھشدارھایی برای کدھای نامطمئن تولید نمی کنند . کد یا توسط کامپایلر قابل قبول D کامپایلرھای
است یا نیست . این ھر گونه بحثی در این زمینه که آیا ھشدار خطایی صحیح است یا نه و نیز ھر
بحثی در این باره که با چه کنیم را از بین می برد . نیاز برای ھشدار کامپایلر نشان هی طراحی ضعیف
زبان است .
استھلاک
ھمان طور که در طول زمان رشد می کند بعضی کدھای کھنه کتابخانه با نو تر و نسخه بھتر جایگزین
می شود . نسخه قدیمی باید برای پشتیبانی کدھای به جا مانده از قبل موجود باشد اما می توانند
لقب مستھلک بگیرند . کدھایی که نسخه ھای مستھلک را به کار می گیرند به وسیله تعویض کمپایلر
برچسب غیر قانونی م یخ ورند که برای ابقای برنامه نویس برای نشان دادن ھر وابستگی به خصوصیات
مستھلک باعث آسانی است .
غربال اراتستن واحد اول ) ) D نمونه برنامه
import c.stdio ;
bit [8191] flags ;
int main ()
{ int i , count , prime , k , inter ;
print f(“ 10 iterations \n” );
for ( iter = 1 ; iter<=10 ; iter ++ )
{ count = 0 ;
flags [ ] = 1 ;
for ( i = 0 ; i < flags . length ; i ++ )
{ if ( flags [i] )
{ prime = i + i +3
k = i + prime
while ( k < flags . length )
{ flags , [ k] = 0 ;
k + = prime ;}
count + = 1}
print f ( “ % d primes” , count ) ;
return 0;
قسمت پنجم D آشنایی با زبان
مقادیر واسطه ممیز شناور
در بسیاری کامپیوترھا ، اعمال با دقت بالاتر بیشتر از اعمال با دقت کمتر وقت نمی گیرند .این باعث می
شوند که مفاھیم شمارشی بالاترین دقت ممکن را برای اعمال داخلی موقتی به کار ببرند . فلسفه
مورد بحث این است که زبان را به پائین مقسوم علیه سخت افزاری محدود کنیم بلکه آن را قادر به
بھره برداری از بھترین توانایی ھای سخت افزار مورد نظر نماییم .
برای اعمال ممیز شناور و مقادیر واسطه عبارت یک دقت بالاتر از نوع عبارت می تواند به کار رود . تنھا
حداقل دقت توسط نوع عملوندھا مشخص می شوند نه حداکثر دقت . نکته پیاده سازی : در ماشین
٨۶ برای نمونه انتظار می رود ( اما لازم نیست ) که محاسبات واسطه ای در دقت کامل x ھای اینتل
ھستاد بیتی که توسط سخت افزار پیاده سازی می شود انجام شود .
امکان دارد که در مسیر استفاده از مقادیر موقت و زیر عبارات معمول ، کد بھینه شده یک جواب دقیقتر
از کد بھینه نشده فراھم سازد .
الگوریتم ھا باید طوری نوشته شود که براساس حداقل دقت محاسبات کار کند . آنھا نباید در مواقعی
برخلاف float یا double که دقت واقعی بالاتر است از نظر عملکرد تنزل یابند یا شکست بخورند . انواع
نوع گسترش یافته فقط باید در موارد زیر به کار رود :
• کاھش مصرف حافظه برای آرایه ھای بزرگ .
. C • داده ھا و آرگومان ھای توابع سازگار با
انواع موھومی و مختلط
در زبان ھای موجود ، یک تلاش عجیب برای به زور جا دادن انواع مختلط در تسھیلات تعریف نوع موجود
مانند قالب ھا ، ساختمان ھا و … وجود دارد و تمام اینھا معمولاً در نھایت با شکست مواجه
می شوند .
شکست می خورند چون مفاھیم اعمال مختلط می تواند بسیار دقیق باشد و کامپایلر نمی داند که
برنامه نویس در تلاش برای انجام چه کاری است بنابراین نمی تواند پیاده سازی معنایی را بھینه نماید .
تمام این کارھا برای اجتناب از اضافه کردن یک نوع جدید انجام شده است . اضافه کردن یک نوع جدید
بدین معناست که کامپایلر می تواند تمامی مفاھیم اعمال مختلط را دقیق پیاده کند . پس برنامه نویس
می تواند بر یک پیاده سازی صحیح ( یا حداقل دارای ثبات ) اعداد مختلط اعتماد کند .
ھمراه بودن با یک بسته نوع مختلط برای یک نوع موھومی مورد نیاز است .یک نوع موھومی برخی از
پیامدھای ظریف معنایی را حذف می کند و کارآیی را بھبود می بخشد بدون اینکه مجبور به انجام
می i اعمال اضافی روی قسمت حقیقی واضح صفر ، باشیم . الفاظ موھومی دارای یک پسوند
باشند .
; i ١٫٣imaginary j =
ھیچ املای خاص لفظ مختلط وجود ندارد فقط یک نوع حقیقی و موھومی را با ھم جمع کنید :
; i٢+ ۴٫۵complex c=
افزودن دو نوع جدید به زبان کافی است از این رو انواع مختلط و موھومی دارای دقت توسعه یافته
ھستند . ھیچ نوع اعشاری مختلط و موھومی یا نوع دابل مختلط یا موھومی وجود ندارد ( توجه : راه
برای افزودن آنھا در آینده باز است اما مطمئن نیستیم مورد نیاز باشد ) .
اعداد مختلط دارای دو صفت خاصه ھستند :
re. . قسمت حقیقی را به عنوان گسترش یافته بدست می دھد
im. . قسمت موھومی را به عنوان عدد موھومی بدست می دھد
برای مثال :
c . re is 4.5
c . im is 2i
کنترل گرد کردن
املایی D . ٧۵۴ شامل توانایی تنظیم کردن چھار روش گرد کردن است IEEE حسابگر ممیز شناور
[ blah , blah , blah ] : خاص برای دسترسی به آنھا افزوده است
پرچمھای استثناء
٧۵۴ می تواند پرچمھای مختلف را براساس آن چه در یک محاسبه رخ داده IEEE حسابگر ممیز شناور
Reset / SET این پرچمھا می توانند به وسیله املای زبان .[ blah , blah , blah ] : است تنظیم نماید
شوند .
مقایسه ھای ممیز شناور
تعداد بیشتری که خاص D علاوه بر عملگرھای مقایسه معمولی < , < = , > , >= , == , != زبان
اعداد ممیز شناور است اضافه می کند .
مدیریت حافظه
ھر برنامه غیر جزیی نیاز به تخصیص و آزاد سازی حافظه دارد . ھر چه پیچیدگی ، اندازه و کارآیی برنامه
اختیارات متعددی در زمینه مدیریت D . ھا افزایش می یابد تکنیکھای مدیریت حافظه مھمتر می شوند
حافظه پیشکش می کند .
: D سه روش پایه تخصیص حافظه در
١- داده استاتیک : در سگمنت داده پیش فرض تخصیص می یابند .
تخصیص می یابند . CPU ٢- داده پشته : در پشته برنامه
جمع آوری زابله تخصیص می یابند . heap ٣- داده زباله جمع آوری شده : به صورت پویا در
این قسمت بعدی تکنیکھا را برای استفاده از آنھا توضیح می دھد به ھمراه برخی قابلیت ھای
پیشرفته:
copy – on – write ( رشته ھا ( و آرایه ھا
فرستادن یک آرایه به یک تابع را در نظر بگیرید و احتما لاً تغییر دادن آرایه و برگرداندن آرایه جدید . از آنجا
که آرایه ھا با ارجاع فرستاده می شوند نه با مقدار ، یک پیامد وخیم این است که محتویات آرایه از آن
کیست ؟ برای مثال تابعی که آرایه ای از کاراکترھا را به حروف بزرگ برمی گرداند .
char [] toupper ( char [] S )
int i ;
for ( i =0 ; i < S . length ; i ++ )
char ( ‘a’ <= c && c<=’z’ )
S[i] = c – ( cast (char) ‘a’ – ‘A’ );
Return S;
که فراخوانی شد تغییر ھم کرد شاید این اصلاً آن چیز مورد توقع نبود یا بدتر []S توجه کنید که نسخه
ممکن است تکه ای از حافظه فقط خواندنی باشد . []S آنکه
ھمواره توسط تابع ساخته می شد به طور ناکارا و بدون لزوم زمان حافظه برای S اگر یک کپی از
حروفی که خودشان بزرگ ھستند مصرف می شد .
است که یعنی یک کپی ساخته می شود اگر رشته ھا نیاز به copy – on – write راه حل پیاده سازی
تغییر دارند بعضی زبان ھای پردازنده رشته ھا این عمل را به عنوان پیش فرض انجام می دھند اما
ھزینه بسیار سنگین است .
۵ مرتبه بوسیله تابع کپی می شود. برای اینکه از این قرارداد به نحوی با abcdwF” “ در نتیجه آن رشته
حداکثر کارآیی استفاده شود باید به صورت واضح در کد ظاھر شود .
char [] toupper (char [] s)
int changed ;
int i ;
changed = 0 ;
for i=0 ; i <S-length ; i ++ )
char c – S[i ] ;
if (‘a’ <= c && c<= ‘z’ )
if ( ! changed )
char [] r = new char [ S.length] ;
r []= S ;
changed = 1 ;
S [i] = c – ( cast ( char ) ‘a’ – ‘A’ );
return S ;
phibo پروتکلی است که به وسیله توابع پردازش آرایه ھا در کتابخانه زمان اجرای copy – on – write
پیاده سازی شده است . D زبان
جمع آوری زباله
زبانی دارای جمع آوی زباله کامل می باشد . بدین معنی که ھیچ وقت نیاز به آزادسازی حافظه D
نیست . فقط به ھنگام نیاز حافظه را تخصیص دھید و جمع آور زباله به طور دوره ای تمام حافظه بی
استفاده را به توده حافظه آزاد برمی گرداند .
که به کنترل دستی حافظه ھنگام تخصیص و آزاد سازی آن عادت دارند C ++ , C برنامه نویسان
احتمالاً مزایا و تأثیر جمع آوری زباله یقین ندارند . تجربه ی پروژه ھای جدید که با در نظر گرفتن جمع
آوری زباله نوشته شده اند ھمچنین پروژه ھای موجود که به سبک جمع آوری زباله برگردانده شده اند
نشان می دھد که :
• برنامه ھای دارای جمع آور زباله سریعتر ھستند . این واضح است اما دلایلی قابل بیان است .
• شمارش در جاعات یک روش معمول برای حل مسائل تخصیص حافظه آشکار است . کد پیاده سازی
اعمال اضافه و تفریق ھر جا که انتساب صورت می گیرد یکی از دلایل کندی است .
• پنھان کردن کد مذکور در پس کلاسھای اشاره گر ھوشمند به افزایش سرعت کمک نمی کند .
( روش شمارش ارجاعات به ھیچ وجه راه حل عمومی نیست جایی که ارجاعات حلقه ای ھرگز حذف
نمی شوند . )
• مخرب ھای کلاس برای آزادسازی منابع مورد نیاز یک شیئی به کار می رود . برای اغلب کلاسھا این
منابع ، حافظه تخصیص یافته است . با جمع آوری زباله اغلب مخرب ھا خالی می شوند و در نھایت
می توانند دور انداخته شوند .
• تمام مخرب ھایی که حافظه را آزاد می کنند می توانند معنی دار شوند در مواقعی که اشیاء ، بر روی
پشته تخصیص حافظه می یابند . برای ھر کدام مکانیزمی باید در نظر گرفته شود طوری که اگر یک
استثناء رخ داد تمام مخربھا از ھر چارچوب فراخوانی شوند تا ھر حافظه تخصیص یافته برای آنھا را رھا
کنند . اگر مخرب ھا نامربوط شوند ھیچ نیازی برای در نظر گرفتن چارچوب ھای خاص پشته برای
پردازش استثناھا نیست در نتیجه کد سریعتر اجرا می شود .
• تمام کدھای لازم برای مدیریت حافظه می تواند برای تکامل جزیی اضافه شود . برنامه بزرگتر کمتر در
حافظه اصلی و بیشتر آن در حافظه مجازی قرار می گیرد و آرامتر و کندتر اجرا می شود .
جمع آور حافظه ھنگامی صورت می گیرد که حافظه تنگ و کم شود . تا وقتی حافظه جا ××××× •
دارد برنامه در حداکثر سرعت ممکن اجرا می شود و ھیچ وقتی برای آزاد کردن حافظه ، صرف نمی
کند .
• جمع آورنده ھای زباله مدرن ، اکنون به مراتب پیشرفته تر از قبلی ھا و کندترھا ھستند . جمع آورنده
ھای تولید کننده و کپی کننده قسمت عمده ناکارایی الگوریتم ھای جارو کردن و اختصاص دادن را حذف
می کنند .
• جمع آورنده ھای زباله مدرن فشرده سازی توده حافظه را انجام می دھند . فشرده سازی توده
مراقب است که تعداد صفحاتی که به طور فعال به وسیله یک برنامه ارجاع شده اند را کاھش دھد
بدین معنی که دسترسی ھای حافظه احتمالاً بیشتر به حافظه می رسند تا به مبادله حافظه .
• جمع آورنده ھای زباله حافظه استفاده شده را اصلاح می کنند . بنابراین به رخنه ھای حافظه – که
باعث می شوند برنامه ھای با اجرای طولانی مدت آن قدر حافظه مصرف کننده تا سیستم ھنگ کند –
تن در نمی دھد .
• برنامه ھای دارای جمع آور زباله دارای اشکالات کمتر یافتن اشاره گرھا می باشند به این خاطر که
ھیچ ارجاع سرگردان به حافظه آزاد شده نمی ماند .
• برنامه ھای دارای جمع آور زباله برای گسترش و اشکال زدایی سریعترند . چون ھیچ نیازی برای
گسترش ، اشکال زدایی ، امتحان ، یا ابقاء که آزاد سازی آشکار وجود ندارد .
• برنامه ھای دارای جمع زباله به طور معنی داری کوچکترند چون ھیچ که آزادسازی حافظه وجود ندارد
و از این رو نیازی به پردازشگرھای استثناھا برای آزاد سازی حافظه وجود ندارد .
• جمع آوی زباله یک نوشداروی ھم کاره نیست بعضی اشکالات ھم دارد :
• وقتی یک مجموعه برنامه ھمزمان اجرا می شود قابل پیشگویی نیست بنابراین برنامه به طور دلخواه
می تواند مکث کند.
• زمانی که برای اجرای یک مجموعه منصرف می شود نامحدود است با اینکه در عمل بسیار کوتاه
است اما ضمانتی وجود ندارد .
• تمام رشته ھای اجرا به غیر از رشته جمع آوری زباله در حالی که جمع آوری در جریان است باید
مکث کند .
نحوه برقراری ارتباط اشیای دارای جمع آوری زباله با کد بیرونی:
جمع آور زباله به دنبال ریشه ھا د سگمنت داده ایستا و پشته ھا و محتویات رجیستر ھر رشته ی اجرا
می گردد. اگر تنھا ریشه یک شیئی بیرون از آنھا باشد ، جمع آور زباله آن را از بین می برد و حافظه
را آزاد می سازد.
برای اجتناب از این واقعه باید:
ریشه دسترسی به یک شیئی را در جایی ابقا کنیم که جمع آور زباله در آن جا به دنبال ریشه می
گردد .
C به شیئی مجدداً توسط تخصیص دھنده که خارجی یا کتابخانه ھای زمان اجرای
حافظه تخصیص دھیم . ، ( ( malloc/free
اشاره گرھا و جمع آور زباله
الگوریتم ھای جمع آوری زباله بستگی دارد به اشاره گرھایی که به چیزی در حال اشاره اند و غیر
غیر معمول نیستند C اشاره گرھا که به چیزی اشاره نمی کرده اند . بدین منظور دستورات زیر که در
از آنھا خودداری شود : D باید به دقت در
شده حقه ی لیست xor کردن آنھا با مقادیر دیگر مخفی نکنید مانند اشاره گر xor ١) اشاره گرھا را با
برای جا به جا کردن مقادیر دو اشاره گر استفاده نکنید . xor از حقه ی . C پیوندی در
یا دیگر حقه ھا ذخیره نکنید چون جمع آوری زباله انواع cast ٢) اشاره گرھای به مقادیر صحیح را توسط
غیر اشاره گر را برای یافتن ریشه ھای دسترسی بررسی نمی کند .
٣) از مزیت ھم ترازی اشاره گرھا برای ذخیره فلگھای بیتی در بیتھای سطح پائین یا بیتھای سطح بالا
استفاده نکنید .
۴) مقادیر صحیح را در اشاره گرھا نگھداری نکنید و
. null ۵) مقادیر سحر آمیز را در اشاره گرھا ذخیره نکنید به غیر از
۶) اگر شما باید یک مکان نگھداری خاص را بین انواع اشاره گر و غیر اشار هگر به اشتراک بگذارید از
استفاده کنید تا جمع آور زباله تکلیف خودش را در آن مورد بداند . union
دارای خصوصیات است که نشان می D . در حقیقت تا جایی که می شود از اشاره گرھا استفاده نکنید
دھد که اغلب اشاره گرھای آشکارا ، متروک و بلااستفاده خواھند بود . مانند اشیاء مرجع ، آرایه ھای
و بعضی کارھای کیمیاگرانه پدید C ھای API پویا و جمع آوری زباله . اشاره گرھا برای ارتباط موفق با
آمده بودند .
ساختمانھا و یونیون ھا
Aggregate Declaration
کار می کنند با تفاوتھای زیر : C شبیه
١) بدون فیلد ھای بیت
٢) ھم ترازی به طور آشکار قابل مشخص کردن است .
٣) بدون فضای نام برچسب جداگانه – نام برچسب ھا در حوزه کنونی می باشند .
; ABC x : مجاز نیستند بنویسید ; struct ABC x ۴) اعلان ھایی مانند
۵) ساختمانھا یا یونیون ھای بی نام می توانند عضوی از ساختمانھا یا یونیون ھای دیگر باشند .
۶) انتساب دھنده ھای پیش فرض اولیه برای اعضا پشتیبانی می شود .
٧) توابع عضو و اعضای استاتیک مجاز است .
ساختمانھا و یونیون ھا به معنی اجتماع ساده داده ھا یا راھی برای رنگ و آب دادن به یک ساختمان
سیستم API داده می باشد ، علاوه بر سخت افزار یا یک نوع خارجی ، انواع خارجی می توانند توسط
عامل یا یک فرمت فایل تعریف شوند . خصوصیات شیئی گرا نیز با نوع داده کلاس فراھم شده اند .
انتساب اولیه استاتیک ساختمان ھا
به اعضای ساختمان استاتیک به طور پیش فرض مقدار صفر انتساب داده می شود و به مقادیر ممیز
اگر یک انتساب دھنده اولیه ی استاتیک فراھم شود ، اعضا به وسیله نام عضو ، . NAN شناور مقدار
کولوم و املای عبارت انتساب اولیه می شوند . در ضمن ممکن است اعضا به ھر نحو انتساب اولیه
شوند .
struct X { int a; int b; int c; int d = 7;}
static X x = { a:1, b:2}; // c is set to 0, d to 7
static X z = { c:4, b:5, a:2 , d:5}; // z.a = 2, z.b = 5, z.c = 4, d = 5
انتساب اولیه ی استاتیک یونیون ھا
یونیون ھا به طور آشکار مقدار دھی اولیه می شوند :
union U { int a ; double b ; }
static U u = { b : 5.0 } ; // u.b = 5.0
دیگر اعضای یونیون که انتساب دھنده را جای می گذارند ولی فضای بیشتری اشغال می کنند مقدار
صفر می گیرند .
Enums
Enum اعلان
اعضا { enum identifier {
اعضا { enum {
enum identifier ;
را با ثبات ھای تعریف جایگزین می کنند . define # ھا کاربرد معمولی ماکروھای Enum
ھا ھمچنین می توانند بی نام باشند که در آن مورد به سادگی ثابت ھای مجتمع را تعیف می Enum
کنند و یا دارای نام باشند که مقدمه یک نوع جدید خواھند بود .
enum بدون نام {A,B,C } enum ٠ ثابتھای , A= ١, b= ٢C =
٠ و X.A = با مقادیر x نوع جدید {enum X { A,B,C دارای نام Enum را تعریف می کند . در حالی که
٢ تعریف می کند . X.C = ١ و = X.B
یک عبارت ریاضی فراھم شده Enum ھا باید حداقل دارای یک عضو باشند . اگر برای یک عضو Enum
دارای ارزش عضو قبلی به علاوه Enum باشد ارزش عضو مذکور برابر حاصل عبارت است و عضو بعدی
یک است .
Enum { A , B = 5 + 7 , C, D = 8 , E }
٩, E = ٨, D = ١٣, C = ١٢B = , ٠ = A داریم
Enum صفات
min کوچکترین عضو
max بزرگترین عضو
size سایز نگھداری ارزش عضو
Enum مقدار دھی
دارای مقدار اولین عضو است . Enum در غیاب یک مقدار دھنده به صورت آشکار ، یک متغیر
Enum X { A = 3 , B,C }
; X x . برابر ٣ می شود X مقدار

  1. هنوز دیدگاهی داده نشده است.
  1. No trackbacks yet.

پاسخی بگذارید

در پایین مشخصات خود را پر کنید یا برای ورود روی شمایل‌ها کلیک نمایید:

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s

%d وب‌نوشت‌نویس این را دوست دارند: