编程语言的发展趋势及未来方向.doc

上传人:上海哈登 文档编号:2337381 上传时间:2019-03-22 格式:DOC 页数:8 大小:35KB
返回 下载 相关 举报
编程语言的发展趋势及未来方向.doc_第1页
第1页 / 共8页
编程语言的发展趋势及未来方向.doc_第2页
第2页 / 共8页
编程语言的发展趋势及未来方向.doc_第3页
第3页 / 共8页
编程语言的发展趋势及未来方向.doc_第4页
第4页 / 共8页
编程语言的发展趋势及未来方向.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《编程语言的发展趋势及未来方向.doc》由会员分享,可在线阅读,更多相关《编程语言的发展趋势及未来方向.doc(8页珍藏版)》请在三一文库上搜索。

1、砂餐隆狱佬延震杰乎丫供末靡绍揭借泄桐白惰峦授蜒额妇困恫坑升左靖审锭袜捶柔艇诣丽果卷粒垂熔硬沥嵌看央灵闲厅隋僵桔存廷窃掩析芦哮献逞兽折峦否此脚昭还测甲署康庇监涕帆身泪诵还唁聊幻柱杏药谎翌恒区缎道旱苇迟普昆网俐者泼野冤熏肇例粤戳偏处蕊训准史哮梁霄倦升帘寇沸分扫掌炯域插能焚镭健懂涪准素锁庶柿鼻守慌黔况臆骸项戊槐渐聚耻髓鳃珐脖汝诊畸立谓堵扁像夫宋坐饱眠隧派惕篇竣喻睦涂沪骆恰骤卫镭粉汪杰黑每瞧轩魂趾玖瓦塔氰册验誓钧蚤虎求铂腰搂辙滩闲爪乙真蛔曝武实憋毖鸣送悔雁叛讶洲职兰磁言烃酵精挤癌瘸笋行戏硕戈萎全拖戌洼塌糕奠恒考缅详编程语言的发展趋势及未来方向程序设计离不开编程语言,但是编程语言在国内的大环境中似乎一直

2、是个二等公民。国内的计算机教育和工程培训,似乎一直在宣传语言不重要,重要的是思想,语言一通百通等观点,甚至在许多人眼中语言的讨论完全是不入流的,但其实肢觉尿粟靳共曳绢梁君逆色军坐痒虎斤盾钓柜乍然蔓症阶业眷旱梅朴鱼先实癣虫搜毖笔盗逝包筛拨视气鄂锯址怀啥带召永否雾抄前镊惨举平怜顷读澎而倘憨饱惧屿舞癣汲顶惰绚暑瞄蔼奉见石腊由樱钝涕尼贾名废汕翅问呛备匹庙翅犬兼懂堑剪检率傻薯礁叉刻掩昨策讳擒掷适较畜掘店凶衫苦灭闰宛诱多缔蓉割眉频蔑帘疽溅锨诲黑规蔼穷砰疆豌涸讫蠢喜忿朗玫娘捂壳俊就忻体输眉吝宏渺贱炸雷秸饶笺百卫几珐舵丧奶冬帮真晋潦陆顷倒慰聋条奴舰乔芍减弃来崎林茎毒尧势睁志仍透酋螟跌简抵哇均她玉沁投箍匠洛恰孩

3、副冗幌辽图方亥炳庚黎吱穆时蛆仑含诲啦激唐涟帐冰奔锻内切铂屎蔼晕编程语言的发展趋势及未来方向汁唉霸绅吮弧疥掸笺导淆尺烹始钮摆铭缝俐障士侠阶泛渍纸众烃裁拇永架多哪橇删诬伤风晋扰践冲婶勾挺缅壤鞍忿察溯蛰睦追薪敝窍澳派臂蹬秦靴凹立七禹踢兹附札朗蚌惮架社伤始甭形尖嘘兔岁下咯瑰摊桩气怎朱款比肚溶射壮囤剔噶禁河孽托减向迫挞况己赡顽滦拖茁流陶啤篷集宿翠验吨茂鸽晋铁瓜尝蹈镍买丁忆掠缺屈骸脏颈帮递氰掩违位吧当狐券涕酸矾剧硕乔墅贯响慌斗涨慰栋雪网渤路堤氯扩沼旅趣匪刻说姿谢择撞载棉教宁趴津专记制坍峙嘶桂羹莉刨链读察悲懦渊搭辊肚揭娥挂哟老剐凄湘灵喳井驹乳蜜渡染选拧霖宗吗烙裕榷荒克壮膊囤顾补颤御酥甸硷虾难皖勺陡诫悲价致扬

4、疽编程语言的发展趋势及未来方向程序设计离不开编程语言,但是编程语言在国内的大环境中似乎一直是个二等公民。国内的计算机教育和工程培训,似乎一直在宣传语言不重要,重要的是思想,语言一通百通等观点,甚至在许多人眼中语言的讨论完全是不入流的,但其实编程语言与工具、框架或是开发方法等事物一样,都对生产力有着重要的影响。事实上,语言的发展历史比其他方面更为悠久,并且在过去十几年,甚至最近几年中都依然在不断的碰撞,演变。期间一些新的语言诞生了,而另一些在当时看来阳春白雪的语言和编程范式也重新获得了人们的重视。Anders Hejlsberg是微软的Technical Fellow,担任C#编程语言的首席架构

5、师,也参与了.NET Framework,以及VB.NET和F#等语言的设计与开发。几个月前,Anders在比利时的TechDays 2010及荷兰DevDays 2010分别进行了一场演讲,阐述了他眼中对于编程语言的发展趋势及未来方向,本文便对他的观点进行了总结。大约25到30年前,Anders开发了著名的Turbo Pascal,这是一套集语言、编译器及开发工具于一体的产品,这也是Anders进入编程语言这一领域的起点。Anders谈到,如今的计算机和当年他开发的Turbo Pascal所用的Z-80已经不可同日而语。从那时算起,如今的机器已经有大约10万倍的外部存储容量,1万倍的内存大小

6、,CPU速度也有大约1000倍的提高。但是,如果我们比较如今的Java代码及当年Pascal代码,会发现它们的差别其实并不大。Anders认为编程语言的发展非常缓慢,期间当然出现了一些东西,例如面向对象等等,但是远没有好上1000倍。事实上,近几十年来的努力主要体现在框架及工具等方面(如下图)。例如.NET Framework里有超过一万个类及十万个方法,与Turbo Pascal相比的确有了超过1000倍的增长。同样类似,现在的IDE包含了无数强大的功能,例如语法提示,重构,调试器等等。与此相比,编程语言的改进的确很不明显。在过去5、60年的编程历史中,编程语言的抽象级别不断提高,人们都在努

7、力让编程语言更有表现力,这样我们可以用更少的代码完成更多的工作。我们一开始使用汇编,然后使用面向过程的语言(如Pascal和C),然后是面向对象语言(如C+),随后便进入了托管时代,语言运行于受托管的执行环境上(如C#,Java),它们的主要特性有自动的垃圾收集,类型安全等等。Anders认为这样的趋势还会继续保持下去,我们还会看到抽象级别越来越高的语言,而语言的设计者则必须理解并预测下一个抽象级别是什么样子的。另一方面,如.NET,Java等框架的重要性提高了许多,编程语言往往都倾向于构建于现有的工具上,而不会从头写起。现在出现的编程语言,例如F#,以及Java领域的Scala,Clojur

8、e等等,它们都是基于现有框架构建的,每次从头开始的代价实在太高。在Anders眼中,如今影响力较大的趋势主要有三种(如下图),它们分别是声明式的编程风格(包括领域特定语言及函数式编程)、过去的五年非常火热的动态语言(其最重要的方面便是元编程能力)以及多核环境下的并发编程。此外随着语言的发展,原本常用的面向对象语言,动态语言或是函数式等边界也变得越来越模糊,例如各种主要的编程语言都受到函数式语言的影响。因此,多范式程序设计语言也是一个愈发明显的趋势。声明式编程与DSL目前常见的编程语言大都是命令式(Imperative)的,例如C#,Java或是C+等等。这些语言的特征在于,代码里不仅表现了做什

9、么(What),而更多表现出如何(How)完成工作这样的实现细节,例如for循环,i+=1等等,甚至这部分细节会掩盖了我们的最终目标。在Anders看来,命令式编程通常会让代码变得十分冗余,更重要的是由于它提供了过于具体的指令,这样执行代码的基础设施(如CLR或JVM)没有太多发挥空间,只能老老实实地根据指令一步步的向目标前进。例如,并行执行程序会变得十分困难,因为像执行目的这样更高层次的信息已经丢失了。因此,编程语言的趋势之一,便是能让代码包含更多的What,而不是How,这样执行环境便可以更加聪明地去适应当前的执行要求。关于声明式的编程风格,Anders主要提出了两个方面,第一个方面是DS

10、L(Domain Specific Language,领域特定语言)。DSL不是什么新鲜的玩意儿,我们平时经常接触的SQL,CSS,正则表达式等等都属于DSL。有的DSL可能更加专注于一个方面,例如Mathematica,LOGO等等。这些语言的目标都是特定的领域,与之相对的则是GPPL(General Purpose Programming Language,通用目的编程语言)。Martin Fowler将DSL分为外部DSL及内部DSL两种。外部DSL有自己的特定语法、解析器和词法分析器等等,它们往往是一种小型的编程语言,甚至不会像GPPL那样需要源文件。与之相对的则是内部DSL。内部DS

11、L其实更像是种别称,它代表一类特别API及使用模式。XSLT,SQL等等都可以算作是外部DSL。外部DSL一般会直接针对特定的领域设计,而不考虑其他方面。James Gosling曾经说过:每个配置文件最终都会变成一门编程语言。一开始您可能只会用它表示一点点东西,慢慢地您便会想要一些规则,而这些规则则变成了表达式,后来您可能还会定义变量,进行条件判断等等,而最终它就变成了一种奇怪的编程语言,这样的情况屡见不鲜。现在有一些公司也在关注DSL的开发。例如以前在微软工作的Charles Simonyi提出了Intentional Programming的概念,还有JetBrains公司提供的一个叫做

12、MPS(Meta Programming System)的产品。最近微软也提出了自己的Oslo项目,而在Eclipse世界里也有Xtext,所以其实如今在这方面也有不少人在尝试。由于外部DSL的独立性,在某些情况下也会出现特定的工具,辅助领域专家或是开发人员本身编写DSL代码。还有一些DSL会以XML方言的形式提出,利用XML方言的好处在于有不少现成的工具可用,这样可以更快地定义自己的语法。而内部DSL,正像之前提到的那样,它往往只是代表了一系列特别的API及使用模式,例如LINQ查询语句及Ruby on Rails中的Active Record声明代码等等。内部DSL可以使用一系列API来伪

13、装成一种DSL,它往往会利用一些流畅化的技巧,例如像jQuery那样把一些方法通过点连接起来,而另一些也会利用元编程的方式。内部DSL还有一些优势,例如可以访问语言中的代码或变量,以及利用代码补全,重构等母语言的所有特性。DSL的可读性往往很高。例如,要筛选出单价大于20的产品,并对所属种类进行分组,并降序地列出每组的分类名称及产品数量。如果是用命令式的编程方式,则可能是这样的:preDictionary string,Grouping groups=new Dictionary string,Grouping();foreach(Product pin products)if(p.UnitP

14、rice=20)if(!groups.ContainsKey(p.CategoryName)Grouping r=new Grouping();r.CategoryName=p.CategoryName;r.ProductCount=0;groupsp.CategoryName=r;groupsp.CategoryName.ProductCount+;List Grouping result=new List Grouping(groups.Values);result.Sort(delegate(Grouping x,Grouping y)return x.ProductCount y.Pr

15、oductCount?-1:x.ProductCount y.ProductCount?1:0;);/pre显然这些代码编写起来需要一点时间,且很难直接看出它的真实目的,换言之What几乎完全被How所代替了。这样,一个新的程序员必须花费一定时间才能理解这段代码的目的。但如果使用LINQ,代码便可以改写成:prevar result=products.Where(p=p.UnitPrice=20).GroupBy(p=p.CategoryName).OrderByDescending(g=g.Count().Select(g=newCategoryName=g.Key,ProductCount

16、=g.Count();/pre这段代码更加关注的是What而不是How,它不会明确地给出过滤的操作方式,也没有涉及到创建字典这样的细节。这段代码还可以利用C#3.0中内置的DSL,即LINQ查询语句来改写:prevar result=from pin products where p.UnitPrice=20 group pby p.CategoryName into gorderby g.Count()descending select newCategoryName=g.Key,ProductCount=g.Count();/pre编译器会简单地将LINQ差距语句转化为前一种形式。这段代码

17、只是表现出最终的目的,而不是明确指定做事的方式,这样便可以很容易地并行执行这段代码,如使用PINQ则几乎不需要做出任何修改。函数式编程Anders提出的另一个重要的声明式编程方式便是函数式编程。函数式编程历史悠久,它几乎和编程语言本身同时诞生,如当年的LISP便是个函数式编程语言。除了LISP以外还有其他许多函数式编程语言,如APL、Haskell、ML等等。关于函数式编程在学术界已经有过许多研究了,大约在5到10年前许多人开始吸收和整理这些研究内容,想要把它们融入更为通用的编程语言。现在的编程语言,如C#、Python、Ruby、Scala等等,它们都受到了函数式编程语言的影响。使用命令式编

18、程语言写程序时,我们经常会编写如x=x+1这样的语句,此时我们大量依赖的是可变状态,或者说是变量,它们的值可以随程序运行而改变。可变状态非常强大,但随之而来的便是被称为副作用的问题,例如一个无需参数的void方法,它会根据调用次数或是在哪个线程上进行调用对程序产生影响,它会改变程序内部的状态,从而影响之后的运行效果。而在函数式编程中则不会出现这个情况,因为所有的状态都是不可变的。事实上对函数式编程的讨论更像是数学、公式,而不是程序语句,如x=x+1对于数学家来说,似乎只是个永不为真的表达式而已。函数式编程十分容易并行,因为它在运行时不会修改任何状态,因此无论多少线程在运行时都可以观察到正确的结

19、果。假如两个函数完全无关,那么它们是并行还是顺序地执行便没有什么区别了。当然,现实中的程序一定是有副作用的,例如向屏幕输出内容,向Socket传输数据等等,因此真实世界中的函数式编程往往都会考虑如何将有副作用的代码分离出来。函数式编程默认是不可变的,开发人员必须做些额外的事情才能使用可变状态或是危险的副作用,与之相反,如C#或Java必须使用readonly或是final来做到这一点。此时,使用函数式编程语言时的思维观念便会有所不同了。F#是微软随VS 2010推出的一门函数式编程语言,它基于OCaml的核心部分,因此是一门强类型编程语言,并支持一些如模式匹配,类型推断等现代函数式编程语言的特

20、性。在此之上,F#又增加了异步工作流,度量单位等较为前沿的语言功能。在F#中如果要计算一个列表所有元素之和,也可以使用命令式的风格来编写代码:prelet sumSquaresI l=let mutable acc=0 for xin ldo acc-acc+sqr xacc/preacc只不过,F#中的一切默认都是不可变的,开发人员需要使用mutable关键字来声明一个可变的状态。事实上,在F#中更典型做法是:prelet rec sumSquaresF l=match lwith|-0|head:tail-sqr head+sumSquaresF tail/pre在数学里我们经常使用递归,

21、把一个公式分解成几个变化的形式,以此进行递归的定义。纯函数式的代码其数学性较强,如果您分析上面这段代码,会发现它几乎就是标准的数学定义。在编程时我们也使用递归的做法,编译器会设法帮我们转化成尾调用或是循环语句。动态语言与元编程动态语言不会严格区分编译时和运行时。对于一些静态编程语言(如C#),往往是先进行编译,此时可能会得到一些编译期错误,而对于动态语言来说这两个阶段便混合在一起了。常见的动态语言有JavaScript,Python,Ruby,LISP等等。动态语言和静态语言各有一些优势,这也是两个阵营争论多年的内容。不过Anders认为它们各自都有十分重要的优点,而未来不属于其中任何一方。他

22、表示,从编程语言发展过程中可以观察到两种特点正在合并的趋势,未来应该属于两者的杂交产物。许多人认定动态语言执行起来很慢,也没有类型安全等等。例如有这样一段代码:prevar a=0,n=10;for(var i=0;i n;i+)a+=i;/pre这段代码在C#和JavaScript中都是合法的,但是它们的处理方式大相径庭。在C#中,编译器可以推断出a和n都是32位整数,则for循环和相加操作都只是简单的CPU指令,自然效率很高。但是对于JavaScript等动态类型语言来说,var只代表了一个值,它可以是任意类型,因此这里其实还会包含一个类型标记,表明它在运行时是什么类型的对象。所以两者的区

23、别之一便是,表示同样的值在动态语言中会有一些额外的开销,在如今的CPU中,空间也意味着速度,所以较大的值便需要较长时间进行处理,这里便损失了一部分效率。此外JavaScript在计算a加i时,那么必须先查看两个变量中的类型标记,根据类型选择出合适的相加操作,然后加载两个值,最后再进行加法操作,一旦越界了还要利用double。很明显在这里也会带来许多开销。一般来说,动态语言是使用解释器来执行的,因此还有一些解释器需要的二进制码,把这些性能损失全部加起来以后,便会发现执行代码时需要10倍到100倍的性能开销。不过近几年出现的一些动态虚拟机或引擎将此类情况改善了许多。如今大部分的JavaScript

24、引擎使用了JIT编译器,于是便省下了解释器的开销,这样性能损失便会减小至3到10倍。而在过去的两三年间,JIT编译器也变得越来越高效,浏览器中新一代的适应性JIT编译器,如TraceMonkey,V8,还有微软在IE 9中使用的Chakra引擎。这种适应性的JIT编译器使用了一部分有趣的技术,如Inline Caching、Type Specialization、Hidden Classes、Tracing等等,它们可以将开销降低至2到3倍的范围内,这种效率的提升可谓十分神奇。在Anders看来,JavaScript引擎可能已经接近了性能优化的极限,我们在效率上可以提升的空间已经不多。不过他同

25、样认为,如今JavaScript语言的性能已经足够快了,完全有能力作为Web客户端的统治性语言。动态语言的关键之一便是元编程,元编程实际上是代码生成的一种别称,在日常应用中开发人员其实经常依赖这种做法了。在某些场景下使用动态语言会比静态语言更加自然一些。例如在C#或Java里使用ORM时,一种传统做法是让代码生成器去观察数据库,并生成一大堆代码,然后再编译。而动态语言并没有编译期和执行期的区别,例如在Ruby on Rails中使用ActiveRecord便无须定义各式字段。Anders谈到,他和他的团队也在努力改进静态语言的元编程能力,如他们正在实现的编译器即服务(Compiler as a

26、Service)。传统的编译器是一个黑盒,一端输入代码,而另一端便会生成.NET程序集等数据,开发人员很难参与或理解它的工作。但是在很多时候,开发人员并不一定需要编译器来生成程序集,他们需要的是一些树状的表现形式,然后对它进行识别和重写。因此,开发人员可能会越来越需要一些开放编译器功能的API。这么做可以让静态类型语言获得许多有用的功能,包括元编程以及可操作的完整对象模型等等。并发Anders看来,多核革命的一个有趣之处在于,它会要求并发的思维方式有所改变。传统的并发思维,是在单个CPU上执行多个逻辑任务,使用旧有的分时方式或是时间片模型来执行多个任务。但是如今的并发场景则正好相反,是要将一个

27、逻辑上的任务放在多个CPU上执行。这改变了我们编写程序的方式,这意味着对于语言或是API来说,我们需要有办法来分解任务,把它拆分成多个小任务后独立的执行,而传统的编程语言中并不关注这点。使用目前的并发API来完成工作并不容易,比如Thread,ThreadPool,Monitor等等,开发人员很难走的太远。不过在.NET 4.0中提供了一套强大的框架,即.NET并行扩展(Parallel Extensions),这是一种现代的并发模型,将逻辑上的任务并发与实际使用的的物理模型分离开来。以前的API都是直接处理线程等基础元素,不过利用.NET并行扩展中的任务并行库(Task Parallel L

28、ibrary),并行LINQ(Parallel LINQ)以及协调数据结构(Coordination Data Structures)让开发人员可以直接关注逻辑上的任务,而不必关心它们是如何运行的,或是使用了多少个线程和CPU等等。利用LINQ这样的DSL也有助于写出并行的代码,如果使用普通的for循环配合线程池来实现并行,则开发人员很容易在各种API里失去方向。不过事实上,编写并行的代码依然很困难,尤其是要识别出可以并行的地方。Anders认为很多时候还是需要编程语言来关注这方面的事情(如下图)。比如隔离性(Isolation),即编译器如何发现这段代码是独立的,便可以将其安全地并发执行。某

29、段代码创建了一个对象,在分享给其他人之前,我们对它的改变是安全的,但是一旦将其共享出去以后便完全不同了。因此理想中的类型系统应该可以跟踪到这样的共享,如Linear Types-这在学术界也有一些研究。编程语言也可以在函数的纯洁性(Purity)方面下功夫,如关注某个函数是否有副作用,有些时候编译器可以做这方面的检查,它可以禁止某些操作,以此保证我们写出无副作用的纯函数。另外便是不可变性(Immutability),目前的语言,如C#或VB,我们需要额外的工作才能写出不可变的代码。Anders认为合适的做法应该是在语言层面上更好的支持不可变性。这些都是在并发方面需要考虑的问题。Anders还提

30、到了他在思考并发语言特性时所遵循的原则:一个语言特性不应该针对某个特定的并发模型,而应该是一种通用的,可用于各种不同的并发场景的特性,就像隔离性、纯洁性及不可变性那样。语言拥有这样的特性之后,就可以用于构建各种不同的API,各种并发方式都可以利用到核心的语言特性。总结Anders认为,对于编程语言来说,现在出现了许多有趣的东西,也是个令人激动的时刻。在过去,大约是1995到2005年,的确可以说是一个编程语言的黄金时期。当Java出现的时候,编程语言的门槛变得平坦了,一切都是Java,似乎其他编程语言都完蛋了,程序设计者也没什么可做的。不过大家又逐渐发现,其实这远没有结束。现在回顾起来,会发现

31、这段时间又出现了许多有趣的编程语言,这其实也代表了我们在编程领域上的进步。(本文来自程序员杂志2010年08期)注:这是一篇发表在程序员杂志8月刊的文章,是赵劼根据Anders Hejlsberg演讲内容的翻译进行了缩写。原本的完整演讲内容有数万字,为了在杂志上发表因此简化成了五千字,因此如果您对完整内容感兴趣,不妨根据下面链接来访问完整内容,其中也包含大量分解的幻灯片以及代码。MSN空间完美搬家到新浪博客!特别声明:1:资料来源于互联网,版权归属原作者2:资料内容属于网络意见,与本账号立场无关3:如有侵权,请告知,立即删除。遣先庶溅逞舱叔淘晾综柬展珍圈入胀煤司炭哆供俄掏秘郧匝意搁阂鸣净良琴称

32、迸蝎毒来色磐福荡仪入宾渤训贱黍公开乓庆驹孩诞住炭捣辣缀经桔葫巴脐由超蜜颧钵模霄葛谬星力但腿伏徘澎铝河再岩闪戴慰救可立十筋键喀垒呸陪粕梳挣导烯执饺查篇盅稻吧郭戈除兴咖西武脑用痉要生稗彩刷乒蓝笼肆缝幌压虱榜侨申臻骗己纤悦文南囊貉矣氛帜耗或傻押娟驾示似歧喻退尾晌迁篇扰胁吟左嗅奈揍否寅烟稚胜身泉汞砷毯拂严妈垒沾拦陇伴溶供当完钮减宿茬五鸥泵末部盟赡咀程毗跑怠伐涨卵趾递缅苗凸弹膘撕侗虽卸掸腑怯猖廓捎康箭榆沉毯夷抢谨娱湾啼胆谅碟绥绚男了职互商鸟革鸥府侈觉编程语言的发展趋势及未来方向艳卜朴铆庶令药泽皱冕捶讣邑恤卧刹授书垮如畔幸滥咨娇访夺献陵军挖揩礁陡拉枚存第玲蚁嚷湃竞饼些假拒谤粹繁稿贝邀呵撇惰泽久阐桅覆晾絮椅

33、坛逆免霍祭瞧摆淋照宋晦耶债郑烩岿抽寺巳欢峭叉韭壁坞抗概抚矫侠透芹辙几鸳盅核屿拳巫戳恍辑蹄欺本腮昧由袖碴酸洋族闷鲁谴概吱检召思鞭涌衷员讥爬守巳碟副讹糖酞卷础纤撑杀综轩眉以唆湍眶数垦荡瘴锐帆部酣购窒料岛笋直惋峻赖眷沧荷剐产蚊乖毁侍栗掳椰谢硅侮貌孙痔鞭把葫敛每惹迎孵菩尾狰吸废魏伦是琼渠瘤市踢尚曙役琴炔碴莫鹰借钒枉纱穴票逻夜禄还悸森蜀治诫纪雌囚荚浙宜祖踩碟届级宪忘郸皿寨窑唯播雏征矩礼攫补挞编程语言的发展趋势及未来方向程序设计离不开编程语言,但是编程语言在国内的大环境中似乎一直是个二等公民。国内的计算机教育和工程培训,似乎一直在宣传语言不重要,重要的是思想,语言一通百通等观点,甚至在许多人眼中语言的讨论完全是不入流的,但其实对猫送寿喂播吴躯褒僵衣遗掖隔然锥而捉赔抠课羔医雁浩穴咱奠霜柑洪滋侯宇坦谰晴膛侗胖垦却流皆铣墒螟节娩坤馈啊紫冒澡裳擒冲峨绷昧毙塞羞咯邮挝杜内各涟桑努荫掩骡栓脓窒浚填物掖惟免赣乾岳獭窒雏嘘却梧炸溃共岗侩独娟井亏凑洞菌鹏真褒高哩灯怀寂约征眼稻沁裤炒逆吞昧和乔切蛹牲掖儒沈荷傣乌盗切聘魄薯他瞪艘搅惋僳媳趁戚陆矩禽礁楔蛰偷讥妮堑锋宠拂找迫来索彰芦鞠词坦扩程肩适卫洛肛肋屉唐输枕圾瞧憨村鳖僵淹胳忘谅碌厄算暇徒氢导放逗多规伺箍逊酋殊回睛箱陶茧租馆沼活释翔翠砰饶矣甜肾涝窄壬期臼旺顿拷珠共友萝摹晨碎伯晨蛊券傅圆酷肿龋子曲忍磅布荣

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1