自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 收藏
  • 关注

模块化-续

我先从现有的模块结构说起,然后做一个分类和总结,同时预测一下未来的趋势最初的Fortran语言就提供了各种模块机制【当然,按照现在普遍的认识,不认为它们是模块,不过按照我的看法,它们显然是】。比如Routine,DataBlock等。后来出现了ADT,出现了Object,这些都是模块的具体例子。例程 主要用于重用一个抽象数据块 表达用于加工的原材料和结果的一种模块,可以认为是被动的...

2009-03-09 12:08:55 154

关于模块化

模块化是迄今为止对付复杂软件系统的最好的办法。问题并不在于上面这句话。问题在于怎么模块化。这儿的“怎么模块化”并不是说不知道模块化是把系统分拆成几个模块,组合而成系统。而是说不知道以什么规则指导我们进行模块分拆。当然,关于模块化,有很多非常著名的指导原则,最著名的莫过于“高内聚,低耦合”。可是这个原则有点太过空泛。即便如此,我们也很有必要研究一下这个原则。高内聚的好处是什么?为什么要高内聚...

2009-03-02 18:20:31 217

CSS和表格

今天看了[url=http://hax.iteye.com/]hax的blog[/url],不知道哪个项里面提到了CSS面对表格的col的时候的尴尬。后来深入思考了一下,发现这其实是一个本质性的困难。而且问题并不是出现在CSS上,而是出现在XML上。由于XML要求任何一个元素(除了根元素)都必须有且只有一个父元素,这就导致XML的table模型有些不自然,因为,一个cell显然是一个row...

2008-02-29 22:37:04 127

TimerAgent

一个定时器队列实现了一个高性能的定时器队列处理系统,基本的实现思路是把所有的定时器请求按超时的前后顺序排入队列中,然后不断的查看是否开始的定时器超时已经到达,如果到达则调用回调处理函数。这个定时器队列依赖于时间处理的函数和线程,这两个都是平台相关的,不过幸运的是我把他们包装起来了,也就意味着这儿有一个简单的线程包装库。同时有一个小小的可用的可池化的线程的实现。...

2007-11-13 16:38:01 118

一个简单的目录遍历器

只适合在Windows系统下[包括WinCE]使用。主要是因为依赖于Windows平台的CString和FindFirstFile、FindNextFile以及FindClose系列函数。其实对于CString的依赖并不是必要的,只是方便了Find*系列函数的调用而已。examples里面是一些使用这个简单遍历器的例子。包括删除目录中所有文件,复制到另一个目录,生成vector或者一个别的表达等...

2007-11-13 15:46:36 155

一点实用代码

有限状态机实现了一个确定型的有限状态机,可以向它注册状态跃迁规则和动作,然后在事件发生的时候通知它,别的都由它实现了。动作的原型是一个void (*)(void* params)的函数指针。FSM的实现不依赖于任何超越标准C++的内容,也就是说,它可以使用在任何支持标准C++的环境中。顺便说一下,我在WinCE和Windows上都使用过它。 HTML2TEXT一 个简单的例子使用有限状...

2007-11-13 13:33:10 105

合适的地方使用合适的技术

在合适的地方使用合适的技术,我想这一点没有人会反对。而且大多数人都会觉得做到这一点极端简单,无需乎强调。大家可能会觉得问题倒是在于怎么断定什么是合适的技术这个问题。但其实这两个问题(1、使用合适的技术,2、判定技术是否合适)并没有明确的分界线。因为显然如果不能判定技术是否合适,我们就不能使用合适的技术。现在说一下我判断技术是否合适的基本原则。1、要经过时间的考验。2、要有比较严密的理论基础...

2007-06-06 18:24:22 263

依赖顺序是罪恶

C和C++语言是流行和常用的依赖于顺序的语言。C++略为有点改进,在类范围内部不依赖于顺序。依赖于顺序是一种惩罚,是一种不重视程序员感受的表现,并且在深层次要求采用采用声明和实现分开,因而也就不能维持DRY原则。违背DRY会导致维护复杂。我详细说明一下为什么依赖顺序是罪恶的。大家都知道抽象是一种强大的能力,但是,依赖于顺序强迫我们只能从低层次的细节开始,这跟现如今流行的IDE的智能完成一样。我...

2007-02-16 19:23:30 177

软件开发的本质

关于这个话题,我似乎说过好多次了。软件系统其实就是现实系统的抽象,就是现实系统的模型。最近,看到一个论点,是这样说的:软件建模(架构)的过程其实就是一个定理证明的过程。我得说,在我看来,这有一定的真理性。但是事实有一定的差异。基本原因是:我们碰到问题的时候,并不总是对问题的解决方案一无所知的,或者更确切的说,对问题的解决方案几乎总是有一定的了解得。这时候,证明的过程其实并不是很明显,反而是表达的过...

2006-12-04 13:46:36 849

Event系统相关接口

interface EventTarget { void addEventListener(in DOMString type, in EventListener listener, in boolean useCapture); void removeEventListener(in DOMString type, in Eve...

2006-10-15 18:43:40 169

Style&CSS的编程接口

interface StyleSheet { readonly attribute DOMString type; attribute boolean disabled; readonly attribute Node ownerNode; readonly attribute StyleSheet ...

2006-10-15 18:43:06 242

Web Application API

由于Ajax的火爆,所以我会重点介绍与它相关的一些技术。下面的文档已经写了很久了,由于上一篇的尖括号搞的我非常之烦,现在才贴出来,见谅。我将从Window,XMLHttpRequest等这几个主要接口出发(Document前面已经描述了),描述客户端Javascript编程的主要轮廓。另外,值得注意的是,这个领域的变化仍然非常剧烈,我不保证我描述的东西都可用。无论是现在(我描述的东西还太新...

2006-10-15 18:29:55 402

XML基础

虽说我认为上面的东西基本上不言自明,但我也意识到,很多人并不是很清楚XML的基本概念。所以,我准备把上面的东西解释一遍,只解释那些我认为确实有必要解释的东西。一个XML文档就是一个文本文档。跟普通文本文档完全相同。只不过,它可能会比别的文本文档多了一些限制而已。一般来说,我们对于XML文档的直观认识就是:里面有大量的尖括号:)。是的,确实如此。XML文档被要求是Unicode字符集的文本文档。...

2006-10-15 18:16:37 180

JavaScript in Browser

介绍host概念与普通的语言不同的是,JavaScript一开始就被设计为一个嵌入式的语言。这意味着,它是寄生在某个环境中而不是自足的。当然,这也意味着其运行环境的边境就是JavaScript的能力边境。JavaScript所寄居的那个运行环境叫做JavaScript的Host。JavaScript跟Host环境之间可以进行非常方便的交流和沟通,并且,以其寄宿的Host作为自己的世界。Java...

2006-10-15 18:10:00 162

JavaScript RegExp

上面的描述中,我特意的省略掉了RegExp的具体描述。RegExp就是大名鼎鼎的规则表达式,我准备用一章描述之。规则表达式是用来在文本中进行高效查找和替换的一种语言体系。按照分类,它是正则文法。按照惯例,先说RegExp的literal。/.../...,这就是RegExp的literal,两个斜线中间夹着RegExp的主体内容,后面是可有可无的一些选项。我会先试图描述JavaSc...

2006-10-15 18:04:51 134

JavaScript语言教程

接下来我似乎应该给出各个对象的属性了?我给还是不给呢?给出吧。免得大家说我不厚道。arguments: callee, caller, length,同时,需要注意的是,它是一个数组,可以通过[]来访问它的各个具体的元素。其元素就是各个参数。Array: constructor, index, input, length, prototype concat(), join(), pop()...

2006-10-15 18:02:59 123

JavaScript系列教程-JavaScript语言教程

概述JavaScript是一个基于对象的面向对象语言,同时是一个函数式语言。跟我们常见的基于类的面向对象语言不同,JavaScript是基于对象的。这意味着JavaScript没有类的存在,只有对象的存在。这个同时也避免了基于类的面向对象语言学理上对于元类的要求,那会导致无限递归。原因是:类作为一种特殊的对象,其也应该有模版,也就是元类,依次类推下来。没有了类,这就要求我们的思路进行完全的...

2006-10-15 18:01:06 167

模型及其他

首先,是哲学的。柏拉图的理型世界。我们的世界是不完美的,但是有一个完美的世界作为我们的模型存在。比如:马,一匹马可能是三条腿,另一匹马的牙长得不好,但是它们都是马,它们都是理型世界中马的具体化。亚里士多德的反驳。亚里士多德认为,我们的世界并不需要一个先于我们的理型的世界的存在,因为:1、会导致事物的数量倍增。比如:理型的世界中的事物是不是另一个理型的世界中的事物的具体化?2、根据观察的经验,我们都...

2006-10-15 17:59:04 211

安全问题考虑

安全问题分成两个方面,一个是类型方面的,一个是对象方面的。类型方面的是对于一个对象集合作为一个整体进行考虑的时候的安全性问题,对象方面的是针对一个单独的对象考虑的时候的安全性问题。举个例子,只有外科手术医生可以给病人做手术,这就是一个类型方面的安全性描述,而张三这个神刀手可以不受限制的使用医院的医疗器械,这是一个对象方面的安全性描述。在计算机领域,我们经常看到所谓的基于对象的安全性和基于角...

2006-10-15 17:57:53 280

String的length

Java有一个叫做String的类,可以通过length得到String对象的长度。现在我要问一个问题,三秒钟给出答案:这个length是属性(Field)还是方法(Method)。1、2、3。你说是属性?你确认你说的对么?我们可以int n = String.length;但是不可以String.length = n;Why?你见过那个类的某个属性只可读不可写过?或许你能...

2006-10-15 17:54:06 225

原子性

原子性这个概念初想是非常简单的。它表示一个操作序列就像一个操作一样不被打断,而不像一个操作序列一样中间容许被打断。但是细想下来还是挺有点意思的。首先需要确定的就是什么是一个操作?而什么不是一个操作却是一个操作序列?其次需要确定的是如何叫做像?怎么着就是不像了?另外,还有一个牵扯进来的概念就是原子性的范围和其在什么程度上实施这种保证。或许我这儿说的有点形而上,那我们就形而下的举出例子抓住原子性这个概...

2006-10-15 17:50:55 407

同步

我先说说同步的概念。同步的前提是并行,或者同时或者并发。没有并行,不会涉及到同步。有时候,我们把同步看作一个名词而不是动词,那么导致同步的那种动作或者方式叫做同步化。在我这儿,同步或者是名词或者是动词,依赖于上下文。我举例子来说明同步是什么,然后再说我们如何实现同步。两个人,A和B,A邀请B去帮他到d地去搬一块大石头,石头很大,一个人搬不动。B同意了。B告诉A说他不知道d地在哪儿,让A...

2006-10-15 17:50:12 114

线程池的传说

线程池一直是一个比较神秘的概念,在很多程序员心中。说到线程池,不能不说说线程的概念,也不能不说说池的概念。线程就是一个执行线索,或者说一个执行序列,调度器分配给它cpu,它就可以撒欢了。说起来也是蛮容易理解的一个东西。不过首先需要注意的是它表示的是一个动态的概念,是一个运行的指令序列。池其实是一个比喻,表示一种容器,这种容器的特点是:容纳预定义个数的对象,只不过它们(这些对象)都处于非激活...

2006-10-15 17:47:27 88

关于软件工程,我还有话说

软件工程,乃至于所有的工程,其目的都是完成设计目标,达到预期的目的。工程管理就是协调人、工具和过程,使之最终达到需要的结果。具体的说,就是让人使用一定的工具,按照一定的组织过程,最终完成任务的一个体系化的方法。这个大家都是认可的。但是……但是有好多因素导致这么简单的一个体系化方法展开失败。第一个最主要的因素是工程目标本身。并不是说软件工程的目标有多么不清晰,多么难以琢磨,而是说,大多数人都...

2006-10-15 17:46:40 119

关于x86系列CPU的段

x86系列的CPU是指最早由Intel公司生产的8086系列以及以后的后继产品,也包括了各CPU生产厂商仿制的产品。但不包括后来的各种形式的64位的CPU。段是一个存储概念。下面描述的主要是我的想象,你可以把它当成演义来看:),不必当真。从8086 开始,Intel的CPU就已经是16位的了。所谓16位,是指它的数据总线,地址总线(注意,地址总线并不是如此的,后面会有详细的说明,事实上...

2006-10-15 17:45:23 300

什么是所谓的Windows子类化

面向对象大家都清楚。现在OO的主流是基于类的面向对象。子类化故名思义就是定义一个子类,也就是要订制一个类变成一个新类的意思。不过Windows的子类化不是如此。首先,我们知道,除了基于类的面向对象以外,还有基于原型(或者叫基于对象)的面向对象。Windows是一个基于对象的OS,它的对象系统更倾向于基于原型的OO。Windows开发的一个核心概念是Window,也就是常说的窗口,所有的一切...

2006-10-15 17:44:43 284

集合和类型系统

集合的概念可以说是非常一般的。很多人都知道。就算不知道,我们也可以在非常短的时间内给他灌输这个概念。为了避免后面饶舌,我现在就先实施灌输:)集合就是一堆东西。东西就是直觉能区分的个体(康托尔语)。这一堆东西中的每一个都叫做集合的元素。集合中元素的个数叫做集合的阶。全集就是包含全体东西的集合。空集就是没有东西的集合。似乎很简单直觉,其中比较绕的东西我就不提了(如果有兴趣,想想全集的概念,或者想想...

2006-10-15 17:43:41 209

科学的本质

科学是什么?我准备从归纳和演绎两方面给出结论。科学就是研究规律的学问。学问是啥?学问就是人的意识世界里面的一些活动。这是演绎的说法。这里面需要深究的就是:什么是规律了。归纳。我们从某些公认的科学分支出发,给出科学的定义。物理学,研究自然界各种真相以及给出规律的科学。经济学,研究人类社会生产和分配,交换和消费的规律的科学。……诸如此类的。这样,我们归纳出来科学就是研究规律的。那么,它怎么...

2006-10-15 17:42:16 396

语言的一些思考

近几年来,我越来越多地思考语言问题。或者换句话说,表达方式问题。当然,我认为维特根斯坦后期的哲学是对的,虽然还不够精细。也就是说,我认为语言寄生在要表达的问题中,并强烈依赖于“生活方式”。让我们把焦点聚拢一下,对准计算机程序设计语言这种人工语言,好使的我们的讨论可以落到实处。上面说到,语言与问题密切相关,那么我们看看计算机程序设计语言关联的问题是什么。计算机程序设计语言泛泛的说,是要解决各...

2006-10-15 17:40:51 116

对象生命周期与内存模型

内存模型是随着越来越丰富和复杂的对象生命周期要求的发展而发展起来的。最初的内存模型完全是线性的,静态的,一个程序运行时所有需要的对象都是在运行前完全准备好了的,运行完了时释放掉。典型的代表就是Fortran语言。这种语言的运行性能非常高(当然了,没有任何别的消耗嘛),但是表达能力受到限制(毕竟,要求静态的确定一切对象和内存的绑定关系)。最明显的一个限制就是没办法支持递归。这种内存模型支持的...

2006-10-15 17:39:36 103

契约、并行和异常

一直认为,契约是类型系统不可或缺的一部分,虽然现在的主流语言都缺乏它。我们知道,现在的组件都是隐藏其实现,公开其接口的。这为大型的复杂系统提供了必要的抽象机制,可是,现在的接口都是只描述了组件可以接受的消息类型(或者习惯上称作方法的签名),对于该组件在什么状态下可以接受该消息,该消息有什么要求和限制,以及组件对于该消息的响应是如何的都没有描述。这些是应该描述的。在支持契约的Eiffel语言中,它们...

2006-10-15 17:38:11 131

软件工程、代码注释以及其他

自从1970年NATO会议以后,软件工程这个词就正式进入了软件开发领域,并且占据了越来越重要的地位。不可否认,软件工程确实为软件开发带来了一些作用,但是软件工程的缺陷也是很明显的。其中涉及到好几个方面的核心问题,现在暂时无法解决。第一个问题是人的问题。人不是机器,虽然有时候经过比较严格的训练在某些时间段可以表现得跟机器差不多,但毕竟不是真正的机器,这就是说,人的输入和输出并不是恒稳的。这是...

2006-10-15 17:36:08 491

软件开发行业技术问题思考

针对这一行,主要是两方面的问题,一方面是软件开发行业内部的问题,一方面是软件开发行业外部的问题。软件开发行业能够存在,主要是因为外部问题的存在。而由于软件开发行业的不成熟性,内部问题是现在该行业的主要问题。外部问题是该行业创造价值的地方,内部问题是该行业解决问题的地方。外部问题最终总是落实成内部问题解决掉的。有千奇百怪的外部问题,但是内部问题确是有限的。所以计算机科学研究的总是内部问题。...

2006-10-15 17:34:10 564

Ajax的异步用户交互模型问题

Ajax是为了应对让人不耐的WebApp的高延迟而搞出来的一套技术框架。原始的WebApp的Browser和Server是串行运行的,一边工作时,另一边等待。这浪费了整个系统的运算能力。Ajax在Browser端引入一个执行引擎,它一边应付user的请求,一边把某些必须交给服务器处理的东西背地里传送给服务器,同时背地里把结果准备好(接受服务器端的数据),展现给客户。这极大地增强了WebAp...

2006-10-15 17:32:34 139

可执行文件格式详述,ABI和loader……

上回书说到可执行文件的格式,这一节详细描述一下。可执行文件是由头和体组成的。这跟别的复杂一点的文件一样。它的体分成一些叫做节(section)的东西,这是它的特色。另外比较有特色的东西是:我们一般把可执行文件叫做程序的影像(image)。唔,这个叫法也不赖。可执行文件的价值在于执行,执行的程序也就是活着的程序叫做程序的影像。呵呵,这个概念打通了文件和进程的通道,以前说过的loader。一般情况...

2006-10-15 17:28:41 176

操作系统,loader以及应用服务器

这是该系列的第二部分。上次说道,OS主要分成计算的管理,存储的管理和IO的管理,其中,计算的管理从OS的角度来看是最重要最根本的。注:我们暂时不考虑并发。我们现在要从一个动态的角度看问题了。基于程序存储+图灵机这个基本思想,我们构建了现在形形色色的计算机系统。既然程序是被存储的,那么它一定被放在存储系统里面,而对于运算,实际上是一系列的指令来控制计算的进行。这里面就涉及到存放在...

2006-10-15 17:27:32 269

操作系统系列之概述

对操作系统的研究已经很久了,一直以来比较喜欢这方面的东西,从现在开始,我要把我所了解的OS的各个方面一一描述出来。基本的描述风格事先抽象后具体,先轮廓后细节。OS其实是一个大家都知道一些的概念。但是我说得有可能跟传统的说法有些不一样,我按照我的思路和节奏说这些问题。希望大家多提意见。说到OS,一定要先从冯诺依曼抽象机器说起。冯诺依曼机器是图灵机器加上程序存贮这个特性形成的。冯氏机器...

2006-10-15 17:25:57 125

基本概念辨析

抽象:抽象就是有选择的忽略。至于为什么要忽略,忽略什么,这个是由人选择的:)。抽象的用处在于处理复杂性。人类处理复杂性的基本方法就是抽象,有意的忽略某些从这个角度看过来无关大局的东西以求得整个系统的简单和清晰。抽象是因人而异,因角度而已,因层次而已的。抽象可以分层。也就是说抽象地输入也可以是抽象而不是实体。抽象并不是完全相同的,甚至可以说,对于不同的人,抽象一般是不同的。虚拟:恩,这个概念比较...

2006-10-15 17:25:13 354

类型,转换,数组,协变及其他

为了让叙述简化,先定义几个用到的术语:函数:可以给出输出的那种抽象体,变量可以认为是无参数函数。对于成员函数或者更习惯的叫做方法的那种函数,我认为它就是隐含了对象参数的函数。类型系统是现在OO语言的核心和基石。类型系统是保证正确性的基础,现在的编程语言大多强调静态安全性,其实就是编译时类型正确性。动态类型系统对应着运行期类型检查,保证运行时的类型正确性。经常所说的安全性其实就是类型...

2006-10-15 17:22:11 165

C/C++之冲突和共处

C没有抽象数据类型的能力,C++支持ADT,同时支持OO,而且还是多继承的OO,同时支持接口继承和实现继承。所以引出一大堆问题和冲突。其中最主要的是关于初始化的问题。我们知道,C/C++严格区分初始化和赋值,很多人觉得挺奇怪,初始化不就是初次赋值么?呵呵,似乎就是,又似乎不是。初始化是在定义的时候赋值。那位说了,这有啥好处?这涉及到一个程序状态正确性的说明性方法的问...

2006-10-15 17:21:26 398

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除