自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LLVM 新一代 JIT API:ORC

最近看到 ORC(On Request Compilation) 在增加 MachO 平台的 OC 和 Swift 语言支持,这是 MachO JIT(Just In Time) 相关的进展。本文将探索这个 LLVM 新一代的 JIT APIs,即 ORC,其 ORC JIT Weekly 现在还一直处于更新状态。1、JIT 解释以防语境不一致,解释下 JIT(Just In Time) 这个术语。Whenever a program, while running, creates and ru

2021-10-07 14:56:25 1441

原创 C++ 异常是如何实现的

本文内容主要来源于C++ exceptions under the hood,环境为 gcc/x86,原文非常长且专注于实现自己的异常机制,感兴趣可以看原文,本文只针对于原理介绍与术语讲解。1、太长不看版总结编译器会将throw语句翻译成一对libstdc++库里的函数,包括为异常处理分配内存、调用libstdc来进行栈展开(stack unwinding)。 对于每个catch语句的存在,编译器会在函数末尾加上一些特殊信息,包括当前函数可以捕获的异常表,以及清理表(cleanu...

2021-09-04 22:00:26 1471

原创 SOLID 代码设计原则

不同于设计模式,在面向对象软件设计当中,还有 SOLID 代码设计原则,本文将对其进行介绍和举例。1、什么是设计模式设计模式是软件设计当中通用的、可复用的解决方案,它是关于如何在不同情况下如何解决问题的描述或模版,通常是最佳实践。设计模式使得代码变得可维护的、可扩展的、解耦的,开发者为每个解决某种类型问题的方案起名,整理成各种通用的设计模式。注意,软件架构和设计模式是不同的概念,软件架构描述的是要实现什么样的功能和在什么地方来实施,而设计模式是描述怎样来实现。设计模式不是要编写解决方

2021-08-21 18:38:47 385

原创 C++ 析构函数的坑

C++ 的析构函数,通常是用来在生命周期结束时释放对象的。最近看到了关于析构函数的一些坑,本文会有介绍,并不是最全的,但也算是一些记录。1、什么时候编译器会生成析构函数?每一个类都会存在析构函数,对于类类型(class type),如struct、class、union这样的,如果没有自定义析构函数,那么编译器就会为它们生成内联(inline)、public 的析构函数。对于一般的类类型而言,通常其生成的析构函数会是空的(empty body),所以在内联之后,直接就等同于消失了。什么时..

2021-08-15 18:55:33 904

原创 《WebAssembly 原理与核心技术》笔记

读了一本关于 WebAssembly 虚拟机实现的书 ——《WebAssembly 原理与核心技术》,这本书写得非常详细,也有实现的源码讲解。本文是对阅读时所做的粗略的笔记。1、Wasm (WebAssembly)1.1、asm.jsasm.js 是 JavaScript 语言的一个严格子集,试图通过减少动态特性和添加类型提示的方式帮助浏览器提升 JavaScript 优化空间。相较于完整的 JavaScript 语言,裁剪后的 asm.js 更靠近底层,更适合作为编译器目标语言。func

2021-08-08 11:39:59 976

原创 代码分析属性图 CPG 介绍

代码分析工具层出不穷,编译器本身也内置了大量的静态检查,但分析的数据源较为单一。而本文要介绍的,是集众之所长的代码分析属性图 CPG,在漏洞分析上很有帮助。1、定义代码属性图(code property graph,简称 CPG) 是一种数据结构,用来通过 DSL(domain-specific language) 查询语句来挖掘代码漏洞。它的主要思想如下:CPG 将多个程序表示(program representations)整合成一个 CPG 数据被存储在图数据库中 通过 DSL 在

2021-08-01 11:49:04 2748 1

翻译 【译】LLVM 类型相等判断

在 LLVM 的类型系统中,进行两个类型是否等价的判断,对于做代码分析而言是很重要的,本文将介绍遇到的难题以及解决的方法。内容来源:https://lowlevelbits.org/type-equality-in-llvm/原文标题:TYPE EQUALITY IN LLVM作者:AlexDenisov译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为准。1、LLVM 类型系统的简述关于 LLVM 类型系统的背景,可以看我之前写的一

2021-07-24 18:13:00 376

原创 代码 bug 嗅探器:Sanitizer

代码 bug 总在不经意间出现,导演了一出出 crash 的悲剧。为了扼杀 bug 于襁褓之中,本文介绍的主角 Sanitize 挺身而出,致力于解决内存泄露、缓冲区溢出和未定义行为。本文将从原理来探索 Sanitize 的相关能力实现,介绍 ASan、MSan、UBSan、TSan,而关于如何使用,在官方教程都有,不会过多介绍。AddressSanitizer (ASan)ASan 是用来检测释放后使用(use-after-free)、多次释放(double-free)、缓冲区溢出(buff.

2021-07-17 12:54:42 581 1

原创 跨语言调 C 库:DragonFFI

跨语言调用是很方便实用的操作,但其实现并非想象的那么简单,包含有复杂的 ABI 设计、语言间的兼容交互等,本文将介绍一个跨语言调 C 库:DragonFFI。1、定义在官方 github 仓库中就有相关的说明,DragonFFI是 C 语言的 FFI(Foreign Function Interface,外部函数接口)库,使用 C++ 编写,基于 clang/llvm 来实现。跨语言调用 C ,一般有通过手写胶水代码的(JNI,Python,Ruby)、生成胶水代码的(SWIG)、扩展 C 的.

2021-07-10 11:13:21 291

翻译 【译】LLVM 类型系统

LLVM IR(intermediate representation) 的类型系统,在 LLVM 3.0 的时候被重写了,本文将介绍其原因,以及新类型系统如何运作。内容来源:http://blog.llvm.org/2011/11/llvm-30-type-system-rewrite.html原文标题:LLVM 3.0 Type System Rewrite作者:Chris Lattner译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为

2021-07-03 12:44:27 323

原创 代码优化利器 LTO 介绍

由于编译器一次只编译优化一个编译单元,所以只是在做局部优化,而利用 LTO,利用链接时的全局视角进行操作,从而得到能够进行更加极致的优化。1、定义“Link-Time Optimization.” Any kind of optimization that requires looking at the whole program, LLVM features powerful intermodular optimizations which can be used at link time.L

2021-06-26 11:06:55 2681

原创 【论文阅读】C++ 二进制插桩检测程序缺陷

本文是对硕士学位论文《基于二进制指令插桩的C++程序缺陷检测技术的研究与实现》的阅读笔记,作者对于 C++ 程序缺陷以及检测手段都有很详细地描述,感兴趣的建议看原论文。1、程序缺陷检测技术手段1.1、静态分析静态分析指不运行程序,直接对应用程序的源代码或者机器码等进行缺陷分析。1.2、动态测试动态测试指通过直接运行程序的方式对应用程序进行缺陷检测。1.3、对比 静态分析 动态测试 优势 可以比较全面覆盖程序所有执行分支 准确率高 劣势 准确.

2021-06-19 12:18:30 607

翻译 【译】LLVM 的设计

LLVM 是开源的编译工具链项目,用 C++ 编写,包含一系列模块化的编译器组件和工具链,用于开发编译器前端和后端。内容来源:https://aosabook.org/en/llvm.html原文标题:LLVM作者:Chris Lattner译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为准。Classical Compiler DesignImplications of this DesignThe most import

2021-06-14 15:41:30 310

翻译 【译】CMake 构建工具

CMake 是开源的跨平台的构建工具,在开发社区非常的出名,以及各种项目都有用到,本文来了解下 CMake 为何厉害。内容来源:https://aosabook.org/en/cmake.html原文标题:CMake作者:Bill Hoffman && Kenneth Martin译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为准。In addition to a build system, over the years

2021-06-13 14:32:09 238

翻译 【译】Ninja 构建系统

Ninja 是设计目标为速度快而生的构建系统,通过官方的博客,本文来深入了解下 Ninja 为何而快。内容来源:https://aosabook.org/en/posa/ninja.html原文标题:Ninja作者:Evan Martin译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为准。As input you describe the commands necessary to process source files intot.

2021-06-13 14:26:08 265

翻译 【译】编译构建的确定性分析

这是一篇对编译构建的确定性分析的文章,偏理论性的,对编译构建的确定性进行了很好地分类。内容来源:https://blog.llvm.org/2019/11/deterministic-builds-with-clang-and-lld.html原文标题:Deterministic builds with clang and lld作者:Nico Weber译者:流左沙注:翻译较原文会有一定的精简、重排和添删,主要是为了提取重要内容以达到更好的理解,请以原文为准。definitionA b

2021-06-12 13:33:53 160

原创 C++ 是如何处理函数符号查找?

在 C++ 的日常开发中,经常会遇到函数冲突或者找不到匹配的函数的问题,如果不了解编译器处理函数符号查找的行为,就很难去解决这些问题。【参考 How C++ Resolves a Function Call -https://preshing.com/20210315/how-cpp-resolves-a-function-call/】1、函数符号查找难点C 语言的函数调用很简单,每个函数都有唯一的名字。但 C++ 就复杂得多了,因为其有:函数重载 (overloading) 运算符.

2021-06-05 18:02:32 580

原创 CPU 分支预测探索与利用

CPU 的分支预测是个有趣的性能优化点,在写代码层面、编译层面和汇编指令层面我们都可以介入指导分支预测做得更好,本文也将从这些角度来探索 CPU 分支预测,以达到更好的利用。CPU 流水线【参考维基百科 - Instruction pipelining:https://en.wikipedia.org/wiki/Instruction_pipelining】CPU 流水线执行是一种在单处理器上实现多指令并行的技术。CPU 一般的执行操作包含:获取指令、翻译指令、执行指令、内存访问、寄存器写入

2021-05-29 12:04:40 799

翻译 【译】优化 clang 编译器的 mapping 函数

偶然发现一篇优化函数执行性能的文章,文章以 clang 里的 mapping 函数举例,但其优化思路以及举措可以通用到很多地方,非常值得一读,特此借翻译此文也加深自己的理解。内容来源:https://developers.redhat.com/blog/2021/05/04/optimizing-the-clang-compilers-line-to-offset-mapping/原文标题:Optimizing the Clang compiler’s line-to-offset mapping作

2021-05-23 21:55:57 407

原创 《go 语言圣经》笔记

最近看了《go 语言圣经》这本书,发现 go 语言很有趣,对于语法就不必关注,主要记录了一些语言特性(相对于其他语言而言)的笔记。Go(又称Golang)是 Google 开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。packageGo 语言的代码通过包(package)组织,包类似于其它语言里的库(libraries)或者模块 (modules)。Go语言中的包和其他语言的库或模块的概念类似,目的都是为了支持模块化、封装、单独编译和代码重用。每个包都对应一个独立的名字

2021-05-16 23:03:28 560

原创 C++20 协程探索

c++ 20 引入了协程的特性,很多其他语言很早就已经有了,c++ 的又会有什么不同呢,本文旨在了解协程的概念以及简单明白底层实现的原理。Three new language keywords:co_await,co_yieldandco_returndefinition当一个函数被阻塞时,一般会切换到其他线程去执行,而线程频繁切换是存在花销的。如果不阻塞,而使用异步回调,会割裂了原来的代码业务逻辑,还会陷入回调地狱难以维护。A coroutine is a generalisa...

2021-05-04 23:40:50 656 6

原创 lld 链接器简述

lld 是 LLVM 里的一个子项目,是一个链接器,目前官方还在开发中。在 MacOS 上,其链接时间和优化效果都远超苹果的 ld64。本文为笔记形式,旨在介绍并了解 lld,对详细内容感兴趣的,链接放在文末。1、Linker works“Binds more abstract names to more concrete names, which permits programmers to write code using more abstract names”.In general

2021-05-04 23:35:52 1610

原创 新式哈希表 - Swiss Tables

在 cpp2017 大会上,google 向我们展示了 swiss tables,一种在使用性能上可以远超std::unordered_map的哈希表。先看测试效果对比,红色的是 stl 的哈希表,蓝色的是 google 初代的哈希表,绿色的正是 swiss table,不论是在小型工程,还是大型工程,对缓存是否命中,swiss table 都有更少的耗时。本文分为两部分,第一部分讲 c++ stl 哈希表的实现,第二部分讲 swiss tables 如何对其进行优化。本文大纲如下:1..

2021-05-04 23:28:36 1021

原创 git 原理 & 基础学习

git 作为仓库管理工具,是每个程序员必须要掌握的技能,而了解其原理对于 git 的学习会有更大的帮助。本文大纲如下:1、简述 1.1、git2、git objects 2.1、读取 2.2、blob 2.3、commit 2.4、tree 2.5、ref 2.6、tag 2.7、branch  2.7.1、远程分支 2.8、git 存储示例3、packfiles4、文件移动5、格式化获取日志6、fetch & pull7、三方合并 7.1、合并冲突8、me

2021-05-04 23:20:00 567

原创 c++ vtable 深入解析

c++ 利用虚函数实现了多态的能力,虚函数涉及到虚指针和虚表,本文将从汇编和虚表深入探索虚函数机制。【之前写过关于 vtable 的分为上下两篇文章,但发现并不好懂,且有一些疏漏的地方,本着要对写出来的东西负责任的态度,所以修改了文章,并整合为一篇。】refer https://www.tuicool.com/articles/iUB3Ebi1、环境x86_64-apple-macos10.15Apple clang version 11.0.0注:不同环境下不同编译器,对于虚表

2021-05-04 23:06:30 4321 5

原创 堆内存优化之动态栈分配

前言在堆上分配内存的操作开销很大,对性能影响会比较明显。本文探索的就是对于堆内存优化的一种技术,动态栈分配(dynamic stack allocations),中心思想就是把在堆上申请内存的操作分配到栈上来完成。主要参考文章在文末链接处附上了,一些翻译可能不太准确的术语可以直接看原文进行理解。堆 & 栈在探索动态栈分配之前,先简单描述一下基本知识 —— 堆和栈 的概念。堆堆内存在运行时创建,没有固定的地址或大小,一般需要由开发者自行申请分配和释放。在 Linux 和 Posix 上

2021-04-03 14:42:27 783

原创 《python3 网络爬虫开发实践》笔记

最近阅读了一本书《python3 网络爬虫开发实践》,涉及的工具比较多,这本书可以当工具书来进行查阅。由于书中内容繁多,所以我记的笔记都是理论部分较多,代码编写以及工具的使用涉及不多,感兴趣可以查阅下该书。本文大纲如下(预计读完需要 15 分钟):1、基本的环境和工具 1.1、请求库,发送网络请求 1.2、解析库,解析网页中提取的信息 1.3、数据库,用于存储获得的数据 1.4、Web 库,开发网站和接口 1.5、抓包工具,模拟与分析 1.6、成熟的爬虫框架 1.7、部署工具2、基础知

2021-02-21 15:31:46 537

原创 Translation units & module 术语解释

Translation unitsA program consists of one or more translation units. A translation unit consists of an implementation file and all the headers that it includes directly or indirectly. Implementation files typically have a file extension of cpp&

2021-02-06 15:38:12 307 2

原创 《深度探索C++对象模型》笔记

本文为《深度探索C++对象模型》笔记,简要大纲如下,预计看完需要 10 分钟左右:1、对象模型1.1、简单对象模型1.2、表格驱动数据模型1.3、c++ 对象模型1.3.1、类对象中的 string 类型1.3.2、多态与切割2、default constructor2.1、copy constructor2.1.1、bitwise copy2.2、NRV - named return value 优化2.3、initialization list 和 constructor2.4、

2021-01-23 11:47:45 386 2

原创 《基于 LLVM 克隆代码检测关键技术研究》笔记

最近看了一篇论文《基于 LLVM 克隆代码检测关键技术研究》,觉得有些概念和思路不错,做了些笔记。本文大纲如下:1、意义2、检测等级3、主流思路 3.1、基于文本的检测方法 3.2、基于树的检测方法 3.3、基于图的检测方法 3.4、论文思路1、意义重复代码的增多会大大降低代码的可维护性。不恰当的代码重复表明程序设计不良,例如缺少抽象。这会导致程序过长,错误更多,进而难以维护,因为需要人工寻找并修改重复的部分。当克隆具有软件漏洞的代码时,如果开发人员不知道这样的副本,则克隆的代码中可

2021-01-03 16:11:43 279

原创 CMU C++ Tips 笔记

偶然发现 CMU 的 wiki,里面有 C/C++ 的编写小技巧和提醒,特意挑了些自以为的重点做了笔记,其中可能还混杂了我在其他地方看到的内容,详细内容 wiki 可以看文末链接。1、preprocessor1.1、universal character namesThe universal character name \Unnnnnnnn designates the character whose 8-digit short identifier (as specified by ISO/IEC

2020-12-26 15:09:58 289 1

原创 c++ 类方法和普通方法调用有何不同?

本文将简单对比分析普通方法和类方法调用的不同之处,测试环境为 MacOS。这里不考虑虚函数和类静态方法,有关虚函数的内容,可以看我以前发的文章。1、域我们知道如果调用的普通方法在前面没有声明或定义,会导致报错:因为 c/c++ 的解析文件的符号顺序是从上往下,所以图中的 test 函数需要挪到 main 函数之前。而类/结构体这种域结构的,方法的顺序并不重要,不影响解析结果:如图,这里的构造方法可以正常地调用到后面的 fun 函数。1.1、符号解析过程简单解释下为什么类中解析符号不会出错

2020-12-19 15:09:21 659 1

原创 MacOS:多架构产物如何融合?

本机系统架构:x86_64太长不读总结:通常会默认以本机系统架构进行融合,如果编译器或链接器无法分析出需要融合的架构,需要指定 -target / -arch 来辅助。1、多架构编译编译多架构gcc -target x86_64-apple-macos10.15 -c add.c -o x86gcc -target arm64-apple-ios9.0 \-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhon

2020-12-12 12:36:56 394

原创 MacOS 下的动态链接

本文主要讲解 MacOS 下的链接,是与 MacOS 和 iOS 开发相关的内容,其他平台可能也会有类似的操作。本文大部分篇幅都是讲动态链接,静态链接也简单讲了一下,很多不错的参考文章列在文末,感兴趣可以看下。1、ld manualLibrariesA static library (aka static archive) is a collection of .o files with a table of contents that lists the global symbols in the

2020-12-05 17:12:51 831

原创 MacOS 链接特性:Two-Level Namespace

在 MacOS 编译链接时,可能经常会报找不到符号的错误,本文所介绍的 two-level namespace 的链接特性可能就是报错原因之一。本文为笔记附带翻译,想看详细内容的话,在文末附上了参考链接,由于篇幅不算大,所以我简单地翻译了一下,如有错误,帮忙指出,多多包涵。1、Two-Level Namespace & Flat NamespaceWhen an executable file is loaded into a program, the dynamic linker (the

2020-11-28 12:07:37 444

原创 c++ goto & label 机制汇编探索

本文将从汇编的层面来探索 goto 机制,提起 goto 可能会引起程序员的恐惧,但面对恐惧才能战胜恐惧,以致可以利用未曾尝试的点。arm gcc 实测void fun(){ label: printf("\n"); goto label;}使用 gcc -E 即只走预处理看看:// 只多了一些头文件的预处理void fun(){ label: printf("\n"); goto label;}使用

2020-11-15 12:02:34 842

原创 量子比特的构造

量子计算开始引起广泛的关注,虽然量子计算只在特定的计算过程会更快,即还无法取代传统计算机,但了解一个新的技术是有好处的,说不定量子科技以后也能飞入寻常百姓家。量子计算利用量子比特的叠加状态实现平行计算,用于减少计算的数量(一次计算同时得到多种结果),而非计算加快处理的步骤。比如用来做大数的质因数分解。注:才疏学浅,学习只为了解,参考了大量文章,难免有错,还请原谅,感谢指正。1、量子比特1.1、量子量子是指,“任何粒子,记住是任何粒子,小到了一定尺度,就会展现出一些和经典力学不一样的性质”。人们为了

2020-10-31 12:34:09 1424

原创 python 中 os.system 的本质

python 中 os 模块用得比较多,但 os.system 实际上是怎么调用 shell 命令的呢?简单来探寻一下。1、系统环境macos 10.15.6      x86_64python 3.8.5为什么要强调系统环境,因为 python 在不同系统版本上实现可能会有差异,待会讲解就能发现了。2、os 模块通过 help(os) 可以找到源文件查看,下面截取相关代码来看(直接用注释解释了):# 返回一个包含内建模块名字的元组,包含所

2020-10-18 14:36:25 1726

原创 python 执行 shell 命令卡死

最近发现了一个 python 特有的卡死问题,是通过 python 调用 shell 命令出现的,特此记录一下。1、问题描述这里我用一个例子来进行说明,并非真实使用场景。1.1、普通shell 命令执行:yes yes | echo 'hello'在 shell 中能够正常结束并输出。1.2、python 调用 shell 命令执行:import osos.system("yesyes|echo 'hello'")但在 python 中会卡死...

2020-10-17 11:57:37 2108 2

原创 Rust 学习,与 node.js 交互

1、背景近期,参与了一个活动:学 Rust,免费拿树莓派。主要内容为开发应用,在 node.js 中调用 Rust 函数。实际上我认为在很多地方都能用上 Rust,鉴于活动要求,或许 node.js 是一个不错的切入点,毕竟提供了模版,应该会更快熟悉。难点就在于这两,我都没有相关的知识,不过这挑战我接受,学呗!工作党,所以就每天挤出点时间来进行了。2、配置环境配置环境算是每个开发者必须跨过的第一道门槛了。根据教程的环境要求,需要使用 linux 系统。在我的5年老笔记本联想电脑上,是有双系

2020-08-19 20:29:07 1688

空空如也

空空如也

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

TA关注的人

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