delphi与操作系统(100分)

  • 主题发起人 主题发起人 sjjwan
  • 开始时间 开始时间
S

sjjwan

Unregistered / Unconfirmed
GUEST, unregistred user!
我想问一下delphi编译器是仅仅与操作系统有关,还是还与硬件系统有关。
与操作系统有关,即要编译成当前操作系统的可执行程序。与硬件有关,即编译
成该硬件系统下的二进制代码。对吗?
还有比如, x := y + z,这条运算语句是通过操作系统来处理的,还是delphi自己
叫cpu处理的,只不过这三个变量的内存是操作系统分配的.而去取y的值时,要通过操作
系统,因为操作系统分配了内存,它知道它在哪。而加法运算,是delphi自己叫cpu处理的
,不通过操作系统的。对吗?
请高手指点。谢谢!
 
与操作系统有关
操作系统定义了一系列的API,每个操作系统的API不同
Delphi只是封装这些API而已
比如Delphi使用的是Windows的API
Kylix使用的是linux的API
 
Java和C#使用的是另外一种方法
所有.Net上的支持语言都编译成一种中间代码
而在各个平台上由支持这个平台的虚拟机来具体解析这些中间代码来形成机器代码

简单说Delphi(Kylix)得多平台是一种一处编写,到处编译的方式
虚拟机技术则是一处编译,到处运行的技术

以上都是我个人的理解,如果不当请指出,谢谢
 
有谁知道怎么检测应用程序有没有响应啊,知道的高手请指点一下我.QQ38829979
 
delphi编译器与操作系统和硬件系统都有关。
与操作系统有关,即要编译成当前操作系统可以支持的可执行程序的格式,简单的比如windows的PE;
与硬件有关,即编译成该硬件系统下cpu指令支持的的二进制代码。

比如, x := y + z,
这条运算语句是通过编译器来处理的,翻译成二进制代码,一般来说执行类似add的指令。
如果是unsigned int,可能是add,
如果是单精度浮点数,可能执行fadds指令;如果双精度,可能是faddd指令。(不特定某种cpu,仅举例)
至于是什么精度,全是编译器来识别并完成转换的。
如果精度不同,编译器还可能生成一些类型转换的指令。
而如果你的cpu没有浮点处理能力(即不支持浮点加法),
就可能在编译的时候不给你编译成硬件浮点指令,而是调用软件实现的浮点函数来完成。
x,y,z通常会被编译器分配一个存储空间,运算的时候或许会load到寄存器中,而cpu运算时则操作存储器和寄存器。

为什么这条指令会被执行,因为delphi把类似的这些指令进行了包装,生成了windows可以识别的可执行程序exe。
程序中指令、数据、符号表,调试信息都放在规定的位置,运行这个程序,windows会创建进程、线程,把这个程序载入到内存,
初始化之后从程序的入口(就是main的地方)开始由cpu一条一条的执行指令代码,
操作系统基本就不再管了,除非你调用了操作系统提供的服务,也就是API。

而操作系统主要就是进程/线程(处理机)调度,内存(存储器)管理,文件管理,IO设备管理等。
操作系统比一般的软件运行的级别要高,让哪个线程用cpu就由那个线程运行(调度)。
线程们你用一会儿我用一会儿,看起来好像并行一样(单处理机)。
 
至于x,y,z的地址是如何一步一步从编译时的相对地址到
这三个数被cpu使用时直接存取的内存地址/寄存器,可以看看linker和loader的过程,
动态/静态链接,绝对/相对地址等概念吧。
刚才打了一些,回复的时候系统出错了,你自己找些资料看看吧。
 
说白了这些JavaC#.Net其是跟解释语言没有分别,只不过将文本语言,变形处理一下,虚拟
机就是解释器,要求速度的时候,这些语言根本不可能,我自制的控件,Win32比.net版本快几倍。
楼主说的x := y + z不是delphi叫CPU计算,而是Delphi将它变成CPU执行的机器码,跟delphi本身没有关系了。变量的空间,向系统申请,或者自己的堆栈,当然也是系统分配的,delphi有cpu窗口,打开看看就知道了。
 
根CPU和操作系统有关。
 
后退
顶部