脚本语言:21世纪的高级编程语言

编程语言发展史之:第二代编程语言 作者:禅与计算机程序设计艺术 1.简介 随着计算机的发展,编程语言也在不断发展。近些年来,编程语言的数量呈指数级增长。这其中有一些新的、前卫的语言,如Java、Python、JavaScript等等,它们带来的革命性变化影响了整个编程领域。本文将从编程语言发展的角度出发,详细介绍20世纪90年代至21世 阅读详情

1.简介
    在过去的十五年里,人们编写计算机程序的方法发生了根本的转变。这种转变是从c或c++等系统程序设计语言到Perl或Tcl等脚本语言的过渡。虽然很多 人参与了转变,却很少有人意识到它的发生,更不用说知道为什么会发生。这篇文章是我关于为什么在下个世纪脚本语言可以比系统程序设计语言更好的处理许多编 程工作的一点看法。

   与系统程序设计语言相比,不同的脚本语言为不同的工作而设计,这导致了语言间的根本不同。系统程序设计语言起源于像内存字等最初期的计算机元素,它为建立 数据结构和算法而创建。相反的,脚本语言为胶着而设计:他们假设已经存在一套强大的组件,而它主要是把组件连在一起。系统程序设计语言使用强类型定义来帮 助处理复杂事务,而脚本语言使用无类型定义来简化组件间的联系,并提供快速应用开发.

    脚本语言和系统程序设计语言互为补充,并且二十世纪六十年代以来的大多数主要的计算机平台都同时提供这两种类型的语言。这些语言在组件框架中有着典型的应 用:组件由系统程序设计语言创建,并由脚本语言组合在一起。然而,速度更快的机器,更好的脚本语言,图形用户界面和组件构造重要性的不断提高,因特网的发 展等发展趋势大大提高了脚本语言的应用。在今后的十年中,这种趋势将继续,而且越来越多的完全使用脚本语言和系统程序设计语言书写的应用程序将主要用来创 建组件。

2.系统程序设计语言
    为了理解脚本语言和系统程序设计语言的不同,最好先了解一下系统程序设计语言是如何发展的.系统程序设计语言是作为除汇编语言外的另一种选择而引入的.在 汇编语言里,实际上机器的每一个细节都被反映在程序里.每个状态代表一个简单的机器指令,而程序员必须处理像寄存器分配和程序调用顺序等低层细节.因此, 用汇编语言编写和维持大型程序是很困难的.

   二十世纪五十年代后期像Lisp,Fortran和Algol等高层语言开始出现.这些语言里的状态和机器指令不再完全一致,编译程序把过程程序中的每个 状态翻译成一系列二进制指令.经过一段时间,一系列系统程序设计语言包括PL/1,Pascal,C,C++和Java由Algol发展而来.系统程序设 计语言没有汇编语言的效率高,但他们使应用程序更快的发展起来,因此,系统程序设计语言在大型应用项目的发展中几乎完全取代了汇编语言.

    系统程序设计语言与汇编语言在两个方面有所不同:它是高层语言并且是强类型."高层"意味着很多细节被自动处理以便编程人员可以写更少的代码而做同样的工作.例如:

★编译程序处理寄存器分配,所以编程人员不需要写代码来在寄存器和内存间转移数据
★自动设计程序调用顺序:编程人员不需要担心调用栈之间的参数转移
★编程人员可以使用像while和if等简单的关键字来控制结构,编译器执行所有的指令细节来完成控制结构

    平均每行系统程序设计语言代码翻译成大约五条机器指令,与此相比,每行汇编语言代码翻译成一条机器指令(由5个不同的人写的8个c文件的非正式分析中,我 发现这个比率为每行3到7条指令;Capers Jones从大量语言的研究中发现对于一个给定的工作,汇编语言需要的代码长度大约是系统程序设计语言代码长度的3-6倍)不管是什么语言,编程人员每年 可以写大体上相同数量的代码行,因此,系统程序设计语言允许用比汇编语言快得多的语言写应用程序.

   汇编语言和系统程序设计语言的第二个不同是类型设置.我使用"类型"来说明信息的意义在它被使用前就被特殊化.在强类型语言中编程人员声明如何使用每条信 息,并避免此信息被用于其他方式.在弱类型语言中信息应用是没有优先权限制:信息的意思完全由它的使用方法确定,而不是任何初始约定.

   现代计算机基本上是无类型的:内存中的任何字对任何类型的值比如整型,浮点数,指针或结构体都是有效的.值的意思由它的使用方法确定:如果指向一个内存 字,那么他就被认为是结构体;如果一个字涉及一个整型加结构体,那么他就被认为是整型,如此等等.相同的字在不同的时间可用于不同的方法.

  与此相反,现在的系统程序设计语言是强类型定义的.例如:

★系统程序设计语言中的每个变量都必须被声明为整型或指针或字符串等特殊类型,并且必须用于适合这种类型变量的方法
★数据与代码完全分离:创建新的代码很困难或根本不可能.
★变量可以集中在结构体中或者定义好的子结构体和过程或方法的对象中以便于使用;一种类型的对象不能用于期待其他类型对象处.

    确定类型由几个好处.第一,声明变量如何使用使大型程序更易于管理并区分那些必须被分别对待的变量.第二,编译器可以利用类型信息来侦测某些类型的错误, 比如,试图把一个浮点值作为一个指针.第三,定义类型能使编译器更好的执行特殊代码.例如,如果编译器知道一个变量总是对整型值有效,那么他就可以产生一 个整型指令来操纵这个变量;如果编译器不知道变量的类型,那么他就必须产生额外的指令在运行时检查变量类型.

    总之,系统程序设计语言被设计来处理与汇编语言相同的工作,即随机地产生请求.系统程序设计语言比汇编语言层次更高,类型更强.这就使请求产生更迅速并且处理更容易,除了在运行时有一点损失,图示1是汇编语言和其他几种系统程序设计语言的比较.


3.脚本语言
    脚本语言,像Perl,Python,Rexx,Tcl,Visual Basic和Unix shells代表了与系统程序设计语言完全不同的编程.脚本语言假设已经存在了一系列由其他语言写成的有用的组件.脚本语言不希望随机地产生请求,他希望 主要是把组件接在一起.例如,Tcl和Visual Basic可以被用于在屏幕上安排一系列用户图形控制,而Unix shells scripts被用于把过滤程序集合入管道.脚本语言常用于扩展组件特性,但他们很少用于复杂的算法和数据结构;这些东西常由组件提供.脚本语言有时涉及 胶着语言或系统整体语言.

    为了简化连接组件的工作,脚本语言被设计为无类型的:所有的东西无论是看起来还是使用起来都是完全一样的,因此他们可以互换.例如,在Tcl或Visual Basic中一个变量可以一会儿处理字符串,一会儿又处理整型.代码和数据也常可互换,因此,可以用一个程序写另一个程序,然后高速执行,脚本语言一般是面向字符的,因为它为许多不同的事物提供了一致的描述.

    无类型语言使组件更容易连在一起.在使用时没有优先级限制,并且所有的组件及其值都用统一的方式描述.除此之外,任何组件和值都可以在任何情况下使用;为某一目的而设计的组件可以被用于设计者完全没有预见过的完全不同的目的.例如,在Unix shells中,所有的过滤程序从输入读入字节流,并把字节组成的字符串写入输出;任何两个程序都可以通过把一个的输出连到另一个的输入而把两者联系起来.

   下面的shell命令把三个过滤堆在一起来计算选中区域中包含单词"scripting" 的行数:

select | grep scripting | wc

    select程序读入当前显示选中的文本并把它输出;grep程序读取输入并把包含"scripting"的行输出;wc程序对输入的行数求和.其中的每个 程序都可以用于许多其他情况来做不同的工作.

     系统程序设计语言的强类型本质上阻止重用.类型鼓励编程人员创建包含不相容接口的类型("接口很好,接口越多越好").每个接口需要特别类型的对象,而编 译器不允许接口使用任何其他类型的对象,即使那样有用.为了使用一个已经存在的接口的新的对象,就必须写转换代码以便在对象的类型和接口期望的类型间进行 翻译.这反过来又需要重编译部分或全部分布式二进制形式的应用程序,在普通情况下这是不可能的.

     为了能看出无类型语言的优点,考虑下面的Tcl命令:

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

     这个命令创建了一个新的按钮来显示16点Times字体,当用户敲击控制键时显示一段小的信息.它把六种不同的类型混合成一个单一的状态:一个命令名(button),一个按钮控制(.b),所有权名字(-text, -font, 和-command),简单字符串(Hello! 和hello),包含铅字名(Times)及字点大小(16)的字体名(Times 16)和Tcl脚本(puts hello).Tcl代表所有这些非正式字符串.在这个例子中可以在任何一个命令中为属性赋值,而未赋值的属性使用给定的缺省值.在这个例子中20个以上的属性是不特别赋值的.

    同样的例子在Java中用两种方法执行时需要7行代码.使用C++和微软基本类(MFC)需要三个过程25行代码,在微软基本类中仅仅设置字体就需要几行代码:

CFont *fontPtr = new CFont();
fontPtr->CreateFont(16, 0, 0,0,700, 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH|FF_DONTCARE, "Times New Roman");
buttonPtr->SetFont(fontPtr);

    大部分代码是由强类型造成的.为了设置按钮字体,必须运用SetFont方法,但这个方法必须通过指针传给CFont对象,这反过来需要声明和初始化一个 新的对象.为了初始化CFont对象必须唤醒它的CreateFont 方法,但CreateFont有一个需要14个特殊化引数的固定接口.在Tcl中字体(Times铅字,16点)的基本特征不用声明或转换就可以立即使 用.另外,Tcl允许在创建按钮的命令中直接包含按钮行为,而C++和Java中需要把它放在单独声明的方法中.

    (实际上可以用隐藏基本语言的复杂性的图形开发环境处理一个像这样的不重要的例子:用户在表中输入合适的值,而开发环境输出代码.然而,在更多复杂情况像按计划产生合适值或接口的条件任务中开发人员必须在基本语言下编写代码)
这可能看起来脚本语言的无类型特性不能发现错误,但实际上脚本语言和系统程序设计语言一样安全.例如在上面的按钮例子中如果字体大小被置成非整型字符串, 就像xyz,那么就会出现错误.不同的是当一个值被使用时脚本语言在最后一刻进行错误检查,而强类型在编译时发现错误这就避免了运行时的检查.然而提高效 率的代价是限制信息如何使用:这导致了更多的代码和更不易改变的程序.

    脚本语言和系统程序设计语言的另一个重要不同是脚本语言是被解释而系统程序设计语言是被编译.被解释的语言由于没有编译时间而提供快速的转换.通过允许用 户运行时编写应用程序,解释器使.应用程序更加灵活,例如,许多整体线路的综合分析工具,包括Tcl解释器;程序用户编写Tcl 脚本来使他们的设计具体化并控制工具操作.通过快速设计代码解释器可以实现强大的功能.例如,一个基于Tcl的网页浏览器可以通过把网页中的HTML转换 为使用一些常规表达替代物的Tcl脚本,从而从语法上分析网页然后执行脚本把页面翻译显示在屏幕上.

   脚本语言不如系统程序设计语言效率高,部分是因为他们使用解释器而不是编译器,而且因为他们基本组件的选择标准是功能强大和易于使用而不是有效地对应基本 硬件.例如,脚本语言经常使用长度可变的字符串,而同样的情况下系统程序设计语言使用对应一个机器字的二进制值;脚本语言经常使用哈希表,而系统程序设计 语言使用变址阵列.

    幸运的是,脚本语言的性能不经常是一个主要的问题.脚本语言应用程序通常比系统程序设计语言的应用程序要小,并且脚本应用程序的执行受组件执行的支配,而这些组件是系统程序设计语言提供的典型工具.

    脚本语言比系统程序设计语言更高级,平均一个指令可以做更多的工作.一个典型的脚本语言指令执行成百上千条机器指令,而一个典型的系统程序设计语言指令执 行大约五条机器指令(参图一).部分不同是因为脚本语言使用翻译器,这不如系统程序设计语言中被编译的代码.但是主要的不同是因为脚本语言的初期操作有更 强大的功能.例如,Perl中唤醒一个常规表达替代和唤醒一个整型加法一样简单.在Tcl中,变量会有与它相联系的图标,因此,设置变量会导致侧面影响. 例如,一个图标可能会被用于保持变量的值在屏幕上持续更新.



表1.表的每行描述了被执行了两遍的应用程序,一遍使用系统程序设计语言,像C或Java,一遍使用脚本语言,像Tcl.代码率列给出了两个应用程序的代 码行率(>1意味着系统编程语言需要更多的代码),作用率列给出了开发率.在大多数情况下两个版本由不同的开发者执行.表中的信息由 comp.lang.tcl新闻组中对文章进行答复的不同人提供。.

    由于上面描述的特性,脚本语言允许基于胶着的应用程序的快速发展.表1提供了有趣的支持.它描述了几个在系统程序设计语言下执行后又在脚本语言中重新执行的应用程序,或反过来也是一样的.

   在每种情况下脚本版本都比系统编程版本需要更少的代码和更短的开发时间,不同点的变化从2到60.脚本语言第一次执行时好处不显著,这使人联想到任何在第 一次执行经验上的重执行都会更好,而脚本和系统编程的真正不同相差5到10倍,而不是表中的极端点.脚本的好处同样依赖于应用程序.在表中的最后一个例子 中,应用程序的图形用户界面部分是基于胶着的,而模拟装置部分却不是;这可能解释为什么脚本应用程序不如其他应用程序获益多.

    总之,脚本语言被设计成胶着应用程序,他们提供比汇编或系统程序设计语言更高层的编程,比系统程序设计语言更弱的类型,和解译后的开发环境.脚本语言牺牲执行速度来提高开发速度.

4.不同的任务,不同的工具
    脚本语言不是系统程序设计语言的替代品,反过来也一样.他们各自适合不同类型的工作.把胶着和系统合为一体,应用程序可以比脚本语言快5-10倍;系统程 序设计语言将需要大量复本和转换代码来连接各块.而这直接使用脚本语言.对于复杂的算法和数据结构,系统程序设计语言的强类型使程序更易于管理.执行速度 是关键.系统程序设计语言可以比脚本语言运行快10-20倍,因为它产生更少的运行时检查.

    在决定是否使用脚本语言或系统程序设计语言处理一项特殊任务时考虑以下问题:

★应用程序的主要工作是否是把已经存在的组件联系起来
★应用程序是否要操纵不同种类类型的事物
★应用程序是否包含图形用户界面
★应用程序是否做大量字符串操作
★应用程序函数是否能快速解决问题
★应用程序是否需要可扩展

  如果这些问题回答"是"就表明这个应用程序使用脚本语言会更好.另一方面,如果对下面的问题回答"是"就表明系统程序设计语言更适合这个应用程序:

★应用程序是否执行复杂的算法或数据结构
★应用程序是否操纵大量数据集(像图像中的所有像素)因而执行速度很重要
★应用程序的函数是否已经定义好,并且很少改动

   在过去的30年中,大多数主要的计算机平台同时提供系统编程和脚本语言。例如,第一个脚本语言虽然粗糙,却是一个JCL(作业控制语言),它被用于在 OS/360中把工作等级按顺序排好。个别工作等级由PL1,Fortran或汇编语言书写,那时是系统程序设计语言。在二十世纪八十年代时Unix机器 上,c被用于系统编程而sh,csh等壳编程被用于脚本。在二十世纪九十年代的PC时代里,c和c++被用于系统编程e而Visual Basic用于脚本。在现在已基本成形的网络时代中,Java被用于系统编程而像JavaScript , Perl和Tcl等语言被用于脚本。

  脚本和系统编程是共生的,共同使用,他们能产生格外强大的编程环境:系统程 序设计语言用于产生令人兴奋的组件,然后用脚本语言把他们组装起来。例如,Visual Basic的主要吸引力是系统编程者可以用c编写ActiveX组件,而不太老练的编程者可以在Visual Basic应用中使用这些组件。在Unix下编写用于唤醒用c编写的应用程序的壳脚本很容易。Tcl普及的一个原因是可以编写执行新命令的c代码来扩展该 语言的能力。

5.脚本呈上升趋势
  脚本语言已经存在了很长时间,但最近几年几个因素的综合结果使它的重要性提高了。最重要的因素是应用程序综合向胶着应用程序发展的变换。这种变换的三个实例是图形用户界面,因特网和组件框架。

   图形用户界面出现于二十世纪八十年代早期,并在二十世纪八十年代晚期得以普及。在许多编程项目中图形用户界面占了一半甚至更多的比重。图形用户界面基于 胶着应用:他的目标不是创建新的功能,而是把图形控制集合和应用程序内部函数联系起来。我不担心任何快速发展的环境因为图形用户界面基于系统程序设计语 言,不论是Windows环境,Macintosh Toolbox或Unix Mctif,图形用户界面基于c或c++等已被证明难以掌握,使用不灵活,生成结果不灵活的语言。一些这样的系统有很好的图形工具来设计屏幕输出并隐藏基 本语言,而一旦设计者不得不编写代码时一切变得困难起来,像为接口元素提供行为。所有好的快速开发图形用户界面环境都基于脚本语言:Visual Basic,Hyperlard和Tcl/tk,随着图形用户界面的普及,脚本语言也越来越流行。

  因特网的增长也使脚本语言变得大众化。因特网只是一种胶着工具,它不创建任何新的计算结果或数据;它只是简单的把大量已经存在的事物联系起来。因特网编程工作的完美工作之一是让所有连接的组件在一起工作,像脚本语言。例如:Perl 因编写CGI脚本而流行,JavaScript因编写网页而流行。

   基于脚本的第三个例子是组件框架,像ActiveX,OpenDoc和JavaBeans。虽然系统程序设计语言可以很好的创建组件,但脚本更适合组装 组件到应用程序中。没有一个好的脚本语言来操纵组件,组件框架的大部分功能就都没有了。这可以部分解释为什么组件框架在个人电脑上(Visual Basic提供了方便的脚本工具)比在像Unix/CORBA等组件框架中不包含脚本的平台上更成功.

  脚本语言继续普及的另一个原因是脚本技术的提高。现代脚本语言像Tcl和Perl离早期脚本语言像JCL的公开宣布已经很远。例如,JCL不提供基本反复而早期Unix外壳不提供过程,即使在今天,脚本技术仍然相对不成熟。例如,Visual Basic不是真正的脚本语言:它最初执行像一个简单的系统程序设计语言,然后修改使之更适合脚本。以后的脚本语言将比现在使用的更好。

    脚本技术得益于计算机硬件的加速发展。过去常常用系统程序设计语言在复杂的应用程序中获得可接受的执行。某些情况下甚至系统程序设计语言也不够有效,因此 不得不用汇编编写应用程序。然而,今天的机器比1980年的快100-500倍,并且仍在继续以每18个月翻一番的速度增长。今天,许多应用程序可以用解 释后的程序执行,并且仍然有出色的执行。例如,Tcl脚本可以操纵几千个对象同时提供好的相互响应。由于计算机速度的不断提高,脚本将对越来越大的应用程 序产生吸引力。

  脚本语言应用的不断增长最终导致编程群体的改变.二十年前大多数编程者是大 型项目的熟练的编程人员.那个时代的编程人员需要花几个月的时间掌握一门语言和它的编程环境,系统程序设计语言就是为这些人设计的.然而,自从个人电脑出 现以后,越来越多的非专业编程者加入到编程者的行列.对这些人来说,编程不是他们的主要工作,而只是他们偶尔用来帮助他们工作的工具.偶然编程的例子是简 单的数据库查询或者是巨大的扩展片.偶然编程者不希望花几个月的时间学习系统程序设计语言但他们可以花几个小时的时间学到足够的脚本语言知识来写出有用的 代码.由于脚本语言由简单的句法并且省略了对象线程等复杂的特性,因而它比系统程序设计语言要容易学.例如,比较Visual Basic和Visual C++,很少有偶尔编程者会选择Visual C++,而大部分会用Visual Basic建立有用的应用程序.

   即使在今天,用脚本语言编写的应用程序的数目也远多于用系统程序设计语言编写的应用程序的数目.在Unix系统中有比C程序更多的外部脚本,而在 Windows下Visual Basic的编程者和应用程序都比C或C++的要多.当然,多数大型和广泛使用的应用程序都是用系统程序设计语言写成的,所以,如果比较代码总行数或是建 立的副本数,则系统程序设计语言略胜一筹.不管怎么样,脚本语言已经是应用程序开发的主动力,并且今后它的市场份额会继续提高.

6.对象的作用
   脚本语言在编程语言和软件工程中通常被专家忽视.取而代之,他们更注重像C++和Java等面向对象系统程序设计语言.面向对象编程被认为是代表下一步编程语言发展的主流.像强类型和继承等面向对象 特征 据说可以减少开发时间,提高软件重用率,并解决包括脚本语言技巧等其他问题.

   面向对象编程实际能提供多少好处?不幸的是,我还没有看到足够的数据可以确切地回答这个问题.在我看来,对象只能提供一定的好处:或许能提高20-30% 的创作力,但决不会有两倍,更不用说是十倍.现在抱怨C++的和喜欢它的一样多,并且一些语言专家开始公开反对面向对象编程.这一段剩下的部分用于解释为 什么对象不能像脚本一样显著地提高创作力,并讨论脚本语言中可以获得的面向对象编程的好处.

  面向对象编程不能显著提高创作力的原因是他没有提高编程层次或鼓励重用.像C++等面向对象语言中编程者仍然使用需要用大量细节来描述和操纵的基本的小单 元工作.理论上可以开发强大的函数库包,并且如果这些函数库被广泛使用就将提高编程层次.然而,这样的函数库却很少.大多数面向对象语言的强类型使包的定 义受限制从而难以重用.每个包都需要特殊类型的对象,如果两个包在一起工作,就必须写转换代码在两个包需要的类型间进行翻译.面向对象语言的另一个问题是 他们强调继承.当一个类借用为另一个类写的代码时执行继承并不是一个好主意,它使软件难以管理和重用.它把类的执行绑在一起,因而没有另外一个类任何一个 其它类都不可理解:不知道其继承的方法在父类中如何执行,则无法理解子类;而不知道其方法如何被子类继承,则无法理解父类.在一个复杂的类继承中,不理解 它所继承的所有其他的类就无法理解任何一个类.更糟的是,一个类无法从它继承的类中被分离以用于重用.多重继承使这个问题变得更麻烦.执行继承导致和 goto语句被重复执行时所看到的一样的交错和不可靠.因此,面向对象系统经常不能处理复杂问题并缺少重用.

   另一方面,脚本语言实际引起了有效的软件重用.在有趣的组件由系统程序设计语言建立使他们使用了模块,随后用脚本语言把他们胶着在应用程序中.这种劳动的 分割提供了为重用的自然的框架结构.组件被设计为可重用的组件和脚本间有定义好的接口以利于组件的使用.例如,在Tcl中组件是C中执行的常规命令.他们 看起来更象是内在的命令,因而更容易在Tcl脚本中使用.在Visual Basic中组件是ActiveX的扩展,可用于从工具面板直接拖到窗体中.
不管怎么样,面向对象编程至少提供了两个有用的特性.第一个是封装:对象用某种隐藏执行细节的方法把数据和代码联系起来.这使管理大型系统更加容易.另一 个有用的特性是接口继承,这涉及提供同样方法的类和APIs,即使他们有不同的执行,这时类之间可以相互转化,从而鼓励重用.

   幸运的是,对象的这些好处在脚本语言中可以像在系统程序设计语言中一样实现,并且所有的脚本语言都提供面向对象编程.例如,Python是面向对象脚本语言,Python第五版包括提供对象,Object Rexx是Rexx的面向对象版本,而Incr Tcl是Tcl的面向对象版本.有一点不同是,脚本语言中的对象事物类型的,而系统程序设计语言中的对象是强类型的.

7.其他语言
   这篇文章不是所有编程语言的全部特性记述.除了类型长度和编程层次以外还有许多编程语言的其他特性,并且还有许多不能被明确定义为系统程序设计语言或脚本 语言的其他有趣的语言.例如,Lisp系统的语言就处于脚本语言和系统程序设计语言之间,两方的特性它都有一些.它开创了像解释和活动类型等现在在脚本语 言中很普遍的观点,又有自动存储管理和综合开发环境等在脚本和系统程序设计语言中同时使用的观念.

8.结论
   脚本语言代表一套与系统程序设计语言不同的协定.他们牺牲执行速度和与系统程序设计语言相关的类型长度而提供更高的编程创作力和软件重用.当计算机变得更 快和比编程者的劳动力更便宜时这个协定越来越行得通.在复杂的数据结构和算法中系统程序设计语言也适于创建组件,而脚本语言更适合在联系复杂的应用程序中 进行胶着.胶着工作变得越来越盛行,因而脚本在下个世纪将成为比今天更为重要的编程范例.

   我希望这篇文章可以在三个方面影响编程群体;
★在开始一个新的项目并为每个工作选择最强大的工具时我希望编程人员能考虑到脚本和系统编程的不同
★我希望组件框架的设计者能认识到脚本的重要性并确信框架不仅是创建组件的工具,同时也是把他们胶着在一起的工具
★我希望编程语言研究协会能转变他们对脚本语言的态度,并在将来帮助发展更强大的脚本语言.对语言设计者而言,提高编程层次应该是唯一重要的目标,因为他是提高编程者创造力的最重要的因素;强类型是否有助于达到这个目标还不清楚.

9.答谢
   这篇文章得益于很多人的观点,包括Joel Bartlett, Bill Eldridge, Jeffrey Haemer, Mark Harrison, Paul McJones, David Patterson, Stephen Uhler, Hank Walker, Chris Wright,IEEE计算机执行官,和许多热心参与这篇文章早期草稿网上新闻组讨论的人.Colin Stevens 写了MFC按钮例子的版本,Strphen Uhler写了Java版本.

常见编程语言 编程语言排行榜 TIOBE排行榜是根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据,只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。 链接:https://www.tiobe.com/tiobe-index/ 2019年3月排... 阅读详情

相关推荐

34、编程语言探索之旅

本文探索了多种编程语言,包括高级语言如 C#、Scala 和 Mojo,Web 相关语言如 PHP、Dart、Elm 和 Grain,以及量子计算语言和小众实验性语言如 Brainf**k、Befunge 和 LOLCODE。同时讨论了编程语言与硬件架构之间的关系,从冯·诺伊曼架构到神经形态系统,并展望了未来编程语言的发展趋势,包括对新硬件架构和量子计算的适应。

milk8的博客 98

高级编程语言

高级编程语言是一种接近人类语言的编程语言,它允许开发者以一种更自然和直观的方式来编写代码。与低级语言(如汇编语言或机器语言)相比,高级语言提供了更多的抽象层,隐藏了底层硬件的细节,使得编程更加容易和高效。易读性:语法结构类似于自然语言,易于理解。易写性:简化了编程过程,减少了编写代码所需的工作量。可移植性:代码通常不依赖于特定的硬件或操作系统。结构化:支持结构化编程,使得代码组织更加清晰。丰富的内置功能:提供了大量的内置函数和库,简化了常见任务的实现。

Python老吕的博客 1532

深入掌握Perl脚本语言:从基础到高级应用

Perl语言由Larry Wall于1987年发布,其设计初衷是为了简化文本处理工作。早期的Perl版本以处理Unix系统的日志文件和报告生成为主。随着时间的推移,Perl因其强大的文本处理能力和快速开发的特性,在网络编程、系统管理以及生物信息学等领域变得流行起来。在1994年发布的Perl 5版本中,引入了面向对象的特性,进一步扩展了Perl的应用范围。在Perl中使用哈希结构存储键值对应的数据,这使得数据的存取和检索变得非常方便。创建哈希:同数组一样,哈希的创建也是隐式的。通过。

weixin_30476025的博客 1050

编程语言的发展历史 早期阶段(20世纪40年代-50年代)中级阶段(50年代-60年代)结构化编程时代(60年代-70年代)面向对象编程时代(80年代-至今)现代发展(21世纪至今)

由于其固有的不可变性,函数式编程非常适合处理并发和分布式系统,因为在这种情况下,状态的变化和数据的共享往往会导致复杂的同步和协调问题。汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的硬件和软件资源,且目标代码简短,占用内存少,执行速度快,是高效程序设计的有力工具。通过抽象,我们可以更好地描述和理解复杂系统的结构和行为,提高代码的可读性和可维护性。此外,高级语言通常提供丰富的数据结构和算法库,以及强大的错误处理和调试工具,从而简化了程序编写的难度,提高了程序的可靠性和可维护性。

Python老吕的博客 2150

基于单片机的室内空气质量监控系统设计

摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 方案选择 3 1.2 系统控制原理 4 2系统硬件设计 5 2.1 单片机的选择与设计 5 2.2 温湿度模块设计 6 2.3 甲醛采集模块设计 8 2.4 显示器模块设计 9 2.5 按键模块设计 10 2.6 报警模块设计 11 2.7 加湿及风扇模块设计 11 3系统软件设计 13 3.1 总流程方案设计 13 3.2 温湿度获取的软件设计 14 3.3 液晶屏LCD1602的软件设计 15 4系统调试 13 4

Q_1928499906的博客 2701

k8s重装1.28.2+calico+踩坑收集+InPlacePodVerticalScaling

它提供了从镜像构建(通过 Dockerfile)、镜像管理(上传、下载、存储等)、容器创建、运行、网络配置(可以为容器分配自定义的网络,如 bridge 网络、host 网络等)到容器编排(通过 Docker Compose 可以简单地编排多个容器的启动和关联关系)等一整套完整的解决方案。它的核心功能是启动和管理容器的生命周期。sudo apt update这个可以经常用,是来更新软件包的,它不下载,所以没风险,但是经常会报错,别问,问就是某种强大的力量,所以用镜像或者代理或者巴拉巴拉。

SsjjsS2019的博客 2553

史上被骂最多的编程语言——JavaScript

北理教师“学海泛舟”系列文章之二,介绍JavaScript编程语言,并尝试绘出一张JavaScript技术导航图,方便技术学习和探索。

bitfan(数字世界一凡人)的专栏 3万+

2026年7月19日 从可插拔到共封装:技术路线研究报告

AI 算力的爆发正在重写数据中心光互连的技术路线。本报告对当前并存的四代光互连架构——

weixin_51184047的博客 587

编程语言发展简史从二进制到自然语言编程的演进之路

计算的黎明:二进制与机器指令时代编程语言的故事始于最基础的交流方式:与机器本身对话。在计算机科学的早期,程序员需要直面硬件的本质,使用二进制代码(由0和1组成)或与之密切相关的机器语言来下达指令。每一行代码都直接对应着CPU的一个具体操作,例如将数据从一个位置移动到另一个位置或执行算术运算。随后出现的汇编语言,用简短的助记符(如ADD、MOV)代替了晦涩的二进制序列,是迈向抽象化的第一步,但它仍然是“低级”语言,与特定计算机的硬件架构紧密绑定。编程是一项极其繁琐且容易出错的专业活动,充满了对硬件的深刻理解。

pyw7612的博客 474

基于STM32的多参数水质检测仪系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6主控,搭配pH、TDS、浊度、水温四大核心水质检测模块,完整实现了多参数水质检测仪的全流程开发,从多通道ADC采集、数字滤波、温度补偿、专业校准、阈值报警到人机交互,全流程无跳步保姆式拆解,配套逐行注释可直接编译的开源代码,新手跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 484

语音增强评价指标全解析:从MOS到eSTOI的实战指南

本文全面解析了语音增强领域的核心评价指标,包括主观评价的黄金标准MOS,以及PESQ、STOI、eSTOI等关键客观指标。文章详细阐述了各指标的原理、适用场景与实战计算方法,并提供了Python代码示例,旨在帮助开发者和研究者建立科学的评估体系,以平衡语音可懂度与音质,从而优化算法效果。

yhn456789的博客 1199

编程语言人类与机器对话的进化史

此时的对话是单向的、精确到极致的指令下达,程序员必须完全遵循机器的逻辑,没有任何灵活性与容错空间。程序员能够以更抽象、更符合人类思维习惯的方式来组织指令,但对话的本质仍然是“我命令,你执行”,机器扮演着绝对服从的被动角色。最终,人机对话将趋向于一种无缝的、共生的合作关系,人类专注于创造性思考和战略决策,而机器则作为强大的执行伙伴,共同推动技术的边界。编程语言本身不再是唯一的沟通桥梁。从最初对电路的直接命令,到如今近乎自然的对话,这一进化历程不仅是技术能力的跃迁,更是人类思维方式与机器智能的深度融合。

fog1111的博客 427

解锁Vscode:C/C++环境配置超详细指南

本文详细介绍如何在 VSCode 中配置 C/C++ 开发环境,帮助开发者快速搭建高效的编码调试环境。内容涵盖前期准备、软件下载安装、环境变量配置、工作区文件设置及测试运行全流程:首先需准备 VSCode 编辑器、MinGW-w64 编译器及 C/C++ 插件;接着完成工具下载与安装,配置系统环境变量以确保编译器可全局调用;然后通过创建.vscode工作区文件夹,配置核心文件,实现代码智能提示与调试功能;最后通过编写 Hello World 示例验证环境可用性,并附上常见问题排查方案。

邓邓子的博客 3047

你会有编程语言歧视吗?

转自一个大佬的博客,说到心里了。 https://www.cnblogs.com/xuanyuan/p/4661085.html 开发软件就好比人睡觉。床是硬件,人是软件。 硬件是晦涩的,各种各样的,让你在上面开发程序是一件极其痛苦的,必须对硬件了解非常透彻才行。就像让你直接睡在石板床上,没几个人能坚持下来。这就像让你用汇编语言在单片机、微处理器上直接写程序很难受一样。 后来有人说,我们在石板床上垫一层稻草,铺层凉席,睡起来没那么硬了。这就是早期的操作系统,如DOS。我们在DOS上再开发软件要舒服一些了,这

小胡同学的工程师学习之路 250

20_文件系统的制作 -JFFS2

JFFS2 文件系统是通过工具 mkfs.jffs2 将文件系统目录制成映像文件。制作工具mkfs.jffs2 需要编译 zhb 库和 mtd-utils,下面详细介绍其制作过程

Leon的博客 549

把时间当成数据:SAP ABAP 里的 DATS/TIMS 与 DATN/TIMN,怎么选才不踩坑

SAP项目中日期时间字段的陷阱与优化 日期时间字段(DATS/TIMS)在SAP项目中看似简单却常引发事故,主要问题包括: 非法日期(如20201331)入库后,在月结、对账时爆发异常 空值被处理为00000000导致排序错误 ABAP提供两种处理方案: 经典类型DATS/TIMS:存储为字符格式,校验宽松易存脏数据 HANA原生类型DATN/TIMN:数据库级校验,写入即拦截非法值 优化建议: 在接口层和入库前进行严格校验 新项目优先使用DATN/TIMN类型 对遗留数据使用DATS_IS_VALID等函

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 184

高级语言参数传递方式_搬砖民工也会建成自己的“罗马帝国”:Go语言创世纪...

来源 | 异步 | 文末赠书我不知道,你过去10年为什么不快乐。但相信我,抛掉过去的沉重,使用Go语言,体会最初的快乐!——469856321Go语言最初由谷歌公司的Robert Griesemer、Ken Thompson和Rob Pike这3位技术大咖于2007年开始设计发明,设计新语言的最初动力来自对超级复杂的C++11特性的吹捧报告的鄙视,最终的目标是设计网络和多核时代的C语言。...

weixin_39536630的博客 298

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

编程语言的发展历程与未来趋势

AI辅助编程工具,如基于大型语言模型的代码生成和补全,正在改变程序员的编码方式,未来可能实现更高层次的意图编程——开发者只需描述“做什么”,AI助手就能自动生成“怎么做”的代码。此外,形式化验证、语言服务器协议(LSP)等技术的发展,将进一步增强代码的可靠性和开发工具的统一性,推动编程语言向着更智能、更安全、更人性化的方向持续演进。现代语言如Scala、Swift、Kotlin等,不再拘泥于单一的编程范式,而是博采众长,同时支持面向对象、函数式等多种特性,让开发者能根据具体问题选择最合适的工具。

wwp880928的博客 325

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

脚本语言, 领域语言与软件自动构造

我对MDA一向不太关心它的层次结构以及转换方法,因为最重要的而且最难解决的是领域语言,如何让开发者制定最合适的领域语言才是关键。SQL是一种领域语言,它只对关系数据库进行一般操作,而且有标准的语法,世界通用。操作系统的的shell语言也是局限在宿主操作系统中的领域语言,他们的共同特征是:1。局限在某一领域2。不包含或很少包含界面,大多采用command line交互3。开发者很容易掌握,说明他们很

mobiledn的专栏 947

编程语言进化论从C语言到Rust,18种语言的演变与融合

这种“零成本抽象”理念,使得Rust在保持C/C++级别性能的同时,显著提升了可靠性与安全性,已被广泛应用于操作系统、浏览器引擎、区块链等对安全和性能要求极高的领域。纵观这18种语言的演变,一条清晰的主线是:在提升开发效率、降低错误率的同时,不懈追求性能与控制力的平衡。C语言的指针、结构体和内存手动管理机制赋予了程序员极大的灵活性,使其成为操作系统、编译器等领域的主导语言。编程语言的发展史,如同一部浓缩的科技进化史诗,不仅记录着计算思想的变迁,更折射出我们对软件复杂性、安全性与开发效率不懈追求的轨迹。

zw2111983的专栏 490

编程语言进化史从C到Rust,Python到GPT,18种语言的演变与未来

诞生于20世纪70年代的C语言,以其接近硬件的效率、简洁的语法和强大的灵活性,迅速成为系统编程领域无可争议的霸主。随着互联网的崛起,Java提出了“一次编写,到处运行”的愿景,通过虚拟机(JVM)实现跨平台能力,并利用垃圾回收机制自动管理内存,降低了开发门槛,促进了企业级应用的发展。它保留了C语言的简洁性,内置了强大的并发原语(Goroutine和Channel),编译速度快,生成静态链接的单一可执行文件,在性能和开发效率之间取得了出色的平衡,成为微服务和云原生基础设施的热门选择。

yihuaiyang的专栏 534

编程语言在人工智能时代的演进与创新

同时,强类型系统与类型推断的结合既保证了代码的安全性,又减少了冗余的类型声明。同时,多范式融合成为新的发展方向,许多现代语言都在尝试将面向对象、函数式、并发编程等不同范式的优点融为一体。一个成功的编程语言不仅需要优秀的设计,更需要完善的生态系统。活跃的开源社区、丰富的第三方库、完善的工具链支持,这些都是衡量编程语言成熟度的重要指标。从静态类型到动态类型,再到如今的渐进式类型系统,类型系统的发展呈现出螺旋式上升的趋势。简洁的语法糖、直观的操作符重载、富有表现力的模式匹配等特性,都在不断提升程序员的开发效率。

WIFbfQNx的博客 272

程序语言概述(本文适合准备入门或者才入门学习编程语言的朋友阅读)

程序语言,又称编程语言,是计算机与人类之间沟通的桥梁。它允许程序员将人类可理解的算法和逻辑转换为计算机能够执行的指令序列。作为计算机科学的核心组成部分,程序语言在软件开发、数据分析、人工智能等众多领域发挥着关键作用。程序语言是计算机科学的重要组成部分,它的发展历程和未来趋势反映了信息技术的不断发展和创新。随着技术的不断进步和应用场景的不断拓展,程序语言将继续发挥重要作用,推动计算机科学的繁荣和发展。作为软件开发者,我们应该不断学习和掌握新的程序语言和技术,以适应不断变化的市场需求和技术环境。👨‍💻博主。

Python老吕的博客 1533

人工智能时代编程语言的发展趋势与应用前景

摘要随着人工智能技术的迅猛发展,编程语言作为构建智能应用的基石,其发展趋势与应用前景备受关注。本文深入探讨了人工智能时代编程语言的演变方向,分析了主流编程语言在 AI 领域的应用现状、优势与局限,并对新兴编程语言的崛起及其在特定 AI 场景中的潜力进行了研究。同时,详细阐述了编程语言与人工智能融合所催生的创新应用,包括智能编程辅助工具、自动代码生成技术以及基于语言模型的智能交互系统等。

数字魔方操控师的博客 909
上一篇: 中美两国软件开发管理的比较与启示-杨锦方
下一篇: 计算机科学技术学习引论
lphpc
博客等级 码龄22年 32粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值