SICP公开课翻译小记(零)

DeathKing posted @ 2013年2月04日 00:50 in Scheme with tags lisp ruby Scheme SICP 公开课 , 5974 阅读

于此来说,计算机科学是个很糟糕的名字。

首先,它不是一门科学。它或许是一门工程或者一种艺术。但我们会发现计算机被叫做所谓的科学 ,是因为它有很多与魔法一致的地方。这些将在本课中体现 。

——Harold Abelson

 

缘起

  记得那是在高一信息技术课上,我从老师的口中听到了两个来自于上古的名字:PrologLisp。而在高二与朋友的闲聊中,又听闻到了Scheme——这个由MIT主导开发的Lisp方言,以及Scheme界的“The Bibble”——魔法书Structure and Interpretation of Computer Programs

Structure and Interpretation of Computer Program

《计算机程序的结构与解释》

  《算法导论》《编译原理》C程序设计语言》甚至《计算机程序设计艺术》毫无疑问都是计算机学界的瑰宝,然而这本《计算机程序的构造和解释》,却凭借与其自身的独特魅力,或者说魔力,在这个群魔乱舞的神坛里面独树一帜。我们也很想跟随SICP,跟随两位作者,去不一样的世界冒险,去追寻那神秘的魔法之力。偶然的机会,我得知SICP有公开课视频,这是两位作者Harold AbelsonGerald Jay Sussman19867月给Hewlett-Packard公司员工培训时所录制的视频。于是,怀着对SICP以及两位作者的崇高敬意,我和@ChingfanTson师兄开始了这段艰难的漫长翻译路。

 

视频、字幕和SICP中译版

Harold Abelson

  首先要再次说明,SICP公开课的系列视频录制于1986年,并作为HP公司的内部资料。而HP公司为响应Harold Abelson教授的MIT OCW建设,也于惠普影视部后制处理之后大方地公开。由于当时的录制条件所限,分辨率只有320X240,并且画质也非常糟糕。这对我们的字幕制作带来了很大的影响,我们也尝试着将分辨率提高到640X480(否则小分辨率显示字幕非常糟糕),并使用一些商业软件略微修补画质,但效果不太理想。

  而就字幕来说,我和@ChingfanTson之前都没有做过类似的工作,因此这次也是硬着头皮来完成这个系列的翻译。以前看电影时从没考虑过字幕组会付出多少心血,如今亲身实践,才发现此中不易!一节课的视频只有一个小时,但完成划句、翻译、审校、做时间轴花了我们不下30个小时的功夫,期间的种种酸甜苦辣,也只有我们才知道。个别句子,甚至要花上好些时间理解,有时还得热烈讨论一番才能得出结果。有些句子,为了使翻译符合中文习惯,不得不苦心孤诣,再三斟酌。还有的句子,在参考了资料后,又不得不改了又改。而最后的结果也难以令人满意。除了已经把这个项目托管到了GitHub,我还希望能有时间再细细的磨下,把措辞再变得准确一点、优雅一点。

Gerald Jay Sussman

  SICP的中译版,也就是《计算机程序的结构和解释》,是由北京大学的裘宗燕教授翻译的,虽然网路上有一部分人不太认可他的翻译,但我觉得,这个译本是非常棒的(尤其是序言的翻译,非常精彩)。在翻译SICP公开课的时候,很多地方也采用了他的译法。另外,出于统一的考虑,公开课出现的术语都朝裘书中的译法靠拢,比如:

  • Operator,操作符→运算符;
  • Operand,操作数→运算对象;

  出于忠于上下文的考虑,仔细理解后,Lec1a中有一处我们保留了我们的译法:

  • Conventional Interfaces,约定的接口,约定的界面(裘书)

  还有的术语出于跟上时代的考虑,翻译成了当下的叫法,比如:

  • Black Box,黑箱→黑盒
  • Syntactic Sugar,语法糖衣→语法糖;

  还有的词,再与裘宗燕教授交流一番后,我们终于从几种不同的译法中择出了最优:

  • Imperative Knowledge,行动性知识→指令性知识;

  虽然我们的翻译不能确保100%的准确,而且能够用中文表达作者的神韵,但我们的确是用心在做这件事。

 

Lisp\Scheme

C Lisp 一个就像红外线,一个就像紫外线,它们分布在光谱的最两端。它俩一个牛逼的地方刚好是另一个傻逼了的地方。

—— Steve Yegge ,Tour De Babel

  我承认,正因为之前有一点其它程序设计语言的基础,接触到PrologLisp的时候着实给吓傻了。一个不需要“for”语句,不需要“do-while”语句的语言,你这是想说Edsger W. Dijkstra提出的计算机程序的结构“顺序、分支、循环”中的“循环”是多余的么?Lisp告诉你,对,我们不需要它。我们可以用迭代或者递归来完成(SICP中会告诉你递归和迭代在某种程度上是一致的)。于是在SICP书中你就可以看到用递归完成的求平方根法。

  Lisp\Scheme之美,在于它能够模糊数据与代码的边界。代码和数据,在Lisp的世界中,就如道家的阴和阳,相互对立又相互转化,十分和谐。这是什么意思呢?我们假设在代码中,我们有一个叫a的变量,如果我们只是简单的使用它,那么编译器/解释器就会对其求值,以Ruby作喻:

a = 5
a #=> 5

  然而,我们如果想表示,叫a的这个变量的名字,也就是“a”这个符号,那么我可以用“符号”这个东西

a = 5
:a #=> :a

  Ruby只是从Lisp那里继承了一点东西,所以才会看起来更Lisp有异曲同工之妙,Lisp\Scheme通过一个单引号就将代码变成了数据:

(define atom?   
  (lambda (x)  
    (and (not (pair? x)) (not (null? x)))))  

(atom? (atom? 'a))    ; #t
(atom? '(atom? 'a))   ; #f

  由于Lisp写出下面的代码也不奇怪,运算符也可以作为返回值——因为它们都是复合过程——这是Lisp/Scheme神奇的组合以及抽象手段:

(define my-opr
    (lambda (x)
        ((cond ((> x 0) *)
                (else +)) x x)))

(my-opr 3)  ; 9
(my-opr -3) ; -6

  就此打住,Lisp\Scheme的奥秘还请各位自行在这个魔法世界里探索。

彩蛋

  公开课中播放的音乐是Johann S. BachJesus, Joy of Man's Desiring

  Harold Abelson教授是左撇子

视频

  正在后期制作,估计年三十那天应该能正式看到吧,算是送给各位虔诚的\(\lambda\)教信徒的新年贺礼吧!

Avatar_small
FTS 说:
2013年2月07日 16:12

十分感谢LZ做出的贡献!

just 说:
2013年11月04日 13:22

Excellent work,thanks a lot~最近也在看这本书

未命名 说:
2016年11月20日 21:50

我觉得裘的中译版是别人代笔的。第169页,图3-8中,“这里是由set改变的平衡”。本来是平衡的?现在被打破了?等等,代码里面好像有balance,一直是余额啊,难道莫非,看了下原版,果然是余额。。。。坑。。。。其中一个小坑而已。。。。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter