【计算机原理交集】解释型和编译型语言的解释整理


高级语言都需要转成机器语言才能让计算机执行,转换的方法主要分为两种:解释和编译。

以下解释来源转载加补充:

引用开始: https://www.jianshu.com/p/54e2aeca013b 《什么是编译型语言和解释型语言?》

编译型语言

使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。

特点

在编译型语言写的程序执行之前,需要一个专门的编译过程,把源代码编译成机器语言的文件,如exe格式的文件,以后要再运行时,直接使用编译结果即可,如直接运行exe文件。因为只需编译一次,以后运行时不需要编译,所以编译型语言执行效率高。

总结

  1. 一次性的编译成平台相关的机器语言文件,运行时脱离开发环境,运行效率高;

  2. 与特定平台相关,一般无法移植到其他平台;

  3. C、C++、Pascal、Object-C以及很火的苹果新语言swift等都属于编译型语言。

解释型语言

使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。

特点

解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行,所以只要某一平台提供了相应的解释器即可运行该程序。

总结

  1. 解释型语言每次运行都需要将源代码解释称机器码并执行,效率较低;

  2. 只要平台提供相应的解释器,就可以运行源代码,所以可以方便源程序移植;

  3. C#、JavaScript、Python、PHP、Perl等属于解释型语言。

引用结束

写个两者类型转换的大致过程:

对于编译型语言如C语言,词法分析(状态机)->语法分析(抽象语法树AST)->中间代码(类似于java中的.class字节码)->目标代码(汇编)->二进制机器码

对于解释性语言如javascript,词法分析(状态机)->语法分析(抽象语法树AST)->中间代码()---->黑盒子(如java的虚拟机))–> 运行结果。

编译或解释不是语言的特性,而是实现的特性

收集完以上的解释,我看到了个让我深思的问题。

引用开始:https://www.zhihu.com/question/19608553 知乎
作者:wuxinliulei

有人说Java是编译型的。因为所有的Java代码都是要编译的,.java不经过编译就无法执行。

也有人说Java是解释型的。因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释型的。

对于C和C++,它们经过一次编译之后,可以由操作系统直接执行,所以它们是编译型语言。而Java不一样,它首先由编译器编译成.class(字节码)文件,然后在通过JVM从.class文件中读一行解释执行一行,所以它是解释型的语言。也正是由于java对于多种不同的操作系统有不同的JVM,所以实现了真正意义上的跨平台。

引用结束

看完以上关于java类型的划分内容,我个人一直以来是不太喜欢把一个事物做绝对的定性判断,于是我又去搜文章,发现知乎有个老哥讲的特别好。

编译或解释不是语言的特性,而是实现的特性。

老哥通过举例有些语言能够以编译或者解释的方式实现,还举例了C语言也能改成解释的方式实现。

他还说:“ 如果一定要从极其严格的定义上说,限定编译这一术语于从源码到目标机器可执行代码的过程。但是放开这个苛刻的定义,再广义一点,Python和Java都有编译的过程。只不过没被编译成目标机器可执行代码,编译成了字节码。”

然后我又去搜JS的相关视频讲解,发现居然有些 “编译的特性” ,举其中一个例子:

JS代码运行前不能像C++一样提前知道变量类型,只能执行到了才识别,所以不能快速的编译成低级代码,所以C++有更高效的编译;为了解决这个问题,JS引擎中有个Just In Time Compilation,可以实现边运行代码边编译成机器代码;还有另一种实现方式Ahead Of Time,和C++一样,运行前提前生成好机器代码;这些方式使得JS运行速度极快,即时响应;(自己也体会到了,每次修改保存一瞬间,就执行完毕了)。

等以后有精力了再去研究一下其他的 “编译的特性” 。先挖个坑。

总结

通过此次的查阅和大致总结,我觉得收获较大的并不是认识这些理论知识,而是再次实践了自己的一些理念。对于任何事物不要总是故意去钻牛角尖,不要去随意的定性,没有非黑即白的两种情况,更多的是处在一个中间的状态,只有把自己的眼界放宽了,心平气和的去求知,才能提升自己的认知水平!

扯远了哈哈~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值