请读者看下面的这个代码程序:
#include <stdio.h>
int main()
{
int a=100000,c;
while(a>1)
{
scanf("%d",&c);
switch(c)
{
case 1:
printf("c是1");
break;
case 2:
printf("c是2");
break;
case 3:
printf("c是3");
break;
case 4:
printf("c是4");
break;
case 5:
printf("c是5");
break;
}
a--;
}
return 0;
}
看上面的代码,似乎并没有问题,就C语言而言,确实如此。但没问题不代表就是最优,天地万物都有进化的空间,语言也不例外。让我们还拿这个程序为例,思考一种不理想的情况:当c的值是5时,机器会如何运行这段代码呢?首先,机器会先测试c的值是不是1,如果不是,再测试c的值是不是2,如此类推循环,直至遇到正确值5为止【郑重声明:以上斜体字只是我个人的猜测!本人水平有限,有可能是错的,因为编译器完全可以用更复杂的方法编译出更优的执行机器码,所以请大家不要轻信!!在这里也作出一个恳求,如果我的猜测是错的,还望知情的大侠在见笑之余,能够指教小弟一二,谢谢!!】若真是这样,很显然,机器至少要浪费掉4个指令执行时间。所以,对于这种浪费,有没有一种可能的方法避免呢?
为了配合上面的问题,请允许我胡编滥造出一个新的“D语言”,该语言全部继承自C,几乎与C一模一样。唯一的区别是比C多了个代码段地址类型,以及一个获取代码段地址的关键字getcodeadd,最后还多了一个动态的gotoadd行为。为了说得详细一点,请看下面的伪代码,该程序的目的和第一个程序一模一样:
#include <stdio.h>
int main()
{
int a = 100000, c;
codad add[10]; // codad是一个“关键字”,类似int、char
add[1] = getcodeadd[1];//这个getcodeadd[1],在编译的后期,已经被替换为一个代码段地址值add[2] = getcodeadd[2];
add[3] = getcodeadd[3];
add[4] = getcodeadd[4];
add[5] = getcodeadd[5];
while (a>1)
{
scanf("%d", &c);
gotoadd(add[c]) // 根据c的具体数值,直接跳转到相应代码段地址
{
getcodeadd[1]: //后面多了一个“:”号,表示这是一个标记获取代码段地址的行为,以及编译的最后阶段该字符串不必被代码段地址替换
printf("c是1");
break;
getcodeadd[2]:
printf("c是2");
break;
getcodeadd[3]:
printf("c是3");
break;
getcodeadd[4]:
printf("c是4");
break;
getcodeadd[5]:
printf("c是5");
break;
}
a--;
}
return 0;
}
在编译这种“D语言”时,编译器会先检测程序代码有没有getcodeadd,如果有,就会建立一个地址表。在编译的最后阶段,编译器会扫描代码中所有带“:”号的getcodeadd,以便获取该getcodeadd所标记的代码段地址,并将获取的这个地址值填充进地址表相应的位置中。最后的最后,编译器会扫描代码中没有“:”号的getcodeadd,然后讲该字符串替换为地址表中相应的代码段地址数值......
上面这个所谓的D语言,只是个人的瞎想,也许不可行。但不管怎样,欢迎拍砖,敬请指教,谢谢