首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于编译器与解释器

关于编译器与解释器

作者头像
未读代码
发布于 2019-11-04 07:28:34
发布于 2019-11-04 07:28:34
5140
举报

尊重原创。此篇为转载文章,原文请点击底部阅读原文链接。

为了让更多的人能够从本质上理解编译器解释器的区别,我杜撰了一个小故事 来福与旺财的养牛场 来福和旺财有一个养 牛场。本来养牛不是一件太难的事情,但是偏偏他俩养的牛都有特别的怪癖。奶牛阿圆只吃切成圆形的牧草,而奶牛阿方和阿三(印度来的?)分别只吃切成正方形 和三角形的牧草。如果来福和旺财拿不和奶牛性格的草去喂食,阿X们不但不产奶而且还会鄙视来福和旺财。 于是来福和旺财分别有了自己的主意 来福的方案: 来福发明了三套大型碾碎机:圆圆碾碎机,方方碾碎机和三三碾碎机。每天收割了牧草,就分别放到这三套机器里碾碎给三头奶牛吃。但是一旦被碾碎了,这堆草就只能给某一头牛吃了。很明显阿方是不会吃给阿圆准备的草的。而且来福每天都要操作这三台机器,觉得比较麻烦。

旺财的方案: 旺财在考察了来福的方案后,发现每天操作三台机器真的很麻烦,而且有时有的牛吃不完,有的牛不够吃时,还不能在奶牛之间调配碾碎了的牧草。所以旺财有了不同的想法:口罩型碾碎机。

就像在图上看到的,旺财给每头奶牛装配了一台口罩碾碎机,所以三头牛完全可以在一个槽里吃草了,在吃之前口罩会自动把牧草碾碎成适合该牛食用的类型。旺财就轻松了,他每天只需要割割草就行了。 但是旺财被鄙视了??? 是的,被来福鄙视了。来福观察后发现,旺财的口罩碾碎机的效率很低(因为比较小嘛)。阿圆食量大,吃来福的圆圆碾碎机的食物一个小时就饱了,但是戴着口罩吃的时候要吃十个小时!所以来福认为旺财的口罩碾碎机虽然省事,但只能喂喂小牛,完全不适合食量大的牛。 旺财也觉得这样做有问题,但他不想回到来福方案上,他改进了口罩方案:牧草预切割机。

呵呵,看到预切割做了什么吗?它把牧草割得小了一些,所以需要口罩碾碎机做的事情就少多了。(当然口罩碾碎机也要作适当改进适合预切割后的牧草,所以图上用蓝色表示)阿圆以前用口罩不是要吃十个小时吗,现在两三个小时就可以了。 编译器与解释器 好的,谢谢你有耐心看到这里,经过上面那个不太恰当的例子,相信你已经相当的糊涂了。那么我们试着回到技术方面来。 在上面的例子中 牧草 = 我们的各种编程语言,C/C++/C#, Java, Pascal, PHP, Python, Perl, Java Script等等 切割机 = 各种编译器 奶牛 = 各种CPU(不要告诉我Intel和AMD哦),比如x86,ARM,MIPS等等 那你应该知道了为什么奶牛会有吃不同形状牧草的嗜好了,这个奇怪的比喻是为了表示不同的CPU接受的不同的机器语言。 对应上面的奶牛图,编译器的图是这样的

源代码被编译成机器码,在CPU上运行。 而解释器是这样的

用解释器很方便,只需要直接“运行”就好了,不用像C那样有编译链接的工序。 为什么说这些语言是跨平台的?因为你写了程序以后,如果这个平台上有这种语言的解释器,只需要拿到这个平台上直接运行就可以了。你可以理解为:解释器是在“一边编译,一边运行”,它只是把以前程序员手工做的编译过程放在了运行程序的时候进行。 为什么我们一般说解释器的效率比较低?你也可以想象的是,一段程序在解释器中运行时可能会被编译多次,因为每次运行到这段程序时,都会重新编译一次,这样的开销是很大的。 所以诞生了Java,C#这样的预编译语言:

在运行之前,需要手动把源代码编译成中间代码(Java里叫字节码),然后在解释器中执行。 这种架构避免了上面纯解释器中编译源代码的开销,所以相对会有效率一些。 但 是我不能骗你们,其实我画在纯解释器中的Python,Perl,PHP可能都不会是真的纯解释执行的,这样实在是太没有效率。Python在运行时会生 成pyc的二进制临时文件,看起来很像是预编译的结果。只有JavaScript这种真的不会写得太长的语言(Ajax请原谅我)才会采用纯解释的运行方 式。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿阿朗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【译】一个超级小的编译器
今天我们一起动手写一个编译器,但不是我们平常所说的编译器,而是一个超级超级小的编译器,小到如果你把本文件的所有注释都删了,真正的代码也就200多行。
街角小林
2022/06/15
7420
JVM、Java编译器和Java解释器
java解释器就是把在java虚拟机上运行的目标代码(字节码)解释成为具体平台的机器码的程序。即jdk或jre目录下bin目录中的java.exe文件,而javac.exe是编译器。
一个会写诗的程序员
2018/08/17
6.6K0
傻傻分不清:JIT编译器,解释器,AOT编译器
编译器所干的事,将一门语言 X 编译为另一门语言 Y (可以是语言 X、高级语言、低级语言等),整个编译过程涉及词法分析、语法分析、语义分析。该过程往往由程序员在编写程序时完成。
用户7257200
2020/05/20
6.9K0
傻傻分不清:JIT编译器,解释器,AOT编译器
编译器VS解释器
编译器(compiler)对于我们并不陌生,它主要为程序设计语言提供服务,它将各种各样的程序设计语言(比如:C、C++、RUST、JAVA等)进行处理,翻译成我们底层的计算机能够理解并执行相应动作。
董哥聊技术
2023/08/29
2310
编译器VS解释器
汇编程序,编译器和解释器的简短介绍【Programming】
在计算的早期,硬件很昂贵,而程序员则很便宜。 实际上,程序员是如此廉价,以至于他们甚至都没有被称为“程序员”,实际上通常是称之为数学家或电气工程师。 实际上早期的计算机被用来快速解决复杂的数学问题,因此数学家很自然地适合“编程”工作。
Potato
2019/11/24
1.4K0
汇编程序,编译器和解释器的简短介绍【Programming】
java解释器虚拟机-【Java解释器和编译器】解释器和编译器的深入理解
  作为一个看过JVM虚拟机的小白,不懂解释器和编译器之间的区别的,那就是糗大了~
宜轩
2022/12/26
6150
这款编译器能让Python和C++一样快:最高提速百倍,MIT出品
来源:机器之心本文约2000字,建议阅读5分钟甚至比 C 的速度还快,现在已在 GitHub 上可用。 自深度学习兴起以来,Python 一直是最热门的编程语言之一,它在数据科学和机器学习领域占主导地位,甚至是科学和数学计算领域的主角。如今你能想象到的任何项目,几乎都可以找到一个相应的 Python 包。 然而,尽管高级语言的简化语法使其易于学习和使用,但和 C 或 C++ 等低级语言相比,它的速度更慢。 麻省理工学院计算机科学与人工智能实验室(CSAIL)的研究人员希望通过 Codon 来改变这一现状,C
数据派THU
2023/04/08
4420
这款编译器能让Python和C++一样快:最高提速百倍,MIT出品
11 个最佳的 Python 编译器和解释器
原作:Archie Mistry 翻译:豌豆花下猫@Python猫 原文:https://morioh.com/p/765b19f066a4
Python编程与实战
2020/03/04
1.4K0
11 个最佳的 Python 编译器和解释器
深入解析java虚拟机:编译器到底为何物?面试大厂该怎么答?
编译器是一个相对复杂且专业的领域,需要一些先验理论知识。本文将简单讨论编译理论的基本概念,也会逐一讨论HotSpot VM本身涉及的许多特设的编译技术,为后面的篇章打下理论基础。
愿天堂没有BUG
2022/10/31
5430
【JavaScript】JavaScript 简介 ④ ( 解释型语言 和 编译型语言 | 计算机程序本质 | 编译器 和 解释器 )
计算机 的 程序 是在 CPU 上执行的 , CPU 上执行的只有匹配该 CPU 的机器码指令 , 不同类型的 CPU 执行的 机器码指令 格式不同 , X86 和 ARM 执行的 机器码 指令格式是不同的 ;
韩曙亮
2024/03/18
2090
【JavaScript】JavaScript 简介 ④ ( 解释型语言 和 编译型语言 | 计算机程序本质 | 编译器 和 解释器 )
十年磨一剑!万字长文剖析华为方舟编译器的前世今生
2017年5月的一个凌晨,华为某实验室里,方舟编译器上第一个Java程序“Hello, World”跑通了。
新智元
2019/08/09
1.5K0
十年磨一剑!万字长文剖析华为方舟编译器的前世今生
Java解释器和编译器
这几天重新研究了一下内存模型、内存屏障,在学习内存屏障的时候,了解了lock前缀指令,为了编译出lock前缀指令,于是去学了一下字节码指令。因为还要添加一些运行参数,于是今天又看了一下午JVM的编译问题。知识一环套一环,现在内存屏障这一块还没搞完。这可能也正是自学乐趣之所在,知识无限延展,层层连贯,于是晚上就整理了一下关于java编译方面总结。
叫我阿柒啊
2022/05/09
6590
Java解释器和编译器
以问答的方式解释编译器与解释器
编译器是一种计算机程序,它可以将源代码转换成目标代码。编译器通常包括一个词法分析器、一个语法分析器和一个代码生成器。
2024/04/30
4100
以问答的方式解释编译器与解释器
解释器模式举例-柯里化的前生今世(四):编译器与解释器
  编译器会将源代码转换成另一种语言的代码解释器模式举例,然后在支持后一种语言的机器上执行。
宜轩
2022/12/29
3740
Java编译器解析
Java程序最初都是通过解释器Interpreter进行解释执行的,当虚拟机发现某个方法或代码块运行特别频繁,就会把这些代码认定为热点代码,为了提高热点代码的执行效率,在运行时,虚拟机会把这些代码编译成本地机器码,然后进行各种优化。运行时完成这个任务的后端编译器被称为即时编译器。
Mr.Shelby
2024/12/24
2470
Java编译器解析
深入浅出了解Java即时编译器原理及实战
学习JVM相关的知识,必然绕不开即时编译器,因为它太重要了。了解了它的基本原理及优化手段,在编程过程中可以让我们有种打开任督二脉的感觉。比如,很多朋友在面试当中还会遇到这样的问题:Java是基于编译执行还是基于解释执行?当你了解了Java的即时编译器,不仅能够轻松回答上述问题,还能如数家珍的讲出JVM在即时编译器上采用的优化技术,而且在实践过程中更深刻的理解代码背后的原理。本文便带大家全面的了解Java即时编译器。
程序新视界
2020/12/31
9680
Java 答疑:编译器和解释器有何区别?Java 语言属于编译型编程语言还是解释型编程语言?
我们都知道开发语言整体分为两类,一类是编译型编程语言,一类是解释型编程语言。那么你知道二者有何区别吗?编译器和解释器又各自有何区分?Java 语言属于编译型编程语言还是解释型编程语言呢?
白鹿第一帅
2022/05/08
9140
Java 答疑:编译器和解释器有何区别?Java 语言属于编译型编程语言还是解释型编程语言?
自己动手写编译器:实现命令行模块
在前面一系列章节中,我们完成了词法解析的各种算法。包括解析正则表达式字符串,构建 NFA 状态就,从 NFA 转换为 DFA 状态机,最后实现状态机最小化,接下来我们注重词法解析模块的工程化实现,也就是我们将所有算法集合起来完成一个可用的程序,由此在接下来的章节中,我们将重点放在工程实现上而不是编译原理算法上。
望月从良
2023/10/08
2490
自己动手写编译器:实现命令行模块
试用GO开发pyhton编译器:字节码基础
掌握一门编程语言最好的办法或许是将它的编译器设计出来。毫无疑问那些开发Python编译器的人应该是世界上对Python了解最深刻的人群之一。我用python开发过不少程序,但是每次反思或复盘的时候总是感觉对Python的认知还不到位,由此也看了很多讲Python的书,但看的时候感觉好像懂了,但过了一段时间后又忘了,也就是说单纯看书很难将某一项技术完全内化。当然技能的掌握必然要从实践中来,但是我发现在使用Python开发程序时,我总是使用它的一部分功能就够了,或者说居于我的思维模式限制,我在使用python开发时总是落入一个套路,这使得我只能掌握python技术的冰山一角,就如同井底之蛙一样只了解一小块内容,为了能够打破认知局限,让我自己能更全面的对python的设计原理有更深入的了解,我打算尝试做一个能运行的python编译器。
望月从良
2021/12/20
3950
试用GO开发pyhton编译器:字节码基础
编译原理工程实践—01编译器前端技术核心三步
什么是编译器的前端技术?我们在大学课堂里学习的《编译原理》大多侧重讲解编译器的 "前端(Front End)" 技术,即编译器对程序代码的分析和理解过程。而与之对应的 "后端(Back End)" 则是生成目标代码和优化的过程,跟目标机器有关。
CS逍遥剑仙
2025/05/12
1640
推荐阅读
相关推荐
【译】一个超级小的编译器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档