interface EventTarget {
void addEventListener(in DOMString type, in EventListener listener, in boolean useCapture);
void removeEventListener(in DOMString type, in EventListener listener, in boolean useCapture);
boolean dispatchEvent(in Event evt) raises(E ...
- 18:43
- 浏览 (557)
- 评论 (0)
interface StyleSheet {
readonly attribute DOMString type;
attribute boolean disabled;
readonly attribute Node ownerNode;
readonly attribute StyleSheet parentStyleSheet;
readonly attribute DOMString href;
readonly attribute DOMString ...
- 18:43
- 浏览 (549)
- 评论 (0)
由于Ajax的火爆,所以我会重点介绍与它相关的一些技术。下面的文档已经写了很久了,由于上一篇的尖括号搞的我非常之烦,现在才贴出来,见谅。
我将从Window,XMLHttpRequest等这几个主要接口出发(Document前面已经描述了),描述客户端Javascript编程的主要轮廓。另外,值得注意的是,这个领域的变化仍然非常剧烈,我不保证我描述的东西都可用。无论是现在(我描述的东西还太新)还是以后(而且还没有定型)。
interface XMLHttpRequest {
attribute EventListener onreadystatechange;
...
- 18:29
- 浏览 (2069)
- 评论 (0)
虽说我认为上面的东西基本上不言自明,但我也意识到,很多人并不是很清楚XML的基本概念。所以,我准备把上面的东西解释一遍,只解释那些我认为确实有必要解释的东西。
一个XML文档就是一个文本文档。跟普通文本文档完全相同。只不过,它可能会比别的文本文档多了一些限制而已。一般来说,我们对于XML文档的直观认识就是:里面有大量的尖括号:)。是的,确实如此。XML文档被要求是Unicode字符集的文本文档。当然,它可能有多种编码方式(比如:utf7、utf8、utf16le、utf16ge等等),但这不是我们关注的焦点。顺便说一句,xml文档一般不需要bom字符,当然如果你加上了bom,你的xml必须没有 ...
- 18:16
- 浏览 (579)
- 评论 (0)
介绍host概念
与普通的语言不同的是,JavaScript一开始就被设计为一个嵌入式的语言。这意味着,它是寄生在某个环境中而不是自足的。当然,这也意味着其运行环境的边境就是JavaScript的能力边境。JavaScript所寄居的那个运行环境叫做JavaScript的Host。JavaScript跟Host环境之间可以进行非常方便的交流和沟通,并且,以其寄宿的Host作为自己的世界。JavaScript的Host多种多样,包括Browser,Web Server,Flash player,Photoshop,……以及所有支持以JavaScript为其接口脚本语言的各种环境。这儿,我们的重点 ...
- 18:10
- 浏览 (1280)
- 评论 (0)
上面的描述中,我特意的省略掉了RegExp的具体描述。RegExp就是大名鼎鼎的规则表达式,我准备用一章描述之。
规则表达式是用来在文本中进行高效查找和替换的一种语言体系。按照分类,它是正则文法。
按照惯例,先说RegExp的literal。
/.../...,这就是RegExp的literal,两个斜线中间夹着RegExp的主体内容,后面是可有可无的一些选项。
我会先试图描述JavaScript的RegExp的内容和模式,然后描述它的接口和用法。
JavaScript的RegExp是经典RegExp的扩充,但完全兼容经典的RegExp,同时,也几乎完全兼容Perl的RegExp。
Patte ...
- 18:04
- 浏览 (1089)
- 评论 (0)
接下来我似乎应该给出各个对象的属性了?我给还是不给呢?给出吧。免得大家说我不厚道。
arguments: callee, caller, length,同时,需要注意的是,它是一个数组,可以通过[]来访问它的各个具体的元素。其元素就是各个参数。
Array: constructor, index, input, length, prototype concat(), join(), pop(), push(), reverse(), shift(), slice(), sort(), splice(), toLocaleString(), toSource(), toString(), uns ...
- 18:02
- 浏览 (602)
- 评论 (0)
概述
JavaScript是一个基于对象的面向对象语言,同时是一个函数式语言。
跟我们常见的基于类的面向对象语言不同,JavaScript是基于对象的。这意味着JavaScript没有类的存在,只有对象的存在。这个同时也避免了基于类的面向对象语言学理上对于元类的要求,那会导致无限递归。原因是:类作为一种特殊的对象,其也应该有模版,也就是元类,依次类推下来。没有了类,这就要求我们的思路进行完全的转变。我们不再有能力定义一个对象的模版,然后具体的构造出来一个对象。我们自然也丧失了类继承这种方便快捷的重用手法。这会让很多没有基于对象的OO语言背景的程序员感觉困惑、不满和失望。但是,基于对象的面向对象 ...
- 18:01
- 浏览 (620)
- 评论 (0)
首先,是哲学的。柏拉图的理型世界。我们的世界是不完美的,但是有一个完美的世界作为我们的模型存在。比如:马,一匹马可能是三条腿,另一匹马的牙长得不好,但是它们都是马,它们都是理型世界中马的具体化。亚里士多德的反驳。亚里士多德认为,我们的世界并不需要一个先于我们的理型的世界的存在,因为:1、会导致事物的数量倍增。比如:理型的世界中的事物是不是另一个理型的世界中的事物的具体化?2、根据观察的经验,我们都是先有现象和事物的知觉,后有模型和概念。模型的作用。模型是对现实世界的抽象,抽象是有选择的忽略。模型就是对现实世界有选择的忽略。其作用就是让我们可以在智力许可的范围内尽可能的把握希望把握的那个方面。模 ...
- 17:59
- 浏览 (322)
- 评论 (0)
安全问题分成两个方面,一个是类型方面的,一个是对象方面的。类型方面的是对于一个对象集合作为一个整体进行考虑的时候的安全性问题,对象方面的是针对一个单独的对象考虑的时候的安全性问题。
举个例子,只有外科手术医生可以给病人做手术,这就是一个类型方面的安全性描述,而张三这个神刀手可以不受限制的使用医院的医疗器械,这是一个对象方面的安全性描述。
在计算机领域,我们经常看到所谓的基于对象的安全性和基于角色的安全性。当然,计算机领域又给出了一些错误的区分(我是指他们总是强调描述粒度这个无关紧要的细节)。实际上,这就是我上面所说的类型和对象的区分。
首先,我们的类型是对象的类型,其次,一个对象可以有多个类型 ...
- 17:57
- 浏览 (277)
- 评论 (0)
Java有一个叫做String的类,可以通过length得到String对象的长度。
现在我要问一个问题,三秒钟给出答案:
这个length是属性(Field)还是方法(Method)。
1、2、3。
你说是属性?
你确认你说的对么?我们可以int n = String.length;但是不可以String.length = n;Why?你见过那个类的某个属性只可读不可写过?
或许你能联想到JavaBean里面的某些规定。确实,有了JavaBean规范,我们可以实现这样一个可读不可写的Property。但问题是String不是一个JavaBean。所以,这里的String是一个不能用Java语 ...
- 17:54
- 浏览 (290)
- 评论 (0)
原子性这个概念初想是非常简单的。它表示一个操作序列就像一个操作一样不被打断,而不像一个操作序列一样中间容许被打断。但是细想下来还是挺有点意思的。首先需要确定的就是什么是一个操作?而什么不是一个操作却是一个操作序列?其次需要确定的是如何叫做像?怎么着就是不像了?另外,还有一个牵扯进来的概念就是原子性的范围和其在什么程度上实施这种保证。或许我这儿说的有点形而上,那我们就形而下的举出例子抓住原子性这个概念的直观感觉。
先举一个CPU指令集中常见的一个指令:CAS。看到这个指令我就仿佛看到了大家脸上的某种意味的笑容。呵呵,是的,它完成两个操作,一个比较,一个交换,后一个完不完成依赖于前一个操作的结果, ...
- 17:50
- 浏览 (491)
- 评论 (0)
我先说说同步的概念。
同步的前提是并行,或者同时或者并发。没有并行,不会涉及到同步。有时候,我们把同步看作一个名词而不是动词,那么导致同步的那种动作或者方式叫做同步化。在我这儿,同步或者是名词或者是动词,依赖于上下文。
我举例子来说明同步是什么,然后再说我们如何实现同步。
两个人,A和B,A邀请B去帮他到d地去搬一块大石头,石头很大,一个人搬不动。B同意了。B告诉A说他不知道d地在哪儿,让A领着他去。让A第二天早晨到 B家门口等着B出来,然后一起去。A走路的速率比较高,而B恰恰相反。从B家门口到d地有两个拐弯,用b和c表示罢。为了叙述方便,我把B家门口用a表示。现在总结一下涉及的对象。a,b, ...
- 17:50
- 浏览 (345)
- 评论 (0)
线程池一直是一个比较神秘的概念,在很多程序员心中。说到线程池,不能不说说线程的概念,也不能不说说池的概念。
线程就是一个执行线索,或者说一个执行序列,调度器分配给它cpu,它就可以撒欢了。说起来也是蛮容易理解的一个东西。不过首先需要注意的是它表示的是一个动态的概念,是一个运行的指令序列。
池其实是一个比喻,表示一种容器,这种容器的特点是:容纳预定义个数的对象,只不过它们(这些对象)都处于非激活状态,一旦需要这种对象,就激活这些对象,把它们从池子中拿出来用,当不需要的时候再次放入池子中,进入钝化的状态。池的目的是希望通过减少创建和销毁对象的次数而提高性能,当然,这是一个典型的用空间换时间的策略。 ...
- 17:47
- 浏览 (397)
- 评论 (0)
软件工程,乃至于所有的工程,其目的都是完成设计目标,达到预期的目的。工程管理就是协调人、工具和过程,使之最终达到需要的结果。具体的说,就是让人使用一定的工具,按照一定的组织过程,最终完成任务的一个体系化的方法。这个大家都是认可的。但是……
但是有好多因素导致这么简单的一个体系化方法展开失败。第一个最主要的因素是工程目标本身。并不是说软件工程的目标有多么不清晰,多么难以琢磨,而是说,大多数人都没有意识到,软件系统是作为现实系统的一个对偶系统存在的,而且,一般情况下,软件系统总是对现存系统的某种改变而不是从0开始构造。所以,我们拿到一个目标以后,不考虑现实的状况而直接分解目标,给出方案的方式是极 ...
- 17:46
- 浏览 (240)
- 评论 (0)
x86系列的CPU是指最早由Intel公司生产的8086系列以及以后的后继产品,也包括了各CPU生产厂商仿制的产品。但不包括后来的各种形式的64位的CPU。
段是一个存储概念。
下面描述的主要是我的想象,你可以把它当成演义来看:),不必当真。
从8086 开始,Intel的CPU就已经是16位的了。所谓16位,是指它的数据总线,地址总线(注意,地址总线并不是如此的,后面会有详细的说明,事实上,它的地址总线是20位的),各个寄存器都是16位宽的。那真是一个简单的年代。16位地址总线意味着可以寻址64K的地址空间。甚至在那个年代,64K也有点小了。所以Intel决定(配合IBM的要求)采用20位地 ...
- 17:45
- 浏览 (373)
- 评论 (0)
面向对象大家都清楚。现在OO的主流是基于类的面向对象。子类化故名思义就是定义一个子类,也就是要订制一个类变成一个新类的意思。
不过Windows的子类化不是如此。
首先,我们知道,除了基于类的面向对象以外,还有基于原型(或者叫基于对象)的面向对象。Windows是一个基于对象的OS,它的对象系统更倾向于基于原型的OO。Windows开发的一个核心概念是Window,也就是常说的窗口,所有的一切别的东西都是围绕着这个展开的。一个Windows应用程序,其基本的逻辑框架就是:创建一个窗口,接收系统发给该窗口的消息进行处理。收到结束消息的时候,关掉窗口,程序完蛋。
Window(注意,不是 Wind ...
- 17:44
- 浏览 (372)
- 评论 (0)
集合的概念可以说是非常一般的。很多人都知道。就算不知道,我们也可以在非常短的时间内给他灌输这个概念。为了避免后面饶舌,我现在就先实施灌输:)
集合就是一堆东西。东西就是直觉能区分的个体(康托尔语)。这一堆东西中的每一个都叫做集合的元素。集合中元素的个数叫做集合的阶。全集就是包含全体东西的集合。空集就是没有东西的集合。似乎很简单直觉,其中比较绕的东西我就不提了(如果有兴趣,想想全集的概念,或者想想理发师悖论也行:0),免得大家抓狂。另外,我们还要引入子集的概念。一个集合中,我们取出其中一部分元素(可以是全部,也可以是0个)组成的集合,叫做原集合的子集。子集的阶可以等于原集合,也可以小于。小于的叫 ...
- 17:43
- 浏览 (270)
- 评论 (0)
关于客观实在 “客观实在”这个词包含了两个词。“客观”和“实在”,而且一般情况下我们可以认为客观是用来修饰实在的。我们仔细分析一下。实在,就其字面意思而言,似乎是说实际存在。可是,这又牵扯到实际是什么和存在是什么的问题,众所周知,这是非常困难的。我们暂时放弃类似于本体论的概念分析,采用类似于马克思主义的过程或者属性分析,分析一下客观。客观,明显的,跟主观相对的一个词语,客观的一定不是主观的,明确一点地说,客观的和主观的交集是空集(不知道客观和主观是不是这么清晰的分离的?)。但是,客观的和主观的并集是不是就是事物的全集呢?也就是说,相对于全体事物而言,他们是不是互为补集的?看看看看,我们又扯出来 ...
- 17:42
- 浏览 (257)
- 评论 (0)
科学是什么?我准备从归纳和演绎两方面给出结论。
科学就是研究规律的学问。学问是啥?学问就是人的意识世界里面的一些活动。这是演绎的说法。这里面需要深究的就是:什么是规律了。
归纳。我们从某些公认的科学分支出发,给出科学的定义。物理学,研究自然界各种真相以及给出规律的科学。经济学,研究人类社会生产和分配,交换和消费的规律的科学。……诸如此类的。这样,我们归纳出来科学就是研究规律的。
那么,它怎么研究规律呢?总体来说,它首先观察现实,提出猜想性质的规律,然后用这个规律套现实,如果没有什么违反规律的现实出现,那么就可以认定这个规律是真实的,可信的。由于现代科学倾向于认为在价值层面可供研究的素材越来越少 ...
- 17:42
- 浏览 (478)
- 评论 (0)
近几年来,我越来越多地思考语言问题。或者换句话说,表达方式问题。当然,我认为维特根斯坦后期的哲学是对的,虽然还不够精细。也就是说,我认为语言寄生在要表达的问题中,并强烈依赖于“生活方式”。
让我们把焦点聚拢一下,对准计算机程序设计语言这种人工语言,好使的我们的讨论可以落到实处。上面说到,语言与问题密切相关,那么我们看看计算机程序设计语言关联的问题是什么。
计算机程序设计语言泛泛的说,是要解决各种可计算问题。对于可计算问题,图灵机清晰的捕获了这个概念,谁想深入请自己去看相关论文。具体的说,计算机程序设计语言就是用计算机解空间元素表达问题领域的问题的。更直白的说,计算机程序设计语言就是要表达出问题 ...
- 17:40
- 浏览 (292)
- 评论 (0)
内存模型是随着越来越丰富和复杂的对象生命周期要求的发展而发展起来的。
最初的内存模型完全是线性的,静态的,一个程序运行时所有需要的对象都是在运行前完全准备好了的,运行完了时释放掉。典型的代表就是Fortran语言。这种语言的运行性能非常高(当然了,没有任何别的消耗嘛),但是表达能力受到限制(毕竟,要求静态的确定一切对象和内存的绑定关系)。最明显的一个限制就是没办法支持递归。这种内存模型支持的对象的生命周期跟应用程序的生命周期完全一致。同生共死,天下大同。
Alogal的出现引入了一个强大的概念: lexical scope,内存模型也相应的出现了细分概念:栈。栈就是那种先进后出的容器,它完 ...
- 17:39
- 浏览 (420)
- 评论 (0)
一直认为,契约是类型系统不可或缺的一部分,虽然现在的主流语言都缺乏它。我们知道,现在的组件都是隐藏其实现,公开其接口的。这为大型的复杂系统提供了必要的抽象机制,可是,现在的接口都是只描述了组件可以接受的消息类型(或者习惯上称作方法的签名),对于该组件在什么状态下可以接受该消息,该消息有什么要求和限制,以及组件对于该消息的响应是如何的都没有描述。这些是应该描述的。在支持契约的Eiffel语言中,它们被分别描述为 Precondition和Postcondition。契约不仅仅是一个类型安全的必要组成部分,它还是一个设计工具,可以借此理清各个组件的权利和义务等等关系。
近来突然感觉,契约这个东西 ...
- 17:38
- 浏览 (288)
- 评论 (0)
自从1970年NATO会议以后,软件工程这个词就正式进入了软件开发领域,并且占据了越来越重要的地位。不可否认,软件工程确实为软件开发带来了一些作用,但是软件工程的缺陷也是很明显的。其中涉及到好几个方面的核心问题,现在暂时无法解决。
第一个问题是人的问题。
人不是机器,虽然有时候经过比较严格的训练在某些时间段可以表现得跟机器差不多,但毕竟不是真正的机器,这就是说,人的输入和输出并不是恒稳的。这是软件工程没有办法解决的硬伤。
第二个问题是软件度量问题。
这个问题到现在为止,可以说根本没有一个实质性的解决方案。关于软件的复杂度,软件开发的工作量,开发中的软件的完成度,软件的价值等等方面,从来没有一个 ...
- 17:36
- 浏览 (408)
- 评论 (0)
针对这一行,主要是两方面的问题,一方面是软件开发行业内部的问题,一方面是软件开发行业外部的问题。
软件开发行业能够存在,主要是因为外部问题的存在。而由于软件开发行业的不成熟性,内部问题是现在该行业的主要问题。外部问题是该行业创造价值的地方,内部问题是该行业解决问题的地方。外部问题最终总是落实成内部问题解决掉的。有千奇百怪的外部问题,但是内部问题确是有限的。所以计算机科学研究的总是内部问题。
该行业的内部问题主要分成基本算法问题,资源管理和分配问题,运行环境问题,各种特定媒体的编解码问题,网络通信问题,IO和人机交互问题。它们各自落实成计算机行业中非常出名的几门课程,例如OS,DB等等。
...
- 17:34
- 浏览 (1312)
- 评论 (1)
Ajax是为了应对让人不耐的WebApp的高延迟而搞出来的一套技术框架。
原始的WebApp的Browser和Server是串行运行的,一边工作时,另一边等待。这浪费了整个系统的运算能力。Ajax在Browser端引入一个执行引擎,它一边应付user的请求,一边把某些必须交给服务器处理的东西背地里传送给服务器,同时背地里把结果准备好(接受服务器端的数据),展现给客户。
这极大地增强了WebApp的表现能力。对于大多数的用户交互都会比较自然的支持。
Ajax涉及到的几个技术焦点主要是Javascript(提供可响应的UI,在WebPage上提供交互特性)、XMLHttpRequest (HTTP ...
- 17:32
- 浏览 (345)
- 评论 (0)
上回书说到可执行文件的格式,这一节详细描述一下。
可执行文件是由头和体组成的。这跟别的复杂一点的文件一样。它的体分成一些叫做节(section)的东西,这是它的特色。另外比较有特色的东西是:我们一般把可执行文件叫做程序的影像(image)。唔,这个叫法也不赖。可执行文件的价值在于执行,执行的程序也就是活着的程序叫做程序的影像。呵呵,这个概念打通了文件和进程的通道,以前说过的loader。一般情况下,可执行文件放在永久性的存储设备上,进程放在速度较快的主存上——一般是半导体存储设备,易失性的。loader干的主要的活之一就是把可执行文件从速度较慢的哟耐久性存储设备转移到速度较快的主存上。这个转移 ...
- 17:28
- 浏览 (476)
- 评论 (0)
这是该系列的第二部分。
上次说道,OS主要分成计算的管理,存储的管理和IO的管理,其中,计算的管理从OS的角度来看是最重要最根本的。
注:我们暂时不考虑并发。
我们现在要从一个动态的角度看问题了。基于程序存储+图灵机这个基本思想,我们构建了现在形形色色的计算机系统。既然程序是被存储的,那么它一定被放在存储系统里面,而对于运算,实际上是一系列的指令来控制计算的进行。这里面就涉及到存放在存储系统里的静态的程序怎么幻化成可以操纵计算的动态的操作者。
这个过程叫做loader。loader就是把程序从静态的存储状态转换为动态的进程状态,然后这个动态的程序就可以控制计算过程了。
说到这儿,不得不 ...
- 17:27
- 浏览 (428)
- 评论 (0)
对操作系统的研究已经很久了,一直以来比较喜欢这方面的东西,从现在开始,我要把我所了解的OS的各个方面一一描述出来。基本的描述风格事先抽象后具体,先轮廓后细节。
OS其实是一个大家都知道一些的概念。但是我说得有可能跟传统的说法有些不一样,我按照我的思路和节奏说这些问题。希望大家多提意见。
说到OS,一定要先从冯诺依曼抽象机器说起。冯诺依曼机器是图灵机器加上程序存贮这个特性形成的。冯氏机器本身也像图氏机器一样,并没有规定IO,但是根据系统论的基本原理,我们知道一个系统如果是封闭的,那么就是不可知的,没有什么价值的,所以,现代的计算机都配备有大量的IO部件。不过虽然IO部件非常之多,但是由于我们 ...
- 17:25
- 浏览 (292)
- 评论 (0)
抽象:抽象就是有选择的忽略。至于为什么要忽略,忽略什么,这个是由人选择的:)。抽象的用处在于处理复杂性。人类处理复杂性的基本方法就是抽象,有意的忽略某些从这个角度看过来无关大局的东西以求得整个系统的简单和清晰。抽象是因人而异,因角度而已,因层次而已的。抽象可以分层。也就是说抽象地输入也可以是抽象而不是实体。抽象并不是完全相同的,甚至可以说,对于不同的人,抽象一般是不同的。
虚拟:恩,这个概念比较复杂,原始的意义是非真实的。虚拟一般是概念世界里的实体。由于概念分为内涵和外延两个层面,外延表示物理世界里的实体,而内涵总是对外延的归纳和抽象,说到概念,我们一般强调的是概念的内涵。从这个角度说,概念本 ...
- 17:25
- 浏览 (265)
- 评论 (0)







评论排行榜