Skip to content

Instantly share code, notes, and snippets.

View compiling-notes.txt
模块化设计的工具链(toolchain) 能适配多种源语言和多种目标语言。其中把源代码翻译成目标代码的工具统称为编译器(compiler) 。
对现代的优化编译器(optimizing comipler) 来讲,基本原理是管道-过滤器(pipe-filter) 模式的代码变换(code transformation) 。
典型简单情况下,从源语言的输入到目标语言的输出的流程是线性的,有相对固定的步骤。
除了输入输出,这些步骤处理的形式统称 IR (intermediate representation,中间表示)。
源语言一般是高级语言。适配源语言的编译器组件统称前端(frontend) 。前端把源语言翻译成能让编译器剩余流程接受的 HIR (high-level IR,高级 IR ) 。
适配目标语言的编译器组件统称后端(backend) 。后端接受 LIR (low-level IR),输出目标语言代码。
目标语言也可以是高级语言,不过更常见的,翻译成体系结构相关的硬件 ISA (instruction-set architecture ,指令集架构)支持的本机代码(native code) 。因为是硬件实现的, ISA 支持的二进制代码一般也叫机器码(machine code) 。
粗略地说, ISA 指定了各种不同的硬件指令集,如 IA-32(x86) 、x86-64(Intel 64/AMD64)、IA-64(Itanium) 、ARM 、MIPS 等(实际上经常得适配指令集扩展)。
编译器前端和后端之间的步骤有很大部分可以重用,不依赖前端也不依赖后端的逻辑独立出来成为单独的组件,称为中端(middle end) 。
GCC 一开始是给 C 编译器 GNU C compiler ,不过后来逐渐支持不同的语言,因此需要不同的前端,改叫 GNU Compiler Collection ,里面是前端中端后端都有。 GCC 使用的 IR 有 GENERIC 和 GIMPLE 等。GCC 4 以来使用 SSA(static single assignment) 形式的 IR 进行优化。
View 190303.txt
偶尔主题氵,果然继续挂……
原贴id=6052737295,大概已经自行了断了。
标题《c++ 快速入门 简明教程 15讲》,转B站av44206018。
看了一下回复:
视频编辑质量尚可,内容质量较低,不推荐。从立意、推荐C++Primer【Plus】、目录的乱七八糟、5GL的胡扯之类都可以看出作者对PL、PL历史和C++都比较外行。
剩下到睿站去说。
考虑声称转载,给留了点面子。
@FrankHB
FrankHB / 190219.md
Last active Feb 28, 2019
《流浪地球》评论
View 190219.md

https://www.bilibili.com/read/cv2010708

虽然是复制粘贴,我也懒得找出处了,内容的槽点先放这吧……

对硬科幻作品的大多数目标受众来讲,科学漏洞硬伤确实比较不能忍,而且这里达到了以原著以外的角色放到职员表里就会掉刘电工的人设了的程度。

科学设定问题跟现实可实现性其实没关系;不管是光速还是虫洞,最起码给出一种和已知科学理论不矛盾的解释了,但此片中的问题是很多关键的不能以现实科学理论解释的东西并没有出现清楚的解释。这至少是叙事结构上的重大缺陷(虽然有些也许是剪片不当)。

例如,原作的“太阳的演化已向主星序外偏移,氦元素的聚变将在很短的时间内传遍整个太阳内部”这样的和现实理论不同的设定,在影片里交代得并不充分(明明“150亿吨的推力”都直接照搬了……)。所以有知识背景但没看过原作的观众可能会觉得这里“不科学”。

View tieba-backup.md
@FrankHB
FrankHB / calling-for-language-features.md
Last active Nov 27, 2018
Feature lists of a desired programming language
View calling-for-language-features.md
View 未开化案例研究6.txt
2018-10-30 20:08
不是很值得浪费文字的代表性新种,但之前的实例没有直接涵盖,所以单列。
https://www.bilibili.com/video/av34518556/#reply1156391696
hugsidesick
手机双持的都知道苹果的人机交互比安卓舒服多少。买苹果的根本没多少人在乎我的手机配置能不能秒天秒地,系统用的舒服,软件生态好,这才是它最大的卖点。华为进步大有目共睹,不需要海军吹嘘。
#73 来自iOS客户端2018-10-26 11:0931回复
View 180110.txt
PHP的所谓traits是一种语言特性,可以算是一种弱化的mixin,能用于替代多继承的一部分常见使用;而C++核心语言特性并没有traits这种东西。C++原生支持多继承(先不评论设计得如何),不需要另外加特性模拟。
C++的traits或者说type traits不是语言特性,而是TR1那时候搞出来的一类翻译时的语用技巧,算是惯用法。
也有其它设计成语言特性的如Rust,和继承(一种inclusion subtyping)也没什么关系(和C++的concept一样都更像是Haskell的typeclasses),尽管可以实现类似的目的。区别是C++的这坨都是严格受限翻译时确定的,其它语言类似特性就没那么明显的限制(但有其它的破事)。
加上PHP,硬要说这些用法的共同点的话,就是和C++的traits依赖的模板名称查找一样都算是structrual typing的实例,只有用到了traits以后才做具体的名义类型检查。
考虑到可用特性的正交性,PHP的tratis应该是其中表达能力最弱的——只适合用于对付缺少继承的问题。
C++再烂,用SFINAE强行introspect的出来的起码在翻译时也能是个first-class value,允许让类类型用于实现足够多其它语言做不到的和面向对象没什么关系的玩意儿。
至于“实现”traits的语义——谁在乎呢?表达能力足够强的语言根本不需要包含这种特性,让用户随便自己糊就是了。
另一个事实是除了当年脑子进OOP水一股脑跟风设计的语言特性(包括C++的多继承和Java的interface之流,不过多继承在用途上不至于那么鸡肋)以外,现在没多少通用目的语言会像PHP一样专门搞一个基本没法正交的如此specific的特性出来糊弄用户的。
@FrankHB
FrankHB / test.txt
Last active Apr 12, 2019
NPL Console test code
View test.txt
$def! $rem $vau . #ignore "";
$import! std.strings string->symbol symbol->string ++ string<- string-empty?;
$import! std.promises promise? memoize $lazy $lazy/e force;
$def! $redef $def!;
$defv! $unspecified ((&x .)) env eval x env;
$def! $defu! $vau (&x .&xs) env eval (list $set! env x $unspecified xs) env;
$defl! putss (.&xs) puts (apply ++ xs);
$defl! dlog (&x) (display x; x);
View 161109.md

http://tieba.baidu.com/p/4860024843

56L @福音战士01 :

这是典型地没学明白。

首先是没搞清楚语言的目的和应用领域,其次是不明白现在对语言的应用的一些常见外延。

一条条分析。

@FrankHB
FrankHB / POSIX-bad-design.md
Last active Aug 15, 2016
UNIX/POSIX烂设计
View POSIX-bad-design.md

糟糕的设计审计和接口设计质量

例如几乎没什么用的文件锁

综合示例

sem_open 允许 EINTR ,凭空制造 race condition ,根本没法确定打开时是不是同时创建了信号量。

而文件系统持久语义导致不 sem_unlink 就会在最后/进程挂掉以后遗留空的信号量(如果权限设置有问题后面访问/创建同名的信号量都麻烦)。

You can’t perform that action at this time.