编程基础
1.为什么要学习编程基础
因为你首先是一个合格的程序员,然后才是一个合格的前端工程师
前提:一个程序员必须知道
- 硬件和软件:计算机运行原理,参考书籍《编码》(理解难度面向0基础同学更友好),以及大学计算机相关课程,例如《计算机组成原理》,《计算机网络》等(最好有老师带,自学有一定难度!)。
- 最大的软件:操作系统
- 自己写软甲:数据结构和算法
- 多人写软件:软件工程
2. 前端工程师必知(自上而下)
- 服务器 :不论HTML/CSS,还是JS,数据来源都在服务器中。
- 浏览器 :HTML/CSS/JS 这三种前端主要语言都是运行在浏览器之上。
- 操作系统:浏览器,不仅仅是浏览器,所有的软件都是运行在操作系统之上。
- 硬件:操作系统作为最大的软件,运行在硬件之上。
3.常识:计算机如何存储0和1?
3.1 为什么计算机只能存储0和1?
这其中涉及到很多硬件知识,简单的来说,因为电脑是集成电路,内存微观上是无数小开关,或者是小电池,而“0”和“1”正好分别代表“开”和“关”(或者是“通电”和“不通电”),就好像家里的电灯开关只有开和关一样。所以,电脑的本质决定了它必须是二进制,只能存储0和1.
3.2 计算机是如何存储0和1?
计算机存储过程,其实就是给小电池不断充电的过程,因为小电池自身存在耗电(好比家里的南孚电池放久了不用自己会消耗电量一样)。
那么,既然小电池自己会耗电,又要不断充电,如何判断它是的状态是0和1呢?
规则是:当小电池电量大于50%,为1;电量小于50%,则为0。因为计算机的充电速率是纳秒级(10^-9), 即一次充电过程为:刷新 1次/10^-9s。
4.内存如何存储数字?
上面我们说,计算机已经解决了如何存储0和1的问题,那么,我们如何存储其他数字呢?
方法是将所有数字转化为0和1的组合去进行存储,这就是需要探究十进制如何转化为二进制的问题。
- 举个例子:
4.1 存储整数
如上:37 在十进制上以10为底的方式得到结果过程:
37(10)
=3\*10^1+7\*10^0
=30+7
同理,37(10)也可写作以2为底的方式得到:
37(10)
=1\*2^5 + 0\*2^4 + 0\*2^3 + 1\*2^2 + 0\*2^1 + 1\*2^0
=1 0 0 1 0 1
4.2 存储小数
同理,对于小数也是一样的道理,以1/10为底,过程为:
0.75(10)
=7\*1/10 + 5\*1/10^2
=0.7+0.05
那么,以1/2为底,过程为:
0.75(10)
=1\*1/2 + 1\*1/2^2
=0.5+0.25
问题:如何存储负数和小数点呢?
参考资料如下:
5.如何存储字符?
方法:对所有字符进行编号,首先以十进制的方式表示每个字符,最后都转化为二进制的方式进行存储。参考:ASCII美国信息交换标准代码
如图:
图片如图:如果你想存储字母a,那么就存储97(10),对应进制转换为: a -> 97(10) -> 0110 0001(2) -> 61(16)
如果你想存储数字1,对应进制转换为:1-> 49(10) -> 0011 0001 -> 31(16)
以上就是存储键盘上简单字母的方法。
6.如何存储中文?
参考资料:GB 2312
-
在国内使用字符为汉字,我们便在ASCII码的基础上进行扩充。GB 2312收录了6163个汉字,同时收录了包括拉丁字母,希腊字母,日文平假名及片假名字母、俄语西里尔字母在内的682个字符。
-
缺点:因为GB2312主要为常用字,不能满足人们的需求。后来,为了存储生僻字、繁体字、日语、朝鲜语等,微软推出了GBK字符集
7.如何存储所有字符?
-
为了将所有字符都能够在电脑上显示,然而不同的字符集考虑到兼容性问题,Unicode联盟做了这样一件事,他们将全世界的文字都编在一张表中。截止到2016年6月,累计128231个字符。(参考资料:Unicode)
-
缺点:因为 128231>216,所以Unicode必须用232来存储。但是,也带来一些问题:
原来使用ASCII字符编码进行存储时,只需要1个字节即8位存储就足够,但是使用Unicode却需要4个字节即32位来存储;
原来存储一个中文字符需要2个字节即16位,使用Unicode后需要4个字节32位存储。这样大大的浪费了存储空间。
图片
7.2 UTF-8的出现(UTF-8)
因为采用Unicode存储字符的方式大大的浪费了存储空间,为了节省字符存储消耗,使用UTF-8的方式进行优化,注意,这里是对Unicode存储方式进行优化,而没有改变原有的字符编码。
规定:对于字母例如字母 “a”,依然采用原来的一个字节存储,而不是4个字节进行存储,这样就节省了3个字节的空间;
而对于汉字,例如汉字 “你” ,依然使用原来的2个字节进行存储,但是,在上面的一大堆 0 和 1 中,计算机是无法识别哪一段表示字母,哪一段表示汉字,所以,又拿出一个字节进行区分;
例如 图中汉字 “你”:原本2个字节存储为:01001111 01100000 ,而转换为3个字符存储,表示为:11100100 10111101 10100000,第一个字节的前缀 1110表示这个字符长度为3,后面第2和第3个字符的前缀都为10 是为了和前面所标志的一致,而实际上这个字符的组成,是从第一个字节的后4位、第二个字节的后6位,第三个字节的后6位所组成。
所以,计算机在读取的过程中,当它读到 0110 0001 时,它发现开头没有1,那么就知道这是一个单字节;当它读到 11100100 10111101 10100000,发现前面有3个1,那么它就知道这是由3个字节组成,然后它就自动去读取第一个字节的后4位、第二个字节的后6位,第三个字节的后6位,拼凑成2个完整的字节,表示汉字“你”
- 切记: UTF-8 只是一种编码方式,而不是字符集!
8.为什么很多中文软件喜欢使用GBK而不是UTF-8?
Unicode和GBk发展史之前我们说,Unicode字符集使用UTF-8的编码方式更节省空间,而大家却为什么不用呢?考虑到两方面因素:
1.发展史:当时在国内发明GB 2312的早几年,微软的GBK还没有出现,大家习惯了使用 GB 2312 和 GB13000 ,而新出来的Unicode虽然全球统一,但是还不完善,没有采用UTF-8的编码方式。
之后GBK的出现,对原来的GB 2312更加优化,深受大家的喜爱。而到后来2000年出现的 GB 18030-2000 ,它统一和兼容了GBK,但是90年到2000年初,代大家还是习惯性的使用GBK字符集。
2.国情:在当时的背景下,信息相对比较闭塞,并不是什么东西像如今Google一下就可找到,所以在国内90年代大部分软件使用的字符集依然是GBK。