• 请不要在回答技术问题时复制粘贴 AI 生成的内容
quxw
V2EX  ›  程序员

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

  •  
  •   quxw · Aug 5, 2016 · 8808 views
    This topic created in 3742 days ago, the information mentioned may be changed or developed.

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

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

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

    pypy 是加了 jit 还是一个动态语言
    quxw
    quxw
    OP
    Aug 5, 2016 via iPhone
    23
    我是因为用 pycharm 和 type hint 后,觉得即使 python 变成一本静态语言,写起来变化也不大,反而能提升性能, ide 检查等优势,好像也不错。
    quxw
    quxw
    OP
    Aug 5, 2016 via iPhone
    24
    jit 是处在 解释型 和 编译型 之间的一个概念,和动态静态太大关系吧。
    noli
    noli
    Aug 5, 2016
    25
    @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
    bdbai
    Aug 5, 2016 via Android
    26
    @noli 静态不是绝对的。就拿 C# 来说,它支持反射,还提供了 dynamic 关键字,你能说它是动态么?
    noli
    noli
    Aug 6, 2016 via iPhone
    27
    @bdbai dynamic 关键字实际上什么也没干,只是提示编译器不去检查属性的有效性。这种效果 c++也可以办得到,然而这不影响它的静态类型绑定,只是针对一类特别强大的静态类型的语法糖。然而这好像跟我提的那个问题好像没什么关系
    bdbai
    bdbai
    Aug 6, 2016 via Android
    28
    @noli 我的意思是,不要用某一特殊的特性来判断动态还是静态。
    noli
    noli
    Aug 6, 2016 via iPhone
    29
    @bdbai 我的意思也只是想说明,静态类型还可能有别的理解方式,当然就这个帖子本身,我这个理解是不适合的。

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