计算机专业术语简单释义
先简单声明两个基本概念
客户端 :是为客户提供本地服务的程序,最常见的有我们电脑上的浏览器
服务器 :就是指运行着服务软件的高性能计算机或计算机系统,用以存储数据,为客户提供信息(一般也把服务软件直接称为服务器如nginx,uWSGI)
ftp/http/https/http2.0
ftp :指文本传输协议,性质类似与我们平常所见的http,但解决了http协议中传输文件较慢的特点。打开浏览器,在地址栏直接输入ftp://…..就可以进行访问相应的服务器,既可以把文件传送上存放,也可以从上面把文件下载到本地
http :指超文本传输协议,是客户端和服务器之间请求和应答的标准,二者之间采用http协议进行通信(数据传递),一般传递的数据是指超文本文档(HTML文档)
https :简单来讲就是http的安全版,是一种加密的超文本传输协议,由http+ssh(为建立在应用层和传输层基础上的安全协议)组合而成,使客户多个并发的端与服务器之间加密通信,即在通信过程中要身份认证,像一些网上银行,安全性比较重要的网站都会使用https
http2.0 :是下一代的http协议,在http基础上增加了一些新的功能,如增加加密技术,引入二进制框架(以前的http所不兼容),支持多个并发的http请求等等
TCP/IP
先简单介绍一下协议的的四个层次
连接层:负责电路的链接
网络层:负责为联网机器分配地址和传输二进制数据
传输层:负责传输文本数据
应用层:负责传输最终态数据,直接和用户打交道(常见的协议有http,ftp)
后一层协议都是以前一层为基础
TCP :是传输层的主要协议,负责发现传输问题,一有问题就发出信号,要求重新传输
IP :是网络层的主要协议,负责给每台联网机器规定一个IP地址
TCP/IP都是英特网上基础的协议
gzip压缩
gzip压缩 :用于压缩文件,通常我们在Linux系统下见到的以gz为后缀名的文件就是gzip格式的,它是一种文件压缩格式。在Linux下可以直接用gzip命令来压缩文件(或解压文件),如 gzip test.tar 就可以把test.tar文件压缩成test.tar.gz
nginx/uwsgi/cgi/php-fpm/fastcgi
nginx :是一款轻量级的http服务器,反向代理器,说它是一个服务器,更准确的说它应该是一款服务程序(由C语言编写),运行在服务器上。我们自己的电脑运行nginx,可以作为一个简单的服务器
uWSGI :区别WSGI和uwsgi,WSGI和uwsgi都是一种协议,uWSGI是实现了这两种协议的web服务器,性质类同nginx,是运行在服务器上的一款服务软件,可直接称为服务器,一般与nginx配合使用,因为nginx有很好的静态文件处理能力,将动态内容发给uWSGI,二者结合可以达到很好的服务效果
cgi :cgi是一种协议,规定服务器与cgi程序程序之间的通信(即应该传那些东西,那些东西不传),区别cgi与cgi程序,cgi是协议,而cgi程序是实体(也就是程序),cgi程序一般是指php解释器(如php-cgi)。
fastcgi :fastcgi也是一种协议,用于对进程管理,提高cgi程序(php-cgi)的性能。php-cgi只是一个cgi程序,并不会进程管理,所以就要一些调节php-cgi的进程的程序
php-fpm :其实php-fpm就是上面所说的那些调节php-cgi进程的管理器之一,即它是cgi程序进程管理器,实现了fastcgi协议
高阶函数/函数柯里化
高阶函数 :函数想必大家都知道,在C语言中经常用到这一概念,那什么是高阶函数呢?只要一个函数的参数能够接收函数或者函数能够返回函数,我们就称这样的函数为高阶函数
函数柯里化 :就是把接收多个参数的函数变换成为接收单一参数的函数的过程,这个接收单一参数的函数返回值为一个新函数,这个新函数又可以接收原函数余下的参数。举个例子(JavaScript)
function add(n)
{ return function(m)
{ rerurn m+n
}
add1=add(2)
print(add1(1))
输出的结果就是3
函数式编程
函数式编程 :函数式编程,如同面向过程,面向对象的编程方式一样,是一种编程思想和编程模式,模块化是成功编程的关键,而函数式编程可以极大地改进模块化。函数式编程有很多特性,支持高阶函数,用递归作为控制流程的机制
前置条件/后置条件/循环不变量/代码正确性检验
前置条件 :前置条件就是把条件放在前面,先检查,如果条件不符合,则后面的程序就没有机会执行(类似while模型)
后置条件 :后置条件是把条件放在后面,程序至少要被执行一次,然后再检查条件是否通过,如果通过则接着执行,反之就不执行(类似do…while模型)
循环不变量 :顾名思义,就是要在循环中保持不变的量,一个循环不变量是指在循环开始和循环中每一次迭代时永远为真的量,可以帮助我们在写循环时不至因细节而出问题,用于检验循环的正确性。代码实例可参见http://www.douban.com/group/topic/11516372/
代码正确性检验 :在写代码的过程中出现错误是在所难免的,代码正确性检验就是用来测试程序,将测试过程中的结果和预期结果比较,分析出错原因,然后加以改正
hash函数/曼哈希/加密算法
hash函数 :是一个将一种任意长度的消息压缩到到某一固定长度的消息的函数,主要应用于信息加密,他把一些不同长度的信息转化成杂乱的128位的编码
慢哈希 :让哈希函数变慢,使那些想破解的人认为破解这个没有多大意义
加密算法 : 是一种把原来是明文的文件或数据处理成一种不可读的代码
线程/进程/协程/并行算法
进程 :简单来讲就是某个独立功能的程序的一次动态执行过程,多个进程可以同时包含同一个程序,程序执行完毕,进程就消亡了,进程的组成包括正在执行的程序,以及其对应的数据等,进程是是系统进行资源分配和调度的基本单位
线程 :线程是进程的子集,一个进程可以包含多个线程,每一个线程都共享进程中的资源,所以线程占用的资源比较少。可以把线程理解为轻量级的进程
协程 :进程和线程都是由系统控制的,而协程是用户层面的,有用户自己承担起调度责任,这样就避免了无意义的调度,但同时也失去了使用CPU的能力
并行算法 :是把一个简单的问题分成若干个相互独立的自问题,然后使用多个机器去处理,同时求解每一个子问题,最终获得原问题的解,这种算法可以提高运算速度
文件系统
文件系统 :文件系统是操作系统中专门负责管理和存储文件信息的软件机构,我们平时对文件的修改,删除,移动等操作都属于文件系统的范畴。文件系统的体系结构可用树状图表示
html/css/js
这是一套做网页,前端设计的标准套装
html :超文本标记语言,所谓超文本,就是指页面内不仅仅只有纯文本,还有图片,链接,视频,音乐等。平时在浏览器上浏览的网页基本上都是用html所写
css :css是用来美化页面的,控制页面的布局,比如一段文字应该放在页面的什么位置,用什么颜色显示等。
js :JavaScript的简写,是一种增强表现力的脚本语言,可以为html页面增加许多动态性效果,如在一个网页上点击“登录”,页面就会弹出一个登录的小窗口
bcd/mit licenses
bcd :BCD码,也称二码十进数,是一种二进制的数字编码形式,这种编码形式能够是二进制和十进制数得以快速的转换。它常用于会计系统
mit licenses :是一种非常宽松的许可证,使用该许可证的软件有以下权限:免费,任何人使用,经营这种软件不受任何限制,包括修改,出版,发行等
cocoa
cocoa :是mac os x系统上一种应用程序环境(运行环境和开发环境),和Java一样
mvc模式
mvc :mvc是一种框架模式,m代表模型(是程序的核心,处理核心程序),v代表视图(显示数据),c代表控制器(处理输入,调用模型),这种模式使这三者分离开来,有利于开发人员专注于其中一个方面,可以对这三块同时进行开发
装饰者/装饰器模式
装饰者 :可以动态地给一个对象添加一些额外的功能,与继承类似(当有些问题不适合用子类来进行拓展的话可以考虑使用装饰者),但比继承中生成子类的方式要更加灵活,更加方便,它避免了继承体系的臃肿。
装饰器模式 :就是使用装饰者为对象添加新功能的模式,在为一个对象添加新功能时有有三种方式:直接修改对象,用子类来拓展,使用对象组合,装饰器模式就是基于第三种方式,很灵活地为对象添加新功能
socket/websocket
socket :通常称之为套接字,可以理解把它为是一种“打开——读/写——关闭”模式的实现,在服务器与客户端通讯时,服务器与客户端各自创建一个“文件”(即创建一个socket),在建立连接后,可以向自己建立的文件中写入内容,供对方读取,通讯完毕则关闭文件
websocket :是html5中的一种新协议,他改变了服务器被动接受请求的局面,以前都是服务器在接收到请求后,才可以向客户端发送数据,而websocket协议中服务器可以主动地向客户端发送数据,实现了服务器与客户端之间的双工通讯
opengl/opencv
opengl :是一个开放的图形库,是跨平台,跨语言的专业图形接口。例如在vc++ 6.0中使用OpenGL,我们要把OpenGL所对应的库链接到工程中,在编写程序时包含相应的头文件,然后调用其中的函数,这样就实现了对OpenGL的使用
opencv :如同opengl一样,opencv也是一个开源的库,他是一个视觉库,opengl专注于图形处理,而opencv主要提供音频方面的处理,比如降低噪音,目标的识别等
多态
多态 :在面向对象的编程语言(c++,Java)中简单来说,多态是指同一操作用于不同的对象,可以有不同的解释,产生不同的效果。如Java中多态就体现在方法的重载和重写上。多态的优点是可以降低代码的耦合度
像素/长度/px/分辨率/ppi
像素 :即图像元素,是构成图像最基本的单元
长度 :长度是一维空间的度量,指空间的尺度
分辨率 :单位尺寸上的像素点数目的多少就称为分辨率,比如,有一英寸宽一英寸的图片,水平分成30条,垂直分成40行,那么这幅图片共有1200个 像素点,则分辨率为1200
ppi :ppi表示每英寸所拥有的像素数目,是图像的分辨率的单位
编码原理/代码运行原理
编码原理 :将高级程序设计语言(c,c++,Java等)变换成计算机能够识别的机器语言,以便计算机进行处理,如用C语言编写的程序文件(.c),经过编译后得到.obj文件,里面是机器代码,计算机就可以识别
半加器/全加器/提前进位加法器
半加器/全加器 :半加器和全加器是算术电路中的基本单元,他们是完成一位二进制数相加的一种逻辑电路,半加器不考虑低位来的进位,只计算两个二进制数相加,输出本位和和进位;全加器能进行加数、被加数和低位来的进位信号相加,输出本位和和进位信号;也就是说半加器两个输入,两个输出,全加器三个输入,两个输出
提前进位加法器 :提前进位加法器,是对普通全加器进行改善而设计成的并行加法器,全加器在串联时互相进位会产生延迟,提前进位加法器通过增加一个逻辑电路改变了全加器的这一缺点
mysql/mongodb/sql/nosql
mysql :是一个关系型数据库,他将数据保存在不同的表中,而不是将所有的数据放在一个大仓库内,这样就提高了灵活性
mongodb :mongodb也是一个数据库,不过它是非关系型的数据库,也称为文档型数据库,它适合于大规模的数据存储,在这方面它胜出mysql,但它占用的空间也比较大
sql :是一种用于管理关系型数据库系统的程序设计语言,数据库的管家,使用它可以处理数据库(mysql)中的数据,常见的是实现对数据库的增删改查
nosql :nosql是一种泛指,泛指非关系型数据库,上面的mongodb就是一种nosql型数据库,它的初现是为了解决关系型数据库难以克服的大数据难题
git/svn/版本控制
git :git是一款免费的,开源的分布式版本控制系统,也可以说是一款软件,用于有效地项目版本管理,简言之,git可以让任何人毫无困难地下载一份项目源代码副本到他们自己的机器上,做出修改,然后,觉得满意了就将修改的部分上传回项目的集中代码库,而且git可以令每个人做出的修改都无缝融合起来
svn :svn是与git同级的概念,svn是集中式版本控制系统,依赖于一个中心服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突(冲突要比git少),提交,所有的版本信息都放在服务器上。如果脱离了服务器(或者说断掉了网络),开发者基本上可以说是无法工作的
版本控制 :是一种记录项目文件内容变化,以便将来查阅特定版本修订情况的系统,特别是于软件来说,修改一行代码,或者是一个参数,软件就有可能发生巨大的变化,很多开发者同时在修改,就没人也没办法记住这些修改,版本控制(软件)就是用来帮忙记住这些个修改的手段
ssh
ssh :ssh是建立在应用层和传输层之间的提供安全性的协议,传统的网络传输协议(ftp,http),他们在网络上用明文传送数据,很不安全,容易受到“中间人“这种方式的攻击。用ssh,你可以把所有传输的数据进行加密,这样”中间人”这种攻击方式就不可能实现了,还有一个好处就是使用ssh传输的数据是经过压缩的,可以提高传输速度
php是世界上最好的语言/pythonic
php是世界上最好的语言 :php是一种嵌入在html并由服务器解释执行的脚本语言,php文件能够包含文本html,css以及php代码,php能够生成动态页面内容,能够创建、打开、读取、写入、删除以及关闭服务器上的文件,能够添加、删除、修改数据库中的数据,能够限制用户访问网站中的某些页面
说“php是世界上最好的语言”,其实是黑它的。在所有生产语言中,即使不能说php是最烂的,也是最烂的之一。举个小例子,php中empty()函数的使用,就有点坑
pythonic : pythonic是python一些惯用法,简单说就是符合python语言编程理念的代码风格,一个python程序,如果不pythonic,看起来就会累赘,让人费解
ORM
ORM :是对象程序和数据库之间映射,将面向对象程序中的对象数据存到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式,面向对象程序,如Java,关系型数据库,如mysql
下面来详细介绍几组概念
nginx/uWSGI/cgi/php-cgi/fastcgi/php-fpm
先声明nginx和uWSGI在下文中直接用server来代替
在这几个部分中,server,php-cgi,php-fpm是实体(即程序),而cgi,fastcgi是协议。cgi是用于规定server与php-cgi(即cgi程序)之间的通信,fastcgi规定php-cgi与php-fpm(cgi程序进程管理器)之间的通信,这是他们之间的基本关系
对于server,如果请求是html文件,那么server会去文件系统中找到这个文件,发送给客户端,这里分发的是静态数据。但是,如果现在请求的是php文件(xxx.php),根据配置文件,server(nginx)知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给php解释器。server会传哪些数据给php解释器呢?cgi就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。
当server收到xxx.php这个请求后,会启动对应的cgi程序,这里就是php的解析器。接下来php解析器会解析文件,处理请求,再以规定cgi协议规定的格式把结果返回给server。server再把结果返回给客户端。
当我们的server每次接收到xxx.php这种请求后,server会把这些请求交给php-cgi处理,php-cgi对每个请求都会执行这些步骤,每次都要启动进程,非常麻烦,非常累,所以处理每个的时间会比较长。但php-cgi只是一个cgi程序,并不会进程管理,于是就出现了一些能够调度php-cgi进程的程序,即cgi进程管理器php-fpm,可以说php-fpm实现了fastcgi协议,php-fpm工作原理是:先启一个master,解析配置文件,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置提前启动几个worker等着;当然当空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是php-fpm的对进程的管理。
session/cookie
先讲一下,http协议本身是无状态的,客户端只需要简单的向服务器请求某些文件,无论是客户端还是服务器都不会纪录彼此过去的行为,每一次请求之间都是独立的。
session和cookie机制则是在客户端与服务器之间保持状态的解决方案,session是服务端的处理机制,cookie是客户端的处理机制。下面来打个比喻说明一下cookie与session的之间的2区别和联系记录方式。
有一家奶茶店规定,只要一位顾客在店里购买奶茶数量累计超过五杯,就免费赠送一杯奶茶。所以店主就要记录每一位的客户的消费数量,有如下两种记录方式。
1.发给顾客一张卡片,上面记录着消费的数量。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态(cookie)。
2.发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态(session)。
cookie机制的基本原理就如上面的例子1一样简单,但是还有几个问题需要解决:“卡片”如何分发;“卡片”的内容;以及客户如何使用“卡片”。cookie分发是通过扩展http协议来实现的,服务器通过在http的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。cookie可以设置过期时间,如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。
seeion机制的基本原理就如上面的例子2,是一种服务端的机制。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识-称为session id(也就是上面所说的会员卡卡号),如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。客户端把这个session id保存到cookie,所以采用session机制是建立在cookie机制的基础上的
html/css/js(基本概念前面已经介绍)
打个不是很恰当比喻来说明一下这三者之间的关系,比如你要建一个房子,那么你要用到的材料(如砖头,瓦片等)就是html,你打算把门窗建多大,在什么地方,就要css实现,你把一把椅子从东边移到西边的过程属于js范畴
一个网页分为三层,结构,表现,行为。用html书写结构;用css控制样式,如让网页横排或者竖排,让每个元素表现出各种样式(比如粗体字,颜色,边距,浮动…)等;用js控制事件,如让网页显示当前的时间和滚动图片等
在一个html文件中可以可以同时出现css和js,即它们在head下直接标记。当然也可以把css,js编写在一个以.css和.js为后缀的文件里,然后把该文件链接到网页文件中,使用html中的link标签
mvc
mvc是一种框架模式,m代表模型(是程序的核心,处理核心程序),v代表视图(显示数据),c代表控制器(处理输入,调用模型),它强制性的使应用程序的输入、处理和输出分开。使用mvc应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。
模型
模型包含了应用问题的核心数据、逻辑关系和计算功能,它封装了所需的数据,提供了完成问题处理的操作过程。控制器依据I/O的需要调用这些操作过程。模型还为视图获取显示数据而提供了访问其数据的操作。
视图
视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并能接收用户的输入数据,但是它并不进行任何实际的业务
控制器
控制器通过时间触发的方式,接受用户的输入。控制器如何获得事件依赖于界面的运行平台。控制器通过事件处理过程对输入事件进行处理,并为每个输入事件提供了相应的操作服务,把事件转化成对模型或相关视图的激发操作。
mvc的实现
1. 分析应用问题,对系统进行分离
分析应用问题,分离出系统的内核功能、对功能的控制输入、系统的输出行为三大部分。设计模型部件使其封装内核数据和计算功能,提供访问显示数据的操作,提供控制内部行为的操作以及其他必要的操作接口。以上形成模型类的数据构成和计算关系。这部分的构成与具体的应用问题紧密相关。
2. 设计和实现每个视图
设计每个视图的显示形式,它从模型中获取数据,将它们显示在屏幕上。
3. 设计和实现每个控制器
对于每个视图,指定对用户操作的响应时间和行为。在模型状态的影响下,控制器使用特定的方法接受和解释这些事件。控制器的初始化建立起与模型和视图的联系,并且启动事件处理机制。事件处理机制的具体实现方法依赖于界面的工作平台。
4. 控制器的可安装性和可卸载性,带来了更高的自由度,并且帮助形成高度灵活性的应用。控制器与视图的分离,支持了视图与不同控制器结合的灵活性,以实现不同的操作模式,例如对普通用户、专业用户、或不使用控制器建立的只读视图。这种分离还为在应用中集成新的I/O设备提供了途径。
mvc的优点和不足之处
优点:
1. 低耦合性
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
2. 模型的可移植性
因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。
3. 快速的部署
使用mvc模式使开发时间得到相当大的缩减,它使程序员集中精力于业务逻辑,界面程序员(html开发人员)集中精力于表现形式上。
4. 有利于软件工程化管理
由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。
不足之处:
1. mvc并不适合小型甚至中等规模的应用程序,在小型项目中如果采用mvc模式,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
2. 视图对模型数据的低效率访问。如果不采用mvc模式,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。