免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: meego2012
打印 上一主题 下一主题

[技术动态] 王垠:我和Google的故事 [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
51 [报告]
发表于 2012-08-17 16:12 |只看该作者
回复 49# OwnWaterloo


    我觉得这个课题其实有点用。

关键在于应用场景。人家不是真的想给Python加静态类型H&M神马的。不是的,他是做工具。哪些呢?

- 全文token搜索神马的(比如foo被哪些函数给调用了)
- 代码语义高亮(啥是函数?啥是变量?)
- 静态标记代码bug
- 代码补全(这个可能性都比较小,然而是这个课题能做到最好玩的)

那么,充其量最终分析的结果,可能就只是定性一下“foo是个函数”这种。然而如果遇到这种情况怎么办?

if rand() == 1:
   foo = lambda: 1
else:
   foo = 1

foo到底是不是函数呢?对于1和2应用,其实是不管的,这是一个“使用方协议”,即,假设代码是对的,然后直接在使用的地方(foo(1)神马的)标记。如果不对扔异常神马的,这个东西估计也是看不出来的。

对于最好玩的3和4怎么办呢?宽容分析。上面的代码,证明foo属于一个“类型包”,这个包是(long, func[()->long),总能够分析出一个标识符对应的类型包。有两个特殊包:nil和any,nil代表这个变量根本没被用到(完全不知道类型),any代表类型是任意(比如根据输入决定),同时我们还可以把一些特征放入类型包。比如callable类型包,或者compareable类型包等等。那么假设遇到了这样的情况:

max(|

这时补全就可以直接搜索所有具备<功能的,这里看得到的变量。找到了最好,找不到补全失败也没什么吧?

我觉得这还是应用场景的问题,人家是做工具,不是做编译器。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
52 [报告]
发表于 2012-08-17 16:17 |只看该作者
回复 50# 狗蛋

没人认为python静态类型分析/推导不能做,而是没有实用性。

你所谓的max(1,2)寻根究底就能分析出类型,已经将局部/单文件静态分析上升到全局/所有模块分析。

  1. import mathematics # 为了避免与内建的混淆,故意改个名字
  2. print max(1,2)
复制代码
但导入模块(我还没用__import__)就已经是一个运行时行为。你还分析个屁啊。
你根本就无法在运行前得知它导入的到底是:a录下的mathematics.py

  1. def max(a,b) : return b if a < b else a
复制代码
还是b目录下的mathematics.py

  1. def max(a,b) : return str(b if a < b else a)
复制代码
你只能在若干选项里


如果全局分析里在遇见依赖运行时的行为:

  1. max(argv[1], argv[2])
  2. print (int if argv[1]=="int" else str)(argv[2])
复制代码
你根本就是有心无力。



你以为自己忘记名词很有本事? 以为靠你个人的理解发现的是他人都不知晓的新大陆? 我们都被这问题卡住了? 不过是个我们都公认的常识性前提啊。。。
井底蛙少笑死人了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
53 [报告]
发表于 2012-08-17 16:26 |只看该作者
starwing83 发表于 2012-08-17 16:12
回复 49# OwnWaterloo
关键在于应用场景。人家不是真的想给Python加静态类型H&M神马的。不是的,他是做工具。哪些呢?

问题是王垠的原话就是类型推导

max(| 补全什么的我也见过。
max(| 能推导出类似 Eq a => a -> a -> a 我就没用过有这本事的分析器了。

而且,不是说这东西一定做不出来,而是说不具有实用性
1. 动态类型语言本身就不是为了干这种事而设计出来的, 就不能将分析局限到单一单元中。 速度会随着规模越来越慢。
2. 既然都用动态类型语言了,还去静态分析类型是闹哪样?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
54 [报告]
发表于 2012-08-17 16:33 |只看该作者
本帖最后由 starwing83 于 2012-08-17 16:36 编辑

回复 53# OwnWaterloo


    还不是为了顺个手…………你看我写Lua前,偶尔也ctags一下,虽然打Crea|的时候居然会给我补全出CreateFlags这种东西,不过配合Vim的自动增量补全也还是很好耍的啦……

不过这玩意儿对于ctags来说的确没啥太大的优势= =

关于max的问题,很简单可以解决:
1. 引擎配置文件,原文提到了这玩意儿是个持续性的询问式服务,自然可以通过配置文件判断一些必然的信息,比如调用的是什么库。
2. builtin库类型注入。提供一个清单,里面是hardcoded过的python标准库类型列表,比如eval就是String->any之类的,max是Eq, Eq ->Eq这种。

这样的话,基本上就比较实用了——做网页后端的语法高亮渲染引擎总够了吧?

顺便说一下,他说的类型分析估计撑死了也就是根据foo在(前面就认为foo是个函数这一类的吧。不然不会提到AST,总的来说这货就是个渣,这玩意是建立在”程序一定完全正确“这个基础上的,不过从他想完成的功能来看(为已有代码做查询服务),这个假设也是合理的。

哦,对了,补充一下:对于所有的二进制库(所谓pyd),都必须提供这种手写的类型样例,不然推导就会死翘翘,所以我估计应该是直接根据AST判断那货究竟是函数还是变量这种简单业务- -

论坛徽章:
1
天蝎座
日期:2013-10-07 19:10:56
55 [报告]
发表于 2012-08-17 16:34 |只看该作者
欢迎own前来cpfn当c版版主,共同建设美好家园

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
56 [报告]
发表于 2012-08-17 16:39 |只看该作者
回复 54# starwing83

>> 不过这玩意儿对于ctags来说的确没啥太大的优势= =
是啊,要轻量撑死了就是一个更好的ctags。
要重量级,就得把静态类型语言丢的那些东西全都给加上,比如再加个什么.pyi。

于是动态类型的优势:
>> 还不是为了顺个手…………
在哪里。。。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
57 [报告]
发表于 2012-08-17 16:46 |只看该作者
回复 56# OwnWaterloo


    优势啊…………可以写:

a = ga.window "Demo"

而不是被迫得写:

ga_Window *a = new ga_Window(ga_string("Demo"));

(当然auto能让这个稍微不蛋疼一点)

其实动态的优势就是写起来简单,debug起来会死人……

写起来顺手什么的,有些名字要这么长我有什么办法= =

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
58 [报告]
发表于 2012-08-17 16:49 |只看该作者
回复 56# OwnWaterloo


    要说比ctags好,如果在IDE里面,的确是可以有比ctags好的地方。

比如说吧,确定刚才输完的那一行的缩进神马的,似乎就需要AST了(PS:Python肯定是不行的= =)。。。

反正,额,补全是肯定比不上ctags了= =

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
59 [报告]
发表于 2012-08-17 17:15 |只看该作者
回复 54# starwing83

另外,救命。。。 我已经掉入静态类型的坑里出不去了。。。

在动态类型语言里:

  1. function some_record(v0,v1,...) return {field0=v0,field1=v1,...} end
复制代码
很常见吧? 反正lua又没有真正的record,就必须这么用了。
在有真正的record的语言里,这么用也很,呃,顺手。。。

然后,如果一段时间后这个record的结构变了。。。
【不要吐槽应该隐藏具体实现啦。。。 1) 总有地方需要了解细节  2) 即使一开始就把共有接口描述清楚,它也只是相对稳定一些,但不能说绝对不变】
重点不是应该暴露什么形式的接口什么。。。 重点是如果接口变了。。。
你心里有没有慌乱的感觉?



这是之前的情况。但无论怎样,这样的bug是不太容易藏住的(相对我下面要说的),只要执行到了,总会报找不到域或函数什么的。没执行到就暂时认为是正确的呗。
现在遇到的新情况是,如果忘记改了,哪怕也执行过了,也很难发现。。。
比如在clojure里用软件事务内存(STM)实现一个两账户间转账的函数。细节不重要,重要的是STM需要用dosync开始一个事务。转账函数肯定需要用dosync。
假设后来增加了单个账户的收入和支出函数,然后转账函数用这两个函数实现。依然没问题。
问题出现在如果将收入和支出函数公开了,在转账函数之外被使用了,那就没有dosync了。  遇见这种情况这bug不要找疯去了?

而反观haskell,有没有开启事务,会反应到签名里的。没有开启事务就是STM a,开启了就是IO a。绝对不会用错。
并且进一步的,haskell里就不需要考虑某个函数是否会被公开,是否需要加dosync(实际是atomically)。都不加就是了。所有的函数都是 ... -> STM a的。
然后最终在需要时通过atomically把它粘到main里去。

于是开始反思静"态类型更安全","Haskell代码编译通过通常就能执行正确"等等。。。
这其实已经不仅仅是在检查动态类型语言里的类型,还把动态语言里的一部分逻辑(是否开启事务)给检查了。。。
如果哪天不给用了,(可能要投靠clojure了。。。)心慌。。。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
60 [报告]
发表于 2012-08-17 18:03 |只看该作者
其实就算上下文齐全,做静态分析有时候也很困难,比如这个:

  1. def dft(tree):
  2.         try:
  3.                 for c in tree:
  4.                         for e in dft(c):
  5.                                 yield e
  6.         except TypeError:
  7.                 pass
  8.         yield tree
  9. a=[1, (2, 3), [4, 5, set([6, 7]), 8], 9]
  10. for i in dft(a): print i
复制代码
想想怎么搞?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP