编译型语言和解释型语言是两种不同的编程语言类型,它们的主要区别在于程序的执行方式。编译型语言如 c 语言和 c 加加, 在执行前需要通过编译器将原代码一次性转化成机器码,生成一个可执行的程序,例如 windows 下的 exc 文件。编译型语言的优点是执行效率高,因为编译只做一次运行时不需要编译。 但是编译型语言的缺点是如果原代码需要修改,就需要整个模块重新编译。 此外,由于编译的时候会根据对应的运行环境生成机器码,不同的操作系统之间移植可能会有问题,需要根据运行的操作系统环境编译不同的可执行文件。解释型语言如拍放和 javas script, 可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序。解释型语言的优点是有良好的平台兼容性,在任何环境中都可以运行, 前提是安装了解释器虚拟机。此外,解释型语言更灵活,修改代码的时候直接修改就可以, 可以快速部署,不用停机维护。但是解释型语言的缺点是每次运行的时候都要解释一遍,性能上不如编译型语言。这两种类型的编程语言各有优势和劣势,选择使用哪种类型的语言主要取决于具体的应用需求。
粉丝686获赞5733

编程语言从执行原理上可分为编译型语言和解释型语言。那么到底什么是编译型语言,什么是解释性语言呢?编译型语言不止程序在执行之前需要经过一个专门的编译过程,把原码文件编译为机器语言的可执行文件,运行的时候可以直接执行,执行效率高。比如 c 语言程序的执行过程,先 将后置为点 c 的原文件,通过编意、链接等步骤分成可直性文件,然后就可以直接运行了。编意型语言的缺点是比较依赖编意器,而平台性较差。 事情语言是指程序员代码不需要经过编语,程序在运行时才会翻译成机器,每次执行都需要翻译,效率较低。比如拍摄程序的执行过程,拍摄解释器需要把原代码一行一行的转换为可执行代码程序才可以运行。解释新语言比较依赖解释器,跨平台信两号 至今,速度而言,编辑性语言更快,同化平台而言,解释性语言更变了。那么问题来了,加吧,是变异性语言还是解释性语言呢?评论区等你答案!

编程语言大致分为两种,一种叫做编辑性语言,一种叫做解释性语言。大家都知道机器只能识别零合一,所以要能识别我们用编程语言写的代码, 就要把代码最终翻译成各种零合一。变异性语言就是针对某个机器,用变异器先把代码全部翻译成这个机器能够识别的零合一,之后再让机器执行, 比如 c、 c 上等语言。解释型语言则是用解释器在需要执行的机器上,先把代码一行一行的翻译成零和一边翻译边执行,比如 iphone、 luby 等语言。 简单说,变异性语言是一次性把代码全部翻译好,没问题才能在机器上执行,所以效率高。但是夸平台性很差。因为是要针对某个机器或者平台,先翻译好。解释 语言是边翻译代码边执行,翻译到有问题的地方停止执行,所以效率低,但是夸平台性很好。这也就是在同样条件下, ios 和安卓 app 运行速度有些许差异的原因之一。 ios 是基于 c 语言编意型 效率高,而安重是基于加瓦解释型效率低。户外提一下,华为的鸿蒙结合方舟编辑器完全绕过了虚拟机,不再需要低效的解释执行,因此速度也很快。

解释型语言解释型语言的程序不需要编译,相比编译型语言省了道工序,解释型语言在运行程序的时候才才逐行翻译。优点 是有良好的平台兼容性,在任何环境中都可以运行。前提是安装了虚拟机,灵活修改代码的时候直接修改就行了,可以快 爱数不数,不用停机维护。缺点就是每次运行的时候都要解释一遍。性能上不如变异性语言,代表语言有达拉斯,可以拍笋、 php, 关注加点赞,每天获得一点编程小知识。

好知识点二程序编码程序编码当中啊,是我们来进行 书写计算机的一个程序啊。书写计算程序的话,我们会用到各种语言程序,比方说有第一代的机器语言, 机器人,指的是二进制代码来编写这样的一个程序,可读性比较差。但是我们的计算机呢?能够唯一识别的啊语言就是我们的机器语言 啊,用户很难识别它对不对,计算机能够唯一识别和执行的就是我们的机缘。第二种会编元,是属于符号化了的机器元,用了一些助剂词, 但也属于比较低级的元。第三代是各种高级元,比方说我们的 c 元,我们的 c 加加,我们的 java 都属于高级元,高级元是用 英文语法加上我们的数学函数对吧,所构成的。这个语言面向于我们的普通程序员啊,友好性会比较好啊,意志性也比较的好啊。 那么对我们的程序设计语言而言的话,其实指的就是一组记号或一组规则。 在程序是语言当中,这些记号串就是我们的程序。程序会包括语法、语意以及语用啊。那所谓这个语法指的是我在编写程序的时候,这些符号 啊之间这些雨之间呈现什么样的一个规则。雨意指的是程序起什么样的作用, 而与用指的是这个程序和使用之间什么关系。另外我们还需要注意下,如果我们是用高级元来编写这样的一个程序,比方说你用 c 所编写的这个程序,计算机是不能够直接识别和执行的,你需要通过编译或者说解释程序的处理。 那那么自然这里涉及到我们的编译跟这个解释什么样的一个区别。所谓编译的话,它会形成等价的机器员目标程序啊。而我们的解释呢?就是逐句的进行翻译并执行, 输入一条,翻一条,执行一条,中间并没有目标程序。它的一个深层交互性会比较好一点,但是效率会更低啊。这里主要是搞清楚我们的编译和这个解释到底有什么样的一个区别啊。 好,重点就关注是否有目标程序,目标代码它的生成。 第一个选择题编译和解释是实现高级语言程序语言的两种基本方式。什么是这两种方式的主要区别啊?这个解释在有的书当中也写作翻译啊,翻译啊。 那主要是什么呢?主要是是否生成目标代码。答案选择是我们的。 d 就是等价的继续员目标程序。

编译型语言和解释型语言是两种不同的编程语言类型,他们的主要区别在于原代码是如何转换成计算机能够识别和执行的机器码的。编译型语言需要提前将所有的原代码通过编译器一次性转换成可执行程序,比如 windows 下的 exc 文件。 解释型语言则是通过解释器逐行对原代码进行解释和执行,不会生成可执行程序。 编译型语言和解释型语言各有优缺点,具体如下,编译型语言的优点是执行效率高, 运行时不需要编译器或解释器的支持,可以脱离开发环境运行。缺点是可移植性差,不同平台的可执行程序和原代码都可能不兼容,需要重新编译或修改。解释行 语言的优点是可移植性好,源代码可以在任何安装了解释器的平台上运行,不需要重新编译或修改。缺点是执行效率低,运行时需要解释器的支持,不能脱离开发环境运行。


很多初学者学了几门编程语言,但是并不清楚这些编程语言到底是编译型语言还是解释型语言,什么是解释,什么是编译?如你学过 c 语言,你就会知道, c 语言在执行前一定要先编译一下,如果发现语法错误,一定编译不通过 c 语言。编译器首先要将你编写的代码编译成可执行文件。 比如在 windows 系统上,首先要编译生成一个 e x e 的文件,然后才可以执行。而解释型语言就是解释一条执行一条。比如 job 语言就是这样,如果有一句代码发生错误的话,程序就执行到那一句,才会停下来报错。 边解释边执行的语言解释就是一句一句的翻译,如下图所示。编译型语言就是先从原程序转化 换成机器指令,然后再由机器运行,而解释型语言就是逐条读取,逐条执行。为什么会有这两种类型的编程语言,我认为主要是为了解决跨平台性的问题, 一般编译型语言跨平台性都不好。比如 c 语言在不同的操作系统下,需要使用不同的编译工具进行编译,编译出来的机器代码是不同的,所以 c 语言程序进行移植后,需要重新编译。 而解释型语言就不一样,比如 java, java 程序首先通过编译器编译成 class 字解码文件,也就是二禁制文件。 使用过命令行操作的朋友知道,这部通过 j v a c 进行编译这个字解码文件与平台无关。如果在 windows 平台上运行,则通过 windows 平台上的 java 虚拟机进行解释。如果运行在 linux 平台上,则通过 linux 平台上的 java 虚拟机进行解释执行,所以说能跨平台,前提是平台上必须要有相匹配的 java 虚拟机,如果没有 java 虚拟机,则不能进行跨平台。 简单来说就是 java 程序的跨平台,是因为 java 虚拟机跨平台,所以它可以跨平台。你会发现,如果你要运行 java 程序,首先要安装 java 虚拟机,其实就是 jdk, jdk 里面包含了 jvm, 没有 jvm 你是无法执行 java 语言编写的软件的。 把字解码文件通过类加载器加载进 jbm 中,然后进行字解码的教验,没有问题就通过解析器把字解码翻译成当前机器能识别的机器码,然后交给操作系统去进行调度执行。虽然字解码文件与平台无关,但是 特定平台的机器只能执行其对应的机器码,那么就需要有一个中间键来把字解码翻译成对应的平台机器码,这个就是解析器,而解析器其实就是 j v m 里面的一个组件。 j v m 的执行流程一、 j v m 使用类加载器装载 cos 文件。二、字解码效验, 检查当前克拉斯文件的版本和 jbm 的版本是否兼容。检查当前代码是会破坏系统的完整性。检查当前代码是否有战役出的情况。 检查当前代码中的参数类型是否正确。检查当前代码中的类型转换操作是否正确。 三、把通过教验的字解码解析成机器码。解析器是一句一句进行代码进行解析的。同样拍同也是一种解释型语言,他的原理和 javan 类似,只不过拍同代码是先编 编译成批捆键,也就是二禁止文件,同样也是跨平台的,然后再由拍堂虚拟机解释执行。其实解释型语言的编译不是一个强制的操作,事实上编译是一个自动的过程,多数情况下你甚至感觉不到他的存在。 这就是为什么解释型语言性能没有编译型语言的好,原因就是因为虚拟机的存在中间隔了一层,自然就慢了。 本来像 c 语言那样可以直接由操作系统运行,而找到和 python 语言要先由操作系统运行虚拟机, 然后再由虚拟机运行。对于的 java 和拍团程序自然而然运行速度就慢,需要的内存也比较高。总结来说就是编译型语言有他的优点,也有他的缺点,优点就是运行快,内存小,缺点就是跨平台性差。解释型语言刚好 和编译型语言相反,优点是跨平台性好,缺点是相对于编译型语言来说运行慢,内存大。

今天我想跟大家聊一个大家一定都会用到,但却很少被重视的步骤,编译和链接。通常这两个步骤呢,被我们的 ide 封装的很完美,我们一般都是一键构建,对吧?非常方便。 但是一旦遇到错误的时候呢?尤其是链接相关的错误,很多人就束手无策了。所以今天我想跟大家一起深入探讨一下编译和链接的整个过程。首先,什么是编译呢? 编页的过程其实是将我们程序的原代码翻译成 cpu 能够直接运行的机器代码。比如我们写了一个原文件魅点 c, 你便简单说出了一行文字,并且调了一个函数 add, 而这个函数被定义在另一个原文件 math 点 c 中。 这里我们就可以调用 gcc 杠 c 来分别编译这两个原文件。需要注意的是,编译永远都是以单个原文件为单位的。在实际开发 中,我们通常会将不同功能的代码分散在不同的原文件,一方面方便代码的阅读和维护,同时也提升了软件构建的速度。比如你修改了一个原文件,那么只需要单独编译它这一个,而不需要浪费时间重新编译整个工程。 可以看到,在编译之后会生成两个扩展名为点 o 的文件,它被称作目标文件。目标文件是一个二进制的文件,文件的格式是 l f linux 下所有可执行文件的通用格式。 相应的, windows 使用的是另一种格式 pe, 他们虽然互不兼容,但在格式上非常相似,都是对二进制代码的一种封装。 我们可以在文件头部找到可执行文件的基本信息,比如支持的操作系统,机器类型等等。后面是一系列的区块,被叫做 sections, 里面有我们的机器代码,还有 程序的数据等等。比如点 tax 是代码区,里面是之前编译好的机器代码,点 day 的是数据区,里面保存了我们初始化的全局变量、局部静态变量等等。后面还有一些其他的区块我们待会讲到。 需要注意的是,目标文件虽然包含了边域之后的机器代码,但它并不能够直接执行,操作系统也不允许你去执行它。 因为在编译的过程中,我们用到了尚未定义的函数 add, 而我们主程序中的 add 其实只是一句声明而已,他被定义在另一个模块 mess 点 c 中, 这团也包括我们用到的标准库中的 printf。 如果我们去查看 standard io 点的 h 头文件,其中的 printf 只是一个函数的声明而已。换句话说,我们在编译魅点 c 的时候,编译器是完全不知道 printf 和爱的函数的存在的,比如他们位于内存的哪个区块,代码长什么样都是不知道的。因此编辑只能将这两个函数的跳转地址先暂时设为零,随后在链接的时候再去修正它。什么意思呢? 比如我们来看一下魅点 o 这个目标文件中的内容。这里的魅是编页之后的主函数代码,左边是机器代码,右边是对应的返回编。 可以看到这里的两个括指令,很明显,他们分别对应之前调用的 printf 和 add 函数,但是你会发现他们的跳转地址都被设成了零,而这里的零会在后面链接的时候被修正,我们马上讲到。 另外,为了让链接器能够定位到这些被修正的地址,在代码块中我们还可以找到一个重定位表,比如在点 text 区块中,需要被重 定位的两个函数 printf 和 add, 它们位于偏移量十四和二十三的位置,后面是地址的类型和长度,这和我们之前看到的机器代码是一一对应的。 我们将另一个原文件 math 点 c 也编译出来,最后连同魅点 o 一起链接生成一个独立的可执行文件。我们用到的还是 g c c 命令后面传入之前编译的这两个目标文件,随后在目录下可以找到生成的可执行文件 ma, 而这个 ma 就可以直接运行了。 所以链接其实就是将编译之后的所有目标文件联通用到了一些静态库,运行实库组合,拼装成一个独立的可执行文件,其中就包括我们之前提到的地址修正。在这个时候呢,链接器会根据我们的目标文件或者静态库中的重定位表,找到那些需要被 重定位的函数全局变量,从而修正他们的地址。但如果我们在链接的时候忘记提供必须的目标文件,比如这里的 math 点 o, 由于链接器找不到爱弹数的实线,于是报错。引用未定义,或者有的编辑也叫他符号未定义,意思就是我们用到了爱,但链接器却无法找到他的定义,因此只能报错。 讲到这里呢,相信大家对编译和链接已经有一定的了解了,但如果每次都手动编译在链接显然不够高效,实际开发也没有人这么做,通常我们都是用各式各样的 ide 或者构建工具帮我们自动化了, 所以这里我想先介绍一种最简单的构建工具, macfl。 可能很多人对他的印象是很古老,但其实 macfl 除了软件构建之外,还有许多其他的奇迹引巧,比如用它来 自动生成文档的呢?像很多现代的项目也都还在用它,譬如 android o s 的构建的呢。 make file 的核心其实是对依赖的管理,比如要构建 me, 则需要 me 点 o 和 math 点 o 这两个文件同时执行下面这条链接指令。 如果要构建魅点 o, 又需要魅点 c 这个文件,同时执行下面这条编译的指令。然后你会发现, make file 其实就是在定一颗依赖树,你要构建最上方的这个目标,就需要提供下面这些节点的文件,然后这样层层的递规下去。 有了 make file 以后,我们可以调用 make 命令后面跟上目标的名称 make, 它会自动根据我们的依赖数地规的去构建这个可执行文件。当然第一次运行,由于所有叶子节点都不存在, make 会自动构建所有的依赖包, 包括其中的目标文件。但如果我们再运行一次 mac, 由于所有的文件都已经存在,并且是最新的 mac, 就不会再重复构建了。 此时如果我们再单独修改一下魅点 c 文件,由于魅点 c 只会影响魅点 o, 从而影响最后的可执性文件 me, 所以 make 只会去重新生成这两个相关的文件,从而避免了其他不必要的文件编译。 其实所有的现代化构建工具都用到了相同的原理,对依赖的管理,只不过加入了一些更实用的功能,比如脚本原的支持、第三方库的管理等等。如果大家感兴趣的话,也可以去看看之前的那一期 c max 视频, 他是一个更加灵活同时也更复杂的软件构建系统,备用在很多大型的 c 或者 cr 项目中,大家感兴趣的话也可以去研究一下。