- 论坛徽章:
- 1
|
本帖最后由 ecloud 于 2011-10-17 20:23 编辑
比PEEK,POKE方便多了,比汇编好写多了,不然pascal为何不学PEEK,POKE?那么多牛人为何不用无所不能的 ...
ipindo 发表于 2011-10-17 15:44 ![]()
原则上讲,用任何语言可以编写任何程序,区别在于方便程度和可维护性。你以为无所不能的C也没有编写过web动画或者行列式计算程序,并不是说C做不到,而是人们有其他更好的选择。不同的语言有不同的特点,适合不同的应用环境,不存在谁高谁低,谁能谁不能。“方便”只是相对的,在某种环境下特定的。在面向硬件编程领域,至今仍有大量汇编在应用,因为汇编在这个环境下更方便、高效,UNIX内核迄今仍有一小部分是汇编编写的
至于你前面的问题,根本就不是问题
PEEK就是*,POKE就是&,除了占用字节多少不同,两者的实现毫无任何不同。但是在结构化的程序语言中,是要避免PEEK这种函数式的、硬性地址操作方法的;用一种“指针指示符”更适合结构化程序设计方法;相反,在过程化的语言中,直接的函数式操作更适用
举个简单的例子,C也好,Pascal也好,都可以用以下伪码来解释指针操作,注释后面是翻译成BASIC的方法
函数 A // 10 ADDA = 123456
{
int x; // 20 ADDAX = ADDA + 16
int y; // 30 ADDAY = ADDAX + 16
x=2; // 40 PEEK(ADDAX,2)
y=3; // 50 PEEK(ADDAY,3)
}
int M1 = A.x+A.y; // 60 M1 = POKE(ADDAX) + POKE(ADDAY)
printf(M1);; // 70 PRINT M1
实际上这里,每一个类型声明就等同于分配一个地址数,也就是BASIC里面ADD打头的变量赋值,这里假定一个int是16bit的。这里ADDAX就是*x,ADDAY就是*y
这个例子里面有很多弱点,比如A的地址是瞎编的,M1的类型检测不充分等等,我只是简要的举个例子,表明结构化语言并不具有任何的先天与众不同,是完全可以等价翻译成过程化语言(汇编也是一种过程化语言,并且实际是其他过程化语言的本体)的,只是会带来很多不便
比如说布尔值,BASIC没有这种数据类型,我可以定义一个数组 BOOL[1],令BOOL[0]=0,BOOL[1]=1,然后就可以用它来表示true和false,总之有各种办法来达到目的
这就好比,你用C去解一个行列式,可以写一大堆算法来实现,等价于matlab两行语句,但是你不能说C解不了行列式,只能说C不适合干这个
另:本例可以从一定层面上回答好多d提出的问题,姑且作为一个引子,我就不扩展了,比如ADDA的地址里面有16bit的空间,可以用来存另外一个地址数,从那个地址开始的内容是A的构造函数;以此类推,自己去扩展吧,呵呵
100 ADDINT=45678
110 PEEK(ADDA,ADDINT)
120 IF A需要构造 THEN GOTO 1000
130 POKE(ADDINT)
......
10000 A构造函数开始
......
10400 PEEK(ADDINT,返回值)
10500 GOTO 130
其实这货就是**A,呵呵 |
|