是不是很多经典库和数据库内核月报是C而不是C++?是的话,为什么

下面是我在2012年六月旧金山Go SF会议上的发言。  这是一个私人谈话。我不单是对在这坐的Go开发团队成员说,我要感谢团队在推动Go发展上所做的一切。我还想感谢Go SF组织者给了我跟大家交流的机会。  几个星期前我被这个问题:“你被鼓励转到Go后遇到最大的惊喜是什么?”。我立刻知道了答案:虽然我们预期C++程序员会将Go当做一个替代者,然而转到Go的程序员更多来自于如和Ruby等语言,很少有来自C++。  Ken、Robert和我,当我们还是C++程序员时我们设计了一种新的语言来解决我们认为需要用这门新语言来解决的问题。这好像是自相矛盾的,其他C++程序员并不在乎。  下面是我在2012年六月旧金山Go SF会议上的发言。  这是一个私人谈话。我不单是对在这坐的Go开发团队成员说,我要感谢团队在推动Go发展上所做的一切。我还想感谢Go SF组织者给了我跟大家交流的机会。  几个星期前我被问道这个问题:“你被鼓励转到Go后遇到最大的惊喜是什么?”。我立刻知道了答案:虽然我们预期C++程序员会将Go当做一个替代者,然而转到Go的程序员更多来自于如Python和Ruby等语言,很少有来自C++。  Ken、Robert和我,当我们还是C++程序员时我们设计了一种新的语言来解决我们认为需要用这门新语言来解决的问题。这好像是自相矛盾的,其他C++程序员并不在乎。  今天我想来说说是什么激发我们创建 Go 语言,以及为什么得出这样的结论应该是意料之中的事情。我承诺这将是一段更倾向于 Go 语言而不是 C++ 语言的发言,所以即使你不了解 C++ 语言,你也可以从这篇文章中了解一二。  实际上,这篇文章的结论可以概括如下:你认为 less is more (少即多),还是 less is less(少即少)?  这里我用一个真实的案例作为比喻。Bell 实验室中心原来是用 3 位数字来命名的:111 是物理研究所、127 是计算科学研究所等等。在 20 世纪 80 年代,随着我们对研究的深入了解,已经不足以用 3 位数字来简单地命名研究所了。所以,我们的研究中心编号变成了 1127 。 Ron Hardin 半开玩笑地说如果我们真的了解了这个世界,我们可以去掉编号前面的 1 位,从 127 变为 27。当然,管理层不会采纳这个玩笑,也并没有被期望他们这么做。但是,我认为,Ron 的说法是有道理的。 Less can be more (精简反而有更深的内涵)。你了解得越深入,你就能够用更精炼的语言来概括。  记住这个道理。  回到 2007 年 9 月,我正在做一些为一个大型的 Google C++ 项目做一些琐碎而中心的工作。你可能接触过这样的程序,在我们大型分布式编译集群上编译这个程序就用了大概 45 分钟。后来,听说了在 C++ 标准委员会的 Google 工程师将会进行 C++0x(即现在的 C++11)新特性的演讲。  在这场 1 个小时的演讲里,我们听说了 C++0x 计划中的 35 项新特性。实际上,或许还有更多的,但演讲中只描述了其中的 35 项。当然,一些新特性可能很微小,但是演讲中的特性却都十分重要。一些特性非常精妙而难以理解,像右值引用(rvalue-reference);但同时 也有很多 C++ 特色语法,像可变参数模板(variadic templates);而其他一些则非常疯狂,像用户定义数据标志(user-defined literals)  此刻我问了自己一个问题:C++委员会真的相信C++因为没有足够的特性而出问题吗?当然,作为Ron Hardin玩笑话的变种,简化编程语言相比于增加语言是更大的进步。这想法是有些可笑,但先记住它。  在那次C++演讲前几个月,我曾给自己一个演讲,你可以去YouTube上看,内容是关于我在1980年间创造的一个娱乐性质的并发语言。那个语言叫做Newsqueak,当然它是Go的前驱。  我做那个演讲是因为Newsqueak中的一些想法是我在Google工作时错过的,而我又重新对这些想法进行了思考。我确信它们将使得写代码更加简单,而且Google将会从中受益。  事实上我曾经尝试去寻找一个方法把这些想法引入C++,但是失败了。把并发操作和C++的控制结构连接起来太难了,反过来这样也很难看到真正的优势。再加上C++让自己看起来非常难处理,尽管我承认很难使语言真正易用。所以我遗弃了这个想法。  但C++0x演讲让我重新思考。真正困扰我的——我认为也困扰着Ken和Robert——是具有原子类型的新C++模型。在一个已经超负荷的类型系统 中加入这样一个定义微观细节的集合,让人感觉是错的。这看起来也非常短时,因为硬件很可能在下一个十年里有明显的变化,把语言和今天的硬件结合这么紧密将 是不明智的。  会议结束后,我们回到办公室。继续开始了新一轮的编译,然后转过桌子面对着 Robert,开始询问那些关注的问题。在编译结束以前,我们说服了 Ken ,决定自己动手做点什么。我们并不希望一直用 C++ 写程序,我们,特别是我,希望在为 Google 写代码的时候能够自然地使用并发编程技术。我们也希望强调“Programming in large”的方向。  我们在白板上写了很多我们想要的特性。我们从大方向出发,忽略详细的语法和语义只关注事物的主要部分。  我还保留着在那周里一个邮件列表,下面是一些节选:  Robert:起点: C语言,解决一些明显的瑕疵、删除杂质、增加一些缺少的特性。  Rob:命名为 Go 语言吧,你可以为这个名字想一些原因。但是它已经有不少美好的属性了。简单地说,易于书写。工具命名也容易:goc、gol、goa。如果有一个交互的调试器、解释器的话,它可以就叫“go”。文件名后缀就是“.go”。  Robert:空接口:interface {}。可以被所有接口实现,所以,这个接口可以代替 void* 的位置。  这时候,我们并没有完全弄清楚这种语言。举例来说,我们用了大概一年时间才弄清楚 array 和 slice 的结构。但是在最初的那几天,很多重要的特性就已经出现了。  注意到 Robert 说 C 语言是起始点,而不是 C++ 语言。我不确定,但我相信他指的是 C 语言,因为当时 Ken 也在。但是实际上,最后我们并不是真的从 C 语言开始扩展。我们完全重新开始了这门语言,稍微从 C 语言借鉴了操作符、括号以及一些普遍的关键字。(当然,我们也从其他我们所知道的语言中借鉴了很多想法。)在任何情况下,在我看来,我们从基础上、打破一 切的思路以及重新开始来回应 C++ 语言。我们并不是尝试设计一个更好的 C++ 、甚至说一个更好的 C 语言。它只是一个对我们所关注的软件更好的语言。最后,它当然和 C 或者 C++ 都相当不同。不同点甚至比大家注意到的多。我列举一下 Go 语言对 C/C++ 语言的关键的简化:  正则语法(不需要一个符号表来做语法分析)  垃圾回收  没有头文件  没有循环依赖  常量只是数字  int 和 int32 是两种不同的类型  用大小写字母区别变量的可见性  对所有类型可用的方法(没有类的语法)  没有子类型继承(没有子类)  包层次的初始化和良好定义的初始化顺序  文件的编译以包组织  任意顺序出现的包层次全局变量  没有算术转换(arithmetic conversions)(通过常量支持)  接口是隐含的(不需要用“implements”显式声明)  嵌入的(没有超类的好处)  方法被声明为函数(不需要特殊的地方)  方法就是函数  接口是没有数据的方法  方法以参数名匹配,而不是通过类型  没有构造函数或者析构函数  后增量运算(x++)和后减量运算(x--)是语句而不是表达式  没有前增量运算和前减量运算  赋值操作不是表达式  没有序列点(sequence point)的概念:evaluation order defined in assignment, function call  没有指针运算  分配总是初始化为 0  可以获取本地变量的地址  在方法中没有 this 关键字  分段的栈结构  没有 const 或者其他类型注解  没有模板结构  没有异常处理结构  string、slice 和 map 是语言结构  数组越界检查  尽管需要精简以及缺失部分的列表依然很长,但我相信,Go 比 C 或 C++ 更具表现力。积少可以成多。  当然,没有人可以一下子拿出所有的东西。诸如类型行为、实践中运行良好的语法以及使库间相互运行良好的不可言喻的部分等等需要慢慢积累。  我们也添加了一些 C 或 C++ 中所没有的东西,例如 slices 和 maps、复合声明,顶级文件表达式(非常庞大,且多数部分尚不为人知),反射,拉圾回收等。当然,还有原生的并发。  明显缺失的一项是类型层次。这里我可以说脏话么?  早在GO语言第一次出现的时候,就有人说,不能想象在工作中如何使用一个没有泛型的编程语言。这是我在某处作报告的时候,知道了这种奇怪的想法。  公平的说,他只是以自己的立场发表看法,或许他真的很喜欢C++中的STL为他带来的便利。所以为了讨论的目的,我们只有把他的想法看成很肤浅表面的东西。  按照那种想法,编写一个容器,例如整型的list和字符串的map,是一种不能承受的工作量。我知道了这种奇怪的想法后,花了我很少很少的编程时间实现了这些容器,即使是使用一些没有泛型的编程语言。  但更重要的是,那种想法中把类型作为解决这一难题的方法。类型,不是多态函数,不是语言基元不是其他方法的辅助,竟然是类型。  那是与我相关的细节。  从C++和转向Go的程序员不懂得使用类型编程的想法,尤其是继承、子类和与之相关的内容。也许关于类型我是个门外汉,但我还没发现一个模型能有如此的表现力。  我的一位老友Alain Fournier曾对我说,他把学术工作的最低层次看作是分类学。你知道吗?类型分层恰恰就是分类学。你需要决定哪块进什么箱子,每个类型的父类,无论是 A继承于B还是B继承于A。一个可排序的数组是一个排序数组或者是一个用分类机表示的数组吗?如果你相信类型地址对这些问题都进行了设计,那你就必须对这 个问题做出判断。  我认为那是个可笑的方法去思考编程。重要的不是事物间的祖先关系,而是它们可以为你做什么。  那是与我相关的细节。  从C++和Java转向Go的程序员不懂得使用类型编程的想法,尤其是继承、子类和与之相关的内容。也许关于类型我是个门外汉,但我还没发现一个模型能有如此的表现力。  我的一位老友Alain Fournier曾对我说,他把学术工作的最低层次看作是分类学。你知道吗?类型分层恰恰就是分类学。你需要决定哪块进什么箱子,每个类型的父类,无论是 A继承于B还是B继承于A。一个可排序的数组是一个排序数组或者是一个用分类机表示的数组吗?如果你相信类型地址对这些问题都进行了设计,那你就必须对这 个问题做出判断。  我认为那是个可笑的方法去思考编程。重要的不是事物间的祖先关系,而是它们可以为你做什么。  我们应该使用一些方法,像花园浇水软管一样来连接程序——当需要用另一种方法处理数据时,犹如拧水管一样进入另一个分支。这也是IO的方式。  这也是Go的方式。Go接受了这个想法并发扬光大。它是一个构造和耦合的语言。  很明显的例子是它提供给我们构造成分的接口方式。成分是什么不重要,如果它实现了方法M,我可以把它放在这里。  另一个重要的例子是并发性如何构造那些独立执行的计算。  甚至有一个非寻常(非常简单)的类型构造形式:嵌入。  这些构造技术正是Go的风味特色,这是和C++或者Java程序的最大的区别。  我想提一下Go设计中的一个不相干的方面:Go是为了写大型程序、被大型团队编写并维护而设计的。  关于“大型编程”的想法,从某种角度看C++和Java占据着这个领域。我认为这仅仅是个历史偶然现象,或者是个业界偶然现象。但大部分人都觉得这和面向对象设计有某种关系。  我一点也不相信这些。大型软件当然需要方法论,但更加需要的是强依赖性的管理、干净的接口抽象和优秀的文档工具,而这些C++都不能很好的处理(尽管Java明显好些)。  我们现在还不知道,因为还没有足够的用Go写的软件,但我相信Go将证明是一个优秀的用于大型编程的语言。时间将证明一切。  现在是时候回答我们刚开始提出的令人惊讶的问题:  为什么Go,一种完全为C++是怎样用所设计的语言,又不吸引更多的C++程序员?  玩笑撇在一边,我认为其原因是Go和C++有着完全不同的哲学。  C++是可以让你在指尖拥有一切。我在C++11FAQ中发现了如下引用:  C++抽象范围可表示的很优雅,灵活,手工制作的专业代码和零成本相比是大大增加的。  这样的想法和Go的操作方式是不同的,零成本可不是Go的目标,但至少不是零成本。Go 宣称极小化编程人员的付出是它们认为最重要的。  Go 语言不是包罗万象的。Go 并不自带很多函数,不会对每一个执行细节都有精确的控制。例如,你不会有 RAII。相反地,Go 语言有一个垃圾收集器(Garbage Collector,即GC),因此,不需要一个释放内存的函数。  Go 语言给你的是一套强大且易于理解、易于构建的对问题解决方案。它不是一种像你用其他语言一样的快而复杂、或者说思想上有所激发的语言,但它几乎肯定会更容易编写、更易于阅读、更容易理解、更容易维护,也许还更安全。  用另一种方式来说,当然过于简洁:  和Ruby程序员转向Go,因为他们不需要屈服于大量的表达形式,但可以提升性能,并能使用并发性。  C++程序员没有转向Go,因为他们为精确控制他们的编程领域付出了很多,不想屈服与它的任一方面。对他们而言,软件并不仅仅意味着搞定工作,它意味着使用某种确定的方法去做。  那么,问题是Go的成功将与他们的世界观冲突。  我们本应该从开始时就意识到这一点。那些因为C++11的新特性而激动不已的人是不会关心一个有更少特性的语言。即使,最终它能提供更多。  谢谢。  原文链接:http://commandcenter.blogspot.it/2012/06/less-is-exponentially-more.html  译文链接:http://www.oschina.net/translate/less-is-exponentially-moreGolang语言社区(Golangweb) 
 文章为作者独立观点,不代表大不六文章网立场
的最新文章
背景 C/C++语言的并发程序(Concurrent Programming)设计,一直是一个比较困难的话题1. 锁优化的思路和方法在[高并发Java 一] 前言中有提到并发的级别。一旦用到锁,就说明这是阻塞式的,所From:http://m.oschina.net/blog/. 分段锁
借鉴Disruptor是LMAX公司开源的一个高效的内存无锁队列。这两天看了一下相关的设计文档和博客,下面尝试进Golang :不要通过共享内存来通信,而应该通过通信来共享内存。这句风靡在Go社区的话,说的就是 goro从正确的方式开始测试你的Go应用/**
* 谨献给Yoyo
* 原文出处:https://www.什么是iowait?顾名思义,就是系统因为io导致的进程wait。再深一点讲就是:这时候系统在做io,导致没DK1.5 引入了 concurrent package, 提供了更多的concurrent 控制方法。 还这里,我们以游戏中的一个情况为例。比如魔兽世界里的40人团队副本BOSS战,很多玩家同时攻击BOSS,BOSI/O问题一直是一个比较难定位的问题,今天线上环境遇到了I/O 引起的CPU负载问题,看到了如下这篇比较好的Go是互联网时代的通用编程语言。这样它就和命令行时代的C语言、图示界面时代的C++、以及互联网早期的Java先从个简单点的,也是用的比较多MD5加密开始,不多说直接上代码package sign
import "c当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣。sock1.C++模板的作用。 将算法与具体对象分离,与类型无关,通用,节省精力2.socket编程,如果clien.共享内存大小的设置临时设置:通过修改/proc/sys/kernel/shmmax参数可以达到此目的。  目录 (一)什么是服务器并发处理能力(二)有什么方法衡量服务器并发处理能力1.吞吐率2.压力测试(三)怎么提1
下载开源下载路径:/muesli/cache2go 2
Go中map并发使用是不安全的,当你使用goroutine同时对一个map进行读写操作时,不确定会发生什么(互斥锁互斥锁是传统的并发程序对共享资源进行访问控制的主要手段。它由标准库代码包sync中的Mutex结构体类最近在team内部培训golang,目标是看看golang能否被C工程师快速掌握。我定了个一个月,共计20小转载 : /agateriver/archive/2010/05/关于go语言协程通道的使用
//1.通道可以带缓存,也可以不带
//2.不带缓存的,不管是读还是写都会阻塞感觉现在的Docker就像2013年的Spark一样,势不可挡,因此很有必要对Docker进行深度学习。我们olang有两个非常大的特性,那就是goruntime与channel,这两个特性直接将开发人员从并发和线程golang中延迟调用函数(Deferred Function Calls)的使用。package main import (
"log" 今天逛博客园,看到了一篇推荐的文章《浅谈程序员的英语学习》,就点进去看了一下,对于文章中的观点我非常认同,英简介
园子里已经有不少介绍HTTP的的好文章。对HTTP的一些细节介绍的比较好,所以本篇文章不会对HT简介
当今世界是一个信息化的世界,我们的生活中无论是生活、工作、学习都离不开信息系统的支撑。而信息系统本篇只是自己学习过程中的一个记录首先需要引入”net/http”包import "net/http"导入了相椭圆曲线加密算法,使用golang的实现!最近在看一些关于比特币的东西,里边有个椭圆曲线加密算法,查了下,感使用golang可以很容易实现,生产者与消费者功能。实现一:(只生产一定数量数据)//写入专用通道
//一次package main
func main() {你知道有能力胜任和精通之间的区别是什么吗?这听起来像一个很难回答的问题,因为这两者似乎意味着同样的事情。但它作为一个最底层的程序员,我先记录一些只有底层程序员才会知道的事情。如果多年后,我违背自己进入这个行业的初心,我特别支持软件开发者在他们掌握技术技能的同时去学习“软技能”——事实上,我写了一本关于这方面的书——但是不可package mainimport (
"encoding/csv"
"i国庆节宅在家里,看完了40集的电视剧,也刷了4K代码。最近看看Golang,然后想摆弄一下神经网络。虽然如今在Go语言中处理任何stream数据时,我已经深陷io.Reader和io.Writer的灵活性中不能自拔。概述  在今天, 前后端分离已经是首选的一个开发模式。这对于后端团队来说其实是一个好消息,减轻任务并且更专注「随笔思考」 Code Review 怎么做才好呢「随笔思考」 编程是艺术吗,它有门槛吗?想要构造一个web系统中的TPM,首要问题就是需要保证输入数据安全,打造一个相对可信的前端环境。但是由于web的开放特性,前端作为数据采集的最前线,js代码始终暴露在外,在这种情况下,js代码混淆的重要性逐渐彰显出来。golang解析xml真是好用,特别是struct属性的tag让程序简单了许多,其他变成语言需要特殊类型的在package main
import "time"
import "fmt"
func main() 论获取缓存值的正确姿势cache时至今日,大家对缓存想必不在陌生。我们身边各种系统中或多或少的都存在缓存,自先简单分享自己这10年在技术上曾经感觉到明显迷茫的阶段:阶段1:只会增删改查:时间:大学期间(2005年-2网上有很多这方面的教程,但不是苦涩难懂就是从哪copy过来的,反正很长一段时间我是没看懂,时间长了也没打算去这个问题困扰了我一晚上,但是最终还是被我试出来了。问题场景:1.我通过反射获取一个指针的valuev := package mainimport (
"net"GolangwebGo 语言社区专业的Go语言开发社区,除此之外我们还研发了Go 社区APP,让用户随时随地可以了解Go语言的行业动态。热门文章最新文章GolangwebGo 语言社区专业的Go语言开发社区,除此之外我们还研发了Go 社区APP,让用户随时随地可以了解Go语言的行业动态。据知识浅薄的我所知,nginx是C,FfMPeg是c,很多ietf协议的实现开源库都是C。linux内核是C。既然“加加比C并没有太多性能劣势(存疑)”,加加的编程更好维护更好拓展,加加逻辑性调理性更好,更适合于描述业务。那么:1, 为什么有很大一部分网络协议这种业务描述性质的开源库要用C而非加加?2, 为什么内核用C嵌汇编,而不是用加加嵌汇编?除了虚表,加加似乎额外开销并不大过C多少。
首先我自己是写C++的,写C的话也基本会去按照C++的面向过程的方式去写,所以我对C是没什么太深入的了解。说的不对,你们也打不到我。很多是算法库,底层库,这些东西就算是用C++来写,也会更加去倾向使用面向过程的写法,为了效率,大牛们就会使用模板了,首先是模板这个东西,很多CPP程序员的掌握程度是参差不齐的,那么在之后维护起来,难度就加大,舍弃掉模板,那么无疑,C更加合适(有一点要说的是,加上模板后C++的效率是会比C高的,还记得大明湖畔的qsort嘛,更不要说还有元编程了,在编译期搞定计算这样的技术了。)再来是内核了,越接近底层的东西就越是一个萝卜一个坑,多态继承这些基本都是用不太到的,当然OOP思想还是要使用的,还有就是啊,虚表的开销,首先虚表会占额外的内存,二来频繁调用肯定是效率极低的,所以在做GUI的时候,消息泵是不用虚函数来做的,各个库都有其他办法,我就不多说了。回到内核上,当然你也可以用C++写出不用虚函数的多态(用模板就可以做到),但是又是模板,那还不如用C来做。至于逻辑性,条理性,C一样用面向对象的思想来编程,也就不存在这些问题了,详情可见早期的OpenCV库。所以,不得不承认就是C在不需要大量抽象的情况下,会比C++更合适,当然,这里面并不去比较性能差异。还有反正C和C++无比的兼容,到时候用C++做个封装,也是件容易的事情.当然,我不排除原作者不会C++这个选项.当然我觉得可能里面还有历史原因,比如OpenCV开始舍弃掉C的部分了.还有写在最后,你们不要乱把我的话拿去黑C++啊.我爱C++是爱的深沉的.
已有帐号?
无法登录?
社交帐号登录
我是有酱人精神的码农后使用快捷导航没有帐号?
各种编程语言的优缺点
查看: 863|
评论: 0|来自: 伯乐在线
摘要: 圣经记载:在远古的时候,人类都使用一种语言,全世界的人决定一起造一座通天的塔,就是巴别塔,后来被上帝知道了,上帝就让人们使用不同的语言,这个塔就没能造起来。 巴别塔不建自毁,与其说上帝的分化将人类的语 ...
圣经记载:在远古的时候,人类都使用一种语言,全世界的人决定一起造一座通天的塔,就是巴别塔,后来被上帝知道了,上帝就让人们使用不同的语言,这个塔就没能造起来。 巴别塔不建自毁,与其说上帝的分化将人类的语言复杂化,不如说是人类自身心灵和谐不再的分崩离析。之所以后来有了翻译,不仅是为了加强人类之间的交流,更寄达了一种愿望,希望能以此消除人际的隔阂,获求来自心灵的和谐及慰藉。真正的译者,把握血脉,抚平创痕,通传天籁,开启心门。这是我写的旋风式的编程语言简介 —— 我本来为亚马逊开发者杂志本月的期刊写的,但是发现我写的东西没法见人。首先,我偶尔一不小心口出脏话,或者对上帝不恭的话,所以在很官方很正式的亚马逊上发表是不合适的; 所以我就把它塞到我的博客里了,我的博客反正没人看的。除了你以外。是的,只有你会看,你好啊。其次,这是一项进行中的工程,现在只是东打一耙西搞一下,还没有精加工过的。又一个把它写到博客里的很大的理由。不需要很好,或很完整。就是我今天想说的一些话。请随便!我的旋风式简介会讲C、C++、Lisp、Java、Perl (我们在亚马逊用到的所有语言)、Ruby (我就是喜欢) 和 Python,把 Python 加进来是因为 —— 好吧,你看了就知道了,现在我可不说。C你必须懂C。为哈? 因为出于所有现实的理由,这个世界上你过去,现在,将来会用到的每一台计算机都是一台冯·诺曼机器,而C是一种轻量级的,很有表达力的语法,能很好的展现冯·诺曼机器的能力。冯·诺曼架构就是你每天都用的计算机的架构的标准:一个 CPU,内存,硬盘,一条总线。多核计算机并没有带来本质上的变化。冯·诺曼机是一个很方便,很便宜,上世纪五十年代的实现图灵机的技术,图灵机是执行计算的最知名的抽象模型。世上还有其他的计算的机器。比如,Lisp 机器,是上世纪 50 年代对 Lisp 计算模型的实现。Lisp 模型是基于 lambda 代数的一种计算语言表示法,后者是与图灵机同构的一种模型。不像图灵机,lambda 代数能被人类读和写。但是这二者是同等能力的。它们同样精确的表示了计算机能干什么。Lisp 机现在不是很流行了,除了在跳蚤市场里。从谁更受欢迎来说,冯·诺曼机器赢了。还有一些其他的计算机,比如计算机,译者也不知道怎么翻的计算机(cellular automata),但是这些都不够大众化,至少现在是这样的。所以你必须知道C。还有一个你必须知道C的原因是,Unix 是用C写的。巧的是,Windows 也是。基本上所有的其他操作系统都是用C写的。因为这些操作系统都是冯·诺曼机的操作系统,你还能用别的吗? 任何跟C很不一样的东西都会跟硬件的实际能力相差太远而导致无法满足性能上的需要,至少对一个操作系统来说是这样—至少在上个世纪是这样,碰巧这些系统都是上个世纪的。你还应该知道 Lisp。你不必用它来干实际工作,虽然它在很多 GNU 的软件里都会很用得着。尤其是,你应该学会 Scheme,Lisp 的一种小巧化的,纯洁的方言。GNU 的版本叫 Guile。他们在麻省理工和加州伯克利教新学生一到两个学期的 Scheme,这些学生都对他们为哈要学这么奇怪的语言抓破脑袋。实话实说,作为第一门学习的语言,这是一个很烂的选择,第二门也是很烂。你应该学会它,最终,但不是作为第一门或第二门语言。这是很难的哦。这是很大的一步。学会怎么用 Lisp 写出像C语言的程序是不够的,那没有意义。C 和 Lisp 一个就像红外线,一个就像紫外线,它们分布在光谱的最两端。它俩一个牛逼的地方刚好是另一个傻逼了的地方。如果说,C是最靠近计算机是如何工作的语言模型,Lisp 就是最能反映计算(注意,这里没有了“机”字,计算机和计算是很不同的!译者注)是如何工作的模型。你不需要懂很多 Lisp,真的。紧咬 Scheme 就哦了,因为它是最简单最干净的。其他的 Lisp 已经发展成了很大,很复杂(很好很强大? 译者:-)的编程环境,就像 C++ 和 Java,要有很多库啊,工具啊等等之类。那些,你不需要知道。但是你应该能用 Scheme 写程序。如果你能够做出 The Little Schemer 和 The Seasoned Schemer 这两本书里的所有习题,你懂得就够多了,我认为。但是对于你天天要做的编程工作,你应该基于以下条款选择你的语言:库,文档,工具支持,操作系统集成,资源,和一堆其他的东西。这些条款跟计算机如何工作关系很小,但是跟人类如何工作关系甚大。人们还在用很直白的C语言写东西。很多东西。你应该懂C!C++C++是地球上最蠢的语言,即使是从蠢这个字的真正意义上出发。C++很无厘头。它不知道自己是什么东西。它没有自省(introspective,面向对象里的一个概念,译者注)。C也没有,但是C不是“面向对象”的,而面向对象很大程度上是关于要让你的程序知道它自己。对象就像演员。所以面向对象语言应该有运行时的自省机制,知道自己是个什么类的对象。C++不是这样的,真的,你不会那样用它。关于C:写一个C的编译器是那么的简单,以至于你可以用C写一个关于C的工具,用起来就像是有内省机制。而 C++ 呢,基本上是不可解析的,所以如果你想写一个很牛逼的工具用来 —— 比如,告诉你你的虚函数的原型,或者帮你重构你的代码,你将不得不依赖别人的工具集,因为你自己在除非脑子进屎的情况下是根本不会去写一个 C++ 的解析器的。而市面上所有的 C++ 的解析器都很傻逼。C++很蠢,你不能用蠢语言创造一个好系统。语言决定世界,蠢语言决定蠢世界。所有的计算都基于抽象。你用低级的东西创造出高级的东西。但是你不能用分子创造出一个城市。尝试使用太低级别的抽象只会给你带来麻烦。我们就惹上麻烦了 (是指亚马逊的员工,还是所有 C++ 的程序员? 我也不知道,译者注)。理智的情况下,你用C写的最大的东东就是一个操作系统。而操作系统其实不是很大的,真的。它们看起来很大,但那是因为它们有很多应用软件,操作系统本身的内核是蛮小的。你用 C++ 能写的最大的东东是…也是操作系统。好吧,或许稍微再大点儿。让我们说,再大三倍吧。或者 10 倍吧。但是操作系统内核最多也就,那啥,一百万行代码? 所以我说你能用 C++ 写的最大的系统大概也就是一千万行代码吧,再大的话就开始不行了,这玩意儿你没法控制了,就像恐怖片里的…我说的一千万行是指如果你那时候还能让你的系统编译通过的话。我们(在亚马逊,译者注)有五千万行 C++ 代码。不,现在还要更多了。我已经不知道有多少行了。上个圣诞节是五千万行,那是九个月前,而它以每季度八百万行的规模增长。增长率本身也增长,妈呀。我们想在这个系统里干点啥好像要一万年。一个亚马逊工程师有一次这样描述我们的代码库:“一座很大的屎山,你见过的最大的山,每次你想修正一个 bug,你的工作就是爬到屎山的正中心去。”伙计们,那哥们可是在四年前说的这话。他现在已经到更环保绿色的牧场上去了。真是太可惜了,他可是个实实在在的高手啊。这都是 C++ 的错。别跟我争论。就是的。我们用的是世上最蠢的语言。这简直有点老板级的蠢,你说呢? (译者注,meta 在计算机术语里通常表示更高一个层次,比如,meta-language,比普通的 language 高一个层次,意思是关于语言的语言。哲学里应该会经常用到这个词。我不懂哲学,但是我觉得老板们总是比我们高一级,所以 meta-dump 我就翻译成老板级的蠢喽。:-)说了以上这些难听的话,话得说回来了。用 C++ 写出漂亮的代码显然是可以的,我的意思是说,这样的代码应该大部分还是C,偶尔很有品味的,很有节制的用一点C++。但是这种代码几乎从来不会被写出来。C++是个很好玩的游乐场,而如果你把它玩儿得门儿清的话你会觉得自己特牛,所以你总是被诱惑把你知道的所有的东西都用上。但是那是很难做好的,因为从一开始这个语言就太狗屎了,最终,你会弄得一塌糊涂,即使你很能干。我知道,我说的都是异端邪说,该被钉到十字架上的。随便吧。我在大学里的时候老喜欢 C++ 了,因为我那时候就只知道这一门语言。当我听到我的语言教授,Craig Chambers,绝对的厌憎C++,我想:“为啥呢? 我觉得它挺好的啊”。而当我听到 STL (标准模板库)的发明者被采访时说他恨 OOP (面向对象编程)时,我更是认为他肯定是磕药了。怎么会有人恨 OOP 呢,而这个人竟然还是 STL 的发明者?亲不敬,熟生厌(语出圣经,译者注)。说的是在大多数情况下,跟一件事物熟悉了之后你就失去对它的膜拜尊敬了; 在计算机语言里情况不是这样的。光对一门语言熟悉不会导致你看轻这门语言。你必须成为另一门更优秀的语言的专家(才能让你明白原来那门语言有多么多的问题)。所以如果你不喜欢我针对 C++ 大放厥词,请你去学另一门语言并成为一个专家(我推荐 Lisp),只有那时你才有足够的武器与我争论。然而,那时你将不会跟我争了。你上了我的当了。你也会跟我一样变得不喜欢 C++ 了,你或许会觉得我这个人很恶心,把你骗得不喜欢自己曾经的最爱了。所以或许你应该把我说的一切都忘了。C++挺好的其实,真的。它就是很棒棒(译者注,作者在这里用了 ducky,这是一个女性喜欢用的夸某物好的词,近来也为玻璃们喜爱)。忘了我说的话。C++不错的。Lisp(我打赌这一节会让你觉得惊讶,即使你已经关注我的博客有一阵了[译者注,作者也可能是说,即使你成为亚马逊的员工有一阵了])亚马逊创业之初,我们有很多明星级的工程师。我不认识他们所有人,但是我认识几个。比如?Shel Kaphan, 大拿。Greg Linden, 大拿。Eric Benson。即使在他加入亚马逊之前就已经有自己响亮的名气了。也是大拿。他们写了 Obidos 服务器。是 Obidos 让亚马逊成功的。只是后来那些生产大便很拿手的工程师,网页开发者,搞前端的人 —— 这些人因为生产大便很拿手而总是能让经理们满意 —— 只是在后来这些人把 Obidos 搞糟了。(他们的大便)把整条河都堵了,打个比方说的话。但是 Obidos 是亚马逊最初的成功的一块关键的基石。这些最早的牛人们在亚马逊神圣的代码库里只允许两种语言:C 和 Lisp。你自己去想吧。当然,他们所有人都使用 Emacs。靠,Eric Benson 是 XEmacs 的作者之一。这个世界上所有伟大的工程师都在用 Emacs[注1]。那种世界因你而不同级别的伟大。不是坐在你旁边的格子里的那哥们那种伟大。也不是 Fred,走廊尽头那哥们。我说的是我们这个行业里最伟大的软件开发者,那些能改变这个工业的面貌的人。像 James Gosling 们(Java 语言设计者),Donald Knuth 们(这个人没有听说过的话赶紧改行吧,别搞计算机了),Paul Graham 们[注2],Jamie Zawinski 们,Eric Benson 们。真正的工程师用 Emacs。你必须很有点聪明才能把 Emacs 用好,而如果你能成为一个 Emacs 大师的话它会给你难以置信的牛力。有机会的话你应该站到 Paul Nordstrom 的肩后看看他是怎么工作的,如果你不相信我的话。对那些一辈子都在用烂 Visual Studio 之类的集成开发环境的人来说,一定会大开眼界的。Emacs 是那种你可以用 100 年的编辑器。Shel, Eric, Greg,和其他像他们那样的人,我没有足够幸运能跟他们直接一起工作:他们禁止在这里使用C++,他们禁止使用 Perl(或者 Java,为完整起见)。他们是明白人。现在我们都在用C++,Java 和 Perl 了,所有的代码都用这些语言。我们的前辈们已经到更环保的牧场上去了 (指没有大便的牧场,译者注)。Shel 用 C 写了 Mailman,客服部的人把它用 Lisp 封装了一下。Emacs-Lisp。你不需要知道 Mailman 是什么东西。除非你是个 Amazon 的老员工,或许不是搞技术的,而且你曾经不得不让客户哈皮 (只有在这种情况下你才需要知道 Mailman,译者注)。不是间接的,因为你用 C++ 写的一个狗屎功能跑不起来了,让客户很生气,于是你不得不去搞定它以恢复客户的哈皮度。不,我是说直接的,意思是,你必须跟他们聊。我们可爱的,不识字的,呱呱其谈的,心地善良的,充满希望的,困惑的,能帮点小忙的,愤怒的,哈皮的客户们,真正的客户们,那些从咱们这里买东西的人,我们的客户们。(如果你必须跟他们打交道的话,)那你就会知道 Mailman 这个东西。Mailman 是客服部的客户电子邮件处理软件,我们用了它有…四,五年? 反正是很长时间。它是用 Emacs 写的,所有人都爱死它了。人们现在还很爱它。直到今天,我依旧不得不听我们一些非技术员工跟我长篇大论的叨叨他们是多么的怀念 Mailman。我可绝不是满嘴喷粪。上个圣诞节我参加了一个 Amazon 的派对,一个我不知道自己怎么会被邀请的派对,里面全是些西装笔挺的商务人士,谁都长得比我帅,比我光鲜。以及一些我在公司里曾经打过交道的人(这句不知道怎么译)。四个美女认出了我是在客服部里干的,把我包围了,跟我说了十五分钟她们是多么的怀念 Mailman 和 Emacs,而现在的亚马逊(我们用 JSP 花了好多年准备换掉 Mailman 的那一套软件)是怎么的不能满足她们,让她们觉得跟以前一样爽。这一切都太梦幻了,我觉得她们可能是喝多了。Shel 是个天才。Emacs 是天才。连非技术人员都爱 Emacs。我现在就是在 Emacs 里打这些文字。我绝不情愿在任何其他地方打字。这不只是关于让你的效率得到飞跃,通过那些地球上其他地方找不到的快捷键和文本编辑功能。我每分钟打一百三到一百四十个英文单词,在 Emacs 里,当我在写没有格式要求的文本的时候。我测过这个时间速度。自己写了一个测打字速度的 Emacs 应用。但我想跟你说的不只是这个。Emacs 有的是一种你叫不出名字来的品质。我们现在不用 Mailman 了。那是因为我们有一种叫得出名字的品质 —— 就是,烂。我们很烂。我们(当时)找不到 Emacs-Lisp 足够牛的人把 Mailman 继续搞下去。今天这应该不难了; 亚马逊现在到处都是 Emacs Lisp 的黑客。但是在那时候,客服部的人没法从别人那里得到帮助。于是他们就用他们当时手头有的资源去搞这件事。他们当时没有足够多的 Emacs-Lisp 的人。有一段时间,他们甚至找来 Bob Glickstein 当合同工,那个给 O’Reilly 写了那本 Gnu Emacs 扩展的书的家伙,坐在一个小办公室里给 Emacs 写 Mailman 的扩展。客服应用部是 Amazon 的第一个两块比萨饼的团队(代表团队人数的增加,编者注)。这个团队是完全自立的。不管是那时还是现在。没人跟他们说话,没人帮他们。没有枪,没有炮,他们自己造。他们没有网页工程师,没有支持工程师。屁也没有。有的只是一堆骨灰级的工程师和一个能带新人的文化。这就是他们需要的一切了。但他们最终不得不让 Mailman 光荣退休。妈哎。而我呢今天还听到人们说他们是多么的怀念它。甚至在派对上。我想今天按人头比例来说,客服部仍然拥有比亚马逊任何其他团队更多的 Lisp 黑客。可能他们用到 Lisp 的机会不多了,但是 Eric Raymond 说过,即使你很少用 Lisp 写程序,学习 Lisp 会是意义深远的一个经历,能让你下辈子都成为一个更好的工程师。卡尔,宗教现在已经不是大众的精神鸦片了。现在鸦片是集成开发环境了。(卡尔·马克思。这个人不知道的话应该打屁屁)。JavaJava 是过去的 10 年中计算行业里发生过的最好的同时也是最坏的事。一方面,Java 把你从 C++ 编程的很多枯燥易错的细节中解救出来了。没有数组越界了,没有 core dump 了。抛出来的异常能让你精确定位到出错的那一行代码,而且 99% 的时候都是正确的那一行出错了的代码。对象们在需要的时候能智能地把它们自己打印出来。等等等等。另一方面,除了是一种语言,一个虚拟机,一个巨无霸的类库,一个安全模型,一个可移植的字节码格式,Java 还是一个宗教。邪教。所以你不能太相信对它太虔诚的人。想要招一个好的 Java 工程师是一项很有技术挑战的活。但是总的来说,Java 是软件工程史上的一大进步。从 C++ 到 Java 不只是语法上的改变。这是一种需要一段时间去好好体会的一种震撼性的世界观的转变。这有点像突然你被配了一个执行助理。你知道老总们为什么总是好像有时间去开会,总是知道公司现在运行的情况,总是写出很酷酷的文档吗? 老总们常常忘记其实他们不是一个人在战斗,他们都是两个全职的人,他们和他们的执行助理们。有一个执行助理把你从琐事中解救出来让你有时间去思考那些真的需要你去解决的问题; 没有的话你将不得不花一半的时间在那些无聊的世俗的事情上。切换到 Java 编程语言就把你变成了两个程序员 —— 一个处理那些你不需要关心的东西,另一个可以集中精力在问题本身上。这是一个很震人的改变,一个你应该很快就能习惯能喜欢上的改变。就像 Jamie Zawinski (Netscape 牛人,开发 Mozilla 浏览器,好像学历是高中毕业?)在他著名的“Java 真烂(java sucks)”那篇文章里说的:“先说那些好东西:Java 没有 free() 函数。我必须一开始就承认,其他的东西都没什么了不起。(没有 free)是能让我原谅其他所有东西的特性,不管其他东西有多烂。讲完这一点后,我的文章里其他一切几乎都完全没有重要性了。”Jamie 的文章写在 1997 年,按 Java 年来算的话是很早以前了,跟他写这篇文章时比,Java 已经有很大的改善; 一些他抱怨的东西甚至已经被 fix 了。但是大多数还是没有被 fix。Java 作为一门语言还是有点烂。但就如 Jamie 指出的,Java“是今天为止最好的语言。我的意思是说,它是今天市面上那些烂得底儿掉地一堆语言比起来有那么一点能被我接受。”真的,你应该读读他那篇文章。Java 几乎每一方面都很好,除了它的语言本身,而这是 JWZ 抱怨的主要对象。但那是一个很大的抱怨。再好的库也救不了一个烂语言。相信我:你可能比我知道多得多的东西,但是我知道好兵救不了烂将。在 Geoworks 搞了五年汇编语言都会了我这个道理。跟 C++ 比,Java 作为一个语言还过得去。好吧,别扯了,Java 要好很多。因为它有(内建)的字符串。哥们,你说一个没有内建的字符串的语言是人用的吗。但是 Java 跟 C++ 比少了一些好东西,比如(函数调用时)传引用,栈上的对象,typedef,宏,以及运算符重载。一些时不时地会很称手的东西。哦,还有多重继承,我现在老了,反而挺欣赏了的多重继承。如果你认为我这个观点僵硬不灵活的家伙是多态教义很好的反例的话,我倒是可以给你举几个为什么你需要多态继承的好例子,或者至少像 Ruby 那样的 mixin 或者自动的派遣。下次问问我白龙马的事情。今天我要告诉你为什么 Java 的 interface 是个烂货。几年前 Gosling 自己都说,如果一切都能重来的话,他不会搞出个 interface 的概念。但是那正是 Java 的问题。当 James 说出那句话的时候,人们被雷到了。我甚至能感觉到那股雷劲儿,能感觉到 Sun 公司市场部和法务部的鸟人是多么想把 James 灭口,然后告诉大家他没那么说过。Java 的问题就是人们都被那帮人搞的广告效应蒙住了眼。C++,Perl,任何流行语言都有这个问题。这是很严重的,因为如果没有一些说大话吹牛逼的广告,一个语言是不会流行起来的。所以如果一个语言的设计者说他的语言没有被设计得很完美的话,就是赶紧用麻醉枪射击这胡说八道的家伙并关闭会议的时候了。语言们需要放点儿卫星才能活,我只希望人们不要被卫星耀瞎了眼。我学了面向对象编程, 我自己也对此大吹大擂。当我加入亚马逊时,我不能告诉你我有什么智慧或者经验,但我可以给你背诵出所有关于 OOP 的魔咒。多重继承是邪恶的,因为大家都这么说; 运算符重载是邪恶的,诸如此类。我甚至有点模糊地知道为什么是邪恶的,但实际上不知道。后来我明白了,这些都不邪恶,不是烂玩意儿,烂的是开发者,是我。我现在还是烂,但是希望每年都不烂一点起来。上礼拜我碰到一个来面试的,他告诉我多继是邪恶的,因为,比如,你可以从头,胳膊,腿,躯干多重继承出一个人来。他既是对的,又是错的。那样的多继情形当然邪恶,但那都是因为他自己太邪恶了。那样继承出来的“东西”远远就能看见有多蠢,如果他还把这玩意儿弄进门来那就更邪恶了。不良开发者,占了这世上开发者的大多数,他们能用你扔给他们随便什么语言写出不良的代码。说了这些,还是得说回来,多继不是请客吃饭那么轻松的事儿; mixin 看起来是更好的解决方案,但是还没人完美的解决这个问题。但我还是认为 Java 比 C++ 好,即使它没有多继。因为我知道不管我的出发点是多么好,某一天我还是会被一堆不懂怎么写好代码的人包围,让他们用 Java 比用 C++ 会带来更少的伤害。此外,Java 除了语言本身外还有老多其他的重要有用的东西。且 Java 语言本身也在进化,虽然像冰川一样慢,所以我们还是能看到希望。Java 正是我们应该在亚马逊推荐使用的语言。你就是得小心点儿,因为和其他任何语言一样,你能很容易找出一堆人,他们很懂一门语言及其编程环境,但对品味,计算或者其他任何重要的东西却一无所知。当你有怀疑时,还是雇那种会好几门语言的 Java 程序员,那种厌憎 J2EE/EJB 之类松松跨跨的所谓框架的,那种使用 Emacs 的。这都是一些实战经验。PerlPerl,怎么说呢?Perl 是个老朋友。老老朋友。我开始写 Perl 代码的时候,可能是 1995 年。而它为我很好的服务了差不多 10 年的时间。它就像你骑了十万二十万英里的老自行车,你心里永远有一块地方装着它,虽然现在你已经换了一辆更加现代化的只有五磅重的自行车,而且这一辆也不像老的那辆顶得你屁眼疼了。Perl 受欢迎原因有仨:用 Perl 你很快就能搞定你的问题。而这是最终的衡量标准。Perl 有世上最好的市场推广。你可以写一本介绍他们市场推广有多绝的书。Sun 公司砸大笔钱给 Java 推市场,Perl 在受欢迎程度来说能跟 Java 齐头并进,但 Perl 纯粹是依靠 Larry Wall 和他那帮哥们的三寸不烂之舌做市场。哈佛商学院的人应该去研究 Perl 的市场是怎么做出来的。真的让人瞠目结舌。直到差不多,呃,现在,Perl 没有真正的竞争者。有比 Perl “好”的语言。操,有很多比 Perl 好的语言,如果你定义“好”为“不是给疯子用的”的话。Lisp, Smalltalk, Python,妈呀,我可能可以列出二三十种比 Perl “好”的语言。从这些语言不像这个夏天在台湾街头爆了肚皮的抹香鲸这个角度来说。鲸鱼肠子到处都是,汽车上,机车上,行人身上。这就是 Perl。让人着迷,真的。但是 Perl 有很多很多好的特性,直到最近,都是其他语言没有的。它们弥补了 Perl 肠子在外的不足。你可以从爆了肚皮的鲸鱼可以做很多有用的东西出来,比如香水。这很有用。Perl 也是这样。当其他的那些语言(尤其是 Lisp 和 Smalltalk)都想假装操作系统并不存在,列表(Lisp 的)和对象(Smalltalk 的)就是把屎搞出来的唯一存在,Perl 却走了截然相反的路子。Larry 说:Unix 和字符串是搞出屎来的唯一存在。对很多任务来说,他绝对是正确的。所以 Perl 绝对是 Unix 系统管理和字符串处理的史上最强语言,除了一个,刚出来的一个,从哥斯拉(电影哥斯拉看过没)之地出来的一个。我一会儿会讲到那一个。可惜,Larry 太太太太在意 Unix 系统管理和字符串处理以致他压根忘了列表和对象,等他明白过来想改正的时候已经晚了。实际上,在 Perl 早期的…好吧,对鲸鱼肠子我实在不想用“设计”这个词,就说生命周期中吧,他犯的几个关键错误让把列表和对象加进来变得如此尴尬,以致 Perl 已经进化成一个真正的 Rube Goldberg 机器,至少当你想在 Perl 里用列表和对象的时候。(Rube Goldberg 是一漫画家,常画一些很复杂的机器,但只完成简单的工作,比如一个小球滚过很多关卡,最后把门打开。译者注)。列表和对象也他妈的是很重要的,Larry!(farging 应该是作者不想说 fucking 那么直白,译者注)Perl 没法表达列表因为 Larry 一早犯了一个悲剧性的愚蠢的错误,把列表全抹平。于是(1, 2, (3, 4))魔术般地变成(1, 2, 3, 4)。不是说你会想让它这样工作,而是 Larry 刚好那天在搞一个这样会更方便的问题。于是 Perl 的数据结构从此就变得爆炸了的鲸鱼了。今天你看 Perl 的书,小教程或 PPT 的时候,不花三分之一的时间在“引用”上是不可能的。这就是 Larry 可怜的,坏了的,Goldberg (漫画家,想起来没? 译者注)式的对他那抹平列表的疯狂错误的解决方案。但是 Perl 的市场宣传做得那么难以置信地好以致它让你觉得这是你身上发生过的最好的东西。你可以对任何东西取它的引用。这很有趣!闻起来也很香(说肠子呢,译者注,呵呵)!Perl 不能支持面向对象编程因为 Larry 压根不相信这玩意儿。这可能没什么大不了; 我也不是很确定我是不是信这个 OOP。但是那么为啥他又要试着把对象加进 Perl 呢? Perl 的面向对象是个半成品,且在 Perl 社区里没多少人重视。它就是不像字符串处理或 Unix 集成那样充满灵感。当然了,Perl 还有其他很多怪怪的特性。比如它的“上下文”,这是 Larry 要有N个变量名字空间的喜剧式决定的一个恐怖片式的产物。这些空间由 sigil 来区分(就是 Perl 里变量名前面的‘$’,‘@’,‘%’字符),看着像是从 shell 脚本里拷贝来的。在 Perl 里,所有的运算符,所有的函数,所有的操作其行为都是六取一的随机的,取决于当前的“上下文”。没有一些规则或助记法能帮你搞定这些特定操作在特定上下文里的特定行为。你得把它们全记在脑子里。想要个例子? 这儿有一个:在一个值量(scalar,对应于 vector,向量)上下文里对一个哈希取值你得到一个字符串,里面是个分数,分子是目前已分配的键,分母是总共有多少个桶。鲸鱼肠子,我告诉你。但就像我说的—直到最近,没啥能像 Perl 那样把屎搞定。Ruby每过 15 年左右,一门语言就会被更好的代替。C被 C++ 代替,至少对大应用开发而又需要性能和数据类型的人们来说。C++ 被 Java 代替,而 Java 无疑在 7 年后又会被更好的东西代替—好吧,我说的是完全代替 C++ 的 7 年后,这到目前为止还没有发生,主要是因为微软能在 Java 霸占桌面系统之前狙击它。但是在服务器上的应用而言,C++ 的阵地已经慢慢让给 Java 了。Perl 有一天也会消逝。那是因为一门新的语言 Ruby 刚刚终于被翻译成英语了。没错,它是在日本发明的,这么多地儿,没想到日本人搞出来了,还以为他们只是硬件和制造上占有名气,而不是他们的软件业,所以大家都跟你一样惊奇。为什么呢,大家可能都在想。但是我认为这都是跟打字有关。我根本不能想象他们以前能打字打得足够快,英文字母只有 26 个,他们却有上万个字。但是 Emacs 几年前支持多字节字符了,所以我猜他们现在打字速度他妈的快多了。(所以能搞出 Ruby 来了,译者猜作者是这个意思) (是的,他们也用 Emacs —— 事实上日本人负责了 Emacs 多字节支持的大部工作,而且搞得坚不可摧。)不管怎么样,Ruby 从 Perl 那里偷师了所有的好东西; 实际上,Matz, Ruby 的作者(Yukihiro Matsumoto,如果我没记错的话,但是他外号“Matz”),觉得他从 Perl 那里偷的有点太多了,他的鞋上也粘了些鲸鱼肠子。但是只是一丢丢。最重要的是,Ruby 拿来了 Perl 的串处理和 Unix 集成,一点没改,就是说语法都是一样的,于是乎啥也不说了,你就拥有了 Perl 最好的那部分。这是个不错的开局,特别是如果你不把 Perl 剩下的东西也拿进来的话。但是之后 Matz 还从 Lisp 那里拿来的最好的列表处理,Smalltalk 和其他语言那里拿来了最好的面向对象,CLU 那里拿来了最好的迭代器,以及基本上是每个人每个事的最好的东西。而他让这些东西全部都跑起来,跑得那么顺,你都不会注意到这些东西在那儿。我比其他任何语言都快就学会了 Ruby,我总共会三十到四十门语言; 而我花了大概三天时间就能用 Ruby 比 Perl 还流畅地工作了,当了八年的 Perl 黑客后。这些东西是这么的和谐你都能自己猜它们是怎么工作的,而且大多数时候你都能猜对。漂亮。有趣。靠谱。如果把语言比成自行车,那么 AWK 就是一辆粉系的儿童自行车,前面有个白色小框,还插块小旗,Perl 就是沙滩车(还记得那有多酷吧? 唉。),而 Ruby 则是一辆七千五美金的钛合金山地自行车。从 Perl 飞跃到 Ruby 意义不下于从 C++ 到 Java 的飞跃。却没有任何缺陷,因为 Ruby 几乎是 Perl 功能的一个超集,而 Java 却拿掉了一些人们想要的东西,且没有真正的提供一个替代品。下次我会写更多关于 Ruby 的东西。我先需要灵感。去读读 Lucky Stiff 的(poignant) guide to Ruby 吧。那本书是一本有灵感的书。真的,读一下。超赞。我不理解产生它的那种头脑,但它很有趣,很犀利,且全是关于 Ruby 的。好像。你会看到的。Python啊,Python 怎么说呢,一个不错的语言,这么多年来一直旁边在等待它的机会? Python 社区很长时间以来是那些勇敢地吞下红药片从 Perl 骇客帝国中醒来的人的避难营。啊,有点像 Smalltalk 的人们,他们永远在等待替代C++,没想到半路杀出 Java 一下把它们操翻了,漂亮地,永久地。哎哟。Ruby 正在对 Python 做着同样的事,现在,今天。可能会在一夜之间吧。Python 本来可以统治世界,可惜它有两个致命缺陷:空格,和冷淡。空格很简单,就是说 Python 是用缩进来表达代码块之间的嵌套。它强制你必须按一定格式把所有的东西缩进,他们这样做是为了让所有人写的代码看上去一样。不料蛮多程序员讨厌这点,因为他们觉得自己的自由被拿走了; 感觉就像 Python 侵犯了宪法赋予他们的可以随便缩进格式和全写在一行上的权利。Python 的作者,Guido Van Rossum,也在早期犯过一些很傻的技术错误 —— 没有像 Larry 的失误那么严重,但是还是有几个。比如,最早 Python 没有字面变量范围,但它同时也没有动态变量范围,而动态变量范围可能会有它一些问题,但它还是有用的。Python 却没有这些,只有全局的和本地(函数)的两种范围。所以即使它是一个真正的 OO 系统,类甚至不能访问它们自己的动态成员变量。你必须给成员函数传“self”参数,一大堆 self 参数很快就会把你搞疯掉,即使你不在意空格问题。等等之类。但在我看来,Python 不行其实是因为冷淡。这阻止了它成为首选脚本语言,或者首选一切语言。靠,人们现在还在用 Tcl 作嵌入解释执行器,虽然 Python 比 Tcl 好得不要太多 —— 除了,我说,这个冷淡问题。(此处开始我不知所云。呵呵,这样吧,把原文贴在最后面。译者注)What’s the frost thing, you ask? Well, I used to have a lot of exceptionally mean stuff written here, but since Python’s actually quite pleasant to work with (if you can overlook its warts), I no longer think it’s such a great idea to bash on Pythonistas。The “frost thing” is just that they used to have a tendency to be a bit, well, frosty。Why?Because they were so tired of hearing about the whitespace thing!I think that’s why Python never reached Perl’s level of popularity, but maybe I’m just imagining things。CodaThat was the ADJ article I really wanted to write。Or at least something like it。For some reason, though, my true feelings only seem to come out during insomniac attacks between 3am and 6am。Time for bed!2 hours ’til my next meeting。注1,Eric 告诉我当时几乎全是 Jamie Zawinski,当他们在 Lucid 工作的时候。注2,我写了这个之后很多人告诉我 Paul Graham 是用 VI 的,想不到。注3,为了有据可查,我个人根本不介意空格问题。我认为因为这个而不喜欢 Python 是很傻的。我只是说有一堆比例让人惊奇的其他工程师讨厌空格问题。欢迎加入本站公开兴趣群软件开发技术群兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流QQ群:源代码研究群兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转HadoopQQ群:&
上一篇:下一篇:

我要回帖

更多关于 qq浏览器是不是ie内核 的文章

 

随机推荐