基于操作系统设计的开发环境的设计概要(下)
这部分写的粗略了点抱歉
四、调试模块(续)
5、单CPU多进程调式
前面讨论的各种复杂情况均可以化解为这个情况,即单CPU多进程,而多CPU多进程和多机多进程只是增加了通信同步上的困难,它们的基础都是单CPU多进程
在此讨论的进程,均为含有调式代码的进程,并非一般的软件产品,而且调式器进程是一直处在运行状态
单CPU多进程的调式困难在于不同操作系统对进程生成的方式变化太多,没有多大的定论
如果进程只能通过运行可执行文件来实现则会变得简单,只要在编译阶段将相应的调式代码融入可执行文件中,中间采用一种系统提供的进程间通讯方式,即可完成和调式器的连接
但有一个特殊的地方,如UNIX类的操作系统均采用了一种FORK方式来生成新进程,这为调式自动化造成了一定的障碍
因为在编译阶段要自动判断出用户代码具体生成新进程位置并进行相应的处理,会使得编译器成为操作系统的附属品,而且实现中有一定的难度,用户调式中可能仅对某个进程感兴趣,无须为调式,造成太多的资源耗费,希望各位能帮我想想,有没有好方法实现
一个方法是,编译器不考虑FORK方式,而是提供一种进程标签,由用户自己的标明生成新进程的地方,提示编译器去该处添加处理代码,这样即使对付FORK变种形式也很轻松了
缺点:需要人工实现,显得智能不够
但由此可推导出很多新的调式标记,如记数标记等,希望各位能多想出点好标记
6、调式系统
由前面的讨论可以看出,要实现强大的调式功能,最好是将调试模块做成一个大的调式系统
编程的人遇到这样的困难很多吧,就是打开了一大堆的代码窗口,调式的手忙脚乱,而在WINDOWS基础下,一些鼠标动作和窗口切换会导致不必要的消息处理,使得调式器狂跳一阵
个人认为最好的调试方式是C/S方式,将被调式应用和调式界面分在两个机器中,可以避免使用者在调式界面上的一般操作如鼠标移动等会影响被调试程序
也许有人说,用双屏幕就能解决
不过用C/S或者说是分布式调式系统,可以使得多人同时调试一个系统成为可能,甚至通过广域网来协同调试也行,只要速度不是关键,这样的方式对调试一般的非操作系统式系统会很有帮助的,因为可以跨系统调式,因为中间是通讯接口,不存在操作系统的差异而产生的无法调试
前面讨论的仿真调式方式、子母系统调式方式和内嵌调式器方式均能做成分布式调式系统
五、编译模块
编译理论的发展史远大于我的年龄了,已经成为一门非常成熟的理论,但不完善,毕竟还不能做到自动化编程,希望有生之年能看到自动化编程的实现,最好是有我的功劳,不好意思
在这个设计中,突出考虑的灵活度,而从前面的视图分析和调式分析可以看出,将编译器从铁板一块,分成多个子模块的重要性
至少词法分析和语法分析的分别独立是非常重要的,这可以使得整个系统的功能设计上的灵活度大大增加。它们是形成视图的基础,和进行调式的数据来源
而对编译器自身来说,将其能分割的各个模块尽量的独立,只是用一个大的框架来组织起来有如下优点:
1)便于多种语言的使用同一个编译器,差别可用语言描述脚本来叙述
2)便于移植,不同的硬件体系的运行代码差异可以在目标代码层中兼容,这点和C#语言的想法有点类似
3)便于所有的爱好者将自己的算法添加入系统进行比较,解决编译课程局限于理论的局面
现在写编译器还是有一定难度的,虽然GCC的代码已经公开,但相关的分析文章很少,我也准备在有条件的情况下去分析,因为几个月粗略的看过,发现它写的很乱,使我对GCC的好感大跌
希望有更多的人加入分析编译器代码的行列
对编译器的分解可以很轻松的按照现有书本上的理论大肆分割,越细越好,在写正文前,我也要再看一遍相关的书了
六、类库设计
类库是现代开发系统必可少的部分,也是决定该系统是否实用的关键
但关于整体类库设计的资料几乎没有,连关于为什么MFC会是现在这个样,都没有人来解释
一个基于操作系统设计的开发环境,是不能按照现有的类库方式设计的(而且也不知道它们的设计考虑的初衷)
现有的类库如著名的MFC,它仅仅是操作系统的一个附属,主要是用来开发应用软件的,其本身受到WINDOWS体系的限制太多
在此将从操作系统的理论基础来分析类库的设计思路,毕竟现在的应用软件是建立在操作系统上的,由此推导出来的类库,对应用软件的设计同样适合
操作系统现有理论是按功能模块来分的,实质是每个模块都是一种大的资源类,因此这里将从资源的角度来分析
操作系统资源
|
|—— 启动必须的资源,基本硬件资源(如CPU时间片,硬中断,存储器)
| (核心资源,一级资源)
|
|—— 为应用软件提供的应用接口资源(如API)
| (第二级资源,一种由操作系统定义的协议资源)
|
|—— 应用软件产生的应用资源(如各种控件)
| (第三级资源,最常见的就是图形界面,它本身是操作系统的应用软件)
| (然后从视觉上取代了操作系统,给人感觉操作系统就是视窗)
| (现在正逐步发展成一种应用协议资源)
|
|—— 第三方协议形成的资源(如网络协议)
(独立资源,常和相应的硬件一起存在)
还有一种是真正的基础资源,就是语法和数据结构及相关的无数痛苦的算法
也就是把编译器的基础分解后的结果
基础资源(逻辑资源)
|
|—— 语言定义规则
|
|—— 简单的数据结构(如数组、列表、图等)
|
|—— 其他(为我现在还不知到的东东预留的位置)
现有的类库已有这样的发展趋势了,所以大家努力,还是很容易超过老外的
一点说法
屏幕是视窗类存在的基础,因此视窗类虽然占有了现在多数类库的大半江山,但它不过是操作系统的一个小资源,而且不是必不可缺的资源
曾考虑过关于声音空间的一些概念,最后发现有类似产品出现,但好象很少听得到
听觉是一种唯一能和视觉相比的人信息接收功能
而声卡的功能还远远没达到屏幕那样的地位,等到真正的空间地位声音编辑系统产生的那天,我们就能象处理视窗那样,定位编辑我们耳朵能听到的三维空间的声音了
七、文档管理
关于文档重要性的书和资料是铺天盖地的,此处仅以开发环境设计的需求角度考虑对文档管理进行分析
1、附属的地位
长期以来文档编制都是一个难题,因为很难方便的融入编码过程中,往往是编码结束甚至是调式结束后才编制文档,使得大家都说文档重要,而实际上它是个附属品
作为一个大系统的开发,文档从开始的调研、建模、编码、调式和最后的产品生成都分不开的
而从前文可以看到相应的逻辑视图也是相同的地位,甚至是一一对应的,如将文档和视图结合,则可以将文档的附属地位改变
最简单的考虑就是,文档从某种意义上讲是各种视图的文字注释
所以产生的需求就是,要将文档从现有的长篇大论型的独立结构变成无数细小的文块,将其融合进视图中
另一种客观原因也导致了文档难被重视,就是现有的开发环境本身就没有考虑文档的位置,只是让开发者用一般的文本方式处理,并不对文档进行系统的管理,使得从使用开发环境之初,就很容易忘记了文档编写,而精力都在代码编制上了
文档是系统设计中一个特别环节,它需要更多的人为管理,自己的约束力较弱,将文档分成细块融入视图,便能从一个角度上形成了文档对比,是一种驱动文档编写质量提高的方式
2、文档管理目标
1)克服从属地位
2)即时文档编制
3)形成文档对比
细分文档不可变更,只能更换,但被更换文档必须保留
环境设计中能考虑到的就是尽量将无须人为干涉的功能作好
而文档的人为管理,在很多资料中都有
(关键是我还没怎么去细看过)
3、设计方式
从前面的分析过程可知,是一种先分后合的方式,细分是让用户对各技术细节独立编写文字,要能做到,想到啥就能写入,是一种简单积累方式,配以视图的可视效果来表示,在每个阶段完成后,这些文字片段就是原始资料,编写相应的长篇大论也能得心应手。
作为整体的一部分,文档编制模块就有了一定的难度,因为是细分,选择数据库为存储基础变成为方便之选,为了写入方便,难度是增加在编辑模块上了,幸好编辑模块是最最成熟的工具。
一般情况下,编程时间的文档融合对整体设计的要求不高,而调式中的调试文档的生成,因为调式模块结构变复杂了,相应的文档编制设计也复杂了
当调式模块成为分布式系统时,文档编制也将成为一个分布式系统
即选择集中式存储管理方式,分布式写入。
八、简单的总结
总得来说整个开发环境应做成分布式结构,当然也能只在一台机器上运行,这中间并没有冲突
以协同开发环境为基础,如协同编辑系统的实现,已经有很多文章了,可以很好的借鉴
最好的管理方式是帐户式管理,每个开发小组的成员一个独立帐户,满足系统开发的整体安全性
九、后记
这是一篇概要,很多地方写得粗略了,因为赶时间,希望能得到更多人的意见
最近在书店发现不少相关的好书,又厚又贵的,实在是囊中羞涩,打算天天泡书店了,这就是没工作的唯一好处,空闲的时间特别多,为了写正文,得大量充电了
希望各位多提意见,啥都可以,或者是你的一些不相干的设计思路,因为系统思维本质上是相通的,只是看到的表现形式千变万化
再一次写上我的邮箱:
估计在圣诞前能完成正文,要看各位能否帮我了

有点意思,希望看到更详细的文档及实施计划。
有点意思,但人家做的研究更加彻底和实际,相对来说新的东西不多~~~~
看来我们需要的不是某个软件,而是一个软件开发理论和相配套的开发工具。我觉得编软件,把设计变为代码的工作应由电脑去做,这就需要让电脑能看懂人的设计,可以在增强开发工具的功能的同时在设计方法上也向电脑能看懂的方向靠拢。另外,把模块图形化并以图形为基础进行管理,调试时通过观察数据流的流向示意图来调试也可以提高效率。
sjinny朋友的说法很正确,不过现有的智能还不够实现自动编程
而所有逻辑均由图形表达,也很难看懂的,而且工作量和写代码一样大,甚至更大
因为我在以前的一个公司里写过纯图形的开发软件,是图形化流程设计工具,没有任何脚本描述
如果各位有CTI方面的经验,就会知道CTI中用的就是图形表达方式
但只有结合脚本的方式,才能真正做到人能承受的范围
现在我正考虑如何将UML真正的结合到代码编制和调式中,
在开发工具中,我个人认为模型设计只需表达为视图结构
如何描述是具体使用者的任务
我现在正考虑如何将视图变成动态结构融入具体代码测试中
因为任何调式和测试都有相应视图表达方式
关键是如何提供一种脚本描述方式,来让用户以简单的描述过程,然后自动生成相应的视图和调式代码
大家是否有好的建议提供
请教一下,参照 Zope 这样基于对象的开发方式,通用程序设计时是否也可以采取同样的思路,一个进程,一个数据类型,一个 widget 等等都通过创建对象的形式来建立。然后由开发环境分析这些分散的代码,重新组合起来递交编译器编译。
具体地说不清楚,但很简单,先去 http://www.zope.com http://www.zope.org 那看一下 Zope 是啥玩意,然后将它的设计思路并入通用程序设计,再无边无际的乱想吧~~~就明白了。
有点类似于纯图形的开发工具,但每个图形表示一个对象,该对象的具体代码既可以自己写,也可以像 frontpage 这样的 HTML 编辑器根据预先提供的指令组装。当然,对象都有一大堆属性,如 Abstract Data Type 的对象有数据类型为什么,取值范围是多少,相关操作是什么等等。
不知道可行否?我正在想,如果大家认为可行,就开始朝这方向干活了。
ps:上文太简略了,可能让人难以明白,主要昨晚写了 500 多字还没写完多少,就懒的写了,大家看过 Zope 和图形开发工具后联想联想就明白了。
惭愧~~~惭愧~~~昨天下午去买了一本 UML 的书,才发现人家 n 年前就有这想法了,我想出来的只是打个相对来说打了折扣的思路(或许更容易实现)。
今后要向诸位前辈多多指教了~~~~
uml是面向对象的模型设计方式
因此属于正向工程,但对细节不够深入,因为所有的细节必然是建立在过程设计上的
在逆向工程方面,它有较大欠缺,因为如果源代码是面向对象的,还能有对象可简单提取,而现在还是有大量的过程方式代码,对此分析应当建立在形式符号分析上,如果是对可执行文件的话,所有面向对象设计的程序最终还是成为非对象的过程代码
我现在的思路是从编译器的规范表示(词法、语法、语义描述等)中提取逆向过程的基本视图方式,作为通用编译器和调式器、测试的基础
现在还有很多困难,比如如何描述基于代码的视图,最简单的是流程图方式,但它过于繁杂,不利于全局考察,使用函数名关系表是一种好的入手点,但缺乏进一步提取的描述方式,如怎样表达一用户定义的状态过程描述,使视图生成器自动提取相关的函数名构成一个状态图
uml方式和基本代码间缺乏一种紧凑的连接,我想通过视图方式连接
uml中的视图是建立在面向对象的,属于高层分析,实际中过程视图是最贴近代码和调式过程的,而uml中很多方法和概念可以直接借鉴
望各位能发表更多相关意见
我想先试试自己的想法,写出一个实验环境再说,这样比较有实际体会。
因为自己对 GUI 都还不懂,刚好借此学好,研究+学习,很划算的事。
关于视图
最近我有了一种新的考虑方式
不过主要是针对逆向工程
采用图论的理论基础分析视图
出发点代码整体结构是一张图,各种函数是一种较为独立的'子图',但之间的连接关系比较复杂,感觉存在'子图'分解的方案
看看各位能否出点方案