编程语言的工作原理是什么

在上一节《CPU的工作原理》中,我们提到大多数计算机都依赖于CPU,而CPU可以理解以1和0为形式的一组特定指令。

因此,理论上我们可以编写代码,通过将一和零的长序列以CPU理解的形式串联起来,告诉CPU要做什么。像这样以二进制形式编写的指令被称为机器码。

编程代码

听起来很可怕,不是吗?也许是的,但我不知道,因为我主要使用高级编程语言,如JavaScript、Python和Java。

高级编程语言提供了一套人类可读的关键词、语句和语法规则,对人们的学习、调试和工作来说要简单得多。

编程语言提供了一种弥合我们人类大脑理解世界的方式和计算机大脑(CPU)理解世界的方式之间差距的手段。

最终,我们编写的代码需要被翻译成CPU所理解的二进制指令(机器码)。

根据你选择的语言,我们说你的代码要么被编译,要么被解释成能够被CPU执行的机器代码。大多数编程语言包括一个被称为编译器或解释器的程序,执行这一翻译步骤。

仅举几个例子:JavaScript和Python是解释型语言,而Java是一种编译型语言。一种语言是编译的还是解释的(或两者的某种组合)对开发者的便利性、错误处理、性能和其他方面都有影响,但我们不会在这里讨论这些细节。

编译器是什么?

你口中所说的编程语言本质上只是一个软件,这个软件叫做编译器,编译器读入一个文本文件,经过大量的处理,最终产生一个二进制文件。 编译器的语言部分就是它处理的文本样式。因为电脑只能读取 1 和 0 ,而人们编写 Rust 程序要比直接编写二进制程序简单地多,因此编译器就被用来把人类可读的文本转换成计算机可识别的机器码。

编译器可以是任何可以把文本文件转换成其他文件的程序。例如,下面有一个用 Rust 语言写的编译器把 0 转换成 1,把 1 转换成 0 :

// An example compiler that turns 0s into 1s, and 1s into 0s. fn main() { let input = "1 0 1 A 1 0 1 3"; // iterate over every character c in input let output: String = input.chars().map(|c| if c == '1' { '0' } else if c == '0' { '1' } else { c } // if not 0 or 1, leave it alone ).collect(); println!("{}", output); // 0 1 0 A 0 1 0 3}

编译器是做什么的?

简言之,编译器获取源代码,产生一个二进制文件。因为从复杂的、人类可读的代码直接转化成0/1二进制会很复杂,所以编译器在产生可运行程序之前有多个步骤:

  1. 从你给定的源代码中读取单个词。
  2. 把这些词按照单词、数字、符号、运算符进行分类。
  3. 通过模式匹配从分好类的单词中找出运算符,明确这些运算符想进行的运算,然后产生一个运算符的树(表达式树)。
  4. 最后一步遍历表达式树中的所有运算符,产生相应的二进制数据。

尽管我说编译器直接从表达式树转换到二进制,但实际上它会产生汇编代码,之后汇编代码会被汇编/编译到二进制数据。汇编程序就好比是一种高级的、人类可读的二进制。

解释器是什么?

解释器 非常像编译器,它也是读入编程语言的代码,然后处理这些代码。尽管如此,解释器会跳过了代码生成,然后即时编译并执行 AST。 解释器最大的优点就在于在你 debug 期间运行程序所消耗的时间。编译器编译一个程序可能在一秒到几分钟不等,然而解释器可以立即开始执行程序,而不必编译。解释器最大的缺点在于它必须安装在用户电脑上,程序才可以执行。

编程语言的工作原理是什么

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注