自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 第 10 章:在C++中使用协程进行系统编程

一个进程就是一个程序的运行实例。它有自己的地址空间,除了通过共享内存,不与其他进程共享。线程存在于进程中,它们不能脱离进程存在,尽管在Linux中,进程和线程都被视为任务。它们以相同的方式被调度,并且在内核级别有相同的控制结构。尽管如此,线程被认为是轻量级的,因为程序的初始负载的较大开销由父进程承担。但这并不是完整的情况。还有纤程和协程。如果说进程和线程是真正的并发并且在共享资源上并行工作,纤程就像线程,但不符合并发。虽然线程通常依赖于任务调度器的抢占式时间分片,纤程使用协作式多任务处理。

2024-01-31 20:54:24 742

原创 第 9 章:理解C++内存模型

在本章中,我们汇集了使用C++实现最佳代码性能所需的全部工具集。你学习了许多不同系统和软件层面上的技术,如果你现在想休息一下,这是可以理解的。确实,我们所涵盖的一些内容,例如分支预测和缓存友好性,或通过条件变量和内存顺序实现更多算法,值得花费更多时间。我们强烈鼓励你将本章作为改进系统和更有效工作方向的一步。下一章将致力于C++特性的另一个重大改进——协程。你将看到,对于这里讨论的一些机制,如事件等待,它们更为可取,而且更轻量。第7章第3章第2章。

2024-01-30 22:30:38 984

原创 第 8 章:Linux中使用时钟、计时器和信号

在本章中,我们探索了Linux环境中可用的不同计时器。随后,我们了解了时钟纪元背后的重要性和UNIX时间的概念。接着,我们深入探讨了在Linux中准确测量时间的POSIX的实际实现。此外,我们研究了的领域,并检查了C++为有效的时间相关操作所提供的一系列功能。我们的探索随后带我们详细了解了框架内定义的持续时间、时间点和时钟。接下来,我们熟悉了内可用的各种时钟类型。随着我们的旅程继续,我们开始探索所提供的日历功能。最后,我们熟悉了时区,并提高了我们利用所提供的工具无缝执行时间转换的熟练度。

2024-01-29 19:49:28 1036

原创 C++ 编程的幕后花絮

在C++的世界中,精准与创造力相结合,程序员们正在构建改变人们生活的非凡应用程序。我们希望这本书能帮助你成为那个社区不可或缺的一部分。下面,你将通过C++基础知识的速成。我们将涉及诸如C++中的应用程序构建过程、C++应用程序的底层细节,以及面向对象编程技术的快速介绍等主题。让我们开始吧!

2024-01-28 16:07:49 725

原创 第 5 章:高级语言结构的 IR 生成

在本章中,您学习了如何将聚合数据类型和指针翻译为LLVM IR代码。您还了解了应用程序二进制接口的复杂性。最后,您了解了将类和虚拟函数转换为LLVM IR的不同方法。有了本章的知识,您将能够为大多数实际编程语言创建一个LLVM IR代码生成器。在下一章中,您将学习有关IR生成的一些高级技巧。异常处理在现代编程语言中相当常见,LLVM对此也有一定的支持。将类型信息附加到指针上可以帮助某些优化,因此我们也将添加这一点。

2024-01-27 22:35:47 934

原创 第 7 章:进程间通信

我们很高兴再次讨论IPC主题。上次我们在[第3章]中讨论了管道,并使用了一些代码示例。您了解了进程间交换数据的基本机制,但如您所记,存在一些阻塞点。就像任何编程工具一样,管道有其特定用途——它们快速,可以帮助您从相关(forked)进程(通过匿名管道)和不相关进程(通过命名管道)发送和接收数据。同样,我们可以使用MQs传输数据,它们也适用于相关和不相关的进程。它们提供了将单个消息发送到多个接收进程的能力。但正如您所见,管道在发送和接收二进制数据方面是原始的,而MQs则引入了消息的概念。

2024-01-27 21:50:19 1086

原创 Rust循环和函数

如果你想要一个函数只在特定的操作系统上工作,那么用 #[cfg(target_os = “xyz”)] 属性来标注它(其中 xyz 可以是 “windows”、“macos”、“linux”、“android”、“freebsd”、“dragonfly”、“bitrig” 或 “openbsd” 中的一个)。每个 Rust 程序的起点都是一个名为 main() 的函数,它可以进一步细分为单独的函数,以便代码重用或更好地组织代码。你可以在代码中自己使用它们,它们被放置在它们要说明的项目(比如一个函数)之前。

2024-01-26 00:29:00 1091

原创 第三章:探索WebAssembly模块

在本章中,我们了解了WebAssembly在JavaScript引擎内部的执行方式,并探索了WebAssembly文本格式是什么以及如何使用WebAssembly文本格式定义WASM。在下一章中,我们将探索WebAssembly二进制工具包。

2024-01-26 00:21:10 825

原创 第 6 章:并发系统编程与C++

现代汽车已成为高度复杂的机器,不仅提供交通工具,还提供各种其他功能。这些功能包括信息娱乐系统,它允许用户播放音乐和视频,以及暖气和空调系统,用于调节乘客的温度。想象一下,如果这些功能不能同时工作的场景。在这种情况下,司机必须选择驾驶汽车、听音乐或保持舒适的气候之间进行选择。这不是我们对汽车的期望,对吧?我们期望所有这些功能同时可用,增强我们的驾驶体验,并提供舒适的旅程。为了实现这一点,这些功能必须并行运行。但它们真的是并行运行的,还是只是并发运行的?二者有什么区别?在计算机系统中,并发和并行。

2024-01-25 17:31:29 856 1

原创 第二章: 学习Emscripten

在本章中,我们学习了如何安装和使用 Emscripten 将 C/C++ 编译成 WebAssembly 模块。我们还探讨了 emsdk 工具和在生成 WebAssembly 模块时的各种优化级别。在下一章中,我们将探索 WebAssembly 模块。

2024-01-25 01:07:35 1050

原创 第一章: 理解 LLVM

在本章中,我们了解了编译语言的工作原理以及 LLVM 如何帮助编译它们。我们使用 LLVM 编译了一个示例程序,以理解它的工作方式。在下一章中,我们将探讨 Emscripten,这是一个将 C/C++ 转换成 WebAssembly 模块的工具。Emscripten 使用 LLVM 后端进行编译。

2024-01-25 00:10:31 958

原创 Rust变量和类型

我们将探讨Rust程序的基本构建块,如变量和类型。我们将讨论基本类型的变量,它们是否需要声明类型,以及变量的作用域。不可变性,作为Rust安全策略的基石之一,也将被讨论和展示。我们的代码示例将围绕构建一个基于文本的游戏。

2024-01-25 00:06:16 982

原创 第 4 章:IR 代码生成的基础知识

我们使用// ...Decl *,// ...LLVN类表示SSA形式的值。Value类就像计算结果的标签。它通常通过IR指令创建一次,然后使用。在优化过程中可能发生各种变化。例如,如果优化器检测到%1和%2值始终相同,那么它可以用%1替换%2的使用。这改变了标签但不改变计算。为了意识到这样的变化,我们不能直接使用Value类。相反,我们需要一个值句柄。不同的值句柄具有不同的功能。为了跟踪替换,我们可以使用类。因此,Defs成员将AST的声明(变量或形式参数)映射到其当前值。

2024-01-24 21:05:56 1012

原创 第 5 章:使用C++处理错误

每位软件开发者都应该尽可能地编写可移植的代码。编写可移植代码提供了可重用性,这可以显著降低开发成本。当然,这并不总是可能的。有些情况下,你编写的代码专用于特定系统。但对于所有其他情况,将代码从底层系统抽象出来,可以让你轻松地将其迁移到其他系统,而无需进行大规模重构来使其工作。这更安全,成本更低。让我们回到之前的示例,我们试图抽象从POSIX系统调用接收到的错误代码。它应该可以与可移植错误条件(如)进行比较。我们将用以下用例来扩展这一点。假设我们有一个也与文件打交道的自定义库,我们称之为。

2024-01-24 00:49:13 865

原创 第 4 章:深入了解 C++ 对象

在 C++ 中,声明和定义这两个术语通常用来指不同方面的变量、函数或类。声明在上述示例中,xfoo和Point都是声明的,但未定义。变量声明中的extern关键字表明x在程序的其他地方定义。在声明中,不会分配内存。定义:定义为已声明的名称提供实际实现。int x;在上述示例中,xfoo和Point都是定义的。因此,声明引入了一个名称并指定了其类型,而定义提供了实际的实现并为对象分配了内存。现在我们熟悉了术语,让我们深入了解 C++ 中对象的细节。

2024-01-23 18:07:36 1657

原创 从 Rust 开始

Rust 是由 Mozilla Research 开发并得到庞大开源社区支持的编程语言。它的开发始于 2006 年,由语言设计师 Graydon Hoare 启动。Mozilla 从 2009 年开始赞助 Rust,并在 2010 年首次正式推出。此后的工作经历了多次迭代,最终在 2015 年初推出了第一个稳定的生产版本 1.0.0,该版本由 Rust 项目开发者团队开发,包括 Mozilla 的 Rust 团队和超过 1800 名贡献者的开源社区。

2024-01-23 00:32:23 895

原创 第 3 章:文件系统

在本章中,我们没有展示通过C++修改文件数据的任何示例。我们的目标主要是解释不同Linux文件系统实体。我们使用C++文件系统库丰富了这方面的知识 - 例如,提高系统编程意识。您了解了不同文件系统对象的角色及其特点。您还拥有C++工具来管理文件资源并提升您的抽象水平。还有一些实际示例,展示了如何通过匿名管道和命名管道在进程之间进行通信。它们在操作系统级别的实现也被讨论了,我们还简要探讨了Linux中的信号处理。在下一章中,我们将深入探讨C++语言,为其安全和安全的使用奠定基础,符合最新标准。

2024-01-22 23:11:30 1994

原创 迭代器与范围

现在我们理解了迭代器的基本概念,让我们将其应用于一些实际用途。我们已经看到,如果你有一对从 begin() 和 end() 返回的迭代器,你可以使用 for 循环遍历底层容器的所有元素。但更强大的是,你可以使用任何一对迭代器来遍历容器元素的任何子范围!it!= end;int main()// 加倍整个向量中的每个元素// 加倍向量前半部分的每个元素// 同样加倍向量前半部分的每个元素it!= end;

2024-01-22 22:21:55 843

原创 多态和泛型编程

在C++标准库中,存在两个截然不同但同等重要的使命。其一是提供某些具体数据类型或函数的坚固实现,这些类型和函数在许多不同的程序中都有用,但并未内置于核心语言语法中。这就是为什么标准库包含std::regex等。另一个使命是提供广泛使用的抽象算法(如排序、搜索、反转、整理等)的坚固实现。

2024-01-22 21:56:17 776

原创 第 3 章:将源文件转换为抽象语法树

与前一章的简单计算语言相比,真实的编程带来了更多的挑战。为了深入了解细节,我们将在本章及后续章节中使用Modula-2的一个小子集。Modula-2设计精良,可选择支持泛型和面向对象编程OOP然而,我们不打算在本书中创建一个完整的Modula-2编译器。因此,我们将这个子集命名为tinylang。让我们从一个tinylang程序的例子开始。以下函数使用欧几里得算法MODULE Gcd;END;a := b;b := t;END;RETURN a;

2024-01-22 17:43:57 503

原创 第9章:Clang 静态分析器

你可以尝试直观地检查代码,这非常繁琐且容易出错,或者使用像Clang静态分析器这样的工具。问题在于,它不理解核电站API。我们将通过实现一个特殊的检查器来克服这一点。我们的第一步是建立关于我们想要在不同程序状态间传播的信息的状态模型概念。在这个问题中,我们关心的是反应堆是开启还是关闭状态。我们可能不知道反应堆是开启还是关闭的;因此,我们的状态模型包含三种可能的状态:未知、开启和关闭。现在我们对于检查器如何处理状态有了一个不错的概念。

2024-01-22 00:09:26 891

原创 第2章:探索LLVM的构建系统特性

本章深入探讨了LLVM的CMake构建系统。我们看到了如何使用LLVM自己的CMake指令编写简洁有效的构建脚本,无论是对于树内还是树外开发。学习这些CMake技能可以使您的LLVM开发更高效,并为您提供更多选项,以便将LLVM功能与其他现有代码库或自定义逻辑结合使用。在下一章中,我们将介绍LLVM项目中另一个重要的基础设施,称为LLVM LIT,这是一个易于使用但通用的框架,用于运行各种测试。

2024-01-21 23:28:41 1016

原创 第1章:构建LLVM时节约资源

LLVM是许多令人惊叹的工业和学术项目所采用的最先进的编译器优化和代码生成框架,例如JavaScript引擎中的)编译器和)框架。它是构建编程语言和二进制文件工具的有用工具箱。然而,尽管该项目具有强大的稳健性,但其学习资源分散,文档也不是最佳的。因此,即使是对LLVM有一定经验的开发者,其学习曲线也相当陡峭。本书旨在通过以实用的方式为您提供LLVM中常见和重要领域的知识来解决这些问题——向您展示一些有用的工程技巧,指出鲜为人知但方便的功能,并举例说明。作为一名。

2024-01-21 22:56:14 757

原创 第1章:玩转LLVM

在本章中,我们探讨了LLVM的模块化设计:如何在LLVM的opt工具中使用它,以及它如何适用于LLVM核心库。然后我们研究了LLVM的中间表示,以及一个语言的各种实体(变量、函数等)如何映射到LLVM IR。在最后一节中,我们讨论了一些重要的LLVM工具,以及它们如何用于将LLVM IR从一种形式转换为另一种形式。在下一章中,我们将看到如何编写一个可以输出LLVM IR的语言前端,使用LLVM机制。

2024-01-21 22:39:31 792

原创 第 1 章:模板简介

作为一名C++开发者,你至少应该对模板元编程有所了解,如果不是精通的话。模板元编程是一种编程技术,它使用模板作为蓝图,让编译器生成代码,帮助开发者避免编写重复的代码。尽管通用库大量使用模板,但C++语言中模板的语法和内部工作机制可能会令人望而却步。即使是由C++语言的创造者比亚尼·斯特劳斯特卢普和C++标准化委员会主席赫布·萨特编辑的C++核心准则,也称模板为“相当可怕”。本书旨在阐明C++语言中这一领域,并帮助你在模板元编程方面变得熟练。理解模板的需求编写你的第一个模板。

2024-01-21 20:57:31 853

原创 第 2 章:编译器的结构

在本章中,您了解了编译器的典型组件。为了向您介绍编程语言的语法,我们使用了算术表达式语言。您学习了如何为这种语言开发典型的前端组件:词法分析器、解析器、语义分析器和代码生成器。代码生成器仅产生 LLVM IR,并且使用 LLVMllc静态编译器从中创建对象文件。您现在已经开发了您的第一个基于 LLVM 的编译器!在下一章中,您将深化这些知识,构建一个编程语言的前端。

2024-01-21 19:42:30 2011

原创 第 1 章:安装 LLVM

CMake系统使用文件中的项目描述。顶层文件位于llvm目录,。其他目录也有文件,在生成过程中会递归包含。基于项目描述中提供的信息,CMake检查安装的编译器,检测库和符号,并创建构建系统文件,例如或Makefile(取决于所选择的生成器)。还可以定义可重用模块,例如用于检测是否安装了LLVM的函数。这些脚本放置在特殊的cmake目录(llvm/cmake)中,在生成过程中自动搜索。可以通过定义CMake变量来自定义构建过程。命令行选项-D用于将变量设置为一个值。CMake脚本中使用这些变量。

2024-01-21 18:09:35 956

原创 第 2 章:深入了解进程管理

让我们看一个例子;是的,我们知道您可能之前见过类似的例子,并且清楚输出应该是什么 -fork()1]启动了一个新进程,并打印出两个pid在父进程中,fork()将返回新创建进程的ID;这样父进程就知道了它的子进程。在子进程中,将返回0。这种机制对于进程管理很重要,因为fork()创建了一个调用进程的副本。理论上,编译时段(textdata和BSS)在主内存中重新创建。新的栈。

2024-01-21 17:40:49 982

原创 第 1 章:Linux 系统和 POSIX 标准入门

这里有一些误解,让我们简要澄清一下。Linux是一种类Unix操作系统,这意味着它提供了类似(有时甚至相同)的接口,如Unix——其功能,特别是API,旨在与Unix的接口相匹配。但它不是基于Unix的操作系统。它们的功能实现方式并不相同。在理解FreeBSD与macOS的关系时,也存在类似的误解。尽管两者共享了大量的代码,但它们的方法完全不同,包括它们的内核结构方式。牢记这些事实很重要,因为并不是所有我们将在本书中使用的功能都存在或可以在所有类Unix操作系统上访问。

2024-01-21 16:55:03 865

原创 国内安装Homebrew方法(最佳)

Homebrew 包管理器,它是一个免费且开源的软件包管理系统,可以轻松地安装最新版本的各种软件包。笔者主要是在linux上面使用,Homebrew 可以直观地管理、更新、卸载、查询已安装的包,比apt-get更方便,更实用。

2023-09-29 13:25:37 661

llvm-17第二章代码

llvm-17第二章代码

2024-01-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除