精华内容
下载资源
问答
  • 静态类型检查
    千次阅读
    2019-06-23 20:51:07

    静态类型检查是基于对程序源代码的分析来验证程序的类型安全性的过程。
    动态类型检查是在运行时验证程序的类型安全性的过程。
    另一种解释为
    静态类型 statically: 如果在编译时拒绝ill behaved程序,则是statically typed;
    动态类型dynamiclly: 如果在运行时拒绝ill behaviors, 则是dynamiclly typed。
    例子:

    class A {
        A me() {
            return this;
        }
    
        public void doA() {
            System.out.println("Do A");
        }
    }
    
    class B extends A {
        public void doB() {
            System.out.println("Do B");
        }
    }
    

    比如这段程序,new B().me()返回的是什么?
    是返回B。
    如下代码行是非法的,即使方法doB()是被B对象调用的。问题在于它的引用类型是A,在编译器件,编译器不知道它的真实类型,所以将它当做A类型。

    //illegal
    new B().me().doB();
    所以,只有下面的代码是可以被调用的:

    //legal
    new B().me().doA();
    然而,我们可以将其强制类型转换成B,如下代码:

    //legal
    ((B) new B().me()).doB();
    接下来,我们添加一个C类:

    class C extends A{
    public void doBad() {
    System.out.println(“Do C”);
    }
    }
    那么,下面的代码语句将通过静态类型检查:

    //legal
    ( C ) new B().me()).beBad();
    编译器不知道它的真实类型,但是在运行期间将会抛出异常,因为B类型不能转换成C类型;

    更多相关内容
  • 静态类型和动态类型有什么区别?

    千次阅读 2019-07-01 14:30:25
    编程语言按照类型检查可以分为两大类:**静态类型 (Static Typing) **和 动态类型 (Dynamic Typing)。在现在比较流行的这些语言里,静态类型的代表人物有 Java、C/C++、Golang 等,动态类型有 Python、Ruby 等。 ...

    编程语言按照类型检查可以分为两大类:静态类型 (Static Typing)动态类型 (Dynamic Typing)。在现在比较流行的这些语言里,静态类型的代表人物有 Java、C/C++、Golang 等,动态类型有 Python、Ruby 等。

    静态类型和动态类型有什么区别呢?为什么在程序语言设计时要考虑是静态还是动态?在写代码时,Python 写起来简洁,效率高,可能100行 Java 的程序10行 Python 就能搞定,所以以前我觉得静态类型的语言有点太死板了,不如动态类型的。但是经过这段时间编程语言的学习,不能说一个比另一个好,个有所长吧。这篇文章从3个角度、6个方面对比静态类型和动态类型。

    为什么会有静态类型/动态类型的概念?

    程序都需要进行错误的检查。比如 3 / 0,这个程序会有错误,我们应该在什么时候进行检查呢?

    1. 在写程序时,只要编辑器里出现除以0,报错。
    2. 在编译时,如果检查到了除以0,报错。
    3. 在程序运行时,运行到了除以9,报错。
    4. 不报错,返回无穷大 (+inf.0)。

    不同的语言设计上会选择在这4个过程中不同时候去报错。静态类型和动态类型的区别在于什么时候报类型的错误?,比如说 3 / "a“,静态类型多是在编译时,动态类型多是在程序运行时。怎么报类型的错误呢?语言里会有类型检查的机制,类型检查的目的是避免程序发生一些事情

    编程语言在设计时,要考虑 什么程序要类型检查?怎么执行类型检查?。静态类型和动态类型是这两个问题不同回答的产物。

    从写代码的角度对比

    方便性 Convenience

    静态类型更好:静态类型比较方便,因为不用去检查 x 是不是 number,* 默认只能是 number。

    ; Racket
    (define (cube x) 
      (if (not (number? x)) 
          (error "bad arguments")
          (* x x x)))
    
    (* ML *)
    fun cube x = x * x * x
    

    动态类型更好:动态类型比较方便,因为一个函数可以根据需要返回不同的类型。静态类型却需要去构造一个新的数据类型才能实现。

    ; Racket
    (define (f y) (if (> y 0) (+ y y) "hi"))
      
      
    (* ML *)
    datatype t = Int of int | String of string
    fun f y = if y > 0 then Int(y+y) else String "hi"
    
    fun foo x = case f x of
    		Int i => Int.toString i
    	      | String s => s
    

    更早的发现错误 Catching bugs earlier

    静态类型在编译时就能发现类型上的错误,都不用写 tests,可以比动态类型更早的找到 bug。

    但是喜欢动态类型的人会说,静态类型只能找到"简单"的错误,还是需要写单元测试的,在写单元测试时,肯定就能发现这些"简单"的错误了。

    性能 Performance

    静态类型的程序在运行时更快,因为在编译时已经进行了检测,不需要去储存和检测类型,可以节省程序运行的时间和空间。

    但是喜欢动态类型的人会说,动态类型在性能很关键的部分,可以有一些办法去优化类型的储存和检测,比如说 (let ([x (+ y y)]) (* x 4)),有两个 y,可以只检测一个,4 是一个整数,不需要检测,x 是 y + y 的结果,所以后面的那个 x 也可以不用检测。通过这些方式可以对程序进行一些优化,而不需要像静态类型一样要受到各种类型的限制。

    代码重用 Code Reuse

    动态类型更好:动态类型代码重用率更高,因为没有严格的类型系统,代码可以被不同类型的数据重用。一个最简单的例子

    # Ruby
    def double x
    	x + x
    end
    

    x 可以是数字,把数字翻倍。x 可以是 string,把两个 string 连在一起。

    动态类型中一个 list 里可以有不同的类型的数据,在循环遍历时会,能重用更多代码。

    静态类型更好:静态类型也有代码重用的很多方法,比如泛型,子类型等等。而且一个 list 只有一种类型的数据,可以避免一些难找的bug,也可以避免因为类型自由而滥用一些库。

    原型开发 Prototyping

    动态类型更好:动态类型更适合原型开发,因为在 Prototyping 时,不一定知道确切的数据结构和函数,类型上的自由可以不用在做原型时就确定数据结构,导致了要一直不断的去满足类型的检查,降低了原型开发的效率。

    静态类型更好:虽然效率上不一定比的上动态类型,静态类型能更好的记录整个系统在 Prototyping 的过程中,可以知道整个过程数据类型、数据结构是怎么变化的。如果是跟之前完全不相关的代码,可以直接重写,不需要在之前的做更改。在之前代码不确定的地方,可以用一些表示所有其他类型的方法,比如 | _ => raise Unimplemented

    再开发和维护 Evolution & Maintaince

    动态类型更好:在更改代码时,可以把代码能接受的变得更"宽",比如说修改函数返回类型,调用的代码如果对返回类型没有问题,可以不用更改。静态类型必须要更改所有调用的代码,不能进行局部的测试。

    静态类型更好:动态类型的不用更改旧代码是一个隐患,坊间流传动态类型是「写时一时爽,重构火葬场」,静态类型的类型检查会列出所有需要更改的地方,可以避免一些隐藏的bug。

    总结

    经过这些对比,可以看出静态类型和动态类型各有所长,不能简单粗暴的说一种比另外一种更好。个人而言,我觉得动态类型更适合比较小的程序,像 Python,Ruby,做为脚本语言,能简单快速的写完对文件的处理等。动态类型 Java 和 C++ 则能过支持大型的软件工程项目。

    当然具体选择静态类型或者动态类型,取决于想要什么时候做类型检查?想要什么样的语言特性,并且应该知道选择的 trade-off 是什么样的。

    Reference

    Coursera Programming Languages, Part B Week 3

    展开全文
  • 编程语言 - 强弱/动静态类型

    千次阅读 2020-04-28 12:35:58
    动态与静态类型 要理解一门语言是静态类型还是动态类型,最本质的判断方法是看在什么时间段对类型进行检测。 静态类型的语言会在编译阶段就行检测,动态类型的语言会在运行时做类型检测! 比如C/C++/Go是静态语言,...

    1.应用场景

    了解编程语言的分类及显著的区别, 帮助理解编程语言的本质,和帮助快速学习一门新的语言.

    2.学习/操作

    1. 动态与静态类型

    要理解一门语言是静态类型还是动态类型,最本质的判断方法是看在什么时间段对类型进行检测

    静态类型的语言会在编译阶段就行检测,动态类型的语言会在运行时做类型检测!

    比如C/C++/Go是静态语言,会在编译阶段对类型就行检测,如果检测到不合法的语言,编译阶段就会报错!

    而JavaScript,PHP就是动态语言,编译阶段不会做太多类型检测,而是等到运行时再检测变量的具体类型,这是动态语言性能低于静态语言的一个关键的地方。V8对这种动态性做了大量的优化!

    2. 强类型与弱类型语言

    要理解一门语言是弱类型还是强类型,看变量在运行时,是否能够改变类型。

    比如C / C++ / JavaScript 都可以在运行时将一种类型的变量,改成另外一种类型的,所以他们是弱类型,

    而Java就不能运行过程中修改变量类型,所以是静态语言!

    对于各种语言的类型,你可以参考下图

    举例

    ```
    a = 1
    a = 1.1
    a = ''
    a = []
    a = {}
    ```

    这段代码在JS和Python都是可以执行的,但Python并不是一门弱类型的语言。

    ```
    1 + '1'
    ```

    这代码在JS执行结果是'11',但在Python执行却是报错的,因为Python不理解一个整数和字符串相加的逻辑。
    在JS中,任何两个类型都是可以相加的,但是结果却不是一定是我们想要的。

    补充

    Go 和 Java 类似,它是一门静态的、强类型的、编译型编程语言,为并发而生,所以天生适用于并发编程(网络编程)

    3. 特点[优劣势]

    3.1 动态语言 VS 静态语言

    优点:

    动态语言:不需要进行编译,开发效率比较高,适合快速开发迭代项目,就学习曲线,可能平缓一些,实际上个人感觉也是差不多。

    静态语言: 会做类型检查,质量方面会更好一下,性能方面会更好一些,更适合开发大型项目。

    缺点:

    动态语言:性能方面差一些。

    静态语言: 需要每次执行前,进行编译,开发效率低一些。

    3.2 强类型语言 VS 弱类型语言

    TBD

    图表对比

    后续补充

    ...

    3.问题/补充

    1. Go 与 Python/PHP的对比

    Python/PHP 都是动态语言,而 Go 是静态语言,会做类型检查,可靠性更高。

    开发 Web 应用时,Python/PHP 通常躲在 Nginx/Apache 后面作为后台进程,Go 则提供了内置的 Web 服务器,完全可以直接在生产环境使用。

    -w498

    Python/PHP 之所以要借助额外的 Web 服务器是因为对并发请求的处理,Python 有一个全局锁同时只允许运行一个线程,PHP 本身就没有多线程多进程机制,一次请求从头到位都是一个独立的进程,为了让基于 Python/PHP 的 Web 应用支持并发请求,必须借助外部 Web 服务器。

    而 Go 内置的 Web 服务器充分利用了 goroutine,对并发连接有很好的支持。此外,由于协程的本质是在在同一个进程中调度不同线程,所以还支持共享资源。

    另外就是 Python/PHP 作为动态语言,性能不如 Go,如果要提升 Python/PHP 性能,必须通过 C 语言编写扩展,复杂度和学习成本太高。

    2. 命令式语言一般是指哪些语言呢?

    作者回复:

    1. 所谓“命令式语言”是英文imperative languages的一种翻译。

    命令式的语言的一个特点就是程序员要完成是一件事,需要自己一步一步告诉 机器如何做,即把执行步骤用编程语言的语法罗列出来。

    如今主流的编程语言,如c, c++, java, go, python, ruby,无论是否是静态语言还是动态语言,无论是否支持面向对象编程,本质上都是命令式语言。

    那什么不是命令式语言呢?

    与命令式语言相对的是声明式语言,最常见的就是SQL,它的特点是你只要输入你想要的结果,语言引擎知道该执行什么步骤。历史上还有一种叫prolog的逻辑编程语言也是声明式的,如果对prolog感兴趣,可以看看我参与翻译的《七周七语言》一书。
     

    3. 变量的静态类型动态类型

    20|控制结构:Go中的switch语句有哪些变化?-极客时间

    func main() {
        var x interface{} = 13
        switch x.(type) {
        case nil:
            println("x is nil")
        case int:
            println("the type of x is int")
        case string:
            println("the type of x is string")
        case bool:
            println("the type of x is string")
        default:
            println("don't support the type")
        }
    }

    switch 关键字后面跟着的表达式为x.(type),这种表达式形式是 switch 语句专有的,而且也只能在 switch 语句中使用。

    这个表达式中的 x 必须是一个接口类型变量,表达式的求值结果是这个接口类型变量对应的动态类型。

    什么是一个接口类型的动态类型呢?

    我们简单解释一下。以上面的代码var x interface{} = 13为例,x 是一个接口类型变量,它的静态类型为interface{},如果我们将整型值 13 赋值给 x,x 这个接口变量的动态类型就为 int。关于接口类型变量的动态类型,我们后面还会详细讲,这里先简单了解一下就可以了。

    个人想法,所以,静态类型与动态类型是可以出现在同一个编程语言中的,同一个变量中的。

    4.参考

    12 | 栈空间和堆空间:数据是如何存储的?-极客时间  // 12 | 栈空间和堆空间:数据是如何存储的?

    后续补充

    ...

    展开全文
  • 首先强弱是相对的。 强类型: 每个变量和对象都必须声明类型,在编译时确定好类型了,执行时不能更改。...静态类型: 编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。...

    首先强弱是相对的。

    强类型:

    每个变量和对象都必须声明类型,在编译时确定好类型了,执行时不能更改。偏向于不容忍隐式类型转换。譬如说haskell的int就不能变成double。

    弱类型:

    编译时不确定类型,执行时根据语义确定是哪种类型。通俗地说,弱类型偏向于容忍隐式转换,把不同类型的变量放在一起运算。

    静态类型:

    编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误。

    动态类型:

    编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误。譬如说你不能对一个数字a写a[10]当数组用。

    各种语言强弱和静动态关系:

    展开全文
  • 编程语言一般分为动态类型、静态类型和强类型、弱类型,例如Java是静态、强类型编程语言,而JavaScript是动态、弱类型编程语言。 一、动态类型与静态类型 动态类型语言是运行期间才做数据类型检查的语言,...
  • 理解 TypeScript 的静态类型

    千次阅读 2018-04-20 15:01:01
    这篇博文快速介绍 TypeScript 静态类型的标注。 你将学习什么 阅读本文后,您应该能够理解以下代码的含义。 interface Array<T> { concat(...items: Array<T[] | T>): T[]; reduce<U>( ...
  • C++动态类型与静态类型

    千次阅读 多人点赞 2017-07-21 15:00:45
    大多数情况下对象的静态类型和动态类型相同,我们不用关系二者区别;只有多态情况下,即在有虚函数的继承体系中,通过基类的指针或引用调用虚函数时,这时我们就需要关系指针或引用对象的动态类型,因为它们的静态...
  • 动态类型语言和静态类型语言

    千次阅读 2018-05-24 15:54:33
    https://www.cnblogs.com/liuning8023/p/4286044.html  动态类型语言和静态类型语言本文主要说明动态类型语言和静态类型语言。类型检查所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行...
  • 静态语言: 变量的类型在编译之前就需要确定,在编译的时候需要先编译,将源码转换成目标代码,然后需要运行目标代码程序才能运行,比如C语言。 动态语言:不需要直接指定变量类型,在解释的时候,转换为目标代码和...
  • 另外编程语言除了编译型和解释型,还有静态语言、动态语言、强类型语言、弱类型语言。那么每种语言类型是什么样子的呢,下面让我们来看看吧。  但是在此之前,我们需要先了解一下计算机原因的发展史,从低级语言到...
  • 静态类型检测 1.概念 先要分清楚,强类型和弱类型、静态类型和动态类型是两组不同的概念,类型强弱是针对类型转换是否显示来区分,静态和动态类型是针对类型检查的时机来区分。 静态类型语言和动态类型语言得核心...
  • 所谓静态类型语言,在代码被编译时变量的类型便已确定了 所谓动态类型语言,其变量类型要到程序运行的时候,待变量被赋了某个值才能知道其类型 静态类型语言的优缺点: 优点: 避免程序运行时发生变量类型相关...
  • React 项目使用静态类型检查Flow

    千次阅读 2021-04-07 09:46:38
    代码静态检查4. 常见问题4.1 VSCode 报错:Type annotations can only be used in TypeScript files 1. react项目安装Flow npm/yarn安装,可以全局安装,也可项目安装: npm install -g flow-bin 2. 初始化配置...
  • [C++] 对象的静态类型和动态类型

    千次阅读 2018-05-03 18:10:58
    由于继承导致对象的指针和引用具有两种不同的类型:静态类型和动态类型。静态类型:指针或者是引用声明时的类型。动态类型:由实际指向的类型确定。GameObject *pgo = new SpaceShip // pgo 静态类型是 GameObject*...
  • 静态类型和动态类型检查

    千次阅读 2015-11-06 10:38:17
    1、静态类型和动态类型 如果大家希望学好C++的话那请务必多学习一下c++内部的对象模型,前面有很多博客都是关于这方面的不过都不是自己写的(因为自己很懒)。 举个例子:类A,类B,如果B没有继承A那这就没...
  • 类型系统的一些概念,众说纷纭,使用上也比较乱。有些东西,甚至不好严格定义。以下算学术界的一种相对“严格”的说法。 1. 先定义一些基础概念 Program Errors trapped errors。导致程序终止执行,如除0,Java中...
  • Scala编程 Scala是静态类型

    千次阅读 2018-07-07 22:46:49
    1 通过类型推断避免了冗余性2 通过模式匹配,组织和编写类型的新的方法获取了灵活性3 静态类型系统的经典优越性 1) 可检验属性 2) 安全的重构 3) 文档,静态类型是被编译器检查过的正确的程序文档...
  • python静态类型检查工具mypy

    千次阅读 2022-04-21 14:26:34
    mypy 是 Python 的一个可选静态类型检查器,旨在结合动态(或“鸭子”)类型和静态类型的优点。mypy 将 Python 的表达能力和便利性与强大的类型系统和编译时类型检查相结合。mypy 类型检查标准 Python 程序;使用...
  • C++ 对象的静态类型与动态类型

    千次阅读 2014-12-04 14:19:10
    继承导致对象的指针和引用具有两种不同的类型: 静态类型 和 动态类型 。 静态类型 :指针或者是引用声明时的类型。 动态类型 :由他实际指向的类型确定。   class Base {   } class Derived:public ...
  • Scala教程之:静态类型

    千次阅读 2019-12-16 22:24:42
    Scala是静态类型的,它拥有一个强大的类型系统,静态地强制以安全、一致的方式使用抽象,我们通过下面几个特征来一一说明: 泛类型 型变 类型上界 类型下界 内部类 抽象类型 复合类型 自类型 隐式参数 隐式转换 ...
  • java静态类型与动态类型

    千次阅读 2017-06-13 09:51:13
    静态类型检查:基于程序的源代码来验证类型安全的过程; 动态类型检查:在程序运行期间验证类型安全的过程; Java使用静态类型检查在编译期间分析程序,确保没有类型错误。基本的思想是不要让类型错误在运行期间...
  • 动态类型语言&静态类型语言

    千次阅读 2017-04-14 16:41:56
    静态类型语言概念:意思就是类型判断是在运行前做的(如编译阶段)表现:使用变量前需要声明变量举例:C、C++、Java这些都属于静态类型语言参考:百度百科:http://baike.baidu.com/link?url=oc566smrlmg...
  • 静态类型与动态类型

    千次阅读 多人点赞 2015-06-18 10:05:50
    静态类型 & 动态类型
  • go的静态类型和动态类型

    万次阅读 2018-11-16 20:17:49
    t) } 结果出现编译错误:t.X undefined (type TaskIntf has no field or method X) 注意到, 对于t而言,静态类型是TaskIntf, 动态类型(运行时)是Task. 而在t.X = 1时,编译器会进行静态检查, 故编译错误。 那...
  • 只能在静态类型或顶级类型中才能声明静态方法 原因:出现这种错误多半是因为哪里少了一个大括号,导致大括号不匹配,从而使得静态的方法或属性在类外定义了。 解决方法:仔细检查大夸号的配对情况 ...
  • PHP静态类型变量的销毁

    千次阅读 2019-03-05 20:58:15
    所以,我们要注销一个静态变量,需要重新静态定义该变量为null。 参考如下 : function test() { static $test; $test++; echo($test . " "); //1 unset($test); $test = 2; echo($test . " "); //2...
  • 概念区别 【编译型语言与解释型语言、动态类型语言与静态类型语言、强类型语言与弱类型语言】 文章目录一、编译型语言与解释型语言二、动态类型语言与静态类型语言三、强类型语言与弱类型语言总结 一、编译型语言与...
  • TypeScript(一)TypeScript 的特性(静态类型、弱类型)、编译时报错、安装 文章目录TypeScript(一)TypeScript 的特性(静态类型、弱类型)、编译时报错、安装1. 什么是 TypeScriptTypeScript 的特性类型系统...
  • Python是静态还是动态类型?是强类型还是弱类型? Python是动态的强类型语言 动态还是静态指的是编译期还是运行期确定类型类型指的是不会发生隐式类型转换 为什么要用Python? 胶水语言,轮子多,应用广泛 ...
  • 你把 class Base{ String var="Basevar"; static StrinstaticVar="StaticBaseVar";...只能在静态或顶级类型中才能声明静态字段 void baseMethod(){ System.out.println("Base method"); } static void staticMetho

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,437,810
精华内容 575,124
关键字:

静态类型

友情链接: delphi_mcp2221.zip