主要是名词解释和一些基本的概念说明,包含:
- 算法和数据
- 数据为什么要有类型
- 变量、变量名和值
- 编译期、运行期
- 强类型和弱类型
- 进制、进制转换
- 编码
程序、算法和数据
程序是为了解决人类的各种问题而被设计出来的,这些问题可以是通信、视频、计算、也可以是听歌、玩游戏或者修改一张照片等等。
程序开发就是使用编程语言,通过逻辑的设计编写出能够解决需求的软件的过程。
图灵奖的获得者:Pascal之父——Nicklaus Wirth 提出了一个著名公式:
程序 = 算法 + 数据
问题来了,什么是算法,什么是数据 ?
下面以蛋炒饭为例,在下厨房APP上先找一个蛋炒饭的菜谱:
这里应该有菜谱的图片,但是现在图片无法上传,引用一个网址 https://home.meishichina.com/recipe-10897.html,之后文件可以上传再修改回来。
可以看到需要的东西很多,比如鸡蛋、米饭、盐、油、锅、铲子、碗… 这些就是数据。
菜谱对于怎么做有详细的介绍:
- 做什么什么
- 做什么什么
做蛋炒饭的步骤就是算法。
生活中,我们几乎随时都是在解决各种不同的问题,比如中午吃什么,到哪儿吃,怎么过去,都需要我们进行各种比较。如果把这些内容以代码的方式呈现出来,那就是根据已经知道的数据和解决思路,设计程序的执行过程。
数据类型
看字面意思也能猜到「数据类型」就是把数据按照不同的类型划分了。问题是为什么要这么做,和编程有什么关系呢 ?
还是以蛋炒饭为例(本喵喜欢吃),在食谱中可以看到,食谱中将所需的所有东西进行了分类,比如
- 食材
- 厨具
- 餐具
为啥这么分类 ?当然是为了方便记忆,方便使用么,其实就是打标签。人脑的原则就是怎么简单省事消耗小就怎么来,所以贴标签就称为了人类认知事物的本能,比如 90后、斜杠青年、果粉、有车一族等等。
编程中也会有各种各样的数据,为了能够方便的操作数据,编程语言会规定可以使用的数据类型。
常见的数据类型
对于编程,数据类型不可能会脱离人类日常理解的范畴,所以常见的是:
- 数字(主要是整形和浮点型)
- 字符
- 字符串(多个字符组合起来就是字符串,把字符串起来,很生动。翻译的人真是天才)
- 布尔(真或者假)
变量、变量名和值
变量、变量名和值是编程无法绕过去的概念。
值
值就是数据,我们使用任何软件,其本质都是在操作数据。比如用微信给你喜欢的人发送一条消息,这条消息就是数据。
变量和变量名
假设你家里有很多鞋子,比如100双,四季各有25双。鞋子不用的时候就放到了鞋盒里面,等换季的时候再拿出来穿。此时出现了一个问题,你记不清哪个鞋盒里面放了什么鞋子,只好一个一个鞋盒打开找你想要穿的那双鞋。
为了方便查找,细心的人会在鞋盒上面写上鞋子的名称,或者干脆拍个照片贴上去,这样查找起来不就方便多了么。
生活 | 编程 | 作用 |
---|---|---|
鞋盒 | 变量 | 知道需要操作的值(生活案例就是知道哪个鞋盒中有你要穿的鞋子) |
鞋盒上的标签/照片 | 变量名 | 通过变量名才能定位变量 |
鞋子 | 值 | 变量也好,变量名也好,最终都是帮我们找到要用的东西(鞋子或者数据) |
赋值
编程的最终目的还是要通过代码来操作数据,按照上面的说明进行联系,编程语言就需要有一种方式能够将变量和值关联起来,这种方式我们成为赋值,很多语言都是使用等号来表示这种操作。比如下面JS的代码:
var name = '张三';
编译期与运行期
编程语言分类的时候有很多方式,其中一种分类就是编译期编程语言与运行期编程语言。2者的区别非常简单,现在你写了一篇非常棒的文章,需要翻译为英语。有两种方案:
方案一:找一个翻译质量高的翻译人员,一次翻译完成。之后哪儿要用就把翻译的版本拿去用即可。
方案二:找一个即时翻译人员,以后哪儿要用方案,翻译人员就开始同步翻译。
两种方案各有优缺点,方案一的效率高,翻译一次以后就不用再次翻译,缺点是如果内容发生变化,还需要重新翻译一次。方案二优点在于灵活,毕竟是随时翻译么,缺点也非常明显,就是效率问题。
有的编程语言会结合2种方案,在不同时期内使用不同的解决方案。
强类型与弱类型
强类型和弱类型也是可以用于判断编程语言的方式,区别就是创建变量的时候,要不要直接确定变量的类型。看下面的代码
这种在创建变量时就需要指定变量类型的语言就是强类型编程语言,String就是变量 message的类型
String message = "你好,世界";
JS 则是变量声明时不需要说明变量类型,程序运行时用到了再确认类型的弱类型编程语言。var 只是说明 message是一个变量,但没有说明类型
var message = '你好,世界';
进制与进制转换
不管是什么编程语言写出来的程序,最终都需要翻译为 0 和1 这种二进制供计算机执行,因为计算机只认二进制。问题对于人类,十进制才是熟悉高效的计算方式,那么用十进制写出来的程序代码让计算机执行的时候,就需要转为二进制。这个过程就是进制转换。
其实计算机常用的进制有:
- 二进制
- 八进制
- 十进制
- 十六进制
编码
计算机自美国人发明之后,最基本的就是进行文字的输入与输出。但是计算机只认0和1,是二进制,想要正确保存或者读取英语就需要将内容进行转换,这个过程称为编码。
计算机存储的最小单位是字节,而一个字节是八位,一共可以组合出256(2的8次方)种不同的状态。从 0 开始到 255 结束。因为现代计算机是在美国诞生的,美国人根据英语在计算机上进行编码,占用了0127位,128255便空着。这个方案叫做 :American Standard Code for Information Interchange,美国信息互换标准代码。
当计算机在全世界使用的时候,各个国家都需要显示自己国家的文字,就从128位之后开始增加自己语言的编码,这被称”扩展字符集”。但是原有的编号方法,已经再也放不下更多的编码对于中国来说,常用汉字6000多个,于是将127之后的编码重新编写。前127字节和原来的意义相同,后面的字节用于显示汉字、数学符号、罗马希腊的字母、日文的假名。这套编码称为 GB2312
但是 中国的汉字实在是太多了,GB2312无法满足需要,于是GBK 就诞生了GBK 在GB2312的基础上,同时又增加了近20000个新的汉字(包括繁体字)和符号。随着中国的经济发展,少数民族也开始使用电脑了,于是我们在GBK 的基础上,又增加了几千个新的少数民族的字,这就是 GB18030 编码到此为止,一个汉字在程序中需要占用2个字节!
每个国家都像中国这样搞了一套自己国家的编码标准,但是相互都不兼容。如果日本的电脑想正确显示中文就需要安装一个「汉字系统」。如果将一段中文用GB18030编码写入电脑,用日文的编码读取,因为找不到对应的编码排列组合,就会出现奇怪的字符,但是谁都看不懂~~ , 这就是「乱码」。
为了能够让全世界的计算机都能相互正常处理其他国家的文字。一个国际组织站了出来,这就是 ISO (国际标谁化组织)ISO采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “UNICODE”
UNICODE 开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,这种大气的方案在保存英文文本时会多浪费一倍的空间,英文只用到8位。UNICODE 是用两个字节来表示为一个字符,他总共可以组合出65535不同的字符,这大概已经可以覆盖世界上所有文化的符号。
伴随 UNICODE 来到时,一起到来的还有计算机网络的兴起,UNICODE 如何在网络上传输也是一个必须考虑的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了UTF8 就是每次个位传输数据,而 就是每次个位,只不过为了传输时的可靠性,从到 时并不是直接的对应,而是要过一些算法和规则来转换。
总结:
国内常用的编码:
- ASCII
- GB2312
- GBK
- GB18030
- UTF8
- UTF16
乱码:数据保存与读取使用了不同的编码,而无法正确识别。
上一章 01 学习前注意事项和学习方式
下一章 03 Java基础阶段学习说明