论坛首页 海阔天空论坛

和一个CMU的研究生,聊天所记录的东西。

浏览 12862 次
精华帖 (0) :: 良好帖 (0) :: 灌水帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2005-11-14  
下一代编程语言的发展和计算机系统的部署方式


我举个例子,分布式网络的设计和计算,在一学期过后,一般最差的学生,也该用cmu的模型分析工具作过一个以太网的架构设计,具体服务器,客户端接程序的类图设计,并且需要用Java,结合OSI模型第四层,和第三层的协议进行编程。大量的测试和调整网络的路由情况,尤其是局部的负载调整,自己模拟了路由器集群的工作,而这些不要照搬cisco的协议。完全自己分析,反复捕捉一个路由器,一个网络工作,需要哪些东西;比如说,一个第三层的路由协议要自己定义,一个第四层的传输协议要自己做。其实tcp/Ip协议远远不够好, 所以我们在OSI三,四层之间加入了一个物理端口层,这个好处,很直接:即便是2个局域网内都有机器在使用192.168.1.1这样的地址,我们仍然可以直接和它建立通信,而不需要仍和上层的软件客户端/服务器端。

所以,IPv6不一定是未来的主流,而分布式,我很强烈地感觉到是21世界IT的核心。我这是在做编译器,操作系统时得到的启示。而不是仅仅局限于研究网络模型。所以,一个有毅力的计算机研究人员,需要更多地去实践,更多地去关注许多领域的研究,这样才会发现交汇处的核心内容。跨学科大概也是这样,至少计算机领域的发展方向的预见,需要这样的条件。


过去的C语言是面向过程地,C++和java提出面向对象,这些传统语言的变化,实质上这是个数据聚合方式的对象在发生变化,C语言可以说是面向函数,也就是说它的数据聚合方式是以函数为节点,来实现自我进化和遗传的。C++则可以说是更加真实地模拟自然的属性,用类来实现数据的聚合和父系和子代的遗传。然而,有个最重要的问题,一直以来没有得到解决,那就是:无论是面向过程,还是对象,所有的数据聚合体都是被动调用的,这就是冯 若依曼结构的瓶颈。所有的程序执行,从编写,到编译,再到执行,都是调用在做线形运行体系下的非线性同步运行。比如说:进程,线程,包括可以在不同地址上移动的线程,实质上都是线性调用的,这个局面导致我们的程序很难有主动性,很难有自我意识,也就是说很难让它自己思考;至少,每个程序聚合体,如果程序员不指定它的调用机制和场合,它自己是永远不会去执行的。举个例子,我们写了个类,这个类实现了小狗“叫”的功能,如果去执行它,那么小狗就叫了。但是,我们什么时候执行它呢?程序员必须在其他类里面来指定,

比如说,“主人给骨头”这个类。而这个过程,实际上是程序员在一次次指定,来告诉“主人给骨头”这个类去调用“小狗叫”这个类 ,要不,“小狗叫”这个类,即便知道有骨头要叫,但也不会执行呀。因为我们的编译器不会把没有调用的程序安排进整个执行体。这就是用那种高级语言也无法解决的问题,简而言之,程序太笨了。


有些人会说,有必要去让程序便得能够自我激发吗,也就是自我执行?有,在网络的核心当中,处在第三层的路由器集群,每时每刻都在与周边的路由器进行联系,寻找路径,传输数据,并且判断是否有路由器吊线,已做出调整路由列表的决定,而这过过程,从来没有间断过。需要在每一个单一的路由器平台上运行的路由器协议,传输协议具备自我执行的能力。我举个例子:有一台路由器染了病毒,因为美国的黑客倾入,那么整个校园网某个出口上的数据无法送出。 这时下一级路由器需要去询问上级路由器:你到底怎么了?在线吗?能工作吗? 而这个染毒的路由器就像一个发高烧的人,基本上已经可以说是死掉了。它没有能力去回答,因为他的程序是被动去被下一级路由器调用的;等到下一级路由器去询问时(相当于调用),它已经没有能力做出回应了。即便让上一级路由器去主动告诉下一级,也不可能很好工作,因为在他发现自己应该告诉下一级路由器自己异常时,已经坏了。所以,当年在改进cisco公司的IIGRP协议时,首先是提出了划分邻居路由器的概念,而后我们小组提出需要将类的聚合机智智能化,让路由协议的每个类,每个小的agent都能够向小狗那样,知道自己什么时候该叫,什么时候该攻击,什么时候该发出信号,所有小的Agent聚合在不同的domain里。


这个概念,在微软的.Net平台上已经开始运用了。他们提出的C#语言就是这样的管理机制,里面就有线程管理域,但他们绝对不是原创。另外,为了更好地在以太网内建立通信,我指的通信是指在路由协议那一层,就像2个互联的局域网内有2台都使用同一个2级IP的机器,他们可以直接通过第四层协议就看到对方,互相通信。不需什么端口映射机制。这个项目里面有3个首要的问题:一个是编译器的从新构造,需要更多地去研究自然物体的能动属性,国际上叫做Agent,比如小狗有吃,叫,跑等等属性,但都属于反射属性;第二个是编程语言的数据聚合方式地从新设计,类很显然不可能摆脱被别的对象调用的命运,也不可能去主动给子代做遗传;第三个是改进OSI模型;七层很显然是不够了,而现成的tcp/ip协议很显然并不严谨。最后补充一点,就是这样做下来,由于语言原始智能化,2进制代码执行的效率越低,越是智能化,执行效率越低,所以传统的2进制很显然不可以再用。冯式的结构就自然不合适,所以,光电脑的研究也需要跟上;这在国外,越来越成熟,3进制作为光的自然属性,将有利于智能化的语言。


所以,最后归结出,21世纪,不是哪个公司有更多钱,目前低位多高,市场份额多大就可以占据头牌,而是在关键的技术上实现原始创造。这点,CMU一直做得很好;当然以上这些是我论文中很多次写到的,个人的预测。从编译器,语言的设计,结合到网络模型地改进,最后是计算机体系的更新。


而这些,我得出地最后结论是:分布式的计算机系统就是未来的核心。没有什么单纯意义上地网络公司,操作系统公司,系统软件公司。因为,整个互联网通过这种核心地改造——依赖于语言,计算机体系的更新,使得各个大型的路由器核心构成了一个庞大的智能网络。而所有的用户仍然可以用原始的2进制系统,你只需要一个转换设备,连接互联网,其他的处理功能,并不需要赋予个人机器,大家都是通过智能的网络核心来处理,得到你需要的信息。这就是为什么微软要急着推出.Net,他们提出:21世纪,软件的内涵是提供服务,你不需要知道这些东西怎样运作,只需要告诉网络,你需要什么信息,然后自能地给你提供;连数据在哪里,你都不用知道,当然,.Net是不可能完全做到的,因为微软就不怎么样。另外,核心的cisco把握了网络的基础。


作为一个异常热爱计算机的人,我这些感觉,大概形成也用了这么多年学习,实践所归纳的知识。所以,国内应该真正感到危机,我看了2005年国家计算机学科支柱的项目,各个大学的都有;但是没有设计我提到的这些领域。这是危险的开始,很快吧,20年左右,大家应该会发现C++等等不是你正在用的主流语言了。我们的那些研究?机遇应用的研究,基本上是不能长久地。西方人在想什么我不知道,但从那里走回来了,我深深体会到别人真地在做未来需要的科技 。
   发表时间:2005-11-14  
不实验就不可能有创造

我举个例子,计算机寄存器,主存中,在数据线数据位有限的情况下,使用怎样的进制系统,以及怎样的地址编码,才可以达到尽可能高十进制转机器数的效率,以及提高表示精度和增加表示区间,这样的小问题,需要做实验了。当然,我基本上都是用程序模拟。
再举个例子,计算机系的很多老师都需要使用唯一一台打印机,所以在下班前将自己的任务提交到服务器;然后由但cpu进行编队,处理。当然,老师可以指定希望开始执行自己打印需求的时间——者往往不能准时,因为只有一台打印机。好吧,用任意一种语言来模拟这样一个局域网环境,试试在许多老师提交了长度不同的打印文件,以及指定了不同的打印时间的情况下,为你的打印机排队完成所有任务。并且,给出一张时间表,记录下每位老师的任务是在什么时间完成的,与指定时间相差多少。这是一个很有意思的例子,因为我们实际上可以把这个唯一的打印机看成是一个单cpu体系的服务器,那么老师的任务,就是一个个正在就绪,或者杜塞状态的进程,而cpu只具备单线程处理能力。因为,这个问题中的每个进程都要完全暂用系统时钟,当然,为了计算机每个进程具体是在什么时间开始,什么时间结束,同时又为整个cpu计时,我们需要2个异步的系统时钟。这个例子,我就说这么多,具体的细节还有些。
我提这个例子,是因为前年,我看到中科院软件所有为老师在他们的论坛上求一个程序:用C语言模拟以太网络环境下,单线程cpu服务器完成集群消息栈的工作。我记得很清楚,这个老师的帖子贴了5个月,但没有回。需要模拟单线程处理能力的cpu,也就是不具备中断能力。另外一个就是,模拟网络环境下,对来自不同终端的消息收集和处理的数据存储结构。当然,最关键地是用高级语言模拟2个时钟,一个是cpu时钟,一个是进程时钟,两者间要提供信号机制,来联系。这是这个程序的关健吧。差不多吧,呵呵,当然物理的数据结构设计也是关键。这个和我前面提到的打印机的例子,很相似呀;关键是变通,而这个分析问题的能力,源于实验。我记得当时回帖了,程序大概5000行吧,不多,C++写的,但是那个老师没有回来看过,所以我没有办法给他。我有时会笑国内的研究呀,这哪里是做研究;很多东西都是看书学会的,没有实际发觉问题,所以科研能力,怎么能够提高。考试完全是需要的,基础要扎实。我之所以要提,还有个原因,这个打印机的题目,是cmu大学2年级数据结构课毕考的一道经典试验。我做过监考。给学生5个小时,从分析到编程,到测试;一个人完成,要不就是10个小时,弄不完,也不能出实验室。
很多例子,都可以随手举,就看你自己愿不愿意去想了。我现在写程序少点,以前在那里,每天10小时,绝对少不了;书也要读,晚上和凌晨自己想把法读,
我在举个例子,你不是前几天在用hashtable吗?
那么,stl中的那个hashtable,hashmap,你能不能自己写出来?最关键地是散射函数的散射度定在.7,你能不能自己给侧出来,这里的.7是高级语言中0.7的科学写法。能不能给个解释,为什么要省略前面的0?写完了自己的hash,能不能把一个1万词的词库结合“稀疏矩阵”,来任意散射,做出google实验室都达标的3级检索机制。也就是说,对于10万词汇上的词库,我的hash结构能够之需要输入任何一个词汇的前3个字母就推测出具体位置。 这样的数据结构,自己写完了,金山词霸就有差不多了。搜索引擎,大概1星期就可以写出来。我举个例子,一个单词是否属于词库,有5种检查机制
1、将每一个字母逐一替换;
2、将每2个相邻字母逐一调换;
3、将每一个字母逐一删除;
4、在每2个字母中间逐一插入字母;
刚刚讲的检查机制,是和自动纠正语法错误关联,前面的输入字母的检索机制,需要和“3级稀疏矩阵”一同设计。另外,自己设计一个有穷制动机,检测常见语句在分成:主语,谓语,宾语,状语,补语等等语法名词后,所有状态下,可能的语句构造方式,要求3条:能够检测出陈述语句向疑问语句的转化;能够检测出倒装语句;能够检测出双重否定语句。这是基本要求,做完之后,拼装出来:就是一个具备搜索10万词汇,代用语法检查,词汇检查,自动修改的小辞典。这是我大二自己写的一个小实验。但是,比这个简单的实验,cmu也是要求学生考试写的。
我们可以看到一个问题,在构造自动机这一款,现有的编译器所使用的数据聚合方式局限了智能化地表达数据和父系子系遗传,这是我前几天10.7)在群里提到的,所以要改造高级语言。可见我以前提到的那3个方向,都很多方都是有印证地;我深深感触到这些,未来的发展方向呀。
而这种预见能力,完全基于长期观察,实验的基础上,才有可能去构造自己的计算体系;跟在别人后面,死了,都只能搞应用
今天给大家讲的例子,到这。
我提醒一下,在knuth的这套书中,第3卷,对搜索算法研究很多,看看,我提到的一些数据结构,还有方法,他有说明。
0 请登录后投票
   发表时间:2005-11-14  
关于AspectOP


现在讲讲Aspect
在以往面向对象的基础上,提出了一个新的概念:分散关注。对于通用的需求功能,我们把它从许多不相关的“类”中抽取,同时,让许多的基础“类”可以共享这个抽取的数据聚合体的实例,这就是一个简单的继承关系。父类作为原始数据的实体对象,对其他各个类进行遗传,也就是主动让子类继承。这样做,在面向对象的语言中,很常见。有一个很大地好处:在抽取的“类”的行为发生改变的情况下,我们不需要修改许多继承而来的子类,而是在父系中主动修改。AOP中的“方面”就是要主动去关注这种“分散关注”的编程,将许多数据实力的较高层次的数据,抽取,作为一个单独的抽象类,而后,我们在升级程序的过程中,只需要关注这个抽取的类,这就是关注局部的变化,所以,我们把这种技术的思想称为:分散关注。这个分散同时还意味着,可以抽取出很多这样的父类,并且对每个父类进行封装,将我们关注的功能封装进入这个类,这就使AOP编程的核心。在现有的纯面向对象的语言基础上,加以提升。很显然,大家应该是用过这种抽取的机制;比如说,简单意义上的父类和子类的继承关系。我上面提到的,是在一个程序内部,看起来,AOP就是oop,没有什么特别的;我们完全可以说,在内部,oop机制实现了这样的抽取,和共享机制。但是,在程序体作为一个服务器端(这里的服务器端是指提供线程服务的一个接口)。在这个情况下,会有许多客户端的类,要求主动调用服务器端的数据实体。问题是,现在的冯氏结构,无论在有中断参与的情况下,实际程序底层在执行时,都是按线性规则,逐个响应远程/外部类的调用。这样就需要一个调度机制,来安排每个远程的调用进程和被调用进程的执行。如果发生在某一时刻,多个程序调用同一个抽取类的时候,作为计算机底层,需要支持一个加锁机制,让优先权较高的进程锁定抽取类,这个设计,在用OOP实现时,具体可以这样做,创建一个抽象类,所有的访问类继承这个抽象父类。抽象类中:包含这么几个最基本的函数:
abstract class Server {

  abstract void locked();
  abstract void accessDataObject();
  abstract void unlocked();

}
在父类中,有个加锁函数来响应远程客户端的加锁要求,这是OOP最经典的设计方式。但是,有这么几个问题会很快显露出来:
1,accessDataObject(),这个方法,是客户端实际调用的,它是用来实际执行运算的,那么就必须为这个方法提供相应的加锁程序。否则,我们的lock()函数,即便工作了,给第一个请求的进程加锁了,但其他的进程仍然可以调用accessDataObject()来执行,那么,如果一个抽取类中,有多个向accessDataObject()这样的方法,那么就要为每个方法提供加锁的代码,这样很显然,不好,代码重复率高,另外,解锁很费时。
2、向以java为兴起的纯面向对象语言,为了安全和高效率,只为编程经验不够的程序员提供了单继承机制。因此:具体实现数据处理功能的子类只能继承这个抽取类(父类),如果子类还要继承其它抽取类,比如说另外一个如server的父类,将很难轻易实现。
这点,大家明白吗?
……
再说吧,AOP,最重要的不是叫你怎么去关注方面,然后编程。关键是从新构造编译器,在语言中加入这部分的模块。本科毕业的时候,把java的虚拟机从目标码那一层分离,重新定义object类,加入AOP这一块的新类库,重新定义了26个关键字。我刚才讲那些,只是分析;没有这样的一步步深入,哪里摊新技术。我不管你朋友在哪里,总之,不要提她所谓的AOP语言,这样的平台早就有,但不完善。

从来不要去关注每个具体的技术是什么意思,如何去用;要分析实际问题中会遇到的困难,然后自己去实验,加入。java的虚拟机在经过改造后,可以实现一部分AOP的功能。我那时一个人写,就是在做这个。我都说了,还有Agent的OP,这个概念是我自己想的。主要的Agent是面向数据聚合方式的主动执行,和书上介绍的Agent不是一个概念。所以,不管谁讲什么,都可能不一样;自己的,才是关键。中关村,我都没进去过;但我肯定,没有哪个公司有能力做编译器的下一代开发,那你们就等着用我们推出的下一代语言好了。这个事情,我每次和国内的同学说起来,就生气。所以,回去,也是因为这个。这个论坛里的人,都这么沉默,有人讲完了,还是没有实践,没意义。
0 请登录后投票
   发表时间:2005-11-14  
呵呵,前一段时间在一个群上,和一个CMU的聊天,有人记录下来的。
0 请登录后投票
   发表时间:2005-11-14  
什么是CMU?
0 请登录后投票
   发表时间:2005-11-14  
B1-66-ER 写道
什么是CMU?


Carnegie Mellon University?
0 请登录后投票
   发表时间:2005-11-14  
B1-66-ER 写道
什么是CMU?



CMU:Carnegie Mellon University
0 请登录后投票
   发表时间:2005-11-14  
不错。最好转到 技术版。
0 请登录后投票
   发表时间:2005-11-14  
微软之所以要提出.Net,主要是要解决信息孤岛的问题,就是说提供一系列的框架和访问标准,使得基于.Net平台架构的信息系统能够通过标准方式提供便利的互相访问的能力,为信息系统的集成提供更简单更优秀的平台级别支持。而不是要建造什么以大型路由器为核心的智能网络,一劳永逸解决任何问题,微软还不至于那么白。
0 请登录后投票
   发表时间:2005-11-14  
基本判断这个哥们至多是个动手能力很强的程序牛人(究竟是不是光凭这个还看不出来),但不适合搞研究。从文中对agent的说法,觉得这哥们至多看过agent的科普文章,而且属于不超过5000字的那种。而那个Agent OP, Agent Oriented Programming这个概念导入已经有将近15年了。
最大的感慨,是这个哥们对自己并不怎么了解的领域废话太多,感觉上和方舟子有的一拼。而且,也没看到做出什么原创性的东西,基本上是类似于国内有些高校的大实验(但在时间和人数上可能有更严格的限制)。动手做实验很重要,但光凭实验得到的结果和经验,看到的不足就大为感慨,那也太小看这个世界上的那些牛人了,毕竟那些人不是吃干饭的。在一个方向上没读100篇以上的论文,还真不敢乱感慨,很可能自以为得计的一些想法,早就被别人解决了。计算机科学发展了这么多年,拓荒年代早就已经过去了。
0 请登录后投票
论坛首页 海阔天空版

跳转论坛:
Global site tag (gtag.js) - Google Analytics