免费注册 查看新帖 |

Chinaunix

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

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

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

关于那点他确实没说错。试想在C#里只适用dynamic这一种类型,就很像动态类型了。
动态类型确实是只有一种变量类型。既然只有一种,就没什么可检查的了,甚至都不需要提及这个类型。所以会被有些人称为无类型。
Dynamic languages are static languages

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

http://blog.sina.com.cn/s/blog_5d90e82f010177qx.html
我比较喜欢这篇。
——————————————————————————————————————————

对动态语言,如python,下面这个函数究竟返回什么?

def max(a, b):
     return a if a>b else b

如果局限于一点,至多能回答:返回的是一个有 > 方法的对象。


这个帖子里的大部分朋友,恐怕都是被锁死到这里了。




但是,众所周知,模板函数的返回类型无法确定,并不等于某段调用模板函数的代码所返回的类型无法确定。

x=max(1, 3)

现在x的类型知道不知道?

如果传给max的东西是经过N层函数调用才传过来的呢?
对一个大项目,能回答这个问题,显然是至关重要的;而这个问题的答案也是非常简单的:追溯传给max函数的那个对象的由来——它必然是有一个由来的——自然也就知道max返回值的类型了。

这个过程类似C++模板的实例化。

当然,如果传给max的东西无从追踪,就说明max这个“模板函数”没有被调用过(未实例化)。它就继续作为一个无类型的模板库而存在吧。
即便如此,语义分析仍然能告诉我们,这个模板库的参数需要满足什么性质——这只要看该参数在传递过程中被调用过哪些方法即可。


至于eval,它不过也是个“模板库”罢了。

甚至于:
x=eval
switch x.user_declared_type():
....

对以上结构,甚至可以针对每个switch分支,去分析该分支的x应该有什么性质(看它被传递到后端后,被调用的方法即知),从而在编程时给予恰当的提示。

这个过程类似C++模板的特化/偏特化。




很显然,以上种种,都不是什么神秘的高级技术,长了一副大众脸的C++模板相关技术而已。
换言之,所谓的动态类型语言、duck type,其实就是模板化的语言而已——只不过,念叨着这些概念的大多数人并不明白这点。

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

你听说过模块化、分离编译、全局程序分析等概念么?

论坛徽章:
0
44 [报告]
发表于 2012-08-17 13:07 |只看该作者
OwnWaterloo 发表于 2012-08-17 12:57
回复 40# 狗蛋

你听说过模块化、分离编译、全局程序分析等概念么?

但是 Grok 的设计目标不只是检索和分析本机的某一种语言的代码,而是大规模的检索和分析 Google 的所有项目,所有语言,所有代码。这包括 Google 的“四大语言”:C++, Java, JavaScript, Python,一些工具性的语言:Sawzall,protobuf 等,还有一些“build file”和所有第三方的库。Grok 的初期设计目标是一个静态的代码索引服务,只要程序员点击任何一个变量或者函数名,就能“准确”的跳转到它定义的位置。动态的编辑功能稍后也在陆续加入。


无非是40楼帖子内容提到原则的递归应用而已。


甚至,假设X位于一个动态连接库,仍然可以通过分析“build file”把引用到这个库的代码识别出来,从而回答某个编译单元引用到的X究竟是什么。


PS: 我不认为名词很重要;说实在的,我的学习目标是“忘掉名词”,以免被名词晃花了眼,变成个字典。

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

模块化、分离编译、全局程序分析,我都是故意选的C++社区的说法。你认为我是在丢书袋?
你以为你是在忘记名词,但其实不过是在自己的世界里独自麻醉而已。


max(1,2) —— 假设是python2.x —— 必须返回2(int)? 能不能返回2l(long)?  甚至就返回"2"(str)又怎样?
你认为它一定返回int是因为这是max, 这是程序员赋予它的含义而不是语言赋予它的含义。
对一个一般性的函数f(1,2), 如果不继续分析下去 —— 它的函数体,它函数体中调用的函数的函数体 —— 根本无从知晓它的返回类型究竟是什么。
返回类型不属于语言赋予这个函数的接口/约束/规范之一。

然而静态类型里,函数的接口/约束/规范就包含了返回类型。不需要进一步分析,甚至具体调用点都不需要就可以得知这样的信息。


>> 很显然,以上种种,都不是什么神秘的高级技术,长了一副大众脸的C++模板相关技术而已。

max(eval(sys.argv[1]), eval(sys.argv[2]) ), 你用模板实现看看?


你没能摸到编译时与运行时之间的那条界限

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

回复 43# OwnWaterloo


    原来max(a,b)和eval单独都知道,放一块就抓瞎了啊……举一反三有这么难吗?

好吧,我什么都不懂,你说什么就是什么算了。

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

你举个一、反个三给我看看?

  1. print max(eval(sys.argv[1]), eval(sys.argv[2]) )
复制代码
你能仅从源代码代码把这些表达式:

  1. sys
  2. sys.argv
  3. sys.argv[1]
  4. sys.argv[2]
  5. eval(sys.argv[1])
  6. eval(sys.argv[2])
  7. max(...)
复制代码
的类型给分析出来?我真给你跪了。

唯一能分析出来的就是它们的类型都类似C#的dynamic —— 就是动态类型的同义词,等于没说。



狗蛋 发表于 2012-08-17 12:49
http://blog.sina.com.cn/s/blog_5d90e82f010177qx.html
这个帖子里的大部分朋友,恐怕都是被锁死到这里了。


地图炮可以开。水平不过关也至多被称为狂妄。但你后续发言完全是在搞笑啊。

C++的模板是彻底的编译时行为,返回类型必须在编译时确定,不能依靠任何运行时输入。
python中的eval根本是彻彻底底的运行时行为。它的返回类型完全依赖运行时输入,编译时什么都确定不了。
能将这两者扯到一起也真是你这种无招胜有招的人的本事了。

论坛徽章:
0
48 [报告]
发表于 2012-08-17 15:35 |只看该作者
回复 45# OwnWaterloo


    看不懂不要紧,看不懂反而拿自己的狭隘来咬人,这连“狂妄”都谈不上。



谈起什么问题,都需要一个“前提”,都需要一个实用场景。忽视这种前提的抬杠就叫胡搅蛮缠。



比如,对未实例化的max,我认为它相当于一个模板。一旦被传入有明确类型的对象,它的类型就立刻得到确定——我把它叫做“传染”。

然后,对eval,我认为这相当于一个运行时实例化的模板,置之不理即可。

组合起来,eval到max参数,结果仍然不过是个未实例化的模板。




至于eval返回值的类型,这显然是必须在运行时解决的,只有傻子才以为别人连这个都拎不清。
因为它甚至可以接受命令行的手工输入,生成任意对象——这得多傻,才会一厢情愿的以为别人想解决这种问题?

能把别人看傻到这种程度的,要么是狂妄到不知道自己是谁了,要么是推己及人吧。






能做,就做,而且做了会带来很大的方便;不能做,果断放弃。这就叫智者。

至于那些完全摸不清情况、不知道何谓“应用场景”口出不逊的狂妄之徒,恕我懒得在他身上浪费时间。

论坛徽章:
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
49 [报告]
发表于 2012-08-17 15:42 |只看该作者
对于简单的静态类型语言,基本上只要有源代码就可以进行分析,但是对于动态语言,是没办法仅仅根据源代码就进行准确分析的

  1. def f(a,b):
  2.     return a+b
复制代码
很明显,仅通过这个代码片段没有办法确认f返回值的类型,我们还需要准确知道a和b的类型。
在这里a和b就是一个上下文,没有这个上下文就无法分析f
对于像Python这样的动态类型语言,上下文有可能包含运行时的输入,比如说:
  1. f(eval(sys.argv[1]), eval(sys.argv[2]))
复制代码
在这种情况下,脱离开运行期的上下文信息当然无法得知f的返回类型
对代码进行静态分析的本质就是要脱离开运行时的信息去分析代码,所以才叫“静态”分析,反之,运行期的分析叫“动态”分析。

这样的代码当然可以“静态”分析一下:

  1. a=1
  2. b=2
  3. c=a+b
复制代码
不过这种代码大部分只不过是穿着Python马甲的C代码罢了

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
50 [报告]
发表于 2012-08-17 15:49 |只看该作者
狗蛋 发表于 2012-08-17 15:35
回复 45# OwnWaterloo
至于eval返回值的类型,这显然是必须在运行时解决的,只有傻子才以为别人连这个都拎不清。
因为它甚至可以接受命令行的手工输入,生成任意对象——这得多傻,才会一厢情愿的以为别人想解决这种问题?


哦,原来你40楼鬼扯一大通的意思是:你也解决不了这问题啊?
那你40楼说其他人卡是卡在哪了? 没发现后面有什么了不得的见解啊? 居然能将eval与模板搞混,你是来搞笑的吗?

那你40楼说一大堆你认为的、你认为的、你认为的、到底是认为了什么?
就是对max(1,2)能分析出来, 而max(a,b)、f(a,b)、f(eval(input))不属于你所的前提?
就是max(1,2)你也分析不出类型来啊。

你要把max的实现体,max的实现体里调用的函数的实现体全都分析得干干净净?那下面这巴掌就结结实实打你脸上了:
狗蛋 发表于 2012-08-17 15:35
谈起什么问题,都需要一个“前提”,都需要一个实用场景。忽视这种前提的抬杠就叫胡搅蛮缠。


是你搞不懂前提。却自以为得到了就开始鬼扯一通,扯不过了就继续乱绕。
OwnWaterloo 发表于 2012-08-17 12:57
回复 40# 狗蛋
你听说过模块化、分离编译、全局程序分析等概念么?



最后,更专业的发言在30页,你自己好好体会。当然如果你愿意继续当小丑我也不拦你。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP