免费注册 查看新帖 |

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
1 [报告]
发表于 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(|

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

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

论坛徽章:
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
2 [报告]
发表于 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判断那货究竟是函数还是变量这种简单业务- -

论坛徽章:
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
3 [报告]
发表于 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
4 [报告]
发表于 2012-08-17 16:49 |显示全部楼层
回复 56# OwnWaterloo


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

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

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

论坛徽章:
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
5 [报告]
发表于 2012-08-17 18:15 |显示全部楼层
回复 59# OwnWaterloo


    正常的方法是用开发外的方法,比如文档啊,测试啊神马的。

还有一个办法:用子模块,这些函数在某一层里面是公开的,但对上层封闭。上层所有函数都必须带sync神马的。。。

论坛徽章:
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
6 [报告]
发表于 2012-08-17 21:44 |显示全部楼层
回复 62# OwnWaterloo


    python似乎没法线程。

说到下划线,我想到了点什么…主要是以前南京那个项目,下划线的函数随便乱用,还当作不同模块的类似虚函数的东西用…我看到那种代码都快疯了…
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP