当前位置: 首页 > 科技观察

编程语言圣经第一卷

时间:2023-03-23 10:50:48 科技观察

Day0x00在古代,人类主要使用二进制编程,人类需要记住数据在内存中的地址才能读写。比如取出地址0x3A6F27的值和地址0x3A6F39的值,然后将两个值相加。冗长、难以记住的地址对人类来说是一种痛苦。仁慈的上帝要拯救人类脱离苦难。他说:必有变数!用变量来表示内存中的值。人类不解:地址呢?上帝给了人类一个宝贝,叫做编译器:“别担心,编译器把它背后的脏活都做了,这样写代码就容易多了!”x+y人类非常幸福。0x01天,内存中有一条数据,它的值为01100111011011000110111101100010A部落的人读出来,说是32位整数1735159650B部落的人也读出来,说这是一个浮点数1.116533*10^24C部落的人说A部落和B部落都不对。这是一条机器指令,三个部落争论不休。上帝安慰人类说:你们都很好!信息=位+上下文。这串二进制代表什么样的信息,需要上下文才能理解。因此,必须有一个数据类型!诠释x;//表示x指向一个整数floaty;//表示y指向一个浮点数人类很高兴,为了自己的方便,创造了byte,boolean,short,char,long等各种数据类型。有一小部分人真的很怀念那个可以直接操纵记忆的日子,那是自由自在的生活!仁慈的上帝决定满足他们:一定要有指点!整数*x;//x是整型指针,可以作为寻址操作。x++;//操作的是地址,不是值x--;这些人行为不检点,经常乱搞内存,所以老天爷严格限制了指针的使用,只有C、C++等少数语言可以使用指针来操作内存。其他语言不能用!Day0x02人类很快发现这些基本数据类型在编程中远远不够。比如你要表达一本书的信息,需要名称、作者、书号、价格、出版日期等一堆数据,需要几种数据类型的组合。上帝告诉人类:要想拥有自定义数据类型,就要结合基本数据类型!typeDate{intyear;intmonth;intday;}typeBook{Stringname;Stringauthor;floatprice;Datepublish_date}人类很高兴,为了自己的使用,他们写了Student,Company,Department,Employee,Manager等多种数据类型.已创建。不满足的人类在day0x03发现程序经常需要对这些自定义类型进行操作,这些操作被称为函数。功能和类型是分开的,很不方便。大神说:要有抽象数据类型,把类型和函数放在一起typeStack{//Dataintsize;int[]values;...//Operationvoidpush(intvalue);intpop();intsize();}Human说:“天哪,这是一个抽象数据类型,只有接口,没有具体的实现。”上帝说:“哦,懒惰的人类,不会思考的人类,我再给你一个东西:类,在类中写代码实现它。”人类很高兴,把数据和函数放在一起,实现了很多“类”,List、Stack、Queue、Tree……在0x04天,人类发现了一个类,定义好之后,改起来不容易使用,例如:classStack{intsize;int[]values;voidpush(intvalue){...}intpop(){....}}这个stack只支持push和pop整数,人类想用float类型,string类型,甚至Student类型,Company类型stack,还得重写一套代码,这真烦人!人类说:天啊,我们能不能对一个已有的类改一点点?上帝说:当然必须要有生成类的类,也就是templates.classStack{intsize;T[]values;voidpush(Tvalue){...}Tpop(){....}}T可以int,String,Student.....是一个改变的东西。所以,人类可以使用Stacks,Stack,Stack之类的类。。。上帝告诉人类两种实现模板的方法,一种是擦除法:不管你是Stack还是Stack,编译之后,都变成了Stackadded的时候,类型T变为对象。classStack{intsize;Object[]values;...}另一种是扩容方式,每种类型自动生成一个新类Stack_int,Stack_String,Stack_Student...有一个叫Java的部落,使用了擦除法,一个叫C++用的是inflation的方式,这些部落天天吵架,这让老天爷很头疼。第0x05天有一群特殊的人讨厌在代码中编写类型。他们说:一个变量,它在运行时指向什么类型,它是什么类型,为什么要写在代码里?多麻烦啊,能不能这样://现在x是整数类型x=5;//x的类型变了,现在是字符串类型x="helloworld"神来救救他们了:要有动态类型,不需要声明变量的类型,变量的类型是在运行时确定的。那些支持类型声明的人非常生气。他们称自己为静态类型,对动态类型发起强大攻势:编译器找不到错误,IDE中代码提示薄弱,代码不易阅读,动态酷炫,重构火葬场……动态类型的人攻击静态类型很麻烦,代码行多,开发慢,还有模板之类的无用的东西。于是拥有静态类型的人开始使用类型推导。原来的代码是这样写的:InternationalCustomerOrderProcessor又臭又长。有了类型推导,现在可以这样写,方便多了:varorderProcessor=createInternationalOrderProcessor(customer,order);支持动态类型的也不甘示弱,开始在自己的代码中使用类型注解:defgreeting(name:str)->str:return'Hello'+name这个函数的入参标记为字符串(str),并且返回值也标记为字符串。静态类型的人嘲笑类型注释只用在像IDE这样的开发工具中,而不是在运行时。Day0x06人类的斗争越来越激烈。上帝无法阻止它。他头疼,所以他决定休息一天。这就是星期天的由来。【本文为专栏作家“刘欣”原创稿件,转载请通过作者微信获取授权公众号coderising】点此查看该作者更多好文