知乎 转载

和上篇文章一样,这篇也是来自一个知乎上我回答的问题。

原问题:为什么 Linus Torvalds 不愿意将 Linux 变成 GPLv3 授权?

我的回答:

这里有段 Linus Torvalds 在 DebConf 14 上的 Q&A: https://youtu.be/1Mg5_gxNXTo?t=47m20s

其中关于 GPLv3 和协议的那一段在47:20开始到57:00左右。 里面 Linus 对自己的观点澄清得很清楚了。 看u2b或者听英语有困难的请留评论,我抽空可以试着翻译一下。

DebConf 14: Q&A with Linus Torvalds

然后接下来就是我承诺的翻译了 …

知乎 转载

转载几篇知乎上我自己的回答,因为不喜欢知乎的排版,所以在博客里重新排版一遍。

原问题:C语言中“.”与“->”有什么区别?

除了表达形式有些不同,功能可以说完全一样阿。那为何又要构造两个功能一样的运算符? 效率有差异?可是现在编译器优化都那么强了,如果真是这样岂不是有些多此一举


刚刚翻了下书,说早期的C实现无法用结构直接当作参数在函数间传递,只能用指向结构的指针在函数间进行传递!我想这应该也是最直观的原因吧。

我的回答

首先 a->b 的含义是 (*a).b ,所以他们是不同的,不过的确 -> 可以用 * . 实现,不需要单独一个运算符。 嗯,我这是说现代的标准化的 C 语义上来说, -> 可以用 * . 的组合实现。

早期的 C 有一段时间的语义和现代的 C 的语义不太一样。

稍微有点汇编的基础的同学可能知道,在机器码和汇编的角度来看,不存在变量,不存在 struct …

farseerfc.wordpress.com 导入

好神奇的想法,先存着,以后慢慢研究

原文: http://blog.youxu.info/2010/03/14/west- chamber/

待月西厢下,迎风户半开。隔墙花影动,疑是玉人来。

最近推上最流行的一个关键词是”西厢计划”, 这个计划名字取得很浪漫,客户端叫做张生,对,就是西厢记里面那个翻墙去见崔莺莺小姐的张生;显然,服务器端必然叫做崔莺莺。客户端的张生是最重要的部件,可以不依赖于服务端工作。因为西厢计划的作者只是简要的介绍了一下原理,其他报道又语焉不详,我当时就觉得很好奇,花了昨天一个晚上详细读了一下源代码,终于知道怎么回事了,觉得原理非常漂亮,所以写篇文章介绍总结一下。

先说大方向。大家都知道,连接被重置的本质,是因为收到了破坏连接的一个 TCP Reset 包。以前剑桥大学有人实验过,客户端和服务器都忽略 Reset, 则通信可以不受影响 …

导入自 renren

据说是一道微软的面试题。如题,写程序,让Windows的任务管理器中的性能监视器呈现正弦曲线。

正弦曲线 正弦曲线

潜心钻研良久,得代码:(java)

public class sincpu {
    private static final int cycle=1024,tick = 256;
    public static void main (String[] args) throws InterruptedException {
        for(int i = 0;;i++){
            work(calcNextSleep(i % cycle));
            sleep(tick - calcNextSleep(i % cycle));
        }
    }

    private static long calcNextSleep(long i){
        return (int …

导入自 renren

看到陈骉同学很有感想的一篇神创论与命运日志,觉得近日很久没有看到这样的评论了。想说几句自己的观点。

首先我认为,神创论与宿命论没有多少关联,甚至进化论者相较于神创论者更容易接受宿命论的观点。因为神创论主张意志的存在,人所具有的个体意志与神的意志,因此在神创论者的眼中事件的结果是可以通过意志来改变的,亦即如果我从物理楼11楼跳下,那么我就可以改变自己死亡时间的宿命。上帝的意志同样可以左右事件的结果,也就是所谓的宿命不复存在。而进化论者不承认意志独立于物质世界的存在,你我的思考、行为,都受到物理学法则诸如量子力学的约束,这就引出了北大物理系教授的那句“宇宙中的一切都是可以计算的”,亦即宿命论。如我我选择现在从物理楼上跳下,我这一行为并不是处于个人的独立意志,乃是想证明这一点,亦即我跳楼这一举动是有其背后的动机与原因的,就如同计算机的输入必然导致了输出,宿命的必然终结于此。

其次,关于事件的复杂度所导致的随机化,在大量混沌随机中也存在着如统计学和随机分形学这样的规律,并不是否认宿命的充分理由。

关于神创论的合理性问题。我认为是否相信神的存在只是一个boolean二值问题,它为true为false本身并不重要,重要的是确定它的取值之后得到的推论与结果。如果否认神的存在,如现代数学这样的完美又何以存在,进化论者的解释是事物最终会向着更好更高级的方向发展,产生现代数学乃至现代科学是发展的必然。而这种论调显然有悖于物理中以热力学第二定律为首的,预言事物会随时间推演愈发混乱的论断。更进一步,甚至整个人类、整个生物系统的存在都是有悖于热力学推论的现象,是某种理论只能以“小概率事件”解释的现象。

神创论的核心观点之一,是神的唯一存在性 …

farseerfc.wordpress.com 导入

故障描述: MMC Memory Stick Duo记忆棒未经Adapter适配器,直接插入SD Reader,致使MMC卡入SD Reader中。

栈展开: 某日下午,无课。 忙于数分作业,想查询用手机拍摄的板书照片。 取出手机中的MMC。 未经装配Adapter,直接插入SD Reader。 (A runtime exception was thrown.) 尝试翻转笔记本机身,倒出MMC,未果。(rethrow) 尝试用手指甲取出,未果。(rethrow) 考虑到有“推入反弹”机制,尝试将MMC推入更深,反弹机制由于类型不匹配而失效,未果。(rethrow) (The exception spread across the border of the …

farseerfc.wordpress.com 导入

程序开发原理

——抽象、规格与面向对象设计

Barbara Liskov 、John Guttag 著

杨嘉晨 等译

关于翻译风格:

多年来阅读计算机类的著作及译作,感觉总体的困难在于一大堆没有标准译名的技术术语。由于通行于工业界和学术界的还是英文原名和术语,我决定保留大量的英文术语。这样的翻译风格借鉴于台湾著名的译者和作者侯捷先生。对于译与不译的权衡,主要考虑阅读的流畅,以及读者的理解能力,或许难免带有一些主观色彩。

前言 Preface

构建产品级质量的程序——可以在很长一段时间内使用的程序——众所周知是极其困难的。本书的目标就是改善程序员解决这项任务的效率。我希望读者在阅读本书之后成为一名好程序员。我相信本书的成功在于改善编程技巧,因为我的学生告诉我这已经发生在他们身上。

怎么才算是一名好程序员?是产生整个程序产品的效率。关键是要在每一阶段减少浪费掉的努力。解决的方法包括:在开始编写代码之前就仔细考虑你的实现方案,通过未雨绸缪的方法来编写代码,使用严格的测试在早期发现错误,以及仔细注意模块化编程,这样当错误出现时,只需要改动极少数代码就可以修正整个程序。本书涉及所有这些领域的技术。

模块化编程(Modularity)是编写好程序的关键。把程序分解成许多小模块,每一个模块通过良好定义的狭窄接口和别的模块交互作用 …

farseerfc.wordpress.com 导入

3.2 标号、goto,以及switch的实现

goto语句及标号(label)是最古老的C语言特性,也是最早被人们抛弃的语言特性之一。像汇编语言中的jmp指令一样,goto语句可以跳转到同一函数体中任何标号位置:

void f()

{int i=0;

Loop: //A label

++i;

if(i<10)goto Loop; //Jump to the label

}

在原始而和谐的早期Fortran和Basic时代,我们没有if then else,没有for和while,甚至没有函数的概念,一切控制结构都靠goto(带条件的或无条件的)构件。软件工程师将这样的代码称作“意大利面条”代码。实践证明这样的代码极容易造成混乱。

自从证明了结构化的程序可以做意大利面条做到的任何事情,人们就开始不遗余力地推广结构化设计思想,将goto像猛兽一般囚禁在牢笼 …

farseerfc.wordpress.com 导入

3.1 左值右值与常量性(lvalue,rvalue & constant)

首先要搞清楚的是,什么是左值,什么是右值。这里给出左值右值的定义:

1、左值是可以出现在等号(=)左边的值,右值是只能出现在等号右边的值。

2、左值是可读可写的值,右值是只读的值。

3、左值有地址,右值没有地址。

根据左值右值的第二定义,值的左右性就是值的常量性——常量是右值,非常量是左值。比如:

1=1;//Error

这个复制操作在C++中是语法错误,MSVC给出的错误提示为“error C2106: '=' : left operand must be l-value”,就是说’=’的左操作数必须是一个左值,而字面常数1是一个右值。可见,严格的区分左值右值可以从语法分析的角度找出程序的逻辑错误。

根据第二定义,一个左值也是一个右值 …

farseerfc.wordpress.com 导入

2.2 I386平台的内存布局

众所周知,I386是32位体系结构。因此对于绝大多数I386平台的C++编译器而言,sizeof(int)=sizeof(long)=sizeof(void*)=4。当然C++标准对此没有任何保证,我们也不应该试图编写依赖于此的代码。

32位指针的可寻址空间为4GB。为充分利用这么大的寻址空间,也是为了支持其它更先进的技术比如多任务技术或者动态链接库技术,WinNT使用虚拟内存技术,给与每个应用程序全部4GB的内存空间。4GB的地址被一分为二,前2GB供应用程序自己使用,后2GB由系统内核分配和管理。这2GB的内存地址,通常被划分成3种内存区使用:

1 代码及静态数据区

由代码加载器从动态链接库镜像(通常是exe或dll文件)加载,通常定位到镜像文件中指定的基址开始的内存区。如果基址所在内存已被占用,动态连接器会将代码或数据重定向到其它可用地址。

在C++中,静态数据包括:名字空间(namespace)和全局(global)对象、函数的static对象、类的static数据成员 …