بایگانی دسته‌ها: برنامه نویسی

5 روش برای جلوگیری از اجرای اتوماتیک Garbage Collection

دانلود رایگان مقاله کامل با فرمت PDF (حجم 461 کیلو بایت)

Garbage Collector یکی از درخشان ترین دستاوردها در مهندسی نرم افزار است ، اما گاهی در زمانهای نامناسبی رخ می دهد. اگر شما نیاز دارید تا کدهای با کارایی بالا و Real-Time بنویسید ، معمولا نیاز دارید تا از GC در مورد collection ها جلوگیری کنید زمانی که سرعت اجرا به طور بحرانی مورد اهمیت باشد. البته گاهی GC غیر قابل جلوگیری است ، که در این صورت مینیمایز کردن مدت اجرای هر collection بهترین گزینه است . یک هم پوشانی یا overlap بین بهینه سازی مینیمایز کردن فرکانس GC و بهینه سازی مینیمایز کردن زمان عمل کردن GC وجود دارد که میتوانند با یک دیگر در تعارض هم باشند . فهمیدن نحوه ی memory management در .NET می تواند به شما در مورد انتخاب یکی از این دو راه کمک کند ، اما بهترین راه برای اینکه بفهمید چه چیزی باعث اجرا شدن garbage collector میشود این است که از ابزارهای آنالیز memory مثل ANTS Memory Profiler استفاده کنید .

بین Typeهای Value و Reference تفاوت قائل شوید

در .NET دو نوع تایپ وجود دارد : تایپهای Value و تایپهای Reference . تفاوت بین این دو در نهایت در نحوه ی Read the rest of this entry

Advertisements

دستورات محاسباتی در اسمبلی

توجه : مطالب این پست بسیار بسیار تخصصی و خفن میباشد ! لطفاً با مسئولیت خودتان بخوانید و در صورتی که جزء افراد زیر هستید بی خیال شید.

این پست به درد این افراد نمی خورد :

– افرادی که ضریب هوشی کمتر از 165.992 درصد دارند .
– افرادی که به شدت از اسمبلی بیزار هستند .
– کسانی که مدعی برنامه نویسی هستند .
– کسانی که فکر میکنند اسمبلی خیلی آسونه .
– وکلاً کسانی که نمی دانند اصلاً کامپیوتر چی هست ! ! ! ! !

بعد از هشدار های لازم میریم سراغ جمع . برای جمع کردن دو عدد از دستور ADD استفاده میشود . این دستور محتوای دو اپرندش را به صورت زیر با هم جمع میکند .

operand1 = operand1 + operand2

اپرند های این دستور میتواند موارد زیر باشد :

REG, memory
memory, REG
REG, REG
memory, immediate
REG, immediate

همان طور که میبینید با این دستور میتوان حداکثر اعدادی را جمع کرد که طولی به اندازه طول رجیستر ها داشته باشد یعنی 8 بیتی یا 16 بیتی یا در 386 به بالا 32 بیتی چون همیشه یکی از اپرندها رجیستر است و اپرند حافظه ثابت هم محدود به اندازه کلمه RAM میشود که آن هم , هم اندازه ی رجیستر است . اگر بخواهیم دو عدد 32 بیتی را جمع کنیم باید آنرا به دو قسمت 16 بیتی تقسیم کنیم که در رجیستر ها جا شوند . بعد نیبلهای پایین را با هم جمع میکنیم و نیبلهای بالا را نیز با هم جمع میکنیم .

نیبل پایین با دستور ADD به صورت عادی جمع میشود و نیبل بالا باید با رقم نقلی نیبل پایین جمع شود .برای این کار از دستور Read the rest of this entry

برنامه نویسی ساخت یافته

در ابتدای تاریخ برنامه نویسی زبانهای برنامه نویسی به صورت ساخت یافته نبودند و بدون انشعاب و به صورت خطی از ابتدا تا انتها اجرا میشدند .برنامه نویسی ساخت یافته (Structured Programming) روشی برای سازماندهی و کد کردن برنامه هاست . یک برنامه بزرگ به قسمتهای کوچکتر تقسیم میشودبه طوری که هر قسمت وظیفه انجام یک بخش را دارد . سه ساختار «دستور» , «حلقه» و «انتخاب» پایه و اساس برنامه های ساخت یافته را تشکیل میدهند .همه برنامه ها را میتوان با استفاده از این سه ساختار نوشت. کنترول برنامه بدون انشعاب های غیر شرطی از یک ساختار به ساختار دیگر میرود .

زبانهای سطح بالا مانند C برنامه نویسی ساخت یافته را از طریق معادل سازی نماد ها و دستوراتی مانند FOR , WHILE,.. پیاده سازی میکنند ولی زبانهای اسمبلی به طور ذاتی فاقد این ساختار ها هستند بلکه باید این ساختار ها را شبه سازی کرد .

مزایا و معایب برنامه های ساخت یافته :

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

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

به هر حال با این همه معایب جداً اساسی چون برنامه نویس ها اصولاً انسانهای Read the rest of this entry

پازل برجهای Hanoi با اسمبلی

یک procedure یا تابع بازگشتی تابعی است که خودش را به صورت مستقیم یا غیر مستقیم call میکند.با اسمبلی 86×80 خیلی راحت میتوان توابع بازگشتی را نوشت. اگر پارامترها و متغیر های local به Stack ارسال شوند ,میتوان با هر بار فراخوانی تابع فضای دسترسی جدیدی برای پارامترها و متغیر های جدید در استک ایجاد کرد.اگر رجیسترها به درستی در استک ذخیره و بازیابی شوند میتوان از آنها در هر فراخوانی تابع استفاده کرد بدون اینکه مقادیر از بین بروند.

حل پازل برجهای هانوی به این صورت است که در صورتی که فقط یک دیسک وجود داشته باشد با یک حرکت ساده از میله مقصد به میله مبدأ دیسک جابجا میشود.

اگر تعداد بیشتر از یک دیسک وجود داشته باشد آنگاه Number -1 دیسک بالا به میله کمکی انتقال می یابد و آخرین دیسک که بزرگترین دیسک هم هست به میله مقصد انتقال می یابد و در آخر Number -1 دیسک کوچکتر به مقصد انتقال می یابند .

شبه کد :

 

procedure Move(NbrDisks, Source, Destination, Spare);
   begin
       if NbrDisks = 1
       then
            display "Move disk from ", Source, " to ", Destination
       else
            Move(NbrDisks -- 1, Source, Spare, Destination);
            Move(1, Source, Destination, Spare);
            Move(NbrDisks -- 1, Spare, Destination, Source);
       end if;
   end procedure Move;
   begin {main program}
          prompt for and input Number;
          Move(Number, 'A', 'B', 'C');
   end;

فقط باید دقت کنید که استک Read the rest of this entry

Bubble sort با اسمبلی

شبه کد bubble sort برای یاد آوری :

دوتا حلقه تو در تو و یک شرط که در صورت درست بودن جای دو مقدار رو Swap میکند .

 
bubble sort code
  for(i=(arraySize - 1); i>=0; i--)
         for(j=1; j<=i; j++)
                 if(array[j-1] < array[j])
                 {
                      temp = array[j-1]
                      array[j-1] = array[j]
                      array[j] = temp
                 }

اینهم کد اسمبلی .دیگه فکر نکنم سخت تر از این برنامه توی امتحان سوال بیاد .
Read the rest of this entry

اسمبلی 8086

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

8086, چهارده رجیستر 16 بیتی قابل دسترس برای برنامه نویس دارد ( AVR خودمون 32 تا رجیستر داره ) :

8تا به عنوان General Purpose که چهارتا ی آنها ax, bx,cx,dx هستند که رجیستر Data نامیده میشوند.از این رجیستر ها میتوان به صورت مستقل از هم استفاده کرد همچنین میتوان از هر کدام به صورت دو رجیستر 8 بیتی جدا از هم نیز استفاده کرد .چهارتای دیگر یعنی sp,bp,si,di به عنوان Index/Pointer استفاده می شوند.

دستورات اسمبلی دو نوع هستند : Read the rest of this entry