广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 4560 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
mjmjmj
数位造型
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x2
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[资讯]21世纪的高阶程式设计
(这篇文章曾于 IEEE 电脑杂志 1998 年三月号上刊载)
作者序
Perl、Tcl等scripting语言所呈现的设计风格相较起C、JavaTM等系统程式语言是截然不同的。 Scripting语言的目的是要将应用程式「黏」起来;这些语言使用不指定资料型态的方式来达到高阶程式的境界并拥有比系统程式语言更多的应用程式开发机会。 随着电脑运算速度的提升与程式多元化,scripting语言在未来将会对应用程式有非常大的影像力。
John K. Ousterhout

译者序
前一阵子小弟在网路上寻找有关scripting和系统程式语言差异的文章,我找到了这一篇。小弟读完了以后觉得这篇文章真的是写的很好,虽然是作者个人的看法,但是其中有许多详细的解释和精辟的观点,小弟将这篇文章翻译成中文,希望能将好文章跟大家分享!这篇译本并不是经过官方校正的版本,所以可能在某些地方难免辞意会有所出入,如果您有兴趣可以参考看看原文稿:http://www.tcl.tk/doc/scripting.html
阿得

关键字: 元件架构, 物件导向程式设计, scripting, 严谨的资料型态控管, 系统程式语言。


1 引言
在过去十五年内,人们写程式的方式已经有大幅度的改变。 这项改变是源于程式语言的变迁:从系统程式语言转移到scripting语言,如从C++和JavaTM转移到Perl或Tcl。虽然有为数不少的人亲眼目睹这项重大的发展,却迟迟无法认同,更不用提大家是否了解改变发生的原因。 这篇文章是我的看法:Scripting语言在21世纪将会会比系统程式语言更有效率的完成工作。

Scripting语言的目的跟系统程式语言不同,他们之间的差异则是可以回溯到语言本质上的差异。 系统程式语言的目的在于「无中生有」:完成各种资料结构与演算法的设计,这种特性已可以在早期电脑上的单字记忆演算法中看到。Scripting语言与系统程式语言不同的地方是其作用在于将应用程式「黏」起来: 这些语言假设运作环境中已经有许多功能强大的元件和模组,而语言的目的就是将这些元件整合起来运作。系统程式语言的资料型态规定地非常严谨,而scripting语言则是取消了资料型态的限制来简化各种元件间的键结并专心于程式的开发。

Scripting语言与系统程式语言在某些情况下是互补的,在许多从1960年代就已经开始研发的大型的运算平台上都包含这两种类型的语言。 这些语言大部分的时候都是在元件架构下一起使用:利用系统程式语言写元件然后用scripting语言将元件与其它scripting语言结合。 但近来的一些趋势,如大幅提升的电脑运算速度、功能更强大的scripting语言、地位更根深蒂固的图型使用者介面(GUI)、元件架构与网际网路的蓬勃发展使得scripting语言的使用率越来越高。这些趋势在接下来的十年内将会继续,产生越来越多以scripting语言写成的程式,而系统成语言的角色也会以元件写作为主。



2 系统程式语言
为了要深入了解scripting语言与系统程式语言之间的差异,我们必须先了解系统程式语言的用处。 系统程式语言最早是用来取代以机械指令为基础的组合语言。 组合语言中的每一行程式码都是机械指令,程式设计师必须了解低阶的细节如处理器的暂存器分配和程序呼叫的详细步骤,由此可见,体积庞大的组合语言程式是非常难管理的。 一直到1950年代末,高阶程式语言如LISP,Fortran,与Algol慢慢的被研发出。 这些语言的程式码不再是以机械指令为主,语言的编译器(compiler)将程式码编译成为二位元指令码。 慢慢的,许多以Algol为基础的系统程式语言被开发出,如PL/1,Pascal,C,C++与Java。 系统程式语言虽然没有组合语言的高效率但是却比较容易阅读,进而减少了程式开发的时间,这个特点使得系统程式语言几乎完全取代了组合语言,作为开发大型程式的主要语言。 系统程式语言与组合语言之间的差异有两种:系统程式语言属于较高阶的语言而且拥有十分严谨的资料型态控管。「高阶」一词代表编译器会自动处理一些小细节,让程式码变得简短,例:

编译器会自动去处理CPU暂存器的细节,因此程式设计师不需担心中央处理器中的暂存器与系统记忆体的资料传递。
程序呼叫的细节也是自动处理:程式设计师不需要去将参数从call stack中来回移动。
程式设计师可以以简单的while与for关键字来控制回圈结构;编译器会自动产生细部的指令来确定回圈能够正常运作。

系统程式语言的每一行程式码都可能会编译成五行左右的机械指令,而组合语言则是一行程式码对应一行机械指令(一个非正式的分析显示:由五个不同的程式设计师撰写的八个C语言原始档,其程式码对机械指令的比例范围是从3~7倍;Capers Jones在研究许多不同的语言后发现一样的工作,以组合语言写成的程式长度是系统程式语言的3~6倍)。 不管用什么语言,程式设计师每年能写的程式码长度几乎都是一个定数,因此使用系统程式语言能够比使用组合语言更有效率地开发程式。

第二个组合语言与系统程式语言间的差异就是资料型态的控管。「资料型态」指的是每一项资料的类型在使用前就已经被指定。在一个资料型态控管严谨的程式中,程式设计师必须为每一项变数宣告资料型态来防止资料处理上可能发生的违规行为。而一个没有什么资料型态控管的语言中,资料型态不需要提前宣告:这代表资料的型态是被其之后的使用方式所定义的。

现今的电脑记忆体的预设几乎没有所谓的资料型态:任何被储存的单字都可以储存其他类型的资料,不管事整数、浮点数、指标、或是一整串指令都可以。 一个数值的型态是由使用的方式定义的:如果程式指向一串资料则资料会被当作程式码去执行;如果资料是用在一项加减数学运算中则会以整数的方式呈现,依次类推。同样的资料可以在不同的情况下有不同的型态。

相较之下,现今的系统程式语言则有十分严谨的资料型态控管:

所有的变数必须宣告成一种特定的资料型态,如整数、字串指标,这些变数必须依照本身被指定的资料型态去运作。
资料与程式码是分开的:很难去即时产生新的程式码,不,应该说是不可能的。
变数可以透过程式的操作成为一个资料结构或是物件的一部分;一个特定类别的指标不能够储存不同类别的物件。

资料型态控管有一些好处:第一,先定义好型态的变数,让庞大的程式比较易于管理和阅读。第二,编译器可以用资料型态来侦测一些可能发生的逻辑错误,如将浮点数转为指标。第三,资料型态使得编译器能够产生各别资料型态的机械指令,进而让程式有更佳的执行效率,举例说明:如果编译器不知道一个变数的资料型态,他必须产生额外的机械指令来在程式执行时期对变数进行检查;反之,如果编译器已经知道一个变数只能储存整数,则可以省略这段多余的指令。 在这边做个结尾,系统程式语言的目的是取代组合语言的角色,多半指的是开发新的程式。系统程式语言多半是高阶语言而且拥有比组合语言更严谨的资料型态管理。虽然程式执行的效率略逊于组合语言程式,但是其开发程式的效率和方便性则是有长足的进步。
3 Scripting语言
Scripting语言如Perl、Python、Rexx、Tcl、Visual Basic与Unix Shells呈现一种与系统程式与言非常不同的程式设计方式。Scripting语言通常假设运作环境中已经有许多其他语言撰写的元件可以使用,由此可见其目的并不在于「无中生有」,而是将不同的元件进行整合来完成工作。举例:Tcl与Visual Basic能够用来重新组合萤幕上的使用者介面控制、Unix Shell Scripts则是用来组合filter程式成为pipeline。Scripting语言常常被作为延伸元件功能的工具,但是他们很少会将原有的演算法与资料结构复杂化,因为演算法和资料结构是元件本身具有的功能。因此,Scripting语言又能够被称作「黏着语言」或是「系统整合语言」。 为了要简化元件联结的工作,Scripting语言的资料型态选择非常的简单,因此数值能够很容易的被储存和转换。举例:Tcl与Visual Basic中的变数能够储存字串但是也能够储存整数值。程式码和资料也能够很方便的相互转换,因此能够在程式执行时期迅速的组合并且执行新的程式码。Scripting 语言多半是以文字处理为主,因此能够使用字串来储存许多不同的数值。

一个资料型态控管较松散的语言比较容易连结元件,因为所有的变数一开始并没有强制限定其资料型态,因此所有的元件和数值都是以统一的方式表示,而不特意去区分其型态;这种特性带来最大的好处就是元件和数值可以很方便的被储存或被使用;元件可以被拿来执行原设计师完全没有预料过的工作。举例:在Unix Shell中,所有的filter软体都是读取一个位元组的串流,然后再输出一个修改过的串流,任何两个程式都能够被连结:做法很简单,只要将一个程式的输出连到另一个程式的输入即可。接下来这一段Shell指令将三个filter排列在一起来计算含有「scripting」字样的一段文字有几行:


select | grep scripting | wc

Select 程式会读入萤幕上选取的文字并且输出这段文字;而grep程式则会输出所有输入内含有「scripting」字样的行列。而wc程式则会计算总共被输出的多少行。此例中的每一个程式在不同的情况下能完成不同的工作。

由于系统程式语言有着严谨的资料型态控管,因此他们并不适合将程式中已经使用过的变数再次利用。资料型态指定促使程式设计师创造多种不相容的介面(带来的隐藏讯息是「介面很棒,而且越多越好」)。 每个介面都需要特定型态的物件,而编译器也会禁止任何不同型态的物件与该介面共用。如果要解决问题,程式设计师必须额外撰写转换函式来将不同的型态的物件做转换。这也代表部分或是整个程式必须被重新编译,但这在多数情况下而言是不可能的,因为程式都是以二位元码的方式分享。 以下的Tcl 指令充分的显示出不指定资料型态的好处:


button .b -text Hello! -font {Times 16} -command {puts hello}

这段指令会创造一个按钮元件,按钮上显示一段字串,字型大小为16-point,字体为Times。当使用者按下这个按钮,程式会发出一个简短的讯息。这简单的指令中混合了六种不同的元素:指令名称(button)、一个按钮控制项(.b)、名称(-text ..

访客只能看到部份内容,免费 加入会员 或由脸书 Google 可以看到全部内容



[ 此文章被panasonic732在2004-12-20 13:15重新编辑 ]



献花 x0 回到顶端 [楼 主] From:未知地址 | Posted:2004-10-25 23:09 |
joey0415
数位造型
个人文章 个人相簿 个人日记 个人地图
小人物
级别: 小人物 该用户目前不上站
推文 x0 鲜花 x0
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

好深哦!看不懂呢?不过还是给大大推一下吧


献花 x0 回到顶端 [1 楼] From:未知地址 | Posted:2004-10-27 16:49 |
aa1145 手机
个人头像
个人文章 个人相簿 个人日记 个人地图
创作大师奖
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x2 鲜花 x96
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

怎么有这么长的文章啊 终于看完了 不过好深奥啊


献花 x0 回到顶端 [2 楼] From:台湾TANET | Posted:2004-12-21 17:53 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.068989 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言