编程语言圣经(卷一)

第0x00天

上古时期,人类主要使用二进制编程,人类需要记住数据在内存的地址,然后才能进行读写操作。

比如取出地址为0x3A6F27处的值, 以及地址为0x3A6F39处的值,然后把两个值相加起来。

冗长的、难以记忆的地址让人类痛苦不堪。

仁慈的上帝要解救人类于苦难之中,他说:要有变量 !  用变量表示内存中的值。

人类不解:“那地址呢?”

上帝送给人类一个叫编译器的宝贝:“不用担心,编译器把背后的脏活累活都干了,这样代码写起来就简单多了!”

x + y

人类非常高兴。

第0x01天

内存中有一段数据,它的值是‭0110 0111 0110 1100 0110 1111 0110 0010‬

部落A的人把它读了出来,说这是32位整数 1735159650

部落B的人也把它读了出来,说这是浮点数数 1.116533*10^24

部落C的人说部落A和部落B都不对,这是一条机器指令

三个部落争论不休。

上帝安慰人类说:你们说得都对!信息=位+上下文。这一串二进制到底表达什么信息,得有上下文才能理解。所以,要有数据类型!

int x ;   //表示x指向的是整数

float y;  //表示y指向的是浮点数

人类非常高兴, 为了方便自己的使用,他们又创造了byte ,boolean , short, char,long 等各种数据类型。

有一小撮人非常怀念以前可以直接操作内存的日子,那才是自由自在的生活!

仁慈的上帝决定满足他们:要有指针

int *x;  // x 是整形指针,可以当地址操作了。

x++;    //操作的是地址,而不是值

x--;

这帮人胡作非为,经常把内存搞得一团糟,于是上帝严格限制指针的使用,只让C, C++等少数语言可以用指针操作内存,其他语言不能使用!

第0x02天

人类很快发现,这些基本的数据类型在编程中远远不够, 比如想表达一本书的信息, 需要有名称,作者,书号,价格,出版日期等一堆数据,需要好几个数据类型组合起来才行。

上帝告诉人类说:要有自定义数据类型, 把基本的数据类型组合起来!

type Date{
    int year;
    int month;
    int day;
}

type Book{
    String name;
    String author;
    float price;
    Date publish_date
}

人类非常高兴,为了方便自己使用,他们写出了各种各样的数据类型如Student, Company, Department , Employee, Manager等等。

第0x03天

不满足的人类发现,程序中经常需要对这些自定义类型做操作,这些操作被称为函数。

函数和类型是分开的,很不方便。

上帝说:要有抽象数据类型, 把类型和函数放到一起

type Stack{
    // 数据
    int size;
    int [] values;       
    ......
    // 操作
    void push(int value);
    int pop();
    int size();
}

人类说:“亲爱的上帝, 这是抽象数据类型,只有接口,没有具体实现啊。”

上帝说:“唉,懒惰的人类,不思考的人类啊,我再送你们一个东西: 类(class), 你们在class中写代码实现吧。”

人类非常高兴,把数据和函数放到了一起,实现了很多“类”,List, Stack, Queue, Tree......

第0x04天

人类发现一个class定义好了以后,开始使用的时候就不好改变了, 比如:

class Stack{
    int size;
    int [] values;
    void push(int value){
         ......
    } 
    int pop(){
       ....
    }
}

这个栈只支持push和pop整数,人类想用float型,string型,甚至Student类型,Company类型的栈,还得重新再写一套代码,这实在是太烦人了!

人类说:仁慈的上帝,我们能不能对一个现成的类改变一点点?

上帝说:当然, 要有生成类的类,也就是模板。

class Stack<T>{
    int size;
    T [] values;
    void push(T value){
         ......
    } 
    T pop(){
       ....
    }
}

T 可以是int , String ,Student..... 是一个可以改变的东西。

于是,人类可以这么使用类了 Stack<int>  s,  Stack<String> , Stack<Student> ......

上帝告诉人类两种实现模板的方法,一种是擦除法:

不管你是Stack<String>,还是Stack<Student>,编译后统统变成了 Stack,类型T变成了Object。

class Stack{
    int size ;
    Object [] values;
    ......
}

另外一种是膨胀法,每个类型自动生成一个新的类Stack_int, Stack_String, Stack_Student......

有个叫Java的部落使用擦除法,有个叫C++的部落使用了膨胀法,这些部落每天争论不休, 让上帝头疼不已。

第0x05天

人类出现了特殊的一群人,他们很讨厌在代码中写类型。

他们说:一个变量,在运行时指向什么类型,它就是什么类型,为什么要在代码中写出来呢?多麻烦啊,能不能这样:

// 现在x是整数类型
x = 5;  
// x的类型变了,现在是字符串类型
x = "hello world"   

上帝决定把他们解救出来:要有动态类型, 你可以不声明变量的类型了,变量的类型在运行时来确定。

那些支持类型声明的人很生气,他们自称为静态类型,并且对动态类型展开了强大的攻势:编译器查不到错误,IDE中代码提示弱,代码不好阅读,动态一时爽,重构火葬场......

动态类型的人则攻击静态类型繁琐,代码行数多,开发慢,还得用模板这么无用的东西。

于是静态类型的人开始使用类型推导,原来的代码是这么写的:

InternationalCustomerOrderProcessor<AnonymousCustomer, SimpleOrder<Book>> orderProcessor = createInternationalOrderProcessor(customer, order);

又臭又长, 有了类型推导,现在可以这么写,一下子方便了很多:

var orderProcessor = createInternationalOrderProcessor(customer, order);

支持动态类型的人也不甘示弱,开始在代码中使用类型标注:

def greeting(name: str) -> str:
    return 'Hello ' + name

这个函数的输入参数被标注为是字符串(str),返回值也被标注为字符串。

静态类型的人嘲笑类型标注只在IDE等开发工具中使用,运行时就没有了。

第0x06天

人类的争斗越来越激烈,上帝无法阻止,非常头疼,他决定休息一天。

这就是星期天的来历。

后记:本文的思路受到了《代码之髓》的启发,这本书讲了编程中的基本概念,很不错,推荐阅读。

草长莺飞四月天

正是读书好时节

当当网百万自营图书

>> 每满100减50  <<

满200减100

满300减150

满400减200

以为只有这样?秉持绝不让大家多花一分钱的精神

博文视点联合当当网为码农翻身的粉丝特别送出一批“实付满200减30”优惠码

可以和满减活动叠加使用

简单的说就是可以

花170买400的书

这可是超大的优惠力度,还不赶紧上车!

怎么BUY?

结算时输入优惠码:RZ5EGF 花170就能买400

使用渠道:当当小程序或当当APP

使用时间:4/10-4/23

省省省的快乐喷泉

小程序直达购书专题

扫描小程序选择想要的书,结算页面输入优惠码:【RZ5EGF】即可享受优惠:

### 回答1: 《Go语言圣经》是由美国计算机科学家Alan A. A. Donovan和Brian W. Kernighan所撰写的一本关于Go语言的权威性的教程,而Go语言则是一门开源的编程语言,由Google在2009年发布,其受众广泛,可应用于服务器端开发、分布式系统、云计算等领域。 《Go语言圣经》中文版pdf是《Go语言圣经》这本优秀教材的中文翻译版,使得没有英文基础的读者也可以更加方便地学习和掌握Go语言。这本书采用了简单易懂的语言和生动的示例代码,它为读者提供了一个全面、系统、深入地学习Go语言的平台。 该书主要内容涵盖Go语言的基础知识、语法、并发编程、网络编程等方面,通过实例代码和详尽的解释讲解了Go语言的各个方面以及其中涉及的重要细节。阅读该书,有助于读者深入理解Go语言的思想和哲学,掌握其特有的编程思维方式,提升编程技能,为其在工作中应用Go语言打下坚实的基础。 总之,《Go语言圣经》中文版pdf是一本权威而简单易懂的Go语言教材,是Go语言学习者必不可少的参考书籍之一。 ### 回答2: Go语言圣经是由Alan A. A. Donovan和Brian W. Kernighan合写的一本Go语言教材,是入门Go语言的优秀材料之一。有很多程序员会去下载Go语言圣经中文版pdf来学习Go语言。 Go语言圣经中文版pdf涵盖了Go语言的基础、并发、网络编程等内容,是对Go语言全面系统的介绍。读者可以通过这本书来学习Go语言的语法、特性以及最佳实践,进而提高自己的编程能力。 相对于其他编程语言的教材,Go语言圣经不仅讲解了Go语言的基础语法,还着重介绍了Go语言独有的特性,并发编程的核心概念以及如何通过网络编程来实现分布式系统。这些内容对于学习Go语言的程序员来说至关重要。 总之,Go语言圣经中文版pdf是一本非常优秀的Go语言教材,它很好地解释了Go语言的基础和高级特性。对于想要学习Go语言的程序员来说,这本书是一本必读之作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值