(注:本文包含数学公式,使用 SVG 图形格式,请不要在 RSS 阅读器里阅读本文) 基本上每个程序员都会对 Quake 那个神一样的常量 0x5f3759df 感到惊奇。在 Quake 里,有一段代码是计算光照时候使用的函数,计算 ,那段代码写的真叫经典: float Q_rsqrt( float number ){ long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df – [...]
Category Archives: Discussion
你喜欢这样定义类吗?这就是 eisa 的 def
// Also: Man = type(function(name)…) def type Man(name = “Unnamed”): @name = name end def Man.prototype.say(something): tracel @name + ‘: ‘ + something end var tom = Man.new ‘Tom’; tom.say ‘Hello’ // Also: Priate = outof(Man)(function(name, spname)…) def outof(Man) Priate(name = “Unnamed”, spname = “Unknown”): Man.call this, name @spname = spname end var beard = [...]
自己动手开发编译器(补完)
第十一:http://www.cnblogs.com/Ninputer/archive/2011/07/22/2112030.html 第十二:http://www.cnblogs.com/Ninputer/archive/2011/08/02/2120435.html 没想到作者自己坑掉了 0_0那我也跟着坑掉好了(本来还想看看后端技术地说)
JavaScript: 死或新生
原作:JavaScript is Dead. Long Live JavaScript! 翻译: Belleve Invis 此翻译非直译,可能有部分内容省略,为交流用。如有错漏请回复。 序 十六年来, JavaScript 已经完全占领浏览器。它,见证了网页应用(Web Application)的崛起。尽管其他的脚本语言也能担此重任,然而,命运选择了 JavaScript。尽管微软在数年前就在浏览器里加入了 Basic ,但, JavaScript 因为能在所有浏览器中运行,所以它赢了。因能在所有浏览器中运行,自身的质量又并不差,那些浏览器制造商就没有义务给他们的产品增加新语言。 那些华丽的特性——比如闭包——让她成为我们这些情人眼里的西施。编程圈子里经常有这样的忏悔——“是,我知道,这玩意不怎么样,但是给她个机会,好吗?你会爱上她的。”给这语言推销绝非难事。 JavaScript 被说成一个太早拿出来的实验品,而我们一直戴着有色眼镜。 2007 年, Steve Yegge 说 JavaScript 会“引爆程序圈”,现在看来,是真的。从那时到现在,基于 JavaScript 的网页应用已经变得更复杂、更大型以及更好用。借其力量, Web 仍然保持繁荣,丝毫不让移动 App。 最近, JavaScript 在服务器端成功发力。 Node.js 平台,利用其非阻塞 I/O,有望解决无数程序员多年的积怨。作为 Node.js 的选择, JavaScript 可能会在服务器端完成无数前人没有完成的任务。 总而言之, JavaScript 早已横扫全球。但是,如果浏览器今天从地球上消失,又有多少 JavaScript 代码会在第二天写出来?或许她会一夜之间被打入冷宫。幸而,浏览器不会消失,而且还会存活很多年。 随着开发规模的膨胀,那些缺陷逐渐显现,日复一日戳痛开发人员的心。你会觉得奇怪,为什么我写 JavaScript 那么多年我还不是 JavaScript 教教徒,我写的绝大多数 [...]
自己动手开发编译器(三)有穷自动机 — 注记
说 NFA 是在“猜”实在不是什么好的比喻。如果说 DFA 只能一次有一个活跃状态的话,那么 NFA 一次则可以有多个活跃状态,每次转换的过程是:A’ ← A 读入字符 c 对所有 j ∈ A 对所有 s, 如果转换 (j, s) = c A’ ← A’ ∪ { s } 设置新的活跃状态为 A’ 在正则表达式的领域,如果是做字符串匹配的话, DFA 还真的不常用。因为对于规模为 n 的正则表达式,生成的 DFA 规模为 O(2n) ,生成时间也是这个渐进量级。因此,在需要进行字符串匹配这种场合下如此长的生成时间并非好主意。而 Ninputer 翻译正则到 NFA 的算法则是 Θ(n) 的量级,生成十分迅速。 而且更重要的是, NFA 方法可以很方便的扩展支持非正则语言(比如著名的反向引用),因为转换好的 NFA 里还包含着原始正则表达式的“结构”信息。但通常 DFA 转换完的形式就和正则表达式大相径庭,毫无相似点了。 正则表达式直接转 DFA [...]
有关正则表达式的几个问题,在此挖坑等解答
在这里我们讨论的正则表达式只描述真正的“纯粹的”正则语言,也就是说:只用或 “|” 或者星号 “*”。一个正则语言是一个字符串集合。注意,说某个字符串属于此语言,并非通常正则表达式“在此字符串中找到匹配”,而意味着“这个匹配是整个字符串”。为了讨论方便,空集也是正则语言。(正则表达式为空。) 每个正则表达式都可以表示一个正则语言,反之,每个正则集合都可以用正则表达式表示(但形式并非唯一)。 一个正则语言有限,是否等价于“这个语言对应的正则表达式不含星号”? 正则语言的补是正则语言吗?如果是,如何计算一个正则表达式的补? 两个正则语言的交集是正则语言吗? 在上面所说的“纯”正则表达式里引入前向预搜索 (?=),这种新表达式所描述的语言仍然是正则语言吗? 在一个任意字符串里找出属于某个正则语言的所有(可空)字串,需要多少的时间复杂度? 证明恒等式 (P|Q)* === P*(QP*)*,其中 P、Q 为任意正则表达式。 改写正则表达式,使之不包含懒惰量词: abc.*?def 欢迎各位填坑。
有关 Essentia
lifesinger 的 Seajs(一个符合 Common JS 规范的模块加载器)很华丽,不过有个问题,就是定义模组的时候必须给明依存项,这让我很不爽。因为,我的理想就是一个东西不出现两次。用 seajs 的话,要写出这样的代码: module.declare(['a', 'b', 'c'], function(require, exports){ var a = require(‘a’) // … }); 因为已经写定,所以不能根据条件进行动态 require。我想要的是这样的代码: module.declare(function(requiring, exports, finish){ requiring(['a', 'b', 'c'], function(){ // …… finish(); }) }); 这可能看起来没什么,不过要是配上 Eisa 的阻塞原语,那就非常强力了。我们可以写出这样的代码: module “mod” -> { using a, b, c from libraries..; // 生成一个阻塞,加载 a, b, c // …… } [...]
乱谈,和我做 lofn 时候的一点想法,以及 lofn 的异步库
一直想写这文章有段时间了,自己了解不少语言(自然的 & 程序的),也做过编译器,随便说说,应该还是可以的罢。如果说的不对请回复指正,谢谢。 很多人都在说语言的好坏,比如 Perl 和 Python 社区间持续的争论、Linus 炮轰 C++、老赵力挺 C# 等等。除开骂人时的快感,这些嘴仗没有什么意义:即是 Linus Towards 也无法说服 MS 扔掉 C++ 改用纯 C,也不能让一个有了 N 年 Java 经验的人改用 C#(倒是可能改用 Scala)。在这,我也不想让任何人改用其他语言(那会杀了他们),只是想让你们能多有些了解,此外,如果以后有再次选择的机会,能选择一个称手的语言。 在说程序语言之前,先来乱扯下自然语言。我不研究语言学(我有个同学是),我的很多理解都是基于数理逻辑,而非语言学。自然语言的语系众多,有些语言“好学”、有些“难学”。比如说,拉丁语和古希腊语的语序是一种修辞——句子部分间的关系完全由屈折变化决定。因此,他们都是很美、很有表现力的语言(因为可以用很短的句子表示复杂而精确的语义),也是很难学的语言。古汉语也是如此:当我们阅读文言文的时候,都会感叹怎么那么一点点字就有那么多意思! 与此相反,现代英语和现代汉语则更加“分析化”(Analytic),几乎所有能表现复杂语义的东西都用介词明示出来了。结果呢,原来很有韵味的话突然没了感觉,像是 “Cogito ergo sum” 变成 “I think, therefore I am”,没了韵味。现在的语言多了简易性,而少了美感和厚重感。
js要给力之:代码能有多烂?
转载自http://bbs.51js.com/viewthread.php?tid=88174,原文作者 Aimingoo,感谢您的好文章。 烂代码是怎么定义的? KissyUI 是淘宝 Kissy 这个前端项目的一个群,龙藏同学在看完我在公司内网的“读烂代码系列”之后就在群里问呵:烂代码是怎么定义的? 是呵,到底什么才算烂代码呢?这让我想到一件事,是另一个网友在 gtalk 上问我的一个问题:他需要 a, b, c 三个条件全真时为假,全假时也为假,请问如何判断。
异步编程与响应式框架
本文原发表于《程序员》杂志9月刊,现将全文公开至此。前几天的技术交流会上我也讲了这部分内容,配合着看会有更好效果。此处为原始地址:http://blog.zhaojie.me/2010/09/async-programming-and-reactive-framework.html 异步操作是强大的,它是许多高伸缩性架构的基石。异步操作在许多情况下是必须的,例如在客户端保持用户界面的响应能力,以及在日益兴起的云计算场景中。但是,异步编程又是十分困难的,它让这让许多程序员敬而远之。因此,越来越多的编程语言都对异步编程提供了相当程度的支持,其中的典型代表便是F#中的异步工作流以及Scala的Actor模型。不过目前的一些主流编程语言,如C#或是JavaScript,它们在设计之时并没有在异步编程上考虑太多,我们便会根据它们的语言特性,提供合适的异步编程模型及其实现。而本文介绍的便是其中一例:响应式编程(Reactive Programming)模型及响应式框架(Reactive Framework,简称Rx)。