V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
quxw
V2EX  ›  程序员

如果 python 突然变成 静态类型的 语言?

  •  
  •   quxw · 2016-08-05 12:11:02 +08:00 · 7438 次点击
    这是一个创建于 3039 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在看 type hint ,引发一个脑洞 如果 python 突然变成 静态类型的 语言,会变快吗? 语法简洁的特点会消失吗? 或者其他?

    56 条回复    2016-08-16 08:16:15 +08:00
    ethego
        1
    ethego  
       2016-08-05 12:31:24 +08:00   ❤️ 1
    changshu
        2
    changshu  
       2016-08-05 12:33:00 +08:00
    Cython 欢迎你.
    quxw
        3
    quxw  
    OP
       2016-08-05 12:36:47 +08:00
    @ethego 我看了一下,这个好像只是个检查,底层还是标准的 python
    zhuangzhuang1988
        4
    zhuangzhuang1988  
       2016-08-05 12:39:53 +08:00
    会快, 起码,开发效率会变高..
    妈妈再也不怕我传错参数了, 参数类型了..
    eriale
        5
    eriale  
       2016-08-05 12:45:56 +08:00
    python 3.5 支持 type hint , Pycharm 已经支持了,如果你把参数类型写清楚, pycharm 可以准确找到类型,补全跟 java 一样准确: https://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html
    我个人感觉 type hint 鸡肋,加上了类型信息,只提高了补全精度,感觉不划算。
    yangtukun1412
        6
    yangtukun1412  
       2016-08-05 12:51:34 +08:00
    Cython+1
    linescape
        7
    linescape  
       2016-08-05 13:45:36 +08:00
    你说的不就是 go 么
    clino
        8
    clino  
       2016-08-05 13:47:10 +08:00
    cython +1 楼主可以试试
    noli
        9
    noli  
       2016-08-05 13:51:50 +08:00 via iPhone
    如果我说, python 其实一直都是静态类型的,想知道有多少人会反对。
    ethego
        11
    ethego  
       2016-08-05 14:02:51 +08:00
    @noli 要么你混淆了静态类型和强类型,要么你完全不懂静态类型的概念, python 的类型要在运行时才能确定,怎么可能是静态类型?
    noli
        12
    noli  
       2016-08-05 14:07:05 +08:00 via iPhone
    @raysonx python 是强类型的然后类型是动态绑定的,这个好像大家都没有异议。莫非楼主说的静态类型说的就是动态类型绑定的相对概念?
    ethego
        13
    ethego  
       2016-08-05 14:22:52 +08:00
    @noli 静态类型只有一种理解。
    reus
        14
    reus  
       2016-08-05 15:48:14 +08:00
    怎么变?怎么在编译时确定所有值的类型而不对语言大改大砍?
    这只能叫,设计一个新语言,并起名叫 python 而已。
    wizardforcel
        15
    wizardforcel  
       2016-08-05 16:29:28 +08:00 via Android
    我一直把它当成静态类型写的。。。

    给类型推断的话稍微改改就能通过了。
    roychan
        16
    roychan  
       2016-08-05 16:40:18 +08:00
    CPython 不是个 Python 实现么?跟语言本身的性质有什么关系…
    roychan
        17
    roychan  
       2016-08-05 16:53:23 +08:00
    看错了,请无视我= =
    larme
        18
    larme  
       2016-08-05 17:10:34 +08:00
    harry890829
        19
    harry890829  
       2016-08-05 17:35:14 +08:00
    那个……我问下,静态语言不是必须经过编译成二进制文件才能运行么?这不是最大的区别?
    SlipStupig
        20
    SlipStupig  
       2016-08-05 17:46:50 +08:00
    @harry890829 如果用了 JIT 这种技术,算静态还是动态呢?
    harry890829
        21
    harry890829  
       2016-08-05 18:04:17 +08:00
    @harry890829 看了下 jit 的介绍,也是有个编译的过程吧……
    quxw
        22
    quxw  
    OP
       2016-08-05 19:03:49 +08:00 via iPhone
    我的理解
    静态类型就是运行过程中,变量的类型不能改变,因为类型固定,并编译运行过程中很多行为都可预测,进而可以优化。
    C 是静态 弱类型 强检查
    python 是动态 抢类型
    Java 是静态 强类型的

    pypy 是加了 jit 还是一个动态语言
    quxw
        23
    quxw  
    OP
       2016-08-05 19:10:12 +08:00 via iPhone
    我是因为用 pycharm 和 type hint 后,觉得即使 python 变成一本静态语言,写起来变化也不大,反而能提升性能, ide 检查等优势,好像也不错。
    quxw
        24
    quxw  
    OP
       2016-08-05 19:14:45 +08:00 via iPhone
    jit 是处在 解释型 和 编译型 之间的一个概念,和动态静态太大关系吧。
    noli
        25
    noli  
       2016-08-05 19:49:19 +08:00
    @ethego

    ```
    import copy

    class Foo:
    cls_val = 'Foo'
    pass


    class Bar:
    cls_val = 'Bar'
    pass


    foo, bar = Foo(), Bar()
    bar2 = copy.copy(bar)

    setattr(bar.__class__, 'cls_val2', 'Bar2')
    print(dir(bar.__class__))
    print(dir(bar2.__class__))
    ```


    以上代码,我们可以预见, 两个 print 语句打印的内容是一样的。

    现在,假设有一种语言,执行了像 setatter(bar.__class__) 这样的语句之后,并不是直接修改该 __class__ 指向的值,而是 new 一个新的 class 然后把 __class__ 指向这个新的 class 。

    这种该叫做什么类型的语言?
    bdbai
        26
    bdbai  
       2016-08-05 19:53:16 +08:00 via Android
    @noli 静态不是绝对的。就拿 C# 来说,它支持反射,还提供了 dynamic 关键字,你能说它是动态么?
    noli
        27
    noli  
       2016-08-06 01:55:00 +08:00 via iPhone
    @bdbai dynamic 关键字实际上什么也没干,只是提示编译器不去检查属性的有效性。这种效果 c++也可以办得到,然而这不影响它的静态类型绑定,只是针对一类特别强大的静态类型的语法糖。然而这好像跟我提的那个问题好像没什么关系
    bdbai
        28
    bdbai  
       2016-08-06 11:44:10 +08:00 via Android
    @noli 我的意思是,不要用某一特殊的特性来判断动态还是静态。
    noli
        29
    noli  
       2016-08-06 13:47:26 +08:00 via iPhone
    @bdbai 我的意思也只是想说明,静态类型还可能有别的理解方式,当然就这个帖子本身,我这个理解是不适合的。

    然而我也并不同意你的观点,涉及到对类型系统的操作,在各种语言中都是比较冷知识的,然而效果差别非常大,所以这简直就是最好的用来描述语言特性的论据。
    bdbai
        30
    bdbai  
       2016-08-06 14:41:58 +08:00 via Android
    @noli IMHO 动态和静态只是对某个语言特性的总体描述。为了方便,一门静态语言有可能在设计时加入了一点动态成分,总体上并不影响这门语言本身的性质。
    C# 或者说 .NET Framework 有 DLR ,这应该算是静态类型系统的一个缺口吧。
    ethego
        31
    ethego  
       2016-08-07 12:37:52 +08:00
    @noli 那是 reference type 和 value type 的区别,只是在这里 python 的 oop 给了 hook 允许你去修改__class__这个属性而已
    ethego
        32
    ethego  
       2016-08-07 12:46:31 +08:00
    @noli 这里的__class__是一个引用,你在 copy 的时候两个实例共用了一个引用,当然会被一起修改了。如果你用 deep copy 就不会出现这种情况了。而你说的那种“新语言”只是把这种 reference type 换成了 value type 而已,和静态类型还是动态类型没有关系。现代程序语言早就已经抛弃了 value type 这样的特性。
    franklinyu
        33
    franklinyu  
       2016-08-07 14:07:44 +08:00
    @bdbai 「支持反射」和「动态 /静态类型」没关系吧, Java 也支持反射。
    franklinyu
        34
    franklinyu  
       2016-08-07 14:13:04 +08:00
    @ethego 说得对。我倒是觉得,像他说的那种「并不是直接修改该 __class__ 指向的值,而是 new 一个新的 class 然后把 __class__ 指向这个新的 class 」,在某种意义上是更加的静态了,因为不影响这个类的其他成员。
    ethego
        35
    ethego  
       2016-08-07 14:21:34 +08:00
    @franklinyu value type 有比较严重的性能问题,现在的语言都选择的 reference type
    noli
        36
    noli  
       2016-08-07 14:35:34 +08:00
    @ethego 你确定,把 copy 改成 deepcopy ,对于我举的例子,会产生变化?
    python 2.7.10 和 python3.5.1 不支持你的说法。
    ethego
        37
    ethego  
       2016-08-07 14:42:07 +08:00
    @noli 我没去验证,或许 class 对于 metaclass 来说只能是单例的。但这不影响我有关 reference type 的说法的正确性
    noli
        38
    noli  
       2016-08-07 14:56:45 +08:00
    @ethego 那你下次记得验证一下再说,"用 deepcopy 就不会出现这种情况“.
    ethego
        39
    ethego  
       2016-08-07 15:09:27 +08:00
    @noli 这句话说出来就好像你之前说的都是对的一样
    noli
        40
    noli  
       2016-08-07 15:22:44 +08:00 via iPhone
    @ethego 欢迎你指出并指教
    ethego
        41
    ethego  
       2016-08-07 15:48:09 +08:00 via iPhone
    @noli 我说过了,你混淆了值类型和静态类型的概念
    noli
        42
    noli  
       2016-08-07 16:30:00 +08:00 via iPhone
    @ethego 你从哪里判断我混淆了?因为我问有多少人反对 python 是静态类型?
    ethego
        43
    ethego  
       2016-08-07 17:03:57 +08:00
    @noli 嘴硬,如果你没有混淆,那你 25 楼给出的程序和本贴有关吗?
    bdbai
        44
    bdbai  
       2016-08-07 17:16:24 +08:00 via Android
    @franklinyu 反射这个例子确实举得不好。 DLR 这一点可以吧。
    noli
        45
    noli  
       2016-08-07 19:45:01 +08:00 via iPhone
    @ethego 的确无关,所以我问你这叫什么类型。
    franklinyu
        46
    franklinyu  
       2016-08-08 02:34:50 +08:00
    @ethego 但是我还是比较喜欢像 C++ 那样,让我能够指定使用 value type 还是 reference type 。(中文是叫「值类型」和「引用类型」么?)有一部分性能问题可以用 C++11 的 move semantics 解决,剩下的我会显式指定成引用 /指针。
    franklinyu
        47
    franklinyu  
       2016-08-08 03:02:42 +08:00
    @bdbai {{44L}}:我不了解微软的「动态语言运行时( Dynamic Language Runtime )」,仅仅对 Objective-C 的运行时原理略知一二。你认为,「运行时」的存在会影响这个语言的「动态 /静态类型」的属性;我猜测,是因为我们可以往现有的类里面增加特性?如果是这样,那我认为「可以在变量被定义以后修改变量的 attribute 」并不会让这个语言变成动态类型语言。
    quxw
        48
    quxw  
    OP
       2016-08-08 13:48:39 +08:00
    ![从一本书里翻出来的采访]( https://raw.githubusercontent.com/quxiaowei/7788/master/IMG_0895.JPG "从一本书里翻出来的采访")
    quxw
        49
    quxw  
    OP
       2016-08-08 13:51:50 +08:00
    quxw
        50
    quxw  
    OP
       2016-08-08 13:56:00 +08:00
    quxw
        51
    quxw  
    OP
       2016-08-08 14:11:31 +08:00
    ethego
        52
    ethego  
       2016-08-14 20:25:58 +08:00 via iPhone
    @franklinyu 最后你还是会发现你绝大多数时候都在用指针,毕竟引用类型没有什么明显的问题,值类型就不一样了,在用值类型的时候你必须清楚地知道你在干啥
    ethego
        53
    ethego  
       2016-08-14 20:29:43 +08:00 via iPhone
    @franklinyu 在 java 中,值类型仅被用于一种优化: inline (内联)。任何时候对引用类型的需求都更高,那为什么不默认引用类型?
    franklinyu
        54
    franklinyu  
       2016-08-16 08:13:11 +08:00
    @ethego {{52L}}:「引用类型没有什么明显的问题,值类型就不一样了,在用值类型的时候你必须清楚地知道你在干啥」這個我覺得見仁見智吧,我一般都用值類型,很少建立指針。就算偶爾建立指針,用的也是 smart pointer 。
    franklinyu
        55
    franklinyu  
       2016-08-16 08:13:55 +08:00
    樓上的 @quxw 是網卡了麼
    franklinyu
        56
    franklinyu  
       2016-08-16 08:16:15 +08:00
    Guido 說得挺對的,所以 C++11 加入了 auto
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2573 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:41 · PVG 12:41 · LAX 20:41 · JFK 23:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.