首页 > 其他分享 >编译那些事儿-1

编译那些事儿-1

时间:2023-10-12 20:32:49浏览次数:30  
标签:LLVM Java 那些 编译 编译器 构建 Meson 事儿

前言

      本章节主要梳理编译过程中对概念的各种疑惑,属于是碎片式知识积,没有很规范的体系,阅读前请获悉!

1.代码的构建系统有哪些

常见的代码构建系统包括:

  1. Make:是一个最古老的构建系统,用于编译和构建C程序。Make使用Makefile文件来描述编译规则和依赖关系。
  2. Ant:是Java平台上的构建系统,用于编译Java程序。Ant使用XML文件来描述构建规则和依赖关系。
  3. Maven:也是Java平台上的构建系统,用于管理Java项目的构建,依赖和文档。Maven使用XML文件来描述构建规则和依赖关系。
  4. Gradle:是一个基于Groovy语言的构建系统,用于编译Java程序。Gradle使用Groovy脚本来描述构建规则和依赖关系。
  5. CMake:是一个跨平台的构建系统,用于编译C和C++程序。CMake使用CMakeLists.txt文件来描述构建规则和依赖关系。
  6. Meson:是一个跨平台的构建系统,用于编译C,C++,Python等程序。Meson使用Meson.build文件来描述构建规则和依赖关系。
  7. SCons:是一个Python脚本库,用于构建软件,支持多种语言(如C,C++,Java,Python等)。SCons使用Python脚本来描述构建规则和依赖关系。
  8. Bazel:是一个Google开发的构建系统,用于构建大型项目和分布式系统。Bazel使用BUILD文件来描述构建规则和依赖关系。

   其中,Make/Cmake/Meson在我们的日常工作中比较常见,需要大家对其有一定的了解。

2.meson与llvm什么关系

      Meson是一个构建系统,而LLVM是一个编译器框架。Meson可以使用LLVM作为其后端编译器之一,以生成优化的代码。此外,Meson也可以与LLVM的其他工具和库集成,例如LLVM的调试器(LLDB)和静态分析器(Clang Static Analyzer)。

       例如Meson官方文档里曾有如下说明:

It is possible to use GCC as the frontend compiler and LLVM as the backend compiler. This can be done by passing `-Dfrontend=gcc` and `-Dbackend=llvm` to the Meson command line. This will compile the code with GCC and then pass the generated assembly code to LLVM for optimization and code generation.

       因此,Meson和LLVM之间存在一些关系,但它们是不同的工具,用于不同的目的,采用Meson作为构建系统的项目,可以根据自身的需求,灵活选择前后端搭配。

3.编译的前端后端有什么区别,分别起什么作用?llvm编译与gcc编译的区别是什么

前端和后端是编译器的两个主要部分,它们分别起着不同的作用:

前端负责将源代码翻译成中间代码(IR,Intermediate Representation),同时进行语法分析、语义分析、代码优化等工作。前端通常针对一种特定的编程语言,如C、C++、Java等。

后端:负责将中间代码转换成目标代码,并进行目标代码优化。后端通常与硬件平台相关,针对不同的硬件平台可能需要编写不同的后端。

LLVM和GCC都是编译器,但它们的编译方式略有不同。以下是它们之间的一些区别:

  1. 编译速度:GCC编译速度通常比LLVM快。
  2. 代码优化:LLVM的代码优化能力更强,可以生成更高效的代码。
  3. 跨平台支持:LLVM的跨平台支持更好,可以在多种平台上运行。
  4. 模块化:LLVM的模块化设计使得它更易于扩展和维护。
  5. 编译器插件:LLVM支持编译器插件,可以方便地添加新的编译器功能。

      总的来说,LLVM相对于GCC来说更加灵活、可扩展,具有更好的代码优化能力和跨平台支持。但是,对于某些特定的用例,GCC仍然可能更适合。

4.编译的四个阶段:预编译、编译、汇编、链接分别用到了编译器哪些部分

 编译过程通常分为四个阶段:预编译、编译、汇编和链接,不同阶段使用的编译器部分如下:

  1. 预编译阶段:主要处理头文件,将头文件内容插入到源代码中,生成以.i为扩展名的预编译文件。在这个阶段,编译器主要使用预处理器部分。
  2. 编译阶段:主要将源代码翻译成中间代码,进行语法分析、语义分析和代码优化等操作,生成以.s为扩展名的汇编文件(.c->.s)。在这个阶段,编译器主要使用前端部分。
  3. 汇编阶段:主要将中间代码转换成机器码,生成以.o为扩展名的目标文件(.s->.o)。在这个阶段,编译器主要使用后端部分。
  4. 链接阶段:主要将目标文件和库文件链接成一个可执行文件或库文件。在这个阶段,编译器主要使用链接器部分。

需要注意的是,不同编译器的实现可能略有不同,但一般都包含上述四个部分。

标签:LLVM,Java,那些,编译,编译器,构建,Meson,事儿
From: https://blog.51cto.com/u_15635173/7834977

相关文章

  • Cython加密python代码防止反编译
    本方法适用于Linux环境下:1.安装库Cythonpip3installCython==3.0.0a10 2.编写待加密文件:hello.pyimportrandomdefac():i=random.randint(0,5)ifi>2:print('success')else:print('failure') 3.编写加密脚本import......
  • 在Windows下配置Clang编译器
    PreferencesLinux&macOS平台LLVM相关工具链下载2019年,在Windows下配置Clang编译器VisualStudio2022中使用Clangclion使用clang编译Clion2020.3:如何设置Clang编译器这篇文章主要介绍如何在Windows使用Clang编译器来编译C/C++程序(在命令行下,clang是C编译器,编译C++......
  • OpenHarmony-systemui项目工程无法编译的解决办法
    在探索OpenHarmony3.2Release的过程中,我希望通过修改系统软件来使系统更符合HarmonyOS特性,但是在尝试编译systemui时,遇到了这个问题:hvigorERROR:'entryModules'mustbeconfiguredforafeaturemodule.Detail:Set'entryModules'inthebuild-profile.json5f......
  • CudaText 编译运行c
             CudaText是一款轻量级地文本编辑开源软件。在安装codeblocks的gcc编译器后可以编译运行c。配置如下打开Tools-->config-->Add。 其中Parameters设置如下为编译和运行。{FileName} -o {FileNameNoExt}&&cmd/c{FileNameNoExt} 按快......
  • c++编译报错解决办法
    所有的警告都被当作是错误在全局域:cc1plus:错误:unrecognizedcommandlineoption‘-Wno-unknown-warning’[-Werror]cc1plus:所有的警告都被当作是错误解决办法:去除CMakeLists.txt中的-Werror......
  • 群晖安装保姆级教程(各位兄台慢慢看),给新新新手看的(以DS920类型的编译)
    感谢:非常感谢你的大力支持!我们的目标就是让天下没有难做的NAS。教程准备工具,请旺旺联系店主,店主会私信给你网盘下载链接。包含:引导文件、写盘工具等。1、打开写盘工具 2、插入优盘,优盘要求不小于8G,太小的优盘写起来很费劲。 3、在写盘工具界面上点击选择,选择刚刚下载......
  • vscode交叉编译cmake工程,toolchains设置
    在VisualStudioCode中编译CMake项目时,使用自定义工具链(toolchains)可以很有用,特别是当你需要交叉编译或使用不同的编译器时。以下是在VisualStudioCode中使用自定义工具链的一般步骤,以aarch64的嵌入式为例:创建自定义工具链文件:首先,你需要创建一个包含有关你的自定义工具链......
  • gcc编译过程总结
    第一步:对源文件进行预处理,需要使用的gcc参数为-E#1.预处理,-o指定生成的文件名$gcc-Etest.c-otest.i第二步:编译预处理之后的文件,需要使用的gcc参数为-S#2.编译,得到汇编文件$gcc-Stest.i-otest.s第三步:对得到的汇编文件进行汇编,需要使用的gcc......
  • Android Studio可以编译但Flutter提示无法定位java runtime
    AndroidStudio可以编译但Flutter提示无法定位javaruntime下面我们重点讲一下“UnabletofindbundledJavaversion”报错问题到AndroidStudio安装目录下注意:有些AndroidStudio可能是“jbr”文件,不用管jbr文件,直接复制一份jbr文件在同一路经,再把复制的文件改名为“jre”文......
  • Windows下Cmake编译Poco库
    C++Windows下使用Cmake编译Poco库1.编译前准备:先配置OpenSSL环境(opensslversion-a查看)如果openssl是1.0.*版本,Poco版本最高用1.9.4。如果1.1或者更高,用最新版本。2.编译命令(演示使用VS2022编译v140版本Win32的库):cd..mkdircmake_build_x86cdcmake......