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

2016-08-05 12:11:02 +08:00
 quxw

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

7437 次点击
所在节点    程序员
56 条回复
harry890829
2016-08-05 18:04:17 +08:00
@harry890829 看了下 jit 的介绍,也是有个编译的过程吧……
quxw
2016-08-05 19:03:49 +08:00
我的理解
静态类型就是运行过程中,变量的类型不能改变,因为类型固定,并编译运行过程中很多行为都可预测,进而可以优化。
C 是静态 弱类型 强检查
python 是动态 抢类型
Java 是静态 强类型的

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

然而我也并不同意你的观点,涉及到对类型系统的操作,在各种语言中都是比较冷知识的,然而效果差别非常大,所以这简直就是最好的用来描述语言特性的论据。
bdbai
2016-08-06 14:41:58 +08:00
@noli IMHO 动态和静态只是对某个语言特性的总体描述。为了方便,一门静态语言有可能在设计时加入了一点动态成分,总体上并不影响这门语言本身的性质。
C# 或者说 .NET Framework 有 DLR ,这应该算是静态类型系统的一个缺口吧。
ethego
2016-08-07 12:37:52 +08:00
@noli 那是 reference type 和 value type 的区别,只是在这里 python 的 oop 给了 hook 允许你去修改__class__这个属性而已
ethego
2016-08-07 12:46:31 +08:00
@noli 这里的__class__是一个引用,你在 copy 的时候两个实例共用了一个引用,当然会被一起修改了。如果你用 deep copy 就不会出现这种情况了。而你说的那种“新语言”只是把这种 reference type 换成了 value type 而已,和静态类型还是动态类型没有关系。现代程序语言早就已经抛弃了 value type 这样的特性。
franklinyu
2016-08-07 14:07:44 +08:00
@bdbai 「支持反射」和「动态 /静态类型」没关系吧, Java 也支持反射。
franklinyu
2016-08-07 14:13:04 +08:00
@ethego 说得对。我倒是觉得,像他说的那种「并不是直接修改该 __class__ 指向的值,而是 new 一个新的 class 然后把 __class__ 指向这个新的 class 」,在某种意义上是更加的静态了,因为不影响这个类的其他成员。
ethego
2016-08-07 14:21:34 +08:00
@franklinyu value type 有比较严重的性能问题,现在的语言都选择的 reference type
noli
2016-08-07 14:35:34 +08:00
@ethego 你确定,把 copy 改成 deepcopy ,对于我举的例子,会产生变化?
python 2.7.10 和 python3.5.1 不支持你的说法。
ethego
2016-08-07 14:42:07 +08:00
@noli 我没去验证,或许 class 对于 metaclass 来说只能是单例的。但这不影响我有关 reference type 的说法的正确性
noli
2016-08-07 14:56:45 +08:00
@ethego 那你下次记得验证一下再说,"用 deepcopy 就不会出现这种情况“.
ethego
2016-08-07 15:09:27 +08:00
@noli 这句话说出来就好像你之前说的都是对的一样
noli
2016-08-07 15:22:44 +08:00
@ethego 欢迎你指出并指教

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/297333

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX