`
g596139453
  • 浏览: 2298 次
社区版块
存档分类
最新评论

动态语言和静态语言

阅读更多
编译型和解释型

我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得 专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常 编译之后就会直接生成一个可执行文件,我们就可以直接运行了。但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模 块来组织。这时编译各个文件时就会生成目标文件(Object   file)而不是前面说的可执行文件。一般一个源文件的编译都会对应一个目标文件。这些目标文件里的内容基本上已经是可执行代码了,但由于只是整个项目的 一部分,所以我们还不能直接运行。待所有的源文件的编译都大功告成,我们就可以最后把这些半成品的目标文件“打包”成一个可执行文件了,这个工作由另一个 程序负责完成,由于此过程好像是把包含可执行代码的目标文件连接装配起来,所以又称为链接(Link),而负责链接的程序就叫……就叫链接程序 (Linker)。链接程序除了链接目标文件外,可能还有各种资源,像图标文件啊、声音文件啊什么的,还要负责去除目标文件之间的冗余重复代码,等等,所 以……也是挺累的。链接完成之后,一般就可以得到我们想要的可执行文件了。

上面我们大概地介绍了编译型语言的特点,现在再看看解释 型。 噢,从字面上看,“编译”和“解释”的确都有“翻译”的意思,它们的区别则在于翻译的时机安排不大一样。打个比方:假如你打算阅读一本外文书,而你不知道 这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也立刻让这名翻译辅助你阅读,让他一 句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。

两种方式,前者就相当于我们刚才所说的编译型:一次把所有的代码转换 成 机器语言,然后写成可执行文件;而后者就相当于我们要说的解释型:在程序运行的前一刻,还只有源程序而没有可执行程序;而程序每执行到源程序的某一条指 令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,总言之,就是不断地解释、执行、解释、执行……所以,解释型程序是离不开解释 程序的。像早期的BASIC就是一门经典的解释型语言,要执行BASIC程序,就得进入BASIC环境,然后才能加载程序源文件、运行。解释型程序中,由 于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进行编译, 对于复杂的工程来说,的确是一件不小的时间消耗,况且很可能一些细节的地方还是要修改源代码。而且,解释型程序省却了编译的步骤,修改调试也非常方便,编 辑完毕之后即可立即运行,不必像编译型程序一样每次进行小小改动都要耐心等待漫长的Compiling…Linking…这样的编译链接过程。不过凡事有 利有弊,由于解释型程序是将编译的过程放到执行过程中,这就决定了解释型程序注定要比编译型慢上一大截,像几百倍的速度差距也是不足为奇的。

编 译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像 C/C++、Pascal/Object   Pascal(Delphi)、VB等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性 有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python等等。

但既然 编 译型与解释型各有优缺点又相互对立,所以一批新兴的语言都有把两者折衷起来的趋势,例如Java语言虽然比较接近解释型语言的特征,但在执行之前已经预先 进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执行。它既保 留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比“纯解释型”程序要快许多。而像VB6(或者以前版本)、 C#这样的语言,虽然表面上看生成的是.exe可执行程序文件,但VB6编译之后实际生成的也是一种中介码,只不过编译器在前面安插了一段自动调用某个外 部解释器的代码(该解释程序独立于用户编写的程序,存放于系统的某个DLL文件中,所有以VB6编译生成的可执行程序都要用到它),以解释执行实际的程序 体。C#(以及其它.net的语言编译器)则是生成.net目标代码,实际执行时则由.net解释系统(就像JVM一样,也是一个虚拟机平台)进行执行。 当然.net目标代码已经相当“低级”,比较接近机器语言了,所以仍将其视为编译语言,而且其可移植程度也没有Java号称的这么强大,Java号称是 “一次编译,到处执行”,而.net则是“一次编码,到处编译”。呵呵,当然这些都是题外话了。总之,随着设计技术与硬件的不断发展,编译型与解释型两种 方式的界限正在不断变得模糊。
动态语言和静态语言
通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。
(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类 型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如 VBScript也多少属于动态类型语言。
(2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。
对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamic typing when needed。
强类型定义语言和弱类型定义语言
(1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。
(2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。
强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!
例如:Python是动态语言,是强类型定义语言(类型安全的语言); VBScript是动态语言,是弱类型定义语言(类型不安全的语言); JAVA是静态语言,是强类型定义语言(类型安全的语言)。
分享到:
评论

相关推荐

    动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍

    总结来说,动态语言和静态语言主要区别在于类型检查的时间点,而强类型和弱类型关注的是类型转换的规则。动态类型语言与静态类型语言各有优劣,动态语言更灵活,适合快速迭代的开发;静态类型语言则提供了更好的编译...

    PHP动态语言静态化示例

    此资源最好搭配讲解,地址http://blog.csdn.net/m_nanle_xiaobudiu/article/details/79267703

    汉英语言对比之静态与动态.pdf

    汉英语言对比之静态与动态.pdf

    WPF 多国语言实现与动态切换当前语言

    以上就是WPF应用中实现多国语言支持和动态切换的基本步骤。通过这种方法,开发者可以轻松地为全球用户提供本地化的用户体验,同时保持代码的整洁和可维护性。在实际项目中,可能还需要考虑资源文件的编译和打包,...

    2015 Spark技术峰会-Spark SQL结构化数据分析-连城

    Databrciks工程师,Spark Committer,Spark SQL...Spark DataFrame vs.RDD,有些类似于动态语言和静态语言的区别,在很多场景下,DataFrame优势比较明显。1.3版中,Spark进一步完善了外部数据源API,并可智能进行优化。

    MyGame服务器架构PPT学习教案.pptx

    服务端开发则涉及动态语言和静态语言的选择。动态语言如JavaScript、Lua、Python等在运行时允许程序结构变化,适合游戏需求中的灵活性和可扩展性;而静态语言如C++则在效率上有优势,适合处理性能要求高的任务。为了...

    动态页面生成静态页面实例

    动态页面如`.aspx`文件(如`index.aspx`和`a.aspx`),通常基于服务器端的编程语言(如ASP.NET)运行,每次请求时都会根据用户输入和数据库交互生成内容。而静态页面如`.html`文件(如`index.html`),是预先生成的...

    LINQ与DLR的Expression tree(4):创建静态类型的LINQ表达式树节点

    6. **DLR的作用**:简单介绍了动态语言运行时(DLR),它是.NET框架的一部分,使得动态语言和静态语言可以共享相同的表达式树结构,提高了代码的互操作性。 在提供的代码文件`ExpressionTreeSamples.cs`和`...

    wpf多语言切换,动态和静态切换

    wpf多语言切换,动态和静态切换

    动态网页 和静态网页

    动态网页与静态网页是网页开发中的两种主要类型,它们各自具有独特的特性和应用场景。 静态网页主要是由HTML、CSS和JavaScript等基本Web技术构建的。这些网页在服务器端被完全生成,然后以固定的内容发送到用户的...

    Java动态绑定和静态绑定.doc

    在Java编程语言中,动态绑定和静态绑定是两个重要的概念,它们涉及到方法调用和多态性。了解这两个概念对于深入理解面向对象编程至关重要。本文将详细探讨它们的区别,并通过实例来阐述它们的工作原理。 首先,让...

    动态生成静态HTML

    C#作为一款强大的.NET平台编程语言,提供了丰富的库和框架来实现这一功能。以下是对这个主题的详细解释: 1. **动态与静态页面的区别** - 动态页面:基于服务器端脚本(如ASP.NET、PHP等),根据用户请求实时生成...

    JSR 223

    它不仅丰富了Java开发者的工具箱,还促进了动态语言和静态语言之间的互补合作,提升了开发效率和应用的灵活性。对于希望在Java环境中利用脚本语言优势的开发者来说,JSR 223无疑是一个重要的技术里程碑。

    静态网页和动态网页的区别.txt

    静态网页和动态网页的区别 动态网页和静态网页的区别,首先要分别了解两个概念,就是什么是静态网页,什么是动态网页,并且学会区分哪些是静态哪些是动态。 静态网页: (1)静态网页不能简单地理解成静止不动的...

    aauto quicker

    它结合了动态语言的灵活性和静态语言的严谨性,使得开发者在享受动态语言的快速原型设计和迭代的同时,也能确保代码的稳定性和性能。AAuto的语言设计考虑了广泛的语言兼容性,支持大部分流行编程语言的语法,降低了...

    librdkafka 动态库 静态库

    动态库和静态库是两种不同的库文件形式,动态库在运行时被加载到内存中,而静态库在编译时直接链接到目标代码中。 描述进一步说明这些库是由VS2015(Visual Studio 2015)编译的,并且是v1.6.1版本。这意味着库文件...

    静态、动态链接库的创建和调用

    这种方式的优点在于可以按需加载DLL,对于启动性能要求较高的应用来说更为合适,也便于程序在多语言环境下的动态模块加载,但缺点是调用方式相对繁琐,编程者需要手动管理DLL的加载和卸载过程。 根据不同的应用场景...

Global site tag (gtag.js) - Google Analytics