免费注册 查看新帖 |

Chinaunix

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

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

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

还恕你不浪费时间,别说得你赢了一样好吗?丢人现眼。

论坛徽章:
0
52 [报告]
发表于 2012-08-17 16:04 |只看该作者
本帖最后由 狗蛋 于 2012-08-17 16:11 编辑

事实上,我用c++的模板来举例子,就是为了怕一些人理解不了何谓运行时。结果,现身说法的果然就来了。


我们可以这样理解静态分析:

  1.    ?1    ?2
  2.    |      |
  3.   ?3    ?4
  4.       |
  5. ?7 max(?5, ?6)
  6.       |
  7.   fun(?8)
复制代码
如上,max(a,b)是模板态,这也是静态所见。

当?5和?6取了某个不能应用 > 运算符的值时,c++的做法是置之不理(哪怕在编译时);python也爱莫能助。直到运行时抛出异常甚至程序崩溃。

但,事实上,通过静态分析,完全可以在编译/运行前就发现?5甚至?3甚至?1是不兼容的类型,并提示代码编写者注意。


类似的,当?1和?2的类型可以静态确认时,?7的类型就得到了。那么,之后涉及?7的任何语句就都可以进行类型检查了。
比如,?8


很显然,除了eval这样极端的例子,动态语言的静态分析一样可以得到它的运行时类型。


————————————————————————————————

当然,有些人会这样玩(我的一个同事就这样做过):
1、要求用户输入一个表达式或者一段脚本或者另外一个C/C++格式的函数
2、编译这个表达式/脚本成汇编代码
3、强制指针类型转换,以函数形式调用编译完的数据

这种能不能静态分析?
当然不能。

如果整个程序都以这种方式写成,C/C++部分只管编译和载入,怎么办?
凉拌。

所以,按照一些人的标准,C/C++也是“动态”语言,一样不能静态分析

论坛徽章:
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
53 [报告]
发表于 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
54 [报告]
发表于 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
55 [报告]
发表于 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
56 [报告]
发表于 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
57 [报告]
发表于 2012-08-17 16:34 |只看该作者
欢迎own前来cpfn当c版版主,共同建设美好家园

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


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

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

反正,额,补全是肯定比不上ctags了= =
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP