序
经过多年的学习和实践,我对学习IT技术有一个感受,就是想全面了解一项新技术,最好从两个角度学习,一个是时间角度,一个是分类角度。时间是考察它的发展历史,了解它的传承,进而了解新技术为什么要取代旧技术,有哪些需求和问题在驱动它,从而了解这种新技术或产品为什么会产生。分类观点是指在同一时期,同一种技术会出现很多分支,会出现不同的产品和工具,那么它们的特点和优缺点是什么,各自最适合什么应用场景。而且我觉得了解这项技术背后的原因可能比学习这项技术本身更重要。因为只有这样,你才知道在解决实际问题时应该选择哪些产品和工具,而不应该选择其他。只有这样,你才能最大限度地发挥这项技术的效用。只有做到这些,我们才能成为真正的专家。我想这也是普通程序员和架构师的区别。

让我们言归正传。今天,我们谈论重新理解编程语言。可能有些同学觉得没必要。他可能学过编程,但可能只学过C语言,java语言或者其他什么语言。特别是如果你是一个训练有素的程序员,这其实是片面的。你可能并没有真正对编程语言有一个全面的了解,你也不会成为一个专家或者大师。
编程简史。
简单来说,编程语言的发展可以分为三大阶段。第一代是机器语言,第二代是汇编语言,第三代统称为高级语言。
语言就是CPU的指令集,是计算机唯一能读懂的语言。可惜都是二进制表示,比如010100101这样的字符串。用这种语言写的程序不仅难记,而且难懂。
所以后来为了解决这个问题,发明了汇编语言,把这些二进制的机器语言指令用一个人类容易理解和记忆的英文缩写来表示,这样人们写程序的时候记住指令就容易多了,程序的可读性也增强了。但是我们知道计算机只能理解机器语言,所以我们要用一个叫“汇编器”的工具,把汇编编程翻译成机器语言,让CPU来执行。
随着软件需求的增加,程序的逻辑变得越来越复杂,汇编程序的编程效率成为瓶颈。一方面,编译语言中的指令与计算机硬件有关,也就是说,不同的CPU有不同的指令,这些指令互不通用。汇编程序不具备可移植性,换一台机器后同样的程序可能需要重写。另一方面,汇编程序的语法比较原始,要求程序员对计算机硬件的原理和结构非常清楚。即使是给变量赋值这种最简单的操作也需要操作寄存器、内存地址等。
为了解决汇编程序生产率低的问题,高级语言应运而生。高级语言不是语言,而是一种语言。高级语言是一种更接近人类语言的编程语言。它有变量和常数的概念,有算术运算、逻辑运算、关系运算等运算符。,并将程序逻辑归纳为顺序执行、分支判断和循环迭代三种基本结构,并创造了函数的概念,甚至面向对象的概念等。所有这些都是为了让编程语言更抽象、独立于机器、更容易理解。基于以上原因,高级语言具有良好的可移植性,因为它的语言是抽象的,与具体的硬件无关。但是最后执行的是机器语言,于是人们发明了“编译器”来处理。编译器会把它编译成汇编语言,然后用汇编程序把它转换成机器语言。它可以在cpu中执行。
以上是计算机编程语言的简单发展史。高级语言的出现大大提高了编程的生产力。这直接导致了软件业的发展。我们的应用软件也大大丰富了。基本上,人们只要知道应用领域的业务逻辑,并结合高级语言,就可以在不了解计算机的结构和原理细节的情况下,编写出非常复杂和强大的应用程序。由于其应用领域的侧重点不同,并且为了提高其编程效率,人们发明了许多不同的高级语言,产生了许多编程思想。
计算机高级编程语言的分类
计算机编程语言有很多种分类方法。高级语言以不同的方式分类如下。
根据编程范例:
现有的许多高级语言都可以基于“如何编程”进行分类,从而属于某一个语言家族,这也叫做编程范式。大的语言类别有:声明式和命令式。其中,解释性语言从问题本身着眼于“做什么”而不是“怎么做”,所以更强调如何描述问题,从而隐藏了语言解决问题的具体实现的细节;而命令式语言,从计算机硬件的抽象出发,关注的是如何解决问题。他们强调将问题分解成计算机可以理解的步骤,因此程序员不仅需要理解问题本身,还需要理解实现的原理和过程。简单来说,就是用陈述性语言来解释问题,问题的解决由语言来处理;命令语言命令计算机做事,解决问题的逻辑由程序员决定。
功能语言以功能为语言的核心。在函数式语言中,函数的参数和返回值也是函数。纯函数式语言没有变量和循环,所以函数的定义一般是基于递归来表达的。函数式语言在数学上来源于Church在20世纪30年代提出的λ演算。可以证明λ演算与图灵机在解题上是等价的。函数式语言程序本质上是把从输入到输出看成一个函数,这个函数的定义是建立在一些更简单的函数基础上的,这些函数是逐渐细化的。函数的递归表示使得函数式语言更倾向于描述问题,因此被归入声明式语言的范畴。
数据流语言注重数据的流动,程序由一系列功能节点组成。程序接收输入数据,并显示数据是如何逐步处理和修改的,直到输出。功能节点由输入触发。一旦上游输入准备就绪,功能节点就开始工作,处理输入数据并产生输出。
逻辑语言直接把逻辑推理变成程序的执行。他们把计算看作是一个有目标的推理过程,试图按照一套逻辑规则找出满足特定关系的值。逻辑语言程序描述数据对象之间的关系,用事实和规则来表达。根据规则寻找逻辑结果就是推理。所以逻辑语言程序的设计是陈述事实,制定规则,程序设计的过程是构造证明,程序的执行是推理,推理过程由解释器完成,程序员不需要关心实现细节。
过程语言将计算描述为处理器操作内存中的数据,是最接近冯诺依曼架构思想的语言,因此也被称为冯诺依曼语言。这些语言包括Fortran、Pascal、Basic、C等等,程序员都很熟悉,也是最成功的语言之一。过程语言通过过程调用来组织程序。它把存储在内存中的数据抽象成有结构的变量,把操作数据的一组指令抽象成过程,通过过程修改变量的值,从而影响后续的计算。所以,过程语言的本质就是通过过程来处理数据。
面向对象语言不再直接处理数据,而是把程序看作一些独立对象之间的交互。大多数面向对象语言与过程语言有很深的关系,但它们在编程中采用了更结构化的方式,抽象程度更高。从大的方面来说,面向对象语言的程序是由一组相互作用的对象组成的,这些对象封装了数据和处理这些数据的方法。整个程序是为了描述对象之间是如何相互作用的。当然,说到一个对象的实现,面向对象语言还是遵循过程语言数据加过程的模式。
按适用场景划分
c:操作系统、嵌入式、驱动开发
C++:图形图像、科学研究、通信、桌面软件、游戏、游戏服务器
#: Windows桌面软件,。网络,服务器
Java: Java SE:跨平台桌面应用,Android;Java:企业应用、web开发、服务器后端;Java ME:手机应用,流行于非智能机时代;Android:用于Android开发和应用
GO:高性能服务器应用,相对年轻。

Erlang:高并发服务器应用,多用于游戏。
Python:Web、科学计算、操作和维护
Ruby:web
Perl:运维,文字处理,用的比较少。
Lisp:科学研究,人工智能中使用的逻辑语言。
节点:一个Javascript运行环境
Haskell:就数学逻辑而言,Haskell是一种标准化的、通用的纯函数编程语言
Scala:一种类似Java的编程语言,集成了面向对象编程和函数式编程的各种特性。
Javascript:前端,在node中可以是后端
HTML/CSS:标记语言,主要用于前端工程师构建页面。
按需编译?
编译语言
优点:编译器通常有一个预编译过程来优化代码。因为编译只做一次,运行时不需要编译,所以编译语言的程序执行效率高。它可以独立于语言环境运行。缺点:如果编译后需要修改,需要重新编译整个模块。编译时,机器码是根据对应的运行环境生成的,所以不同操作系统之间的移植会有问题,需要根据运行的操作系统环境编译不同的可执行文件。代表语言:C,C++,Pascal,Object-C,swift等
解释性语言
优点:平台兼容性好,可以在任何环境下运行,前提是安装了解释器。灵活,修改代码的时候可以直接修改,可以快速部署,不需要停机维护。缺点:每次运行都要解释,性能不如编译语言。语言:Javascript,Python,Erlang,PHP,Perl,Ruby
混合语言
混合语言也被称为半编译语言。比如java,C#,C#编译时不是直接编译成机器码而是中间代码。NET平台提供中间语言运行时来运行中间代码,类似于Java虚拟机。。net编译成IL代码,存储在dll中。第一次运行时被JIT编译成机器码缓存在内存中,下次直接执行。Java解释器采用了独立于系统生成字节码指令的技术。也就是说,在任何不同的操作系统上,只要java运行系统安装正确,就会有一个编写和调试java程序的平台。在分布式应用中,java的这一特性使得同一个java程序可以在不同的系统上运行,从而提高了软件的生产效率。可移植性是跨平台特性的延伸,即跨平台保证了可移植性。java程序,java类库,java编译器,Java系统都是可移植的。还有一个特例。通常,Javascript是一种解释性语言。v8引擎旨在提高web浏览器中Javascript的执行性能。为了提高性能,V8会将js代码转换成高效的机器码,而不是依靠解释器来执行。V8引入JIT,在运行时将js代码转换成机器码。这里的主要区别是V8不生成字节码或任何中间代码。这里特别的是JIT做代码优化;解释性语言做不到这一点。
按变量类型划分
动态类型语言和静态类型语言主要关注数据类型检查的时间。
动态类型语言
动态语言是一种在运行时确定数据类型的语言。在使用变量之前,不需要声明变量的类型。通常,变量的类型就是它被赋给的值的类型。
主要语言:Python,Ruby,Erlang,Javascript,swift,PHP,SQL,Perl。

静态类型语言
静态语言是一种可以在编译时确定变量的数据类型的语言。大多数静态类型语言要求在使用变量之前必须声明数据类型。主要语言:C,C++,C#,Java,Object-C注意:一般来说,解释型语言是动态类型语言,编译型语言是静态类型语言。但不是全部。swift是一种编译语言,但也是一种动态类型语言。# C和Java都是解释性语言和静态类型语言。
根据强弱的类型
强类型语言:强类型语言。一旦一个变量被赋予了某种数据类型,如果不进行强制类型转换,它将始终是这种数据类型。你不能把一个整型变量当作一个字符串。主要语言:Java,C#,Python,Object-C,Ruby
弱类型语言:数据类型可以忽略,一个变量可以赋不同数据类型的值。一旦一个字符串值被赋给一个整型变量A,那么A就变成了一个字符类型。主要语言:Javascript、PHP、C、C++


