دو قطعه کد زیر و در نظر بگیریم
int int_if(int x)
{
if (x) return 0;
else return 1;
}
int bool_if(bool b)
{
if (b) return 0;
else return 1;
}
وقتی این دو کد رو در حالت بهینهسازی که حالت پیشفرض همهی کامپایلرها هست کامپایل کنیم دو کد زیر و به دست میآریم
pushl %ebp
movl %esp, %ebp
cmpl $1, 8(%ebp)
popl %ebp
sbbl %eax, %eax
andb $1, %al
addl $0, %eax
ret
و
pushl %ebp
movl %esp, %ebp
cmpb $1, 8(%ebp)
popl %ebp
sbbl %eax, %eax
andb $1, %al
addl $0, %eax
ret
که به جز cmpb
و cmpl
در هیچ جا با هم تفاوت ندارن و بنابراین سرعت اجرای دو کد در حالت بهینه شده برابر است.
اما اگه در حالت بدون بهینهسازی کد رو کامپایل کنیم بسته به کامپایلر معمولاً کدهای مختلفی به دست میآریم. مثلاً ممکنه در یک حالت کدهای زیر و به دست بیاریم
pushl %ebp
movl %esp, %ebp
cmpl $0, 8(%ebp)
je L2
movl $0, %eax
jmp L3
L2:
movl $1, %eax
L3:
leave
ret
و
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movb %al, -4(%ebp)
cmpb $0, -4(%ebp)
je L5
movl $0, %eax
jmp L6
L5:
movl $1, %eax
L6:
leave
ret
که با هم فرق دارن بنابراین سرعت اجراشون متفاوته. بنابراین فقط در حالت بدون بهینهسازی (که فقط برای تست و بررسی هست نه تولید کد نهایی) کدها تفاوت داره.
این تفاوت طبیعی هست. زیرا در حالت بدون بهینهسازی کامپایلر تنها سعی میکنه کد رو به یه کد ماشین درست تبدیل کنه نه کاراتربن حالت ممکن. بنابراین برای bool
و int
که یک بایتی و چهاربایتی هستند، کدهای متفاوتی تولید میشه
هیچ پژوهش انسانی نمیتواند ادعای علمی بودن داشته باشد، مگر اینکه از برهان ریاضی برخوردار باشد (لئوناردو داوینچی)