- 文章
事件导火索是9月25日,在 V2EX 上有人发了一个帖子:《github 上 fork 了一个项目,有人发 PR 让我删掉,我该怎么办?》 地址:https://v2ex.com/t/223610 (同时,有人在Ruby China上发了类似的帖子,但是我并没有看到,据说已经被删除了)
该楼主说有人给他发Pull Request,要求他删除一份fork的代码。发起这个PR的 github 用户叫“ChuPeng”。 项目的原始地址是:https://github.com/gdby/NewEBuy (已被删除),代码上传时间应该是去年的12月份。 从这位名叫 gdby 的 github 用户的项目列表里可以发现,该用户并非原始代码的上传者,而是网上泄漏代码的收集者。
……
复兴岛在杨浦区东南部,黄浦江下游,距吴淞口6公里。南起定海路桥,北近虬江口,呈月牙形,长3.42公里,中部最宽处550米。目前岛上主要分布着一些中央部属、市属企业和部队单位,也有少量居民。
该岛原为黄浦江中一处浅滩,其东为黄浦江主航道,西为运河浅水航道。清光绪三十二年已成雏形,1915、1916年在浅滩东侧抛石筑堤,滩面淤高。1925年,在南段三角形区段再抛石围筑土堤,充以泥土,1926年7月填成陆地。1928~1930年在中段再填充泥土,1930~1934年北段填泥、围埝,终成新岛。上海浚浦局在该岛兴建体育会,供员工日常娱乐、锻炼之用。
……
常见的两种物理处理器指令架构有:复杂指令集(CISC)、简单指令集(RISC)。前者的代表是 Intel x86 处理器,后者的代表有 MIPS、SPARC 和 ARM。
CISC 指令集的指令长度不等,多种寻址方式
看过微软 .net coreclr 的源代码后,觉得 Lua、PHP 和 Python 的垃圾回收代码与之相比简直就是个玩具。而 Hotspot JVM 的垃圾回收算法更加复杂。
常见的垃圾回收技术能大致分成:引用计数、标记清理、标记缩并和节点复制几种。高级的技术有垃圾分代收集、渐进及并发收集、分布式垃圾收集。复杂的垃圾回收算法会根据对象的性质和内存的使用情况来选择不同的垃圾回收算法。
……
那些不怎么“动态”的语言,比如C#和JAVA,一般都会把数据类型分成“值”和“引用”,值类型是分配在栈上的,引用类型是分配在堆上。而“动态”的语言,比如“PHP”和“Python”所有的数据都是动态分配在堆上的。这么做的缺点一是浪费内存,二是访问慢。浪费内存是因为PHP和Python的对象都经过重度的封装,一个简单的整型经过封装后的大小是原来的4、5倍。访问慢的原因是每次创建一个对象都要申请一次内存,而且访问对象必须通过指针,这样一搞CPU的1、2级缓存根本就没有用了嘛。
……
哈希表是动态脚本语言的基石。动态语言中,全局变量表、全局字符串表、对象虚函数表、元数据表皆为哈希表。欲实现语言,则必先实现哈希表。
哈希表原理很简单,不再赘述。不同语言实现的哈希表主要区别在于处理碰撞的机制不同。一种叫“Separate chaining”,PHP的哈希表使用了这种方式;另一种叫“Open addressing”,Lua的哈希表使用的是这种。前者发生碰撞会创建一个新的bucket,然后用链表将所有碰撞的bucket链接起来;而后者在现有的buckets中找到一个空的bucket来存放发生碰撞的key-value pair。我选择的是后一种方式,一方面是节约内存,另一方面还能节省GC开销。
……
一直琢磨着自己实现一个脚本语言。因为懒,直到最近才动手。
构想中的语言语法类似ActionScript,支持GC、闭包、Lambda表达式、协程、尾递归优化、迭代器/生成器、允许(编译期)强类型绑定的可嵌入式动态脚本语言。基础类型支持NULL、布尔型、32位整型、64位长整型、双精度浮点数、元组、列表、字典、闭包、协程、对象、用户数据等。
……
WIN32 宏来判断是否为 Windows 平台。64位 Windows 也会定义 WIN32 宏,此外还定义 WIN64 宏,有些编译器可能是 Windows、__WIN32__、WIN32、_WIN64_MSC_VER 宏判断是否是VC编译器__GNUC__ 宏来判断是否为 gcc 编译器__declspec(dllimport) 和 __declspec(dllexport)__attribute__ ((visibility("default"))) 来导出函数inline 关键字,要用 __inline。可以用如下代码定义:C#if defined(_MSC_VER) && !defined(__cplusplus) && !defined(inline)
#define inline __inline
#endifsize_t 类型、指针运算用 uintptr_t, intptr_t, ptrdiff_t、平台无关整型用 int32_t, int64_tsizeof(long double) 是16字节(VC不支持),但是实际使用长度是12字节,4字节填充的是随机数据(绝对大坑)__cplusplus 宏做下判断__APPLE__和 __MACH__(这个没确认)__BORLANDC__、__llvm__、__clang__、__WATCOMC__……
Lua 源码中定义了一个叫 L_Umaxalign 的数据类型:
ctypedef union {
double u;
void *s;
lua_Integer i;
long l;
} L_Umaxalign;这个结构其实是该平台上最长的数据类型。
……
制作了三次葱油饼,累积了一些心得体会,特此记录。
……