前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >计算机语言的分类

计算机语言的分类

作者头像
Fisherman渔夫
发布2020-02-18 10:39:18
7290
发布2020-02-18 10:39:18
举报
文章被收录于专栏:渔夫

计算机语言的分类

 到目前为止,我自己学过或者说碰过的语言有 C、Java、JavaScript、Python、Go。最近在学的是 Go,看到 Go meta描述是:静态、编译型。但是突然发现自己对于编译型的理解就是:该种语言若要执行,则需要从源码转换为二进制,而语言的静态和动态却摸不着头脑。看来自己基础不牢,需要总结了。

语言大致可以按一下分类:

  • 编译型、解释型、混合型;
  • 动态类型语言、静态类型语言;
  • 强类型、弱类型;

实际上,上述分类并不能说具有绝对的科学性。

一、编译、解释、混合型

定义

  • 编译型:需通过编译器(compiler)将源代码编译成机器码,然后链接为可执行文件。编译的工作流程大致为:源代码 → 词法分析 → 语法分析 → 语义分析 → 目标代码(编译)链接 → 可执行文件,其中:
    • 编译:把源代码编译成机器码;
    • 链接:把各个模块的机器码和依赖库串连起来生成可执行文件;
  • 解释型:解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。
  • 混合型:编译器将源码编译成中间码而不再是二进制机器码,然后中间码需要被即时编译器翻译成目标平台的本地代码;

分类

  • 编译型语言:C、C++、Object-C、swift、Java;
  • 解释型语言:JavaScript、Python、PHP;
  • 混合型语言:C#;

局限性

 这种方式的分类是被认为是不科学的,因为很多语言既可以认为是解释型、也可以认为是编译型,这种分类方式被指出是不科学的,见于:RednaxelaFX在https://www.iteye.com/blog/rednaxelafx-492667中提到的:我是倾向于避开把编程语言描述为“编译型”或者“解释性”的。

 详细地,可以以 Java 和 Python 为例子来解释这个问题。

 Java 是这样从源码到被执行的(大致地~):

Java 源代码 -> javac 将其转为字节码(二进制码)->虚拟机中执行。

 Java 按这种分类方式难以分类的原因就如上所示,首先编译其次在虚拟机中解释执行。为何说后者是解释?因为传统上我们认为从字节码到对应平台的机器码需要不同平台上的 JVM 提供支持,我们认为这个动作就是解释。

 这样一来 Java 就难以按照这个分类方式进行分类了。实际上,我还是倾向于将 Java 称之为编译型语言,因为完全可以将 JVM 看做底层实现。这里粗粒度不宜过细,因为本质上说机器码被 CPU 接收然后运行,其中也涉及一段解释的过程。如此一来,世上只有解释型语言。

 Python 虽然被普遍认为一门解释型语言,按理说应当不涉及编译过程。事实上,Python 解释器会将源代码转换为字节码,然后再由 Python 解释器来执行这些字节码。本质上,Python 解释器不就是完成了编译器+执行器这个模块的任务,既然含有编译过程,那么其被称为解释型语言就具有一定不合理性。

 R 大所认为的:语言一般只会定义其抽象语义,而不会强制性要求采用某种实现方式。而编译、解释只是实现方式的一个步骤或者方式,按这种分类是不合理的。

二、动态类型、静态类型

定义

这种分类方式关注点是类型确定的时机,以运行开始为分类的时间节点。

  • 动态类型语言(Dynamic Typing):含义是类型只有在程序运行期间才能确定;
  • 静态类型语言(Static Typing):在程序运行前类型已知且会进行类型安全检查。这一步通常被语言解释器完成。

分类

  • 动态类型语言:Python、Ruby、JavaScript;
  • 静态类型语言:C、C++、C#、Java、Go;

以 Python 为例来说明动态类型语言所具备的特性:

代码语言:javascript
复制
# coding: utf-8

def sum(a, b):

    return a + b;

print sum(1,2);
print sum("Hello ", "Word")

运行结果自然是:

3 Hello Word

三、强类型、弱类型

定义

学术层面上对此分类方式有争议,不过粗浅地可以认为是如下这般:

  • 强类型:偏向于不容忍隐式类型转换。譬如说haskell的int就不能变成double;
  • 弱类型:偏向于容忍隐式类型转换。譬如说C语言的int可以变成double;

分类

  • 强类型:Java、Python、Go;
  • 弱类型:Javascript、C、C++;

实际上,如果不搞编程界的学术,不必执拗于一本编程语法书上告知你的该语言属于何种类型,如果你遍历地学习了某种语言,实际上已经知道语言具有那种语法特性。分类只是为了更好的抽象,而你已经掌握了具体,况且学术界对这类抽象没有准确的定义。

一个经典的编程语言动静态类型、强弱分类图如下:

classification
classification
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 计算机语言的分类
    • 一、编译、解释、混合型
      • 二、动态类型、静态类型
        • 三、强类型、弱类型
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档