强弱类型、动静态类型语言严格定义

类型系统的一些概念,众说纷纭,使用上也比较乱。有些东西,甚至不好严格定义。以下算学术界的一种相对“严格”的说法。

1. 先定义一些基础概念

Program Errors

  • trapped errors。导致程序终止执行,如除0,Java中数组越界访问
  • untrapped errors。 出错后继续执行,但可能出现任意行为。如C里的缓冲区溢出、Jump到错误地址

Forbidden Behaviours

语言设计时,可以定义一组forbidden behaviors. 它必须包括所有untrapped errors, 但可能包含trapped errors.

Well behaved、ill behaved

  • well behaved: 如果程序执行不可能出现forbidden behaviors, 则为well behaved
  • ill behaved: 否则为ill behaved...

2. 有了上面的概念,再讨论强、弱类型,静态、动态类型

强、弱类型

  • 强类型strongly typed: 如果一种语言的所有程序都是well behaved——即不可能出现forbidden behaviors,则该语言为strongly typed。
  • 弱类型weakly typed: 否则为weakly typed。比如C语言的缓冲区溢出,属于trapped errors,即属于forbidden behaviors..故C是弱类型

前面的人也说了,弱类型语言,类型检查更不严格,如偏向于容忍隐式类型转换。譬如说C语言的int可以变成double。 这样的结果是:容易产生forbidden behaviours,所以是弱类型的

动态、静态类型

  • 静态类型 statically: 如果在编译时拒绝ill behaved程序,则是statically typed;
  • 动态类型dynamiclly: 如果在运行时拒绝ill behaviors, 则是dynamiclly typed。

3. 误区
大家觉得C语言要写int a, int b之类的,Python不用写(可以直接写a, b),所以C是静态,Python是动态。这么理解是不够准确的。譬如Ocaml是静态类型的,但是也可以不用明确地写出来。。
Ocaml是静态隐式类型

静态类型可以分为两种:

  • 如果类型是语言语法的一部分,在是explicitly typed显式类型;
  • 如果类型通过编译时推导,是implicity typed隐式类型, 比如ML和Haskell

4.下面是些例子
无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP
强类型、静态类型检查 :Java/C#
强类型、动态类型检查 :Python, Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell

转载地址:弱类型、强类型、动态类型、静态类型语言的区别是什么? - rainoftime的回答 - 知乎 https://www.zhihu.com/question/19918532/answer/21647195

原文地址:https://www.cnblogs.com/NoctisYang/p/8692259.html

时间: 2024-10-14 14:01:22

强弱类型、动静态类型语言严格定义的相关文章

动态语言/动态类型语言/静态类型语言

动态语言 指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除,即结构上的变化 如众所周知的ECMAScrip(JavaScript)便是一个动态语言 除此之外,Ruby.Python也都属于动态语言 C与C++则不属于动态语言 动态类型语言 指类型检查是在运行时做的 静态类型语言 分析 类型检查是在运行前判断(如编译阶段),如C#和java都是静态类型语言 静态类型语言为了达到多态,会采取一些类型鉴别手段,如继承.接口 而动态类型语言不需要,所以一般动态语言都会采用dynam

弱类型、强类型、动态类型、静态类型语言的区别是什么?

作者:amalgamation链接:https://www.zhihu.com/question/19918532/answer/21647195来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1. 先定义一些基础概念 Program Errors trapped errors.导致程序终止执行,如除0,Java中数组越界访问 untrapped errors. 出错后继续执行,但可能出现任意行为.如C里的缓冲区溢出.Jump到错误地址 Forbidden Beh

强类型、弱类型、动态类型、静态类型语言

收集了一些关于编程语言分类的文章: 一. 作者:rainoftime链接:https://www.zhihu.com/question/19918532/answer/21647195来源:知乎 类型系统的一些概念,众说纷纭,使用上也比较乱.有些东西,甚至不好严格定义.以下算学术界的一种相对"严格"的说法. 1. 先定义一些基础概念 Program Errors trapped errors.导致程序终止执行,如除0,Java中数组越界访问 untrapped errors. 出错后继

编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别

最近在研究Python和Erlang.反复提到动态类型语言.动态语言.解释型语言这些概念.这些概念很生涩,在这里做一个总结. 编译型语言和解释型语言 1.编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言.一般需经过编译(compile).链接(linker)这两个步骤.编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件. 优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行

动态类型语言 vs 静态类型语言

本文内容 Dynamically Typed Language(动态类型语言) Statically Typed Language(静态类型语言) 比较 参考资料 类型检查所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行时期(动态检查).静态类型检查是在编译器所进行语义分析中进行的.如果一个语言强制实行类型规则就称此处理为强类型(或静态类型),反之称为弱类型(或动态类型). Dynamically Typed Language(动态类型语言) 所谓动态类型语言,就是类型的检

【转载】编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别

编译型语言和解释型语言 1.编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言.一般需经过编译(compile).链接(linker)这两个步骤.编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件. 优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高.可以脱离语言环境独立运行. 缺点:编译之后如果需要修改就需要整个模块重新编译.编译的时候根据对应的运行环境生成机器码,

强类型和弱类型,静态类型和动态类型语言如何区分

强类型和弱类型 如果一门语言很少隐式转换类型,说明他是强类型语言.如果经常这么做,说明他是弱类型语言.java, c++和python是强类型语言.PHP,JavaScript和Perl是弱类型语言 静态类型和动态类型 在编译时检查类型的语言是静态类型语言,在运行时检查类型的语言是动态语言.静态类型需要声明类型.Fortran和Lisp是最早的两门语言.他们分别是静态类型语言和动态类型语言. 静态类型使得一些工具编译器和ide便于分析代码,找出错误和提供其他服务(优化,重构,等等).动态类型便于

Android EventBus的简单使用基本的使用步骤就是如下4步,点击此链接查看例子及介绍。 定义事件类型: `public class MyEvent {}` 定义事件处理方法: `public

基本的使用步骤就是如下4步,点击此链接查看例子及介绍. 定义事件类型: `public class MyEvent {}` 定义事件处理方法: `public void onEventMainThread` 注册订阅者: `EventBus.getDefault().register(this)` 发送事件: `EventBus.getDefault().post(new MyEvent())` 一.实现 **EventBus**使用方法很简单,但用一个东西,如果不了解它的实现用起来心里总是没底

动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言

关于如题这几个概念,大部分人应该比较熟悉,但是我昏了好久,所以写下来加深印象. 1. 动态语言 又叫动态编程语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所周知的ECMAScript(JavaScript)便是一个动态语言.除此之外如Ruby.Python等也都属于动态语言,而C.C++等语言则不属于动态语言. 而其实我们平时说的"动态语言"应该指的是"动态类型语言".至少我之前一直是这么认为的. 2. 动态类