一些计算机常见基本概念的区别

解释型和编译型

计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算机才能运行程序。

编译型语言:执行之前需要一个专门的编译过程,通过编译系统(不仅仅只是通过编译器,编译器只是编译系统的一部分)把高级语言翻译成机器语言,把源高级程序编译成为机器语言文件,比如windows下的exe文件。以后就可以直接运行而不需要编译了,因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。

解释型语言:不需要编译。解释型语言在运行的时候才翻译,比如VB语言,在执行的时候,专门有一个解释器能够将VB语言翻译成机器语言,每个语句都是执行的时候才翻译。这样解释型语言每执行一次就要翻译一次,效率比较低。

两种方式只是翻译的时间不同。

https://blog.csdn.net/zhu_xun/article/details/16921413

动态类型和静态类型

动态类型语言:是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。


静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

静态编译和动态编译

静态编译,就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应静态库(.a或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。

 

动态编译的可执行文件需要附带一个的动态链接库。在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。

强类型和弱类型

强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。


弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

面向有连接和面向无连接

TCP是面向有连接的,UDP是面向无连接的

有连接和无连接是什么意思?

 

面向有连接: 通信之前,必须与对端建立一个连接通道,连接断开后无法发送数据

 

面向无连接:不要求建立连接,发送端可以在任何时间自由发送数据,接收端也不知道自己何时从哪里接收数据,在面向无连接时,接收端需要确认是否收到了数据,即使接收不存在或无法接受数据,发送方也可以将数据发送出去

同步异步、阻塞非阻塞

老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)
老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
老张觉得自己聪明了。

 

所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。
虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。

所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。
情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

------------------------

同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。

例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事

 

异步:异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

例如 ajax请求(异步): 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

 

阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。

有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回,它还会抢占cpu去执行其他逻辑,也会主动检测io是否准备好。

 

非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

-------------------------------------------------------

再简单点理解就是:

1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。
2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)
3. 阻塞,就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
4. 非阻塞,就是调用我(函数),我(函数)立即返回,通过select通知调用者

同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞

阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回

综上可知,同步和异步,阻塞和非阻塞,有些混用,其实它们完全不是一回事,而且它们修饰的对象也不相同。

https://www.cnblogs.com/chaser24/p/6112071.html

 

进程、线程、协程

进程:

  • 概念: 资源分配的基本单位

  • 通信: 进程之间的通信只能通过进程通信的方式进行

  • 多进程: 拷贝,使用fork(),生成子进程。每个进程拥有独立的地址空间(代码段、堆栈段、数据段)

 

线程:

  • 概念: 调度运行的最小单位

  • 通信: 同一进程中的线程共享数据(比如全局变量,静态变量)

  • 多线程: 同一个进程中的线程,它们之间共享大部分数据,使用相同的地址空间。当然线程是拥有自己的局部变量和堆栈(注意不是堆)

 

协程:

  • 概念: 非抢占式调度。用户态模拟进程线程的切换的具体实现,并非OS内核提供的功能。由程序员主动控制协程之间的切换。

  • 通信: 不要通过共享内存来通信,而应该通过通信来共享内存。

https://cyent.github.io/golang/other/concurrent/#_5

并发concurrency和并行parallelism

并发:一个处理器同时处理多个任务。

并行:多个处理器或者是多核的处理器同时处理多个不同的任务

 

并发事件之间不一定要同一时刻发生,并行事件指两个事件同时发生。

他们的主要区别在于是不是“同时”。

前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生.

并发和并行的区别就是一个人同时吃三个馒头和三个人同时吃三个馒头。

如图:

一些计算机常见基本概念的区别_第1张图片

循环、迭代、遍历、递归的区别

  • 循环(loop):指的是在满足条件的情况下,重复执行同一段代码。比如,while语句。
  • 迭代(iterate):指的是按照某种顺序逐个访问列表中的每一项。比如,for语句。

  • 遍历(traversal):指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。

  • 递归(recursion):指的是一个函数不断调用自身的行为。比如,以编程方式输出著名的斐波纳契数列。

http://www.nowamagic.net/librarys/veda/detail/2324

map 字典 哈希表

dictionary 跟 map 其实是同一个东西,只是在不同场合叫法不同。

dictionary 的中文是字典,map 在中文是映射,也有地图的意思。查字典,查地图,都是通过某个信息,去找到另一个信息。比如通过单词的拼写找到单词的具体含义。

 

类比查字典过程,单词的拼写为 key, 单词的具体含义为 value。dictionary 就是通过key,找到value,有时也将 dictionary 说成是 key-value 结构。只要达到查找目的,都可以叫做 dictionary。具体怎么找,可以有不同实现。

比如,最简单是将 key,value 放在一起,线性排。

k1, k2, k3, k4, k4 ....
v1, v2, v3, v4, v5 ....

当需要从 key 找到对应的 value 时,就从头到尾遍历过去。依次判断 k1, k2, k3, k4 是不是等于key, 当等于的时候,就找到 key 的具体位置,从而也就找到了value。

但这样从头到尾遍历,速度就太慢了,时间复杂度为 O(N)。N为数据的大小

 

为了快速从key找到value。dictionary(或者说map)的通常有两种实现方式。

  1. 二叉树
  2. 哈希(hash)表

https://www.zhihu.com/question/27581780/answer/37398584

形参parameter和实参argument

形参(parameter) 全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。

实参(argument) 全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

https://segmentfault.com/a/1190000010894177

函数、方法、接口

函数(function)是指一段可以直接被其名称调用的代码块,它可以传入一些参数进行处理并返回一些数据,所有传入函数的数据都是被明确定义。

方法(method)也是一段代码,也通过名字来进行调用,但它跟一个对象相关联。

 

本质上没有区别。

 

可以将方法理解为是函数的一个子集。它是一种特殊的,只针对类和实例而言的函数。

 

方法和对象相关;

函数和对象无关。

 

Java中只有方法,C中只有函数,而C++里取决于是否在类中。

 

函数是语句序列的打包;
方法是对 对象成员的操作,由函数实现;
接口是对方法的抽象和概括,由方法实现具体的接口;

cookie和session

session 在服务器端,cookie 在客户端(浏览器)

session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效,存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置

cookie安全性比session差

字符流和字节流 

  • 字符流:当程序处理中文的时候,字符流是最方便的
  • 字节流:当程序处理二进制数据(图片、音乐、电影)或进行网络传输,或者保存到磁盘数据一定都是字节;
  • 字节流直接与操作终端进行交互,字符流需要经过缓冲区

正向代理和反向代理

反向代理

大家都有过这样的经历,拨打10086客服电话,可能一个地区的10086客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已。那么这里的10086总机号码就是我们说的反向代理。客户不知道真正提供服务人的是谁。

反向代理隐藏了真实的服务端

用户做服务器域名解析时,解析得到的IP其实是负载均衡的IP,而不是服务器的IP,这样有一个好处是,当新加入/移走服务器时,仅仅需要修改负载均衡的服务器列表,而不会影响现有的服务。

 

正向代理

拿借钱打个比方,A想向C借钱,但是C不认识A所以不借给他,然后A就通过B向C借钱,B借到钱之后再转交给A,在这个过程中B就扮演了一个正向代理的角色,这个过程中,真正借钱的人是谁,C是不知道的~

比如我想访问go,可以使用代理软件,代理帮我们请求go,代理再把请求响应结果再返回给我。

正向代理的过程,它隐藏了真实的请求客户端。

 

正向代理 代理的是客户端,反向代理 代理的是服务器

字符和字符串 

字符类型只有一个字节,就是只能储存一个字符,单个字母或者数字,例如a或者1,字符类型的赋值应该用' '号。例如 char a='a';就是将字母a赋给变量a。


字符串可以储存多个字符,例如储存一句"I am fine"等。字符串的赋值要用" ";string a="I am fine!"就是将I am fine!这个字符串赋给字符串变量。

 

值得注意的是字符串变量会在最后加多一个结束标志'\0'。例如char a='a',占一个字节,而string a="a"则占两个字节,因为除了储存字母a外还要储存'\0'这标志。所以char a="a"这个语句是不对的,因为变量a只占一个字节,而"a"则占两个字节,所以上述赋值表达式是非法的。不知道我这么说能不能让楼主明白呢?

内存泄露和内存溢出

内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。


内存溢出指用户实际的数据长度超过了申请的内存空间大小,导致覆盖了其他正常数据,容易造成程序异常,严重的,攻击者可以以此获取程序控制权。

换行\n和回车\r

'\n'  换行(newline) 另起一行
'\r'  回车(return)  回到一行的开头

平时编写文件的回车符应该确切来说叫做回车换行符  

 

Unix系统里,每行结尾只有"<换行>",即"\n";

Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";

Mac系统里,每行结尾是"<回车>"。

 

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;

而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。 (cat -A查看)

 

在解析文本或其他格式的文件内容时,常常要碰到判定回车换行的地方,这个时候就要注意既要判定"\r\n"又要判定"\n"。

写程序时可能得到一行,将其进行trim掉'\r',这样能得到你所需要的string了。

https://blog.csdn.net/strongwangjiawei/article/details/8236703

 

Vim 编辑器底端 [noeol], [dos] 的含义

'noeol' 就是 'no end-of-line', 即“没有行末结束符”, Linux 下的文本编辑器(如 Vim)会在每一行 (包括最后一行)末尾添加一个换行符。比如我们在 Debian 下新建一个名为 'hello-unix.txt' 的文本文件,内容如下:

Hello
Unix

那么,使用cat -A hello-unix.txt命令可以看到这些换行符:

ts@TS:~/www/document$ cat -A hello-unix.txt
Hello$
Unix$
ts@TS:~/www/document$

从中可以清楚地看到每行末尾的 '$' 字符,这就是 Linux 下的“行末结束符”。 

下面我们再在 Windows 下创建一个名为 'hello-dos.txt' 记事本文件,内容如下:

Hello
DOS

在 Debian 下查看此文件的换行符信息:

ts@TS:~/www/document$ cat -A hello-dos.txt
Hello^M$
DOSts@TS:~/www/document$

同样是两行,每行一个单词,Windows 和 Linux 下的换行符有两个明显不同:

  1. Windows 下的换行符比 Linux 下的多了个 ^M;
  2. 最后一行行末没有换行符;

这两个不同之处也正是 [dos], [noeol] 两个 Flag 信息出现的原因。 Windows 下文本文件每行的换行符为“回车+换行“(CRLF,^M$), 而 Linux 下则仅为 “换行” (LF, $). Vim 发现文本中含有 ^m$换行字符判定为 Windows 下创建的 文件,用 [dos] Flag 提示;Vim 没有在最后一行发现换行符,判定此文件不是在 Linux 下创建/编辑,用 [noeol] Flag 提示用户。

如何消除 [noeol] Flag 信息?

只需在 Debian 下将该文件重新保存即可,还是上面的 hello-dos.txt 文件,打开它, 不做任何修改直接 :wq保存退出,再查看换行符:

ts@TS:~/www/document$ cat -A hello-dos.txt
Hello^M$
DOS^M$
ts@TS:~/www/document$

换行符已经追加上去,这里要注意的是追加的是 Windows 下的换行符(回车+换行) ^M$, 而不是 Linux 下的换行符(换行)$, 因为 Vim 已经发现此文件 是在 Windows 下创建的([dos] Flag),尽管是在 Linux 下编辑,Vim 也会按照文件创建 时所在的操作系统下的换行规则添加换行符。

如何消除 [dos] Flag 信息?

有两种简单的方法:

  1. Linux 下提供有两个命令用来进行 Windows 和 Unix 文件的转化:dos2unix 和 unix2dos;
  2. 在 Debian 下使用 touch template.txt 创建一个模板,在 Windows 下创建的任 何文本文件都以此模板为基础;

参考文档

  • http://unix.stackexchange.com/questions/31807/what-does-the-noeol-indicator-at-the-bottom-of-a-vim-edit-session-mean
  • http://linux.vbird.org/linux_basic/0310vi.php#tips_dos

 

你可能感兴趣的:(区别)