`
阅读更多

我们在遇到的大多数编程语言中,总会听到不同的纬度上对不同语言的定义,像最多的编译型和解释型语言,动态语言和静态语言,强语言和弱语言等从不同的角度描述一种语言的特征。

例如:描述Pythen是一种解释型的动态的强类型的语言等。但是在java描述中,它是静态的强类型的语言,但是java首先是通过jvm编译成为中间字节码class文件,在解释执行,我们可以模糊的理解为“半编译半解释型语言”。

 

 

1.编译型和解释型

我们很多资料上都会看到这样的描述,pythen、js是典型的解释型语言,是通过解释器直接实现的。这么说其实是比较片面狭隘的,语言一般都只会定义其抽象语义,而不会强制性要求采用某种实现方式。

在我们大多数的理解上C语言是一种典型的编译型语言,但是C的解释器也是存在的Ch,C++也存在Cint

一般被称之为“解释型语言”的比如Pythen,并不是说他就无法编译。解释器实际上就是一个黑箱,输入是源代码,输出是结果。对于用户来说没有中间的其他步骤比如编译等。其实理论上任何语言都可以实现一个解释器,将源码编译并且执行得到结果,这样的用户运行就能直接获得结果的,无需关心中间怎么运算的称之为解释,实际上很多解释器就是这样“编译器+虚拟机”。先通过编译器将源码转换为AST或者字节码文件,虚拟机执行.所谓的解释型语言并不是不用编译,只是不需要用户手动取显式的编译。

虚拟机是什么,对于java,groovy,python这样的语言来说,就是能够将代码编译成为机器能够识别执行的程序,实现高级语言的定义。它是输入满足了某种指令集和结构的指令序列,转换目标AST为机器能够识别的指令序列并且输出程序执行结果

编译的输出可能是AST,也可能是字节码文件,执行AST的成为解释器或者树遍历式解释器,执行字节码的成为VM,具体的语言采用具体的方式去实现、翻译输入程序的语义。

 

编译方式:AST指令先转换为某种能被底层的系统直接执行的形式(一般就是native code),然后再执行之;

解释方式,则VM会把输入的指令逐条直接执行。


编译和解释方式实现虚拟机最大的区别就在于是否存下目标代码:编译的话会把输入的源程序以某种单位(例如基本块/函数/方法/trace等)翻译生成为目标代码,并存下来(无论是存在内存中还是磁盘上,无所谓),后续执行可以复用之;

解释的话则是把源程序中的指令逐条解释,不生成也不存下目标代码,后续执行没有多少可复用的信息。 

如果一种语言的主流实现是解释器,其内部是编译器+虚拟机,而虚拟机又是采用解释方式实现的,或者内部实现是编译器+树遍历解释器,那它就是名副其实的“解释型语言”。如果内部用的虚拟机是用编译方式实现的,其实跟普遍印象中的“解释器”还是挺不同的…… 

 

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

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

两种方式,前者就相当于我们刚才所说的编译型:一次把所有的代码转换成机器语言,然后写成可执行文件;而后者就相当于我们要说的解释型:在程序运行的前一刻,还只有源程序而没有可执行程序;而程序每执行到源程序的某一条指令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,不断地解释、执行、解释、执行……所以,解释型程序是离不开解释程序的。

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

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

我们提到,Java语言是一半编译一半解释的,它依赖JVM解释执行,但在执行之前已经预先进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVMJava的虚拟机平台,可视为解释器)解释执行。它既保留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比纯解释型程序要快许多。随着设计技术与硬件的不断发展,编译型与解释型两种方式的界限正在不断变得模糊。

 

2.动态语言和静态语言

动态语言:动态语言指的是在运行期间才会做数据类型检查的语言,也就是说使用动态语言编程,永远也不用给任何变量执行数据类型,该语言会在第一次赋值变量时才会在内部将数据类型激励下来。Python就是最典型的动态语言。

静态语言:与动态语言相反,数据类型在编译期间也就是声明升序变量时候,就必须执行变量类型,典型的就是java。

static typing when possible, dynamic typing when needed.

 

3.强类型定义语言和弱类型定义语言

强类型定义语言:一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么他永远就是该类型:如果定义一个整型a,那么更本不可能将a当作字符串类型处理,否则程序报错。

弱类型定义语言:数据类型忽略,一个变量可以赋值任意类型的值。

强类型可能比若类型语言速度上慢,但是强类型严格定义避免了语法错误.

 

 

0
0
分享到:
评论

相关推荐

    单片机编程语言_学习哪种编程语言好?

    #### 二、单片机编程语言分类 单片机的编程语言大致分为三类:机器语言、汇编语言和高级语言。 ##### 2.1 机器语言 机器语言是一种由二进制代码构成的语言,直接被计算机硬件识别和执行。尽管它能够高效地利用硬件...

    计算机编程语言的分类.pdf

    了解不同的编程语言分类是非常有必要的,可以帮助我们更好地理解和选择合适的编程语言。 机器语言是计算机编程语言的最低级形式,它是直接在硬件中解释的语言。机器语言由一些非常低级的机器指令组成,例如add、sub...

    工业机器人操作与编程-机器人的编程语言.pptx

    编程语言分类 4.编程语言的发展 5.编程语言的现状 6.编程语言——RAPID 1/14 工业机器人操作与编程-机器人的编程语言全文共15页,当前为第2页。 主要内容 了解机器人编程的三个层次内容,掌握示教编程语言的含义 ...

    tolmach:node.js的代码的编程语言分类器

    基于模块的编程语言器。 安装 $ npm install tolmach 例子 var tolmach = require ( 'tolmach' ) ; tolmach . detect ( 'for item in items:' ) ; // => "python" tolmach . detect ( '#include <stdio>' ) ; // =>...

    zemax编程语言.pdf

    为了适应这种情况,Zemax提供了一种专有的编程语言——Zemax编程语言(ZPL),让设计师们能够更深入地开发和利用Zemax软件。 Zemax编程语言(ZPL)是一种专门为光学设计软件Zemax设计的脚本语言。它允许用户编写...

    单片机编程语言中学习哪种编程语言好?

    在探讨单片机编程语言的选择时,我们首先需要了解单片机编程语言的分类,以及它们各自的特点和适用场景。单片机编程语言主要可以分为三大类:机器语言、汇编语言和高级语言。 机器语言是最底层的编程语言,它由一...

    编程语言的学习与分类

    编程语言概述 “我该学习什么语言?” 进来看看便知道了。

    2、编程语言与Python介绍.pdf

    - 二 编程语言分类 - - 2.1 机器语言 - 2.2 汇编语言 - 2.3 高级语言 - - 2.3.1 编译型 (如C语言) - 2.3.2 解释型 (如Python) - 2.4 总结 - 三 python介绍 - - 3.1 Python解释器的发展史 - 3.2 Python...

    03-课件:计算机与编程语言.pdf

    1. 编程语言分类:分为低级语言(如汇编语言)和高级语言(如C、Java、Python)。高级语言更接近自然语言,便于人类阅读和编写。 2. 编程语言的结构:包括变量(如int u = 32; int v = 26;),循环(如while循环),...

    机器人编程语言的类型

    本文将详细介绍机器人编程语言的发展历程以及按作业描述水平的不同分类。 #### 二、发展历程 早期的机器人主要依靠固定的程序或示教方式来控制,这种方式适用于功能单一、动作简单的机器人。然而,随着机器人作业...

    并行编程模型与语言.pptx

    - **并行编程语言分类**: - 粗粒度并行编程语言(如 OpenMP),适用于共享内存系统。 - 细粒度并行编程语言(如 MPI),适用于分布式内存系统。 - **并行编程语言示例**: - **OpenMP**:一种基于指令的并行编程...

    软件开发与编程语言

    ### 软件开发与编程语言 在当今数字化时代,软件开发与编程语言的重要性日益凸显。无论是企业级应用还是个人项目,都需要通过编程语言来构建软件解决方案。因此,理解和掌握编程语言及其应用变得至关重要。 #### ...

    编程入门教程.doc

    - **编程语言分类**:主要包括高级语言(如Java、Python、C#)和低级语言(如汇编语言)。高级语言更接近人类自然语言,易于学习和使用。 #### 二、游戏编程入门 - **目标受众**:适合具备基本C++知识的学习者。 -...

    Python和计算机编程入门

    编程语言分类** - **机器语言**:由二进制指令构成,计算机可以直接识别和执行。 - **汇编语言**:接近机器语言但更易于阅读和编写。 - **高级语言**:如Python、Java等,接近自然语言,易于理解和编写。 **3. ...

    阿里云大学编程语言学习内容集锦

    1. 编程语言的分类: 根据描述,编程语言可分为强类型与弱类型语言,静态类型与动态类型语言。强类型语言对变量的数据类型有严格要求,在编译时会进行类型检查。而弱类型语言则对类型检查相对宽松,变量的数据类型...

    所有编程语言的API查找工具-推荐一款能查询所有编程语言的API.zip

    在实际使用中,开发者可以通过关键词搜索特定的函数、类或者方法,也可以按照语言分类浏览API,这样可以帮助开发者更快地定位到所需的信息。同时,一个优秀的API查找工具通常会提供清晰的示例代码和详细的解释,帮助...

Global site tag (gtag.js) - Google Analytics