نوشته شده توسط
vDelphi
البته همه در مورد سرعت و بهینه بودن کامپایلر Delphi اتفاق نظر دارن! :)
ولی سوال من اینه که چرا وقتی فایل exe ساخته شد، باز هم سرعت اجرا مطرح میشه؟
سرعت اجرای فایل exe که ربطی به سورس اولیه نداره! چون فکر کنم سرعت اجرای ماشین کد به سخت افزار سیستم بستگی داره!
سرعت اجرا مربوط به ماشین کد تولید شده هست، وگرنه مترجم زبان که برنامه رو اجرا نمیکنه.
فرض کنید که ماشینی داریم که دو تا رجیستر A و B داره و فقط دستورات زیر براش تعریف شده باشند:
MOVE
دستور انتساب برای
- یک رجیستر به یک متغیر حافظه
- یک متغییر حافظه به یک رجیستر
- یک رجیستر به رجیستر دیگر
- یک عدد ثابت به یک رجیستر
* دقت کنید در این ماشین دستور انتساب به یک متغییر حافظه فقط از طریق یک رجیستر ممکن است.
ADD
به رجیستر یک مقدار ثابت را اضافه میکند.
SUB
از رجیستر یک مقدار ثابت را کم میکند.
JMP
مسیر اجرای برنامه را به آدرس تعیین شده منشعب میکند.
JMPEQ
مقدار یک رجیستر را با یک عدد ثابت مقایسه میکند و در صورت تساوی مسیر اجرای برنامه را به آدرس تعیین شده منشعب میکند.
این ماشینی که فرض کردیم کار زیادی نمیتونه انجام بده ولی برای مثالی که میخواهم بزنم کافی است.
کد زیر را در نظر بگیرید:
X := 0;
I := 100000;
while I <> 0 do
begin
X := X + 5;
I := I - 1;
end;
write(X)
اگر بخواهیم کد بالا را به زبان ماشینی خودمان ترجمه کنیم حاصل میتواند این چنین باشد:
// X := 0
MOVE A, 0
MOVE X, A
// I := 1000000
MOVE A, 1000000
MOVE I, A
LOOP:
// WHILE I <> 0 do
MOVE A, I
JMPEQ A, 0, ENDLOOP
// X := X + 5
MOVE A, X
ADD A, 5
MOVE X, A
// I := I - 1
MOVE A, I
SUB A, 1
MOVE I, A
JMP LOOP
:ENDLOOP
// Write(X)
...
همانطور که حتما" متوجه شدهاید٬ اگر کد ماشین کد بالا را نه برای ترجمه خط به خط بلکه برای رسیدن به جواب برنامهای که نوشتهایم بنویسیم٬ کد حاصل بسیار بهینهتر خواهد بود:
// X := 0
MOVE B, 0
// I := 1000000
MOVE A, 100000
LOOP:
// WHILE I <> 0 do
JMPEQ A, 0, ENDLOOP
// X := X + 5
ADD B, 5
// I := I - 1
SUB A, 1
JMP LOOP
:ENDLOOP
MOVE X, B
MOVE I, A
// write(X)
...
با اینکه هر دو کد در خاتمه مقدار متغییر X و I را به درستی محاسبه و ذخیره میکنند٬ اما در کد دوم از حلقهای که یک میلیون بار تکرار میشود 4 دستور العمل اضافه برداشته شده است. پس ماشین ما در اجرای کد دوم 4 میلیون دستورالعمل کمتر اجرا میکند.
در مثال بالا٬ ماشین و برنامه ثابت هستند ولی ترجمه برنامه به زبان ماشین متفاوت است و در نتیجه سرعت اجرا هم متفاوت خواهد بود.
حالتی که در این مثال پیش آمد در مورد کامپایلرهای زبانهای کامپیوتری هم اتفاق میافتد و به همین دلیل است که سرعت اجرای exe یک برنامه C که با <span dir=ltr>BC++Builder</span> کامپایل شده ممکن است با کامپایل شدن توسط <span dir=ltr>VC++</span> تغییر کند.
* در اخرین کد نام یک رجیستر اشتباه وارد شده بود که اصلاح شد. همیشه تو هر کدی حداقل یک دونه باگ پیدا میشه. :)