编程语言的基本分类方法

来源:互联网 发布:订机票 知乎 编辑:程序博客网 时间:2024/05/22 00:03

这篇博客主要用来介绍编程语言的基本分类方法。
 本文大致有以下内容:
 - 引言
 - 编译型语言、解释型语言和半编译型语言
 - 动态编程语言与静态编程语言
 - 动态类型语言与静态类型语言
 - 强类型语言与弱类型语言
 - 一些注意点
  

引言

  最近计划写一篇总结Java数据类型的博客,感觉在这之前需要先解决Java为什么会有数据类型这一问题,就写了这篇博客。
  在这里先对Java做一个定义:Java是一门强类型的、半编译型的、静态类型语言。
  静态类型语言才有数据类型一说。
  
编译型语言、解释型语言和半编译型语言

  编译型语言 (Compiled Language):需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。
  一般需经过编译(compile)、链接(linker)这两个步骤。
  编译是把源代码编译成机器码。
  链接是把各个模块的机器码和依赖库串连起来生成可执行文件。

  优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
  缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
  代表语言:C、C++、Pascal、Object-C、Swift。

  解释型语言 (Interpreted Languages):需要利用解释器,在运行期,动态将代码逐句直译(interpret)为机器码,之后再运行的语言。

  优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护
  缺点:每次运行的时候都要解释一遍,性能上不如编译型语言
  代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

  半编译型语言 (Semi - Compiled Language):综合利用以上两种方式的语言。
  需要经过编译,但不编译成本地二进制码,而是一种中间代码,独立于CPU,因此具有一定的平台独立性,使用近年来快速发展的JIT技术,执行效率也比较高
  
  优点:较编译型语言性能更佳,较编译型语言灵活
  代表语言:Java,C#

动态编程语言与静态编程语言

动态编程语言 (Dynamic Programming Language ):指在运行过程中程序的数据类型的结构可以被改变,对象的函数、变量可以被修改删除的语言。

 代表语言:JavaScript,Ruby
 示例(JavaScript):

function Person(name){    this.name=name;}Person.prototype.getName=function(){    return this.name;}var person=new Person("taffy");alert(person.getName());//这里person的getName方法被改变了person.getName=function(){return "nono"};alert(person.getName());

  静态编程语言 (Statically Programming Language ):运行时结构不可变的语言。
  代表语言:C/C++,Java

动态类型语言与静态类型语言

  动态类型语言 (Dynamically Typed Language):类型检查在运行时进行的语言。
  编译的时候不需要知道每一个变量的类型,因为类型错误而产生的错误是运行时错误。在用动态语言编程时不用事先定义变量/对象的类型,该语言会在你第一次给变量/对象赋值时,自动记录它的类型。

  优点:方便阅读,代码量少(不需要写非常多的类型相关的代码),编码速度快
  代表语言:PHP、Python、Ruby

  静态类型语言 (Statically Typed Language):类型检查在编译时进行的语言。
  编译的时候就知道每一个变量的类型,因为类型错误而产生的错误是语法错误。在用静态语言编程时,必须事先定义变量/对象的类型,以便让编译器在编译时就确定每个实体的具体类型。

  优点:结构非常规范,便于调试,方便类型安全(!=类型安全)
  代表语言:C/C++、Java、C#

  

强类型与弱类型

  强类型 (Strongly Typed):变量/对象一定是有类型的,且变量/对象的类型一旦确定就不允许更改,不同类型的变量/对象之间不允许进行赋值和初始化操作。
  代表语言:Java,Python

  弱类型 (Loosely Typed):变量/对象的类型概念很弱或者没有类型的概念,不同变量/对象的类型可以更改,不同类型的变量/对象之间允许进行赋值和初始化操作。
  代表语言:PHP,C/C++,JavaScript

一些注意点

在这里先将C#与Java视作编译型语言

  1. 解释型语言不一定是动态编程语言,如:Java是解释型语言,但不是动态编程语言。
  2. 编译型语言不一定是静态编程语言,如:Object-C是编译型语言,但不是静态编程语言。
  3. 解释型语言不一定是动态类型语言,如:Java是解释型语言,但不是动态类型语言。
  4. 编译型语言不一定是静态类型语言,如:Swift是编译型语言,但不是静态类型语言。
  5. 一门语言是不是动态类型语言与这门语言是不是类型安全的完全不相干的,不要将它们联系在一起! 一表胜千言
划分示例 动态类型语言 静态类型语言 强类型 Ruby / Python / Groovy Java / C# / Scala / Haskell 弱类型 PHP / JavaScript / Perl C / C++

注:汇编语言无类型

由于本人水平有限,本文难免存在谬误,欢迎批评指正!

0 0