2014年12月12日
摘要: ##**可见性与乱序**在说到内存模型相关的东西时,我们常常会说到两个名词:乱序与可见性,且两者经常交错着使用,容易给人错觉仿佛是两个不同的东西,其实不是这样,他们只是从不同的角度来描述一个事情,本质是相同的。比如说,我们有如下代码:```cppatomic g_payLoad = {0};atom... 阅读全文
posted @ 2014-12-12 16:45 twoon 阅读(8120) 评论(1) 推荐(1) 编辑
  2014年10月4日
摘要: 趁着国庆长假快速翻了一遍传说中的、大名鼎鼎的 *modern c++ design*,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身。。。论语言方面的深度,我看过的 c++ 书里大概只有 *insight c++ object model* 能与之一战吧?难怪 Herb 老喜欢调侃 Andr... 阅读全文
posted @ 2014-10-04 22:57 twoon 阅读(11530) 评论(3) 推荐(0) 编辑
  2014年9月15日
摘要: 说到 Haskell,这真是一门逼格极高的编程语言,一般初学者如果没有相关函数式编程的经验,入门直接接触那些稀奇古怪的概念,简直要跪下。现在回想起来,隐隐觉得初学者所拥有的命令式编程语言(imperative programming language)相关的知识和经验反而成了负担,若能抛掉以往固有的... 阅读全文
posted @ 2014-09-15 21:54 twoon 阅读(12608) 评论(16) 推荐(7) 编辑
  2014年8月23日
摘要: 解释文本文件是日常编程中太平常的一件事情了,一般来说,土鳖点的做法可以直接手写 parser 用循环暴力地去 map 文本上的关键字从而提取相关信息,想省力一点则可以使用 tokenizer 或正则表达式之类的工具,无论怎样,总的来说,手写 parser 去解释文本基本是件苦力活:写出的代码比较难重... 阅读全文
posted @ 2014-08-23 19:38 twoon 阅读(8309) 评论(3) 推荐(2) 编辑
  2014年8月3日
摘要: 本周花了几天的时间来研究怎么在 breakpad "[1" , "2" ] 中加入打印函数参数的功能,以期其产生的 callstack 更具可读性,方便定位崩溃原因。现代 ELF 中的调试信息基本是以 DWARF 格式为主了,因此这几天的研究也主要将时间花在了理解 DWARF 这货是怎么工作上,感叹... 阅读全文
posted @ 2014-08-03 18:15 twoon 阅读(12299) 评论(7) 推荐(1) 编辑
  2014年7月27日
摘要: 符号重定位 讲动态链接之前,得先说说符号重定位。 c/c++ 程序的编译是以文件为单位进行的,因此每个 c/cpp 文件也叫作一个编译单元(translation unit), 源文件先是被编译成一个个目标文件, 再由链接器把这些目标文件组合成一个可执行文件或库,链接的过程,其核心工作是解决模块间各 阅读全文
posted @ 2014-07-27 21:28 twoon 阅读(18710) 评论(3) 推荐(7) 编辑
  2014年6月29日
摘要: 关于乱序 说到内存模型,首先需要明确一个普遍存在,但却未必人人都注意到的事实:程序通常并不是总按着照源码中的顺序一一执行,此谓之乱序,乱序产生的原因可能有好几种: 1. 编译器出于优化的目的,在编译阶段将源码的顺序进行交换。 2. 程序执行期间,指令流水被 cpu 乱序执行。 3. inhe... 阅读全文
posted @ 2014-06-29 17:37 twoon 阅读(13666) 评论(9) 推荐(3) 编辑
  2014年6月15日
摘要: 问题起源 先看下面很简单的一小段程序。 这段代码在 GCC 下很意外地编译不过,原因竟然是找不到 fun 的定义,可是明明就定义在基类中了好吗!为什么视而不见呢?显然这和编译器对名字的查找方式有关,那这里面究竟有什么玄机呢?上述代码是写得不规范,还是 GCC 竟然存在这样愚蠢而又莫名其妙的 bug... 阅读全文
posted @ 2014-06-15 16:29 twoon 阅读(1972) 评论(5) 推荐(0) 编辑
  2014年5月17日
摘要: 正则表达式几乎每个程序员都会用到,对于这么常见的一个语言,有没有想过怎么去实现一个呢?乍一想,也许觉得困难,实际上实现一个正则表达式的引擎并没有想像中的复杂,《编译原理》一书中有一章专门讲解了怎么基于状态机来构建基本的正则表达式引擎,它讲这个初衷是为词法分析服务,不过书里的东西相对偏理论了些,实现起... 阅读全文
posted @ 2014-05-17 20:03 twoon 阅读(9224) 评论(0) 推荐(1) 编辑
  2014年4月7日
摘要: 前面一篇博文简单介绍了 c++ 异常处理的流程,但在一些细节上一带而过了,比如,_Unwind_RaiseException 是怎样重建函数现场的,Personality routine 是怎样清理栈上变量的等,这些细节涉及到很多与语言层面无关的东西,本文尝试介绍一下这些细节的具体实现。 相关的数据 阅读全文
posted @ 2014-04-07 21:57 twoon 阅读(10476) 评论(0) 推荐(8) 编辑