数据API 案例 开发者 关于
掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

编译还是解释?

张大胖最近频繁的看到两个词: 编译和解释, 他很困惑, 就去找Bill 大神。

张大胖: “大神, 什么是编译? ”

Bill :“编译通俗来讲就是把一种计算机语言写的代码(源代码)转换成另外一种计算机语言的代码(目标代码), 源代码通常是高级语言, 人类容易读, 容易理解; 目标代码通常是汇编或机器代码机器(CPU)能理解, 能高效的执行。比如说, 你一直没学好的C语言, 就是编译型语言的典型代表,  通过编译, C语言可以变成二进制代码执行。 “

张大胖: “那解释又是啥? ”

Bill 说:  “解释就简单的多了, 解析源代码, 并且直接执行它, 没有编译的过程。 ”

张大胖又问: “我听很多人说Ruby , Python, PHP都是解释型语言, 是这样吗? ”

“我先给你说说高级语言再执行之前都要做哪些事情, 然后你自己判断吧。 举个例子, 你写了一行代码: 

totalPrice =  price * 4 - discount  

计算机首先要做词法分析, 把它变成一个个的token:  

张大胖说:“这token表有什么用途呢? ”

“语法分析时会把这些token 变成一棵树, 我们称之为抽象语法树(AST)”

Bill 接着说: “你看看这棵树, 如果你写一个程序遍历每个节点, 是不是就可以执行了?  如果到此打住, 直接解释执行,可以说是解释型语言。”

张大胖说: “那Ruby, Python, PHP是这么干的吗?”

“No, 现代很多动态语言远远不是一个解释器了, 他们都有了自己的虚拟机 ! Ruby在版本1.9以后出现了YARV, PHP有Zend,  Python 本身就有虚拟机,执行PyCodeObject这样的字节码对象。 ”

“和Java 虚拟机有什么关系?”

“他们都是所谓高级语言虚拟机, 有一套自己的指令集,  相当于一个软件CPU。你可以类比成x86 CPU上的指令集”

张大胖说:”那为了在虚拟机中运行, 是不是得把Ruby, Python, PHP的源代码转化成软CPU的指令啊, 按照你的定义, 这种变换更像是一个典型的编译过程啊

Bill说:”你说的没错, 看看这个Ruby 的简单示例,  PHP, Python也差不多。”张大胖说:“这和Java很相像啊, 我们用javac 把java 源码编译成class文件, 里边包含JVM的字节码,  然后在JVM中运行。 “

“对啊, 概念上很像, 当然也有点不同, Ruby 并没有暴露出任何像javac这样的编译接口让程序员使用,  编译过程是自动在内部小黑屋里悄悄完成的, 外边的程序员还误以为解释执行呢。

还有, Ruby 也不会把YARV的指令再变成物理CPU的机器指令, 这和Java 的HotSpot 追踪热点代码, 然后变成机器指令还是不同。 “

张大胖说:“那我们还能说Ruby, Python, PHP是解释型语言吗? ”

“ 也许可以把解释的概念扩大一点: 1. 解析源代码,并且直接执行它 , 或者  2. 把代码转换成中间表示(虚拟机的指令), 然后执行。  ” Bill说到。

张大胖说: “完了, 你这新定义把Java都变成解释型的了 ”

“无所谓了, 如果我说物理CPU也是在’解释执行‘ 指令, 也没错啊, 大家都变成解释型语言了。 其实甭管它什么解释还是编译, 了解了底层的原理就行了 ”

(完)

有心得想和大家分享? 欢迎投稿 ! 

我的联系方式:微信:liuxinlehan  QQ: 3340792577


码农翻身

原文来自:码农翻身

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务
编译还是解释?
发布:2016-12-19

张大胖最近频繁的看到两个词: 编译和解释, 他很困惑, 就去找Bill 大神。

张大胖: “大神, 什么是编译? ”

Bill :“编译通俗来讲就是把一种计算机语言写的代码(源代码)转换成另外一种计算机语言的代码(目标代码), 源代码通常是高级语言, 人类容易读, 容易理解; 目标代码通常是汇编或机器代码机器(CPU)能理解, 能高效的执行。比如说, 你一直没学好的C语言, 就是编译型语言的典型代表,  通过编译, C语言可以变成二进制代码执行。 “

张大胖: “那解释又是啥? ”

Bill 说:  “解释就简单的多了, 解析源代码, 并且直接执行它, 没有编译的过程。 ”

张大胖又问: “我听很多人说Ruby , Python, PHP都是解释型语言, 是这样吗? ”

“我先给你说说高级语言再执行之前都要做哪些事情, 然后你自己判断吧。 举个例子, 你写了一行代码: 

totalPrice =  price * 4 - discount  

计算机首先要做词法分析, 把它变成一个个的token:  

张大胖说:“这token表有什么用途呢? ”

“语法分析时会把这些token 变成一棵树, 我们称之为抽象语法树(AST)”

Bill 接着说: “你看看这棵树, 如果你写一个程序遍历每个节点, 是不是就可以执行了?  如果到此打住, 直接解释执行,可以说是解释型语言。”

张大胖说: “那Ruby, Python, PHP是这么干的吗?”

“No, 现代很多动态语言远远不是一个解释器了, 他们都有了自己的虚拟机 ! Ruby在版本1.9以后出现了YARV, PHP有Zend,  Python 本身就有虚拟机,执行PyCodeObject这样的字节码对象。 ”

“和Java 虚拟机有什么关系?”

“他们都是所谓高级语言虚拟机, 有一套自己的指令集,  相当于一个软件CPU。你可以类比成x86 CPU上的指令集”

张大胖说:”那为了在虚拟机中运行, 是不是得把Ruby, Python, PHP的源代码转化成软CPU的指令啊, 按照你的定义, 这种变换更像是一个典型的编译过程啊

Bill说:”你说的没错, 看看这个Ruby 的简单示例,  PHP, Python也差不多。”张大胖说:“这和Java很相像啊, 我们用javac 把java 源码编译成class文件, 里边包含JVM的字节码,  然后在JVM中运行。 “

“对啊, 概念上很像, 当然也有点不同, Ruby 并没有暴露出任何像javac这样的编译接口让程序员使用,  编译过程是自动在内部小黑屋里悄悄完成的, 外边的程序员还误以为解释执行呢。

还有, Ruby 也不会把YARV的指令再变成物理CPU的机器指令, 这和Java 的HotSpot 追踪热点代码, 然后变成机器指令还是不同。 “

张大胖说:“那我们还能说Ruby, Python, PHP是解释型语言吗? ”

“ 也许可以把解释的概念扩大一点: 1. 解析源代码,并且直接执行它 , 或者  2. 把代码转换成中间表示(虚拟机的指令), 然后执行。  ” Bill说到。

张大胖说: “完了, 你这新定义把Java都变成解释型的了 ”

“无所谓了, 如果我说物理CPU也是在’解释执行‘ 指令, 也没错啊, 大家都变成解释型语言了。 其实甭管它什么解释还是编译, 了解了底层的原理就行了 ”

(完)

有心得想和大家分享? 欢迎投稿 ! 

我的联系方式:微信:liuxinlehan  QQ: 3340792577


码农翻身

原文来自:码农翻身

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

选择想要的接口, 看看能免费获取多少次调用 选择(单选)或填写想要的接口
  • 短信API服务
  • 银行卡四元素校验
  • 身份证实名认证
  • 手机状态查询
  • 三网手机实名制认证(简版)
  • 身份证OCR识别
  • 风险信息查询
  • 企业工商信息
短信API服务
  • 短信API服务
  • 银行卡四元素校验
  • 身份证实名认证
  • 手机状态查询
  • 三网手机实名制认证(简版)
  • 身份证OCR识别
  • 风险信息查询
  • 企业工商信息
  • 确定
选择您的身份
请选择寻找接口的目的
预计每月调用量
请选择预计每月调用量
产品研发的阶段
请选择产品研发的阶段
×

前往领取
×
企业用户认证,
可获得1000次免费调用
注册登录 > 企业账户认证 > 领取接口包
企业用户认证领取接口包 立即领取
× 企业用户认证,
可获得1000次免费调用,立即领取>
数 据 驱 动 未 来
Data Drives The Future