最近在看一些编译过程的知识点,看的比较多的是英文文献。
在这之间常常遇到的两个单词让我着实迷惑:Compiler, Interpreter
中文翻译分别是:编译器,解释器。java
若是有人问咱们「你知道什么是编译器么?」,
咱们颇有可能首先蔑视一下这我的,而后说:「知道啊,不就编译编程语言的程序嘛!」
要是别人再追问一句「那你知道解释器么?」,
这时候颇有可能也会说「知道啊。」,可是很难再带有蔑视的语气了。
要是再问一句「那么编译器和解释器的区别是什么啊?」,
「呃......」程序员
那么到底什么是「编译器」,什么是「解释器」?
虽然对于两个词,咱们很「耳熟」,可是「能详」么?
彷佛咱们并无认真对待这两个词汇。编程
摘自 Wiki Compiler 一段缓存
A compiler is a computer program (or a set of programs) that transforms source code written in a programming language (the source language) into another computer language (the target language), with the latter often having a binary form known as object code. The most common reason for converting source code is to create an executable program.编程语言
大概意思:工具
编译器是一种计算机程序,负责把一种编程语言编写的源码转换成另一种计算机代码,后者每每是以二进制的形式被称为目标代码(object code)。这个转换的过程一般的目的是生成可执行的程序。性能
编译器的产出是「另一种代码」,而后这些代码等着被别人拿来执行,若是还不能直接被执行,那么还须要再编译或解释一遍,再交由计算机硬件执行。
编译器,每每是在「执行」以前完成,产出是一种可执行或须要再编译或者解释的「代码」。this
摘自 Wiki Interpreter 一段操作系统
In computer science, an interpreter is a computer program that directly executes, i.e. performs, instructions written in a programming or scripting language, without previously compiling them into a machine language program. An interpreter generally uses one of the following strategies for program execution:翻译
- parse the source code and perform its behavior directly.
- translate source code into some efficient intermediate representation and immediately execute this.
- explicitly execute stored precompiled code made by a compiler which is part of the interpreter system.
大概意思:
在计算机科学中,解释器是一种计算机程序,它直接执行由编程语言或脚本语言编写的代码,并不会把源代码预编译成机器码。一个解释器,一般会用如下的姿式来执行程序代码:
- 分析源代码,而且直接执行。
- 把源代码翻译成相对更加高效率的中间码,而后当即执行它。
- 执行由解释器内部的编译器预编译后保存的代码
能够把解释器当作一个黑盒子,咱们输入源码,它就会实时返回结果。
不一样类型的解释器,黑盒子里面的构造不同,有些还会集成编译器,缓存编译结果,用来提升执行效率(例如 Chrome V8 也是这么作的)。
解释器一般是工做在「运行时」,而且对于咱们输入的源码,是一行一行的解释而后执行,而后返回结果。
在看了很多很少关于「编译和解释」的文章以后,我发现下面的词汇是大量出现的。
知道这些词汇表明的意思,以及对应的层次,可以更好地看懂别人所要表达的意思。
高级语言代码,天然是指由高级编程语言编写代码,对计算机的细节有更高层次的抽象。
相对于低级编程语言(low-level programming language)更接近天然语言(人类的语言)。
集成一系列的自动工具(垃圾回收,内存管理等),会让程序员延长寿命,更快乐的编写出更简洁,更易读的程序代码。
低级语言代码,指由低级编程语言编写的代码,相对高级语言,少了更多的抽象概念,更加接近于汇编或者机器指令。
可是这也意味着代码的可移植性不好。
在我看来,高与低,只是一组相对词而已。
越高级的语言,性能、自由度越不及低级语言。
可是在抽象、可读可写性、可移植性越比低级语言优秀。
在之前的年代,C/C++语言相对汇编语言,机器指令来讲,确定是高级语言。
而到了今天,咱们更多人对C语言偏向认知为「低级语言」。
或许将来世界的开发者,看咱们如今所熟悉的Java、PHP、Python、ECMAScript等等,都是「low」到爆的语言。
汇编语言做为一门低级语言,对应于计算机或者其余可编程的硬件。
它和计算机的体系结构以及机器指令是强关联的。
换句话说,就是不一样的汇编语言代码对应特定的硬件,因此不用谈可移植性了。
相对于须要编译和解释的高级语言代码来讲,汇编代码只须要翻译成机器码就能够执行了。
因此汇编语言也每每被称做象征性机器码(symbolic machine code)
字节码严格来讲不算是编程语言,而是高级编程语言为了种种需求(可移植性、可传输性、预编译等)而产生的中间码(Intermediate Code)。
它是由一堆指令集组成的代码,例如在javac
编译事后的java源码产生的就是字节码。
源码在编译的过程当中,是须要进行「词法分析 → 语法分析 → 生成目标代码」等过程的,在预编译的过程当中,就完成这部分工做,生成字节码。
而后在后面交由解释器(这里一般指编程语言的虚拟机)解释执行,省去前面预编译的开销。
机器码是一组能够直接被CPU执行的指令集,
每一条指令都表明一个特定的任务,或者是加载,或者是跳转,亦或是计算操做等等。
全部能够直接被CPU执行的程序,都是由这么一系列的指令组成的。
机器码但是看做是编译过程当中,最低级的代码,因外再往下就是交由硬件来执行了。
固然机器码也是能够被编辑的,可是以人类难以看懂的姿式存在,可读性很是差。
从左往右看,
gcc hello.c
编译出 hello.out
文件,该文件由一系列的机器指令组成的机器码,能够直接交由硬件来执行。不管是最近在看《暗时间》的做者刘未鹏,仍是前一段时间听《以产品思惟写文章》讲座的阿禅,仍是其余的不少聪明的人。
他们都强调「抽象看本质」的能力,能从事物自己抽象出共通属性,看待本质。
这也是不少人所说的「跳出这个框框再看」的思惟方式。
不管是「编译 Compile」仍是「解释 Interpret」。
本质仍是「人与计算机的交流形式」,人的语言最终转换成机器语言。
一句 「Hello World」,通过一些列的「编译」和「解释」,最终转换成一系列包含机器指令的那些0和1,机器傻傻执行完以后,告诉你结果。
就这么一个过程,咱们就须要不少的翻译官。
有些翻译官能够作到同声传译(解释),有些翻译官却只能把咱们的意图记下来再所有翻译(编译)给计算机。
而每每一个翻译官能力有限,也只能把你的语言,翻译成另一种低级点的语言,再由另外懂这个语言的翻译官来翻译更接近计算机能读得懂的语言。
不如这张图来得直接:
编译 Compile:把整个程序源代码翻译成另一种代码,而后等待被执行,发生在运行以前,产物是「另外一份代码」。
解释 Interpret:把程序源代码一行一行的读懂而后执行,发生在运行时,产物是「运行结果」。
stackoverflow.com/questions/2…
www.wikiwand.com/en/Interpre…)
www.wikiwand.com/en/Compiler
www.wikiwand.com/en/Machine_…
www.wikiwand.com/en/High-lev…
www.wikiwand.com/en/Low-leve…
www.wikiwand.com/en/Bytecode
本文默认容许转载,但:
感谢!