|
asbai
高级用户
积分 653
发帖 252
注册 2006-4-16
状态 离线
|
『第
106 楼』:
BIOS?若是做操作系统,我现在只相信硬件IO端口
■ 有专门的驱动或者能够自己写针对专门的硬件驱动当然好,否则很多时候也只能用相对低效的BIOS啦。
面向对象技术中最有用的是接口,而不是(类)继承。我一直想在DOS下设计一个类似COM(通用组件模型)的东东,实现能多语言协作的面向对象开发,而且最好能实现实模式与保护模式的透明(太NB了,我设计不出来)。
■ OOP里到底什么最有用,是C++社区中永恒的话题,这个很难说清楚。当然封装和接口是非常有用计数概念。COBRA和COM都有DOS实现的开源项目,而且不止一个,呵呵。
类 = 结构体 + 虚函数表 + 编译器障眼法(语法)
■ 类等于什么应该取决于具体应用才是,最简单的时候等于结构+相关函数;有时等于虚表+结构+相关函数;有时虚表+结构+相关函数+typeinfo信息;有时虚表+虚基表+结构+相关函数+typeinfo;还有时。。。。。。。
面向对象是这样发展的:结构体指针 -> 句柄 -> 对象
所以我一直跟别人说Windows系统符合面向对象思想的
■ 完全同意
程序执行效率与编译器没多大关系(注意不是Java、.Net那样的解释器)
影响速度的主要是算法与数据结构,其次是硬件平台特性
■ 算法和体系结构当然对代码效率有莫大的影响,不过不能否认的是编译器优化也是非常重要的。例如:即使是现代CPU,整数除法也是很慢的,在P4上大概也需要超过60个CPU时钟。但是乘法和位运算却非常快,很多编译器支持用乘法和位运算完成快速除法和取模。
■ 另外由于现代CPU的流水设计,它对分支语句非常敏感。特别是循环中出现的分支,可以轻易地浪费掉上千CPU时钟。很多优化编译器有办法使用特殊的汇编指令有效消除这种分支。
■ 此外还有消除数据相关性、子表达式优化、多分支优化、高速缓存和内存子系统访问优化等等上百种非常有效的编译器优化技术。可见目标代码的质量还是与编译器非常有关系的。
至于汇编。如果没用MMX、SSE等并行指令集的话,一般的程序员写绝对没有优化的编译器产生的机器码好
■ 优秀的汇编程序员确实可以写出比最优秀的优化编译器产生的代码快很多的等效汇编实现,并且仅使用编译器会用到的那些汇编指令。这方面的理论和大量实例比较可以google一下 Kris Kaspersky 和 Agner 这两位大师所写的著作。
以前在混一个论坛时看到一个人,他自以为水平很高,经常说XX语言不好
所以我用他最鄙视的VB写了个图像插值缩放程序
开始时他想当然的以为用vc写的肯定比我快,但是编译后发现速度比我的慢许多
然后他反复优化算法,最终决心用汇编重写核心代码,这才与我的差不多(没使用MMX,因为那时我俩都不懂)
自此他彻底服了,承认算法优化的重要性——居然 汇编优化的程序 跟 没有指针的VB差不多
(这件事使我认识到,如果汇编没使用MMX、SSE,千万别跟别人比速度)
■ 优化的层次应该是:体系结构 > 算法 > 细节优化。
■ 其中细节优化是指消除指令相关、控制相关等影响CPU流水的问题;优化高速缓存和内存访问效率;以及等等类似的细节问题。
■ 用汇编写的冒泡排序也不可能比用Java写的快速排序更快,如果在使用同样算法的前提下,一个汇编程序员写出来的代码比它的C等效还差,那只能说明他不适合做一个汇编程序员
我认为C++最有价值的 模板+多重继承,这才是真正现代的编译器技术
■ 这又是一个C++社区中典型的永无止境型争论话题
|
|
2006-5-28 20:55 |
|
|
jawbin
高级用户
积分 994
发帖 444
注册 2005-1-29
状态 离线
|
『第
107 楼』:
zyl910 兄 只相信 IO 端口...看来也很相信集成电路引脚...昏迷in....
支持多语言? 为什么要背这个包袱呢? 应该由多语言的应用遵循你的接口规范就可以了吧.
实模式 和 保护模式透明? 那只好下面打底, 才能让上层跨越. 但是"真正的"透明, 可能完全不需要努力,仅仅使用实模式的功能就可以了,在保护模式里可以兼容或者使用实模式虚拟机. 一旦用到保护模式特有的东西, 实模式下无法用, 那就透明不了了.
模板是个编译时泛型, 是个方便的工具, 但是我同样担心无所顾忌的"盲目滥用". 当然咯,我对模板其实不太熟悉,哈哈.
[ Last edited by jawbin on 2006-5-28 at 21:10 ]
|
|
2006-5-28 20:55 |
|
|
asbai
高级用户
积分 653
发帖 252
注册 2006-4-16
状态 离线
|
『第
108 楼』:
Quote: | Originally posted by jawbin at 2006-5-28 20:47:
先来回 asbai 兄, 我说的也不是 shell, 在 windows 4.x 至少可以指定 shell, 缺省的是 explorer. 而是一个 GUI os 的基本服务, 如果把 windows 等同与 non-GUI os, 那我尠... |
|
从OS的角度看,兄台认为Windows和Uinx有什么本质区别吗?一样是基于完全相同的操作系统原理构建的,呵呵。
只不过Windows的GUI是默认shell,而unix上的X+桌面管理器通常不设置成自动启动而已。还有,Windows的GUI确实比基于X11的实现效率高不少,但也没什么本质不同,呵呵。
|
|
2006-5-28 21:00 |
|
|
jawbin
高级用户
积分 994
发帖 444
注册 2005-1-29
状态 离线
|
『第
109 楼』:
但对它的实际运用来讲, 很有区别.
Windows 仿佛就是 Macintosh 的一个 " clean rooming" 出来的"开放版", 意在"用户友好", 一蹦出来就 GUI, 而 *nix 通常认为是研究人员使用的, 当然后来开发了强大的 GUI (仍有很多问题), 但是即使至尽, 还有很多人以使用 GUI 为耻, 以不使用 GUI 为荣...反正一些高手的意志是坚定的. 当然, 有时候 konsole 是很方便的并且占用很少的资源, 我尤其喜欢虚拟控制台.
为了人民大众,或者为了反对霸权,各linux 厂商终于争相开发 GUI, 然后所有的 OSs 看上去都差不多了。
|
|
2006-5-28 21:08 |
|
|
asbai
高级用户
积分 653
发帖 252
注册 2006-4-16
状态 离线
|
『第
110 楼』:
还想补充一下,记得 Kris 曾经在他的著名论述中,详细比较过经过完全优化的各种常用算法(诸如:快速排序,遍历和搜索,内存拷贝,快速傅立叶等等)与手工汇编等效代码效率之间的比较。
他使用了当今流行的几种C编译器,最终的比较结果是令人印象深刻的。最接近的性能差距也在50%左右。某些算法甚至会相差几倍。
|
|
2006-5-28 21:13 |
|
|
jawbin
高级用户
积分 994
发帖 444
注册 2005-1-29
状态 离线
|
『第
111 楼』:
从zyl910 兄的经历来看, RAD 有时候不仅增加开发速度,也不输运行速度,瞧我这中文,听起来别扭..
|
|
2006-5-28 21:13 |
|
|
asbai
高级用户
积分 653
发帖 252
注册 2006-4-16
状态 离线
|
『第
112 楼』:
Quote: | Originally posted by jawbin at 2006-5-28 21:08:
但对它的实际运用来讲, 很有区别.
Windows 仿佛就是 Macintosh 的一个 " clean rooming" 出来的"开放版", 意在"用户友好", 一蹦出来就 ... |
|
兄台在说的是用户对OS的感觉差异啊。。。。。小弟一直说的是OS之间在体系结构等技术上的差异。。。完全走岔~
|
|
2006-5-28 21:15 |
|
|
jawbin
高级用户
积分 994
发帖 444
注册 2005-1-29
状态 离线
|
『第
113 楼』:
当然了,从另一方面讲,如果利用商业开发工具只能开发出糟糕的工具,必然有人写出更好的工具.开放的和平等竞争的市场是不会倒退的.
|
|
2006-5-28 21:16 |
|
|
jawbin
高级用户
积分 994
发帖 444
注册 2005-1-29
状态 离线
|
『第
114 楼』:
asbai 兄, 就内部结构上, 我记得除了那三个模块最核心之外(可曾见过只有 kernel 的 windows 在运行?),而且,这三个模块之间也并不是优美的层间依赖关系,而是稍微有点点复杂(但是可能比蜘蛛网简单一些,呵呵),甚至互相引入对方的引出符号. 而且后来,一些符号也从一个模块移动到另一个模块了(这之中之一应该有 kernel 模块).
|
|
2006-5-28 21:32 |
|
|
asbai
高级用户
积分 653
发帖 252
注册 2006-4-16
状态 离线
|
『第
115 楼』:
Quote: | Originally posted by jawbin at 2006-5-28 21:32:
asbai 兄, 就内部结构上, 我记得除了那三个模块最核心之外(可曾见过只有 kernel 的 windows 在运行?),而且,这三个模块之间也并不是优美的层间依赖关系,耠... |
|
嗯?这么说兄台发现ntoskrnl.exe引用了user32或者gdi模块 export出去的接口?小弟从不曾在那个版本的windows上发现这个问题,呵呵。至于user32和gdi之间相互引用那是很正常的,它们都会需要kernel提供支持这就更正常了,不是吗?
|
|
2006-5-28 21:36 |
|
|
jawbin
高级用户
积分 994
发帖 444
注册 2005-1-29
状态 离线
|
『第
116 楼』:
不, ntoskrnl.exe 的模块名应该不是 kernel, kernel32.dll 的才是, 所以我说后来他们部分可能仅仅是占位符了, 就是因为 ntoskrnl 来了, 至于 kernel 模块, 可能会有, 我回去查查, 但是, 当然即使有也非常少.
|
|
2006-5-28 21:40 |
|
|
asbai
高级用户
积分 653
发帖 252
注册 2006-4-16
状态 离线
|
『第
117 楼』:
呵呵,kernel32.dll 只是为了Win32子系统编程方便而封装的系统调用接口,它本身是完全跑在用户模式的,和真正的OS Kernel还差很远,中间隔着 ntdll 和 sspt。
真正的kernel是包在ring 0的,只能通过sspt定义的接口访问到,sspt是真正的user mode(ring 3)到OS Kernel(ring 0)直接的界面,2K上的sspt是通过INT 23H实现,后来据说因为P4对INT指令支持效率太差,XP上换成sysenter指令了。
kernel32.dll只跑在user mode,它是Win32子系统的一个模块,它向下调用ntdll,ntdll负责访问sspt调用真正的kernel service。
兄台这次火星啦
|
|
2006-5-28 21:51 |
|
|
jawbin
高级用户
积分 994
发帖 444
注册 2005-1-29
状态 离线
|
『第
118 楼』:
在以前的 Windows 中, 据 未公开的 Windows 核心技术 这本书讲, Kernel 模块使用了 User 中的至少下述符号:
IsUserIdle, GetFocus, IsWindow, GetWindowTask,PostMessage.
在这里,可能还遗漏了其他的通过 GetProcAddress 来引入的符号.
当然它也讲了,这不是什么丢人的事,罗马不是一日建成的.
另外我在几年前测试的时候发现了这样一个有趣的现象, 那就是似乎 win16 比较"宽容", 不大小些敏感, 当使用 rundll 的时候, 这个特性更觉得有趣.
[ Last edited by jawbin on 2006-5-28 at 22:02 ]
|
|
2006-5-28 21:54 |
|
|
jawbin
高级用户
积分 994
发帖 444
注册 2005-1-29
状态 离线
|
『第
119 楼』:
asbai 兄, 我是从来没把 MS 声称的 kernel 当回事(当成真正的核心), 因为它并不名副其实, 所以我都是用它的官方术语或者字面来描述.
那么显然, 在 Windows 模块中, 如果要找出名字为 "Kernel" 的(具体来说,就是用GetModuleHandle 能取得 handle 的那个), 当然只有 krnl32.dll 了. 多年前, 恐怕 hal.dll 都不存在, 我们不能拿变动的来说事是吧. 例如中国可能已经这么多年是 P. R. China 的简称了, 说到它, 我们未必说, 它在若干年前是战国, 在若干年后又是元朝. 后来又有两部分,未被统一的一部分,和虎视耽耽妄图统一的一部分...
[ Last edited by jawbin on 2006-5-28 at 22:08 ]
|
|
2006-5-28 22:01 |
|
|
asbai
高级用户
积分 653
发帖 252
注册 2006-4-16
状态 离线
|
『第
120 楼』:
晕。。。完全没看明白兄台在说什么~
我刚刚说的Windows体系结构从NT时代开始就一直是这样了,难道兄台一直在跟我讨论的Windows是指Win3.x或Win9x ?
PS:能用GetModuleHandle取得handle的那个肯定不可能是OS Kernel,呵呵
[ Last edited by asbai on 2006-5-28 at 22:15 ]
|
|
2006-5-28 22:13 |
|