编译器、链接器和解释器

这篇具有很好参考价值的文章主要介绍了编译器、链接器和解释器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

编译器

编译器的作用就是将高级编程语言翻译为机器代码。

编译器工作过程一般分为:

  • 词法分析:将高级语言解析成 Token 集合;
  • 语法分析:将 Token 集合构建成语法树,在这个过程可以判断出语法是否有误,比如 while 后面是否 { 等等;
  • 语义分析:判断语法树是否有明显的语义错处,比如:string 不能与 number 相加;
  • 中间代码生成:在一些编译器中,源代码可能会被转换成中间代码,这是一种介于高级语言和底层机器代码之间的表示形式。中间代码易于优化和跨平台生成。
  • 优化:编译器会进行一系列的优化操作,以提高生成的机器代码的性能。这包括代码消除、循环展开、内联函数等优化技术。
  • 目标代码生成:目标代码生成阶段将中间代码或其他中间表示翻译为特定体系结构的机器代码。这些机器代码可以由计算机直接执行。

链接器

编译器生成了一堆二进制文件,怎么运行这些二进制文件呢?链接器的作用就是将多个目标文件(object files)链接为一个可执行文件或库。

1. 符号解析(Symbol Resolution):

符号指的是全局变量函数

每个文件都要确认两个事,自己有哪些符号可以供别的文件使用引用别的文件的符号真实存在

链接器会从目标文件和库文件中提取这些符号,并建立符号表,记录每个符号的名称和地址。如果有多个目标文件或库中存在相同名称的符号,链接器会根据不同的规则解决冲突。

目标文件通常是由编译器生成的二进制文件,包含函数和变量的定义以及对其他符号的引用;而库文件则包含预编译的目标文件(静态链接,如 .a.lib 文件)。

2. 重定位(Relocation):

目标文件和库文件通常会包含相对于文件起始位置的相对地址,这些地址需要在最终可执行文件中被映射到正确的内存地址上。链接器会遍历目标文件中的重定位信息(.relo.text.relo.data),将这些相对地址替换为实际的绝对地址。这样,可执行文件就可以正确地在内存中加载和执行。

3. 库依赖解析(Library Dependency Resolution):

3.1 静态链接(Static Linking):
在静态链接中,链接器会将程序所依赖的库(如 .a.lib 文件)的代码和数据直接嵌入到最终的可执行文件中。当您运行可执行文件时,不需要额外加载外部的库文件,因为所有需要的代码和数据已经在可执行文件内部。

3.2 动态链接(Dynamic Linking):
在动态链接中,可执行文件只包含对库函数和变量的引用,而不包含实际的库代码和数据。这些库代码和数据存储在系统的共享库中(也称为动态链接库或共享对象,如 .so.dll 文件)。多个程序可以共享同一个库的实例,减少了存储空间和系统资源的浪费。

动态链接可能发生在两个时机:

  • 加载时的动态链接:操作系统会在执行可执行文件之前,将所需的共享库加载到内存中。这时,链接器会解析可执行文件中的引用,将这些引用关联到所加载的共享库中的实际函数和变量。
  • 运行时的动态链接:共享库已经在加载时加载到了内存中,但链接的最终步骤是在程序运行时进行的。这时,操作系统会确保程序可以正确地访问所需的共享库中的函数和变量。程序在运行期间,可以根据需要调用共享库中的函数,操作系统会负责将这些调用关联到实际的库代码。

4. 生成可执行文件(Executable File Generation):

在完成所有的符号解析、重定位和库依赖解析后,链接器会根据上述步骤的结果生成最终的可执行文件。这个文件包含了所有目标文件和库文件的代码和数据,以及链接器添加的一些元信息。

可执行文件其实和目标文件是很相似的,都有代码区和数据区,只不过在可执行文件中还有一个特殊的符号 _start,CPU 正是从这个地址开始执行机器指令的,经过一系列的准备工作后正式从程序的 main 函数开始运行。

解释器

解释器是一种能够直接执行源代码的程序或系统组件。

解释器会逐行读取源代码,并将其翻译为机器指令或直接在虚拟机中执行。因此,您可以在没有编译步骤的情况下运行源代码。

一些解释性语言具有良好的跨平台性,因为解释器可以在不同的操作系统上运行。这使得编写一次代码,多平台运行成为可能。

一些典型的解释性编程语言包括 Python、Ruby、JavaScript、Perl 等。这些语言通常用于脚本编程、Web 开发、数据分析等领域。

JVM(Java虚拟机)可以被看作是一种解释器。JVM 是用于执行 Java 程序的虚拟机,它将 Java 源代码编译成字节码(Java 中间代码),然后在运行时通过解释器将字节码转换为机器指令执行。文章来源地址https://www.toymoban.com/news/detail-622334.html

到了这里,关于编译器、链接器和解释器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python知识】11 个最佳的 Python 编译器和解释器,码住了,万一哪天就用上了!

    Python 是一门对初学者友好的编程语言,是一种多用途的、解释性的和面向对象的高级语言。 它拥有非常小的程序集,非常易于学习、阅读和维护。其解释器可在Windows、Linux 和 Mac OS 等多种操作系统上使用。它的可移植性和可伸缩性等特性使得它更加容易被运用。 Python 库可用

    2024年02月06日
    浏览(52)
  • python解析器和pycharm编译器安装

    python解析器下载地址:https://www.python.org/getit/ 注意事项: 1. 建议下载3.6以以上的版本, 2. 官网下载比较慢,可以自行寻找其它网站下载, 3. 建议使用.exe安装包方式下载安装 下载完成后双击运行 验证是否安装成功: pycharm编译器下载地址:https://www.jetbrains.com/zh-cn/pycharm/dow

    2024年02月17日
    浏览(41)
  • Linux的编译器——gcc/g++(预处理、编译、汇编、链接)

    前言: 本文主要认识与学习 Linux 环境下常用的编译器—— gcc (编译 C 代码)/ g++ (编译 C++ 代码)的常用指令等、程序实现的两大环境、动态库与静态库的理解等。 任何一个 C 程序的实现都要经过 翻译环境 与 执行环境 。 在翻译环境中又分为4个部分, 预编译、编译、汇

    2024年02月13日
    浏览(43)
  • 如何在Qt中配置MSVC编译器链接器参数?

    原标题:掌握VS项目配置 【进阶】— 编译器链接器配置 在上一篇基础篇中,我们主要探讨了VS的构造系统模型,了解了VS项目最基本的输入输出配置。输入输出是系统对外的功能接口,是系统最基础的部分。 在本章的进阶篇中,我们要探讨构造系统的内部参数。内部参数用于

    2024年02月15日
    浏览(49)
  • 在makefile中,CC(编译器)和LD(链接器)代表什么?

    这些变量的名称源自相应工具的名称。通常这些缩写的含义如下: CC 代表“ C c ompiler”(在GCC缩写中,它也被视为“ c ompiler c ollection”)。 LD 是一个链接器(来自“ l ink e d itor”或“ l oa d er”)。 CPP 代表 “ C p re p rocessor” CXX 是一个 C++ 编译器

    2024年02月15日
    浏览(46)
  • 链接文件学习(七):英飞凌MCU Tasking编译器LSL链接文件解析 及代码变量定位方法

    目录   1、Tasking的链接文件 1.1、DSRAM中的数据存放 1.2、PFlash中的代码存放 1.3、LMU 1.4、PSRAM 1.5、UCB 2、代码与变量定位

    2024年02月07日
    浏览(52)
  • 【Linux】Linux编译器 gcc/g++的使用&&初识动静态链接库

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯 长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】Linux环境基础工具的基本使用及配置(yum、vim) 在上一篇 Linux 博客中,我们讲解了 vim 编辑器的使用,可以在 Linux 上写

    2024年02月11日
    浏览(52)
  • 『pycharm 』解决无法添加解释器,无法新建项目问题(是无法添加解释器,不是没有添加解释器)

    这个问题和大家常见的: 没有Python解释器 这种简单问题不同。请看问题描述。👇👇 如图,解释器列表空空如也,即使点击“ 添加本地解释器 ”也没有反应(那个展开小三角也是空的)。 所有项目都这样了,那里变成空的了。而且这些都是我自己的项目,之前都好好的。 删

    2024年02月11日
    浏览(68)
  • Pycharm 重命名SSH的conda解释器后,提示该解释器不可用

    目前已知是BUG,截至投稿日未修复 已经提交给youtrack.jetbrains.com,如下图:

    2024年01月17日
    浏览(67)
  • 解锁Spring Boot中的设计模式—02.解释器模式:探索【解释器模式】的奥秘与应用实践!

    解释器模式(Interpreter Pattern)是一种行为设计模式,它用于定义语言的文法,并且解释语言中的表达式。在Java中,解释器模式可以用于构建解释器以解析特定的语言或表达式,如数学表达式、查询语言等。 优点: 灵活性: 解释器模式可以 灵活地添加新的表达式和规则 ,因

    2024年02月19日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包