北京今天有雾吗这么早有操作的吗?

再有急跌可操作反弹短期市场出现快速下跌,几个交易日跌了接近200点,目前5日线出现大幅偏离,而且成交量出现大幅萎缩,昨日虽然有反弹,最终还是陷入震荡,根本原因在于强势股的补跌,一般来说,阶段的企稳必然是在强势股补跌之后发生,所以,强势股的补跌是好现象,从上面股指的运行来看,15分钟级别的中枢正在构造中,由于第一段下跌幅度很大,那么该中枢破位则是大概率,受制于量能以及创业板在3月中旬的启动点,大盘在这个地方企稳回升可能性很大,从操作来说,可以在急跌破掉前面低点位置选好股票介入,因为15分钟的背驰的时间和空间都是可以打破T+1的限制的,而不是像昨天5分钟的反弹都被扼杀在T+1的交易机制里面。
评论该主题
作者:您目前是匿名发表 &
作者:,欢迎留言
提示:用户在社区发表的所有资料、言论等仅代表个人观点,与本网站立场无关,不对您构成任何投资建议。用户应基于自己的独立判断,自行决定证券投资并承担相应风险。[计算机编程语言]为什么现在会有这么多种编程语言?_计算机编程语言-牛bb文章网
[计算机编程语言]为什么现在会有这么多种编程语言? 计算机编程语言
所属栏目:
[计算机编程语言]为什么现在会有这么多种编程语言?为什么不能由几种语言进化成几门很大的语言,让这些语言适应很多方面呢?下面就看看www.niubb.net小编为您搜集整理的参考答案吧。网友林建入对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:虽然有很多冠冕堂皇的理由,但是说到底,即使是那些被万千程序员“膜拜”的“伟大的”编程语言,在被创造出来的时候,只不过是某个年轻的学生或者工程师脑子里的一个小小的想法,他们会说:“嘿,其实我觉得程序应该这么表达,你们看好了……”。然后日夜的工作之后,终于有了一个粗糙的语言轮廓。然后由于某些方面成功的设计,确实得到了一些应用。接下来在商业环境或者科研领域获得自己的一席之地。并不断向前发展。事情就这么简单。我们拥有如此之多的编程语言(不完全统计,至少超过一千种以上),一个重要的原因,是因为目前业界发展虽然看似迅猛,但是软件领域在过去几十年里,其理论认识和发展过程,依然远远比不上硬件方面的发展。曾经硬件生产是属于智力密集型的,既需要尖端的知识,特殊的设备,还需要复杂的过程才能生产;如今,硬件生产依然需要特殊的设备、甚至更复杂的过程,但是整个流程已经被高度自动化、系统化、流程化。反过来看看软件行业,我们的程序员在增多,但是制造软件的难度以及软件本身的复杂度却在急剧膨胀并不断向着超出人们控制能力的方向发展。我们的理论却几近贫乏――虽然每年有牛毛一样多的论文,可是“银弹”还是从未被人真正找到。这种矛盾,使得人们更加积极的寻求各种可能的解决方案。一个很重要的探索方向就是,是否能找到一个更好的编程语言,能够解决目前所遇到的各种,或者至少一部分问题呢?于是大量的编程语言出现了。从这个角度来看,编程语言的涌现,是由于人们在软件研发(软件的程序式语言表达)过程中遇到了瓶颈。人们试图突破这些瓶颈因而创造了大量的语言。另一方面,编程语言大量涌现,也和创造编程语言所需的成本较低有关。尽管大部分程序员,对于“编程语言”抱有近乎崇拜的心态,但真相是,创造一门编程语言并将其实现的难度,甚至低于其他一些业务型软件。真的,古人云:“难者不会,会者不难”,确实一针见血。如果你也愿意花费时间去学习,那么就会发现,要实现一门现代编程语言,虽然谈不上非常容易,但是也绝对不是太难――当然,实现是一回事,实现得好又是另一回事了。能运行不代表性能好。当然,这又成了另外一个问题的答案――由于性能糟糕,或者其他致命的缺陷,我们虽然有那么多的编程语言,但是真正实用并被广泛应用的却寥寥无几。说了那么多,总结一下就是,我们遇到了巨大的问题,期待着“救世主”式的编程语言,因此许多人发明了大量的编程语言,积极探索;另外,由于发明编程语言的难度并不如想象的高,因此也导致了编程语言的大量出现。可惜的是,大部分语言都有致命的缺陷,所以市场虽大,但优质商品却依然寥寥无几。探索还在继续。网友张峻对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:下文有参考性,我只是搬运工(图片好像搬不过来,点进链接看吧)Mort | 【译文】程序语言简史(伪)1801- Joseph Marie Jacquard用打孔卡为一台织布机编写指令,在挂毯上织出了“hello, world”字样。当时的reddit网友对这项工作的反响并不热烈,因为它既缺少尾递归调用,又不支持并发,而且甚至都没有注意在拼写时恰当地区分大小写。Jacquard织布机是第一台可进行程序控制的织布机。用打孔卡进行编程的概念,直到电子计算机被发明出来之后仍然被广泛运用。最早的Hello World程序(出自K&R C)打印的是全小写的字符串:"hello, world"。在许多英文技术社区里,不正确地使用大小写发贴会被视作是小白的行为。(如把“Python”拼作“python”,把“FreeBSD”拼作“freebsd”,把“Qt”拼作“QT”)reddit / Hacker News的月经帖标题:“.*: a new .*-based .* programming language”。底下常见的回帖形式:“它支持并发吗?”“没有尾调用优化果断差评。”“现在的编程语言已经足够多了,为什么我们还需要更多的语言?”……1842- Ada Lovelace写了世界上第一个程序。她的努力只遇到了一点点小小的麻烦,那就是:实际上并没有任何计算机能够用来运行她的程序。后来的企业架构师们重新吸收了她的这个技能,用来学习如何更好地使用UML进行编程。Ada Lovelace为Charles Babbage的分析机写了一个计算伯努利数的算法实现,因此被后世公认为是世界上第一个程序员。实际上,分析机由于其设计思想过于先进,在当时根本没有被制造出来。(Babbage的分析机一般被认为是现代电子通用计算机的先驱)讽刺现在的某些“软件架构师”顶多只会纸上谈兵地画画UML。1936- Alan Turing发明了世间一切程序语言的最终形态,但很快他就被英国军情六处“请”去当007了,以至于他根本来不及为这些语言申请专利。与通用图灵机(Universal Turing machine)等价的语言被称为图灵完备的(Turing completeness),它定义了“什么样的语言可以被称作是程序语言”。二战期间Turing曾秘密地为英国军方工作,破解德军的Enigma密码机,并在战后被授予大英帝国勋章。但这项事实直到多年以后才向公众公开。1936- Alonzo Church同时也发明了世间一切程序语言的最终形态,甚至做得更好。但他的λ演算被绝大部分人忽视了,因为它与C语言“不够像”。尽管存在着这样的批评,但事实上,C在当时还没有被发明出来。Church是Turing在Princeton的博士生导师,他在λ演算方面的工作先于Turing指出了不存在一个对可判定性问题的通用解法,这后来证明和Turing针对停机问题提出的图灵机模型是等价的。即著名的Church-Turing论题。说Church“甚至做得更好”,因为λ演算为后世所有的函数式语言提供了理论基础。现在一种常见的关于函数式编程的批评就是:“它们与C语言不够像”。1940年代- 一些直接采用布线和开关来进行程序控制的“计算机”出现了。工程师们当时这么做,据说是为了避开“用空格还是用制表符缩进”这样的论战。据说当时负责设计ENIAC的工程师中间曾经发生过这样的争论:空格比制表符好。制表符比空格好。4个空格比8个空格好。什么?用2个空格的统统烧死。关于这台具有里程碑意义的人类史上第一台电子计算机ENIAC上应该预装何种编辑器,工程师们还发生过这样的争吵:Vim比Emacs好!Emacs比Vim好!强烈推荐Sublime Text。你丫用编辑器的都是找虐,IDE才是王道。没错,要用就用世界上最好的公司微软开发出来的世界上最好的IDE:Visual Studio。我早就看透了无谓的编辑器论战什么的了,我要告诉楼上吵架的,你们全都是傻逼!最后,工程师们一致决定使用布线和开关来为他们即将发明的计算机进行编程,机智地避开了所有这些无谓的争吵,最终齐心协力创造出了人类历史上第一台电子计算机:ENIAC。(鼓掌(图:两位ENIAC程序员在运用敏捷开发方法进行愉快的结对编程。“自从抛弃伴随我多年的Emacs和HHKB Pro、改用布线和开关进行编程之后,我的左手小指麻痹奇迹般地痊愈了。”其中一位接受采访时如是说。另一位则表示:“新的编程方式让曾经专注颈椎病20年的我得到了彻底的康复,不用再整天盯着显示屏,身心同时得到了极大的放松,值得大力推广!”)1957- John Backus和IBM发明了FORTRAN语言。关于IBM或FORTRAN并没有什么特别好笑的地方。除了,写FORTRAN程序的时候不系蓝领带将被编译器视作是一个syntax error。蓝领带、白衬衫、深色西装似乎是IBM公司20世纪经典的dress code。早期FORTRAN(FORTRAN 77)对程序书写格式的要求那是相当严格。(例如,蛋疼的固定格式缩进)1958- John McCarthy和Paul Graham发明了LISP。由于冷战期间的战略括号资源储备所造成的巨大成本,LISP从未流行过。尽管欠缺足够的流行度,LISP(现在叫做“Lisp”,有时叫“Arc”)仍然被视作一门有影响力的语言,在关键的算法思想诸如递归(recursion)和提升逼格(condescension)上尤为典范。(原文的脚注:幸运的是对于计算机科学来说,花括号和尖括号的供应尚充足。“关键的算法思想”这一说法来自于Verity Stob的Catch as catch can。)战略括号储备:据信是因为克格勃对于他们费尽千辛万苦搜集到的程序片段全都是括号感到极端愤怒,于是封锁了世界各地的括号矿产资源,导致白宫方面不得不加强战略浓缩括号的储备。(误LISP发明的那一年Paul Graham其实还没有出生。据说是因为某本叫做《Haste and Waste》的伪程装黑圣典实在太有名了,以至于许多编程小白们把写这本书的传奇人物同Lisp之间画上了等号。提升逼格确实是一种与递归调用同样关键的算法思想。嗯,你懂的。1959- 在输掉了和L. Ron Hubbard之间的一场打赌之后,Grace Hopper和其他几个抖S发明了所谓的“面向Boilerplate的全大写化语言(Capitalization Of Boilerplate Oriented Language,COBOL)”。多年以后,由于一些被误导的、性别歧视主义者对Adm. Hopper关于COBOL的工作的报复,在Ruby技术会议上不时会看到一些厌女主义乃至仇视女性的材料出现。L. Ron Hubbard是山达基教(Scientology)的创始人,二战期间曾与Grace Hopper同样供职于美国海军。(尚不清楚这两人之间有无其他联系)COBOL语言以代码极其冗长和通篇大写字母的书写风格而闻名。Adm. Hopper:Grace Murray Hopper女士的军衔是Rear Admiral Lower Half,即美国海军准将。Ruby技术会议与性别歧视:在09年的GoGaRuCo会议上,有人做了一场题为“CouchDB perform like a pr0n star”的报告,幻灯片演示中使用了大量色情材料,引起了在场的少数女性观众的极大不适(“This was a national conference, not a gathering of teenager boys in a smelly upstairs bedroom!”)。会后,DHH(Ruby on Rails的作者)发推表示“it's "absolutely" appropriate to use porn in a business presentation”。关于其他更多技术会议上出现的性别歧视事件,参见这里。1964- John Kemeny和Thomas Kurtz创造了BASIC,一个为非计算机科学家设计的非结构化的程序语言。1965- Kemeny和Kurtz两人goto到了1964。调侃BASIC语言对行号和goto的无节制滥用。1970- Guy Steele和Gerald Sussman创造了Scheme。他们的工作导致了一系列以《Lambda之究极(Lambda the Ultimate)……》为标题开头的论文发表,并在《Lambda之究极厨房神器》这一篇中达到了最高潮。以这篇论文为基础,开始了一个长年累月的、收视率究极失败的晚间电视购物节目。Lambda们因为其概念相对难以理解而被大众所忽视,直到未来的某一天,Java语言终于让它们变得有名了起来。通过不包含它们这件事情。Lambda之究极神器系列:(Lambda之究极命令式编程、Lambda之究极宣告式编程、Lambda之究极GOTO语句、Lambda之究极Opcode)Guy Lewis Steele, Jr. and Gerald Jay Sussman. "Lambda: The Ultimate Imperative"). MIT AI Lab. AI Lab Memo AIM-353. March 1976.Guy Lewis Steele, Jr.. "Lambda: The Ultimate Declarative". MIT AI Lab. AI Lab Memo AIM-379. November 1976.Guy Lewis Steele, Jr.. "Debunking the 'Expensive Procedure Call' Myth, or, Procedure Call Implementations Considered Harmful, or, Lambda: The Ultimate GOTO". MIT AI Lab. AI Lab Memo AIM-443. October 1977.Guy Lewis Steele, Jr. and Gerald Jay Sussman. "Design of LISP-based Processors, or SCHEME: A Dielectric LISP, or Finite Memories Considered Harmful, or LAMBDA: The Ultimate Opcode". MIT AI Lab. AI Lab Memo AIM-514. March 1979.后来大概有人觉得每次都投一篇正式的paper太麻烦了,于是干脆专门开了一个博客,名字就叫做Lambda the Ultimate。这样他们将来要发《Lambda之究极割草机》《Lambda之究极厕所皮拔子》这样的营销广告就更加方便了。长年累月的收视率究极失败的晚间电视购物节目:也许是在暗讽MIT专注用SICP作为教给CS学生的第一门编程课20余年。众Java程序员:听说Java 8要开始支持lambda了,想来Java真是极先进的……等一下,我先看看lambda是个啥玩意?于是lambda这个“新鲜货”就一下子在主流业界变得流行起来了。1970- Niklaus Wirth创造了Pascal,一个过程式的语言。很快就有人开始声讨Pascal,因为它使用了类似“x := x + y”这样的语法,而不是更为人熟知的类C语法“x = x + y”。尽管存在着这样的批评,而事实上当时C还没有被发明出来。1972- Dennis Ritchie发明了一把射击时能同时向前和向后两个方向发射子弹的绝世好枪。但他对此发明造成的致死和终身残疾数量感到还不够满意,所以他又发明了C语言和Unix。翻译君:……1972- Alain Colmerauer设计了逻辑编程语言Prolog。他的目标是创造一个具有两岁小孩智商的程序语言。为了证明他成功达到了这个目标,他展示了一个Prolog程序,它对于每条查询都会机智地给出相同的回答:“No”。Ask me anything!?- 1973- Robin Milner创造了ML,一个建立在M&M类型理论基础上的语言。由ML衍生而来的SML加上了一套形式语义的规范。当被要求给这个形式语义本身书写一套形式语义时,Milner的脑子爆掉了。其他ML家族的著名语言还包括OCaml,F#,和,Visual Basic。SML的形式语义规范事实上被写成了这样一本书(SML'97):《The Definition Of Standard ML》。ML明显是建立在H-M(HindleyCMilner)类型推断的基础上的,不太清楚原文所说的M&M类型理论是在吐槽神马……Visual Basic近年来吸收了函数式编程里的不少东西(不知道是不是因为受到了F#影响的缘故)。最典型的是它具备和ML相似的类型推断。1980- Alan Kay创造了Smalltalk并发明了“面向对象”这个词。当被问到它的含义时,他回答道:“Smalltalk程序本身就是对象。”当被问到对象是由什么组成时,他回答到:“对象。”当再一次被问到这个问题时,他说“看,它从里到外都是对象。直到你抽出一只乌龟。”Smalltalk的设计从很大程度上受到了Logo的影响。1983- 为了纪念伟大的先辈程序员Ada Lovelace那能够写出永远也无法被执行的代码的彪悍技能,Jean Ichbiah和美国国防部创造了Ada语言。尽管缺乏证据显示有任何重要的Ada程序曾经被完成过,历史学家仍然确信Ada是个成功的公益项目,它让数以千计的国防承包商免于沦落为与黑帮为伍。Ada曾经是美国国防部指定的嵌入式计算机系统唯一开发语言,在其研发上耗资巨大。(国防承包商们于是不用靠贩卖军火给黑帮来维持生计了)虽然有充分的证据显示Ada的整型范围溢出检查失败导致弄坏了欧空局的一枚Ariane 5运载火箭,不过美国国防部发言人对此表示:关我P事。1983- Bjarne Stroustrup把他所听说过的一切都试图嫁接到C上,创造出了C++。最后得到的语言是如此地复杂,以至于程序必须被送到未来去让“天网”人工智能进行编译。编译时间难以容忍。天网开展这项服务的动机仍然不为人知,但来自未来的发言人说道:“没什么好担心的,宝贝。”带着一口奥地利腔的机械口音。有一些来自坊间的推测,所谓的天网只不过是个自命不凡的缓冲区溢出而已。这篇文章写出来的时候,一个被称作C++0x的新标准还遥遥无期。许多编译器对它的支持似乎永远停留在“partial”阶段。请自行脑补终结者里的T-800……无论什么都改变不了C/C++是个经典的“缓冲区溢出语言”的事实。1986- Brad Cox和Tom Love创造了Objective-C,宣称“该语言完美地结合了C的内存安全性与Smalltalk的神奇效率”。现在的历史学家怀疑这两人其实是诵读障碍症患者。“C的内存安全性十分好”。Smalltalk编译出来的程序以低效缓慢著称。1987- Larry Wall在电脑前打了个盹,Larry Wall的脑门子压到了键盘上。醒来之后,Larry Wall深信 ,在Larry Wall的显示器上出现的神秘字符串并非是随机的,那是某种编程语言之程序样例的神谕。那必是上帝要他的先知,Larry Wall,去设计的。Perl语言就此诞生了。1990- 一个由Simon Peyton-Jones、Paul Hudak、Philip Wadler、Ashton Kutcher和善待动物组织(PETA)组成的委员会创造了Haskell,一种纯函数式的、非严求值的语言。Haskell由于使用了Monad这种较费解的概念来控制副作用而遭到了一些批评意见。Wadler试图平息这些质疑,他解释说:“一个单子(Monad)说白了不过就是自函子范畴上的一个幺半群而已,这有什么难以理解的?”素食主义鼓吹者:为了获取食物而不必要地杀死动物是邪恶的;“纯函数式编程”鼓吹者:为了编程而引入不必要的副作用是邪恶的。(科普帖)自函子说穿了就是把一个范畴映射到自身的函子,自函子范畴说穿了就是从小范畴映射到自身的函子所构成的以自函子为对象以自然变换为态射的范畴,幺半群说穿了就是只有单个对象的范畴,给定了一个幺半群则可构造出一个仅有单个对象的小范畴使其态射由幺半群的元素给出而合成由幺半群的运算给出,而单子说穿了就是自函子范畴上的这样一个幺半群。(这都不理解么亲连这种最基本的概念都不理解还学什么编程!)又:“A monad is a monoid in the category of endofunctors(一个单子是自函子范畴上的一个幺半群)”这句话的原出处据信是Mac Lane的这本书:1991- 荷兰程序员Guido van Rossum为了一次神秘的手术而进行了一次阿根廷之旅。回来后他带着一个巨大的颅疤,发明了Python,而被数以军团计的追随者们加冕为“终生大独裁者”,并向全世界宣布“要办到一件事情,只可有唯一的一种方法!”。整个波兰陷入了恐慌。BDFL(Benevolent Dictator for Life):开源社区一种流行的说法,“仁慈的”终生大独裁者。这个说法最早指的就是Guido van Rossum。希特勒在提出建立“纯正的雅利安人国家”“统一的大德意志帝国”并实现了德奥合并之后,翌年便入侵了波兰,引发了第二次世界大战。“我一个人征服了整个欧洲!”(感觉好棒好棒的)1995- 在家门口附近的一个意大利饭馆用餐时,Rasmus Lerdorf意识到他吃的那盘意面正好是一个用来理解WWW万维网的极好模型,而所有的Web应用都应该仿照它们的媒介那样去做。在他的餐巾的背后,他设计出了著名的“可编程超链接Pasta(Programmable Hyperlinked Pasta,PHP)”语言。PHP的文档至今仍然保留在那片餐巾上。PHP最显著的特点就是:代码是可以直接嵌在HTML文档中的。1995- 松本“Mad Matz”行弘创造出了Ruby语言,用来辟谣一些意味不明的、有关澳洲将会变成一片由莫霍克族战士和Tina Turner统治的荒漠的末世预言。该语言后来被它的真正发明者David Heinemeier Hansson重新命名为Ruby on Rails。(关于某个叫松本行弘的人发明了一种叫做Ruby的语言这件事情从未发生过,最好在这篇文章的下一个版本中删掉。- DHH表示)最早关于Ruby的国际会议不是RubyConf,而是每年在澳大利亚举办的OSDConf。这里应该是在吐槽Ruby的杀手级应用Ruby on Rails实在太有名了,以至于超越了原来的Ruby语言本身。Matz并没有为“Ruby”这个名字注册商标――本着开源的黑客精神。而DHH(RoR的作者)却把“Ruby on Rails”这个(包含了“Ruby”字样的)名称注册成了商标,并且阻止别人未经授权使用“Rails”这个名字。(虽然抢注商标对开源来说未必是一件坏事情――Python基金会今年在欧洲还卷入了一场商标之争了不是)假如你从来没听说过的话,莫霍克族战士据说是像这个样子的:而Tina Turner看起来是这个样子的:1995- Brendan Eich读完了历史上所有在程序语言设计中曾经出现过的错误,自己又发明了一些更多的错误,然后用它们创造出了LiveScript。之后,为了紧跟Java语言的时髦潮流,它被重新命名为JavaScript。再然后,为了追随一种皮肤病的时髦潮流,这语言又被命名为ECMAScript。WAT!Wat ― Destroy All Software TalksJavaScript和Java语言没有任何实质上的联系;就像ECMAScript和Eczema(湿疹)没有任何实质上的联系一样。(Brendan Eich曾表示:“ECMAScript was always an unwanted trade name that sounds like a skin disease.”)但很多人觉得其实JavaScript设计中包含的错误还不够多,本着为程序语言的设计贡献更多错误这样的目的,他们群策群力创造出了更多的、JavaScript中未曾成功涵盖的错误。这儿有一个五花八门的列表,以供有志于为程序语言设计的谬误史添砖加瓦的人们参考。1996- James Gosling发明了Java。Java是一个相对繁冗的、带垃圾收集的、基于类的、静态类型的、单分派的面向对象语言,拥有单实现继承和多接口继承。Sun不遗余力地宣传着Java的独一无二不同凡响之处。2001- Anders Hejlsberg发明了C#。C#是一个相对繁冗的、带垃圾收集的、基于类的、静态类型的、单分派的面向对象语言,拥有单实现继承和多接口继承。微软不遗余力地宣传着C#的独一无二不同凡响之处。2003- 一个叫Martin Odersky的醉汉看见了好时瑞森花生酱杯的广告,展示了某个人的花生酱倒入另一个人的巧克力的场景,他忽然有了个点子。他创造了Scala,一种结合了面向对象和函数式编程的语言。这同时激怒了两个阵营的忠实信徒,他们立刻宣布要发动圣战烧死异教徒。(原文请戳:One Div Zero: A Brief, Incomplete, and Mostly Wrong History of Programming Languages)补充:原文的评论中有人尖锐地指出,开头提到的Jacquard可编程织布机不但支持并发(concurrency),而且是一个典型的多线程(multi-threaded)的例子。如你所见,它确实通过良好的同步机制避免了多个thread间产生竞争条件导致死锁,其实可以看作是现代操作系统最早的雏形。(目测此项科技树成果已突破天际)网友蒙面大侠对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:感谢邀请。在计算机还全都是些庞然大物的石器时代,写程序是靠「机器语言」。虽然名字叫做「语言」,实际上用到的就真的只有两个数字 0 和 1(考虑到三进制计算机[1]的话,也许还要算上 -1)而已。一些特定的数字组合,对于计算机来说有特定的意义,会让计算机做出特定的动作――其实我们甚至不该叫它们「数字」,因为它们并不代表任何「数量」,而是代表「模式」(pattern)的信号。这是什么意思呢?就好比你伸出一只手去按钢琴键盘的同一部分,缩起来的指头记作 0,伸开来的指头记作 1,01000 和 11110 按出来的声音是不一样的,计算机接受的数字组合与之类似。 这个指令输入一块小芯片的时候,芯片里面有八坨晶体管组成的小装置被「按下」了,其中第二个被通上高电压,另外七个则是低电压,而这个组合会继而引发更多的、由芯片工程师所预先设计的一系列连锁反应。无数这样的模式数字接踵而至,才最终让你面前的屏幕上出现一些能被人理解的图案来。给计算机输入这种相当于「命令」的数字――称为「指令」――来让它做一些事情,包括处理其他的数字(不管那些数字是真正代表数量的数,还是另一些代表指令的模式),就是编程的本质活动。明白了这一点之后,不妨来猜猜这台 COSMAC ELF 计算机是怎么编程的……嗯,对,是货真价实地靠下面那排开关的上与下来代表 0 和 1,扳好一排之后,按一下左上角的按钮,代表你输入好了一条指令,然后再输下一条。而具体某一个组合能够做什么,在这台计算机上有明确的行为,在其他计算机上却不一定,也就是说,这种从「模式」到「指令」的映射,从最开始就没有一个共同的标准,基本上是各家计算机厂商自行定义,故此同样的一组数字,对于不同型号的计算机来说,有可能代表完全不同的指令――这一点直到今天仍旧没有改变,那些通过金属引脚接受 0 和 1 输入的 CPU 之所谓「指令集」,本质上就是由芯片制造厂商给出的数字组合定义。由芯片设计结构的不同,每种芯片的指令集也就跟着不同,比如常见用于台式计算机的 Intel 芯片指令集就与常见于手持设备的 ARM 芯片指令集不同。你看,「计算机语言」从这一层面开始,区分就已经产生了。用纯数字的机器语言编程的难度可想而知,所以从数字到助记符号的转译很快随之出现,称作汇编语言。比如若是一组数字
可以让芯片把内部的一个存储单位,称作「寄存器 X」,加上一个值 Y,那么不妨就把这组数字和助记符「ADD」对应起来,上面的指令就可以写作「ADD X, Y」这样。一条条类似的指令写成一串,就是一个对于程序的描述。相对于纯数字来说,这是个质的飞跃――终于不必去扳开关了不是吗?而这样的一串字符,可以由专用的小程序来「翻译」成二进制的机器码,也就是真正可以输入处理器去按下晶体管的程序电子信号。当然,每种处理器的汇编语言仍旧是不同的。机器语言、汇编语言的优点在于,每一条指令都几乎对应于芯片能做的一件事,比如一条指令把一个数字从内存转入寄存器,另一条指令给它加上一,第三条指令将它写回内存去――直接对于一块芯片下命令,效率非常高。相应的缺点则是,如果你只是想把一个数字加一,却每次都要连续写三条指令,时间一长非常痛苦。而且既然不同芯片支持的指令集不同,就意味着这块芯片上需要三条命令完成的事情,另一块芯片可能需要不太一样的五条命令。假如能将一部分固定出现的操作,像连续技一样一次性施放,每次只需要打一个指令,却能够在不同结构的芯片上都做同样的事该有多好?换句话说,如果能有一种更倾向于描述需要解决的问题(给一个数字加一)而不是描述计算机具体进行何种操作(读数,加数,写数)的语言,来封装那些不需要关心的细节,把细小步骤想要达成的意图抽象出来,该有多好?所谓「高级」计算机语言就是为了这一目的而出现的。最古老的高级语言有 FORTRAN、ALGOL 和 COBOL,以及一种同样古老但是来源迥异的 LISP(严格来说,LISP 是先作为一种形式语言发明出来,继而人们发现它可以用汇编语言转写给机器执行,后来甚至有专门运行 LISTP 的机器出现[2])。这些都是二十世纪五六十年代出现的语言。所以题目中的说法其实某种程度上并没有错:你可以说目前流行的一切计算机语言,几乎全都是上述四种古老语言的综合演进,而且如果看看 TIOBE 的流行语言榜[3],你会发现这四种语言都好端端地活在它的徒子徒孙中间,LISP 甚至名列第十五,FORTRAN、COBOL 也都没有掉出前五十。就如同芯片从一开始就有很多种类,这些彼此不尽相同的高级语言也都是几乎同时出现――一定要追寻个中原因的话,也许就是「自由市场经济」吧,每个人都有可能(也有资源)去自由地按照自己的想法开发一种语言,不会有(也不应该有)外界的权威从一开始就去限制、整合它们的差异。六十年代到七十年代,人们开始将这几种当时还很年轻的、主要针对科研(除 COBOL 是针对商业)领域的计算机语言加以修饰、扩展和融合。其动机和幅度,主要取决于程序员的实际需求。与当初「不想记住数字」导致汇编语言的出现、「不想重复劳动」导致宏(macro) / 过程(procedure)的出现类似,因为「想要把数据和操作数据的动作组织到一起」,导致语言增添原生支持物件导向(object orientation)的数据类型和语法;「能方便地把一小块功能隔离 / 独立出来,便于维护 / 分享使用」的需求,导致语言的模块化支持(比如 Python 的 import);「方便干净地在局部处理突发意外状况」的需求,导致异常处理(try…catch…finally)机制的出现;「免于手动管理内存」的需求,导致垃圾收集的出现;「将运算(computation)抽象出来」的需求,导致许多语言开始将函数视为类型系统的一等公民;「一件事做到一半时可以跳开去做另一件事然后还能回来」的需求,导致协程(coroutine)的发明…… 当然,并不都是所有的语言特性都是以语言使用者的需求为本,比如 C 就是这样一个例子――它的若干设计最开始只是为了能快速方便地在不同结构的计算机上写出它的编译器来;还有些语言做的一些尝试完全就是「想看看这样有什么效果」而已。总而言之,那是个不断摸索的时代,因为许多事情都没有人做过,所以大家也不知道怎么做才算好。后来计算机逐步小型化并变得廉价,应用范围大幅度扩展到各种产业。工程方面不断有新的应用实践,也会发现新的可以偷懒 / 改进之处,从而产生新的语言特性需求。这种进程如此之快,语言设计者们不可能一下子追踪、汇总所有的需求,总要有所侧重,好在此时语言的种种可能特性都差不多尝试过一遍了,所以新发明的语言往往会侧重于一种特定的方法、制作特定的语言功能,来使得编写某种特定形式的程序特别便利。这就是编程的所谓「范式(paradigm)」。几乎可以说,许多现今很流行的语言从一开始的设计目标,都是支持一种或几种主要的范式,因为许多设计者的最初目的仅仅是想要满足一个小圈子,甚至就是他自己,在某个领域(domain)的需要,而无法预见到它日后的走红。除此之外,语言设计者对于代码的态度也是一个决定因素,比如强调代码应该「易读」、「好维护」呢,还是「易写」、「好编译」?不同的选择会催生完全不同的两种语言。于是接下来的二十年间涌现的语言大都个性鲜明,比如同样作为教学语言出现的 LOGO 和 BASIC 彼此大相径庭――Apple II 计算机上面同时有两种语言、并且可以在两种语言之间切换对我来说是最初的「原来程序语言可以有思路完全不同的很多种」之启蒙――而感谢此前的多年试错,许多语言都学会了遵循着一组特定的准则(principle)来设计,比如著名的 The Zen of Python[4]。可与此同时也不乏有巨匠试图将语言做得大而全,填入很多特性,支持尽可能多的范式,但这种语言也因此而变得畸形而难以驾驭,到最后连他自己都说,「there is a much smaller and cleaner language struggling to get out」。而最终在语言进化之中「胜出」的,并不是那些设计「完美」的语言。Dennis Ritchie 说 C 是「quirky, flawed, and an enormous success」,同样的评语也可以用在许多其他语言上面,比如在统计学和生物信息学领域中大获成功的 R。重要的是,这些语言都能解决领域内的问题。毕竟语言使用者的需求和,呃,计算机语言 connoisseur 们的着眼点完全不同。语言使用者会不惜(或者说「无意识地」)使用最为愚蠢和肮脏的方式来使用一种编程语言,只要它能达到自己需要的效果;语言使用者也轻易不会切换到另一种不熟悉的语言,不论后者可能会在理论上带来多少倍的好处。这就触及到了一个问题:不同的计算机语言拥有不同的「个性」,实际却都是对于最底层 0 与 1 的抽象和封装,只是方式与层级不一样――但人类对于这些方式与层级的选择态度,是非常难以改变的。也就是说,如果把语言抽象和封装的层级排成一列,那么每个人都能在这条线上找到自己的舒适区域(comfortable zone),呆在里面很舒服;抽象程度再高阶一些就会嫌不自由,再低一点却又觉得麻烦――如果这样说不够直观,那么不妨搬一个现成的例子:iOS 设备很好用,老太婆和小孩子都能搞定;但 Android 用户会说它不够「开放」(whatever that means),意思其实就是,认为它封装了太多东西,自己则希望掌控更多细节;可是除了刷 ROM 之外,多数 Android 用户从未给自己的手机写过任何一个程序――即便他对于某个理想中的 app 应该如何运作有着非常高深的见解。既然我们应该允许人们自由决定使用哪一款电子产品,哪怕他们会因此展开圣战、互斥「脑残」,那么容许甚至鼓励不同风格的编程语言并存,也就是顺利成章的事情了。而且人都是会变的,一辈子闷在 comfortable zone 里多无聊呢?A quote for quote's sake:「我就是不喜g舒舒服服的」[5]。所以也许哪天我也会去学学 Haskell,或者,用用 Android。以上内容挂一漏万,如果感兴趣的话,推荐两本书,一本是《Code: The Hidden Language of Computer Hardware and Software》[6],另一本是《Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages》[7]。前者几乎是一本科普读物,但是对于理解计算机许多「何以如此」的问题非常有助益;后者则会带着你浏览几种设计迥异的编程语言,并把它们解决问题的核心思路以及措施解释给你。两本书都值得读一遍,多写点代码,回头再读一遍。[1] http://en.wikipedia.org/wiki/Ternary_computer[2] http://en.wikipedia.org/wiki/Steve_Russell, http://en.wikipedia.org/wiki/Lisp_machine[3] http://www.niubb.netindex.php/content/paperinfo/tpci/index.html[4] http://www.niubb.netdev/peps/pep-0020/[5] http://www.niubb.netquestion//answer/[6] http://www.niubb.netdp/[7] http://www.niubb.netdp/X――呃,这答案在草稿里呆了七个月,虽然仍旧觉得不够那个,可是再不写完,就要过年了……网友szzz对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:(上图计算机语言时间轴,由racket代码(一种Lisp方言)生成) (上图计算机语言时间轴,由racket代码(一种Lisp方言)生成)最近本人因合写《Lisp编程入门》一书,正在整理计算机语言简史,有错误的地方希望高手指正。 以下是内容:附录A.计算机语言简史这里所说的计算机语言特指可以在机器上运行的高级语言,也就是将汇编语言、伪代码、计算语言等排除在外。A.1.第一个计算机语言:FortranFortran I诞生于1957年,由IBM设计,是世界上第一个真正的计算机语言。Fortran I运行于IBM 704计算机上。Fortran I支持:变量(变量名最多6个字符)、If和do语句、格式化IO。不支持:数据类型声明、单独编译子程序Fortran II 发布于1958年,主要对Fortran I的编译器做了优化,并支持了单独编译的子程序。Fortran IV发布于1962年,并在1966年被标准化为Fortran 66,这也是第一个Fortran的标准化版本。1978年的Fortran 77是非重要的标准化版本,这时的Fortran语言已经大量的引进了其他计算机语言的特点,例如字符串处理、逻辑判断、带else子句的if语句等。Fortran的最新标准化版本是Fortran 2008。Fortran的设计思想基于冯诺依曼体系结构是命令式语言的鼻祖。A.2.源于数学的计算机语言:Lisp人工智能语言IPL(Information Processing Language)诞生于1956年。IPL相当于一种假想的计算机的机器语言,这种计算机是以列表处理为基础,这有别于冯诺依曼体系结构。IPL的关键是证明了:基于列表处理的计算机的可行性。1958年夏,约翰.麦卡锡在IBM研究代数表达式的微分运算时,产生了一系列对语言需求,包括:用数学函数控制流程的方法(即,递归和条件表达式);列表的自动分配;废弃列表的隐士回收。这些语言需求,显然IPL不能满足,所以需要设计新的语言。1958年秋,麦卡锡在MIT成立了人工智能小组,开始着手设计这种新的列表处理语言。这最终导致1960年,Lisp的诞生。1960年的Lisp并没有来得及设计自己的语法,就被麦卡锡的学生实现了,因为没有语法,麦卡锡的学生就以列表格式的语法分析树(即,S(Symbolic)表达式)作为临时语法。 但没有想到的是随着Lisp语言广泛流传,这种语法被程序员迅速介绍,并发现了其独特的魅力。麦卡锡希望Lisp的语法是数学表达式的元语言,命名为M(Mate)表达式,类似于后面的ML语言的语法。但是这种想法遭到了当时Lisp程序员的反对,最后麦卡锡开了MIT,从此Lisp的语法凝固在S表达式上。Lisp建立在列表和lambda演算和基础上,是函数式编程的鼻祖。A.3.通用科学计算语言:AlgolAlgol 58年诞生于1958年,由苏黎世会议制定。是第一个设具体机器无关的计算机语言。随着Fortran的诞生,其他一些语言也在开发中,这些语言的语法格式各不相同,而且和Fortran一样,都与运行它们的具体计算机关联(比如标示符长度、代码行数的限制等)。用这些语言写的代码很难交流。于是Algol 58在Fortran I的基础做了扩展,并兼容了当时其他语言的一些特性,成为了程序设计思想的集成。Algol 60,发表于1960年,在Algol 58的基础上做了重大改进:移入块结构、 支持两种子程序参数传递(按值传递和按名传递)、允许递归、支持本地数组(在栈上分配数组)。Algol 60是命令式语言的一个里程碑。Algol 在设计之初,就定下:语法应当尽可能接近数学记法,的目标。这就使得Algol 60语法格式几乎影响到后来所有的计算机语言,并且Algol 60是很多文献表达算法的唯一正式方式。Algol 60是后来所有计算机语言语法的鼻祖,但Cobol除外。A.4.通用商务语言:COBOLCOBOL 语言于1960年发布。注意真对商务应用。语言的设计理念是:“数学程序应该用数学记法来写,数据处理程序应该用英语语句来写”。 商务应用显然属于后者,所以COBOL 语言看起了就像是全大写的英语。COBOL创造了一些新概念:宏(DEFINE)和数据结构(记录)。COBOL在商务领域被广泛的使用。COBOL对后来的语言几乎没有影响,但PL/I除外。A.5.跨领域语言:PL/I之前的所有语言都是领域特定语言,例如: 人工智能领域的Lisp、科学计算领域的Algol 60,商务应用领域的COMBOL等。PL/I诞生于1964年,是跨科学计算和商务应用领域的计算机语言。PL/I是Algol 60、Fortran IV、COBOL的结合体。A.6.面向对象的起源:SIMULA 671964年,在挪威计算机中心诞生了SIMULA I,然后不断的做改进最终于1967年,产生了SIMULA 67。SIMULA 67是对Algol 60的扩展,是第一个定义类结构的语言,这也被认为是面向对象的起源。将命令式编程中的数据和数据的有关函数集成在一起,就形成了面向对象编程中的对象,而对象的类型就是类。将命令式编程中主程序调用子程序的从属关系,变为面向对象编程中对象之间互相发送消息的平等关系。A.7.正交设计:Algol 68Algol 68,发表于1968年,第一个引入正交化设计的概念,以及用户自定义数据类型。A.8.初学者的语言:BASICBASIC语言诞生于1971年,设计的主要目的是:使得计算机语言可以被非理工科生使用(当时理工科学生使用的Fortran和Algol 60很难被文科生掌握)。这样的设计目的使得BASIC非常适合于初学者。BASIC来自于Fortran IV,语法受到Algol 60影响。是BASIC是第一个被广泛使用的分时处理语言。A.9.学院派语言:PascalPascal语言诞生于1971年,来自于Algol 68。Pascal重大影响来自于程序设计教学。它的出现取代了Fortran作为程序设计入门语言的地位。Pascal在工业界也有广泛的使用。A.10.系统语言:C贝尔实验室的UNIX操作系统,最初版本使用汇编语言写成,并1970年,在UNIX上实现的第一个高级语言叫做B语言,B的目的是:用于开发UNIX系统程序,以及新版本的UNIX操作系统。B以BCPL语言为基础。BCPL,诞生于1967剑桥大写,它的祖先是1962年诞生诞生于同一所大学的CPL语言。B和汇编一样数据类型就是机器字,这极大的限制了B程序在不同位数的机器之间的迁移。B的这种不可一致性导致了C的产生。C语言就是B的改进版本,同样以BCPL基础,诞生引入了Algol 68的特点,使得C语言称为了一个可移植系统程序语言。C语言语法中对操作符的大量灵活的使用,极大的印象了后来的一批程序语言。A.11.逻辑语言:PrologProlog诞生于1972年,是逻辑式编程的鼻祖。所谓逻辑式编程,就是以形式逻辑的方式将计算过程传递给计算机。A.12.极简主义:SchemeScheme作为一种Lisp方言,同样诞生在MIT,时间是1975年。Scheme第一个引入词法作用域,延续体,闭包等概念。并将数据和函数等同对待。Scheme的简约优美使它博得了计算机语言皇后的桂冠,并与另一个以优雅著称的Pascal一起成为教学语言。Scheme是函数式语言主要用于数学算法教学,Pascal是命令式语言主要用于程序设计教学。A.13.Algol式语法的函数式语言:MLML诞生于1979年,ML开创了以Algol作语法的函数式语言的先河。A.14.强类型惰性纯函数式语言:HaskellHaskell是1990年标准化Miranda语言的结果。Miranda诞生于1986年,部分基于ML语言。Haskell最大的特点是惰性求值。A.15.支持面向对象的函数式语言:OCamlCaml诞生于1996年,基于ML和Haskell。OCaml是Caml的面向对象版本,发布于2006年。F#是基于OCaml的.NET平台版本,发布于2010年。A.16.嵌入式语言:AdaAda语言诞生于1980年,是嵌入式系统应用语言。Ada 83是1983年的标准化版本。1995年的,Ada 95标准语言在ARM中定义。Ada的最新版本是Ada 2005。Ada广泛的用于商务、国防航空和交通运输等领域。A.17.纯面向对象语言:SmalltalkSmalltalk语言诞生于1980年,是第一个完全支持面向对象编程的语言。Smalltalk源于SIMUAL 67,完善并定义了消息发送,和对象的继承关系。在Smalltalk中,所有数据都是对象:消息的发送者,消息的接受者,消息,消息的结果…。对象的类型是类。类中可以定义方法,属性等。A.18.命令式面向对象语言:C++C++诞生于1983年,是在C的基础上,以SIMUAL 67的方式对命令式编程的面向对象扩展。C++的成功在于完全兼容C的情况下支持了面向对象,从而使面向对象编程成为了命令式编程的一个子类,传统的命令式编程被叫做面向过程编程。因为对C的完全兼容,ASNI在1989年的标准化版本C 89,合并的两种语言,叫做C/C++。C/C++的最重要版本是1999年的C 99。几乎吸收了当时被认为比较有效的计算机语言特性:面向过程编程、面向对象编程、泛型编程、自定义操作符重载等。C/C++的最新是2011年发布的C 11。引入的lambda表达式,垃圾回收等机制。由于C/C++吸收了太多的语言特性,使得C/C++成为世界上最难精通的语言,没有之一。C/C++是目前使用人数最多的语言,和它一直竞争的是Java。A.19.原型面向对象语言:SelfSelf诞生于1986年。Self源自于Smalltalk。Self对面向对象做了深入与研究,提出了“万物皆对象”的思想。它删除了面向对象概念中的类的概念认为类也是一种对象;消息仍然作为最基本操作;把对象的属性理解为获取或更改属性这两种方法,从而把属性的概念简化为方法;取消了变量和赋值,替代它们的是通过消息来读槽和写槽。在Self中对象创建对象的方式是自我拷贝,所以叫做原型。Self是原型面向对象语言的鼻祖,就像SIMUAL 67是类面向对象语的鼻祖。A.20.另一个对C进行面向对象扩展的语言:Objective-CObjective-C诞生于1983年,后来被苹果公司选中,和C++相似,也是对C的面向对象扩展。所不同的是C++以SIMUAL 67的面向对象为基础,Objective-C以Smalltalk的面向对象基础。Object-C一直伴随着苹果公司的操作系统一起发展,这两年随着iOS的开发被广泛使用。A.21.对Pascal进行面向对象扩展的语言:DelphiDelphi诞生于1995年,是对Pascal的面向对象扩展,借鉴了C/C++的经验,但没有像C/C++后来那样的疯狂变化。A.22.脚本语言:PerlPerl发布于1987年。Perl起源于操作系统的控制台(shell)的命令。用户将完成某个工作的所有命令保存在一个sh文件里,这样只要执行这个文件就可完成对应功能,省去每次都要输入所有命令的麻烦。sh文件就叫做脚本。脚本只是一些命令行,可是发展到Perl时已经是一个相当成熟的语言了。A.23.关联列表函数式面向对象脚本语言:LuaLua诞生于1993年,设计目的是嵌入引用程序,成为其脚本。Lua以其小巧性著称。Lua基于Self和Scheme,它是第一个以关联列表最为主要数据的函数式语言。A.24.虚拟机面向对象语言:Java诞生于1995年的Java 1.0,来自于Sun公司,是第一个在虚拟机上运行的语言。再这之前计算机语言要么:由解释器解释执行源代码(大多数命令式语言),叫做动态语言;要么:将源代码编译连接成实际的计算机指令后再由计算机执行(大多数命令式语言),叫做静态语言。Java运行于JM(Java虚拟机)上,JM和解释器的区别是:JM会将Java源代码编译成字节码,然后然后再由JM解释执行。由于编译和执行过程是交错的,所以从外部来看就像是JM直接执行Java源代码一样。当然也可以,事先将Java源文件编译好,这样JM就可以直接执行了。Java 1.0是C++的简化版本,保留了具有数据类型和类等一小半功能,删除了结构体,泛型编程等一多半的功能。Java 5.5 支持了泛型编程编程。最新版本是2014发布的Java 8.0,支持了lambda表达式。Java是面向对象编程使用人数最多的语言。(C/C++的大部分人之使用C部分,即面向过程变成)。Java的强有力竞争对手是C#。A.25.面向对象解释式脚本语言:PythonPython诞生于1989年,作者为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为 ABC语言的一种继承。ABC是作者开发的教学语言。Python和Perl用于相同领域,是面向过程+面向对象语言。A.26.纯面向对象解释式脚本语言:RubyRuby诞生于1996年,作者基于对Perl和Python的不满而设计,的纯面向对象脚本语言。Ruby基本等于Smalltalk + Lisp。A.27.Web服务器脚本语言:PHPPHP诞生于1994年,是Web服务器脚本语言。PHP和JavaScript的语发相似,都是嵌入在HTML中,只不过一个在服务器端,一个在浏览器端。A.28.浏览器脚本语言:JavaScript1995 年,网景公司发行的 Netscape Navigator 2.0,它的脚步语言就是JavaScript。JavaScript和Java没有任何关系,它的前身是ScriptEase。ScriptEase的诞生于1992年原名C-minus-minus,是一个足够强大可以替代宏操作(macro)的脚本语言,同时保持与 C足够的相似性,以便开发人员能很快学会。ScriptEase基于C和Self语言,支持面向过程和原型面向对象编程。JavaScript后来由引入了Lua语言,支持以关联列表作为数据格式的函数式编程,这种关联列表这就是著名的JSON。最后JavaScript是一个:表面叫Java脚本,但是和Java没有任何关系;表面上是一个像C语言一样的面向过程语言,但实际上是一个原型面向对象语言;表面上你创建了一个对象,但其实只是一个关联列表;表面上你在定义变量和赋值,其实只是&键,值&对;表面上你声明函数,其实只是&键,lambda表达式&对。表面上是一个命令式编程语言,但本质上是一个以关联列表为数据格式的函数式编程语言。A.29 .NET平台主语言:C#C#于2000年和.NET开发平台一起由微软发布。C#是.NET开发平台的主语言。.NET开发平台包括,运行IL语言的虚拟机CLR,基于IL语言的公共类库,用于编译产生IL语言程序的高级语言,以及支持这些高级语言开发的编译的基础开发环境。由于CLR和IL公共类库作为Window操作系统的一部分捆绑发布,所以IL语言程序可以再Window操作系统上直接执行,就行机器指令一样。CLR运行IL和JM运行Java一样,只不过CLR将IL编译成机器指令,然后在由计算机直接执行,而JM是将Java编译成字节码,然后由解释器解释执行。.NET开发平台支持多种语言,其中C#是主语言。C# 1.0 基于Java和C++,以Java为基础将更多的C++加入进来,并且吸收了一些Delphi和Visual Basic的特性。C# 2.0 引入泛型编程。C# 4.0支持了lambda表达式,Linq等。最新版本是2014发布的C#5.0。.NET 4.0引入了动态类型,使得.NET平台可以嵌入动态语言,比如:Lisp、Python、 Ruby等。A.30.不再基础的BASIC:Visual Basic .NETQuick BASIC由美国微软公司开发,1987年推出,它是BASIC的继承者。Quick BASIC是DOS下的开发语言,后来随着Window系统的推出加入了图像化设计所以新的版本改名为:Visual Basic。Visual Basic是第一个支持可视化界面设计的语言。1998年发布的Visual Basic 6.0 是一个应用非常广泛的版本。2001年,Visual Basic迁移到了.NET平台上,改名Visual Basic .NET。Visual Basic .NET对BASIC语言特性进行了重大改进。从此Visual Basic .NET伴随.NET开发平台一起发展。补充,R语言现在是最流行的统计计算语言,是S4语言的免费版本,S语言由贝尔实验室创造。R语言、3M数学计算语言(Matlab、Mathematica、Maple)、汇编语言都未列入名录。网友蒙面大侠对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:和编辑器一样的道理。有一天,学计算机的学生问老师:学生:为什么世界上有这么多不同的编程语言呢?老师:你都去用用看不就知道啦?一段时间之后。。。学生:这些语言都太烂了!我要设计一个比他们更好的,性能更好,语法更简单更贴近自然语言,bla bla bla。。。这时老师一掌敲在他头上:“魂淡,你难道觉得我还想再多接触一门编程语言么?”网友孙立对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:编程语言虽多,但范式并不多。而且编程语言范式的发展是有迹可寻的。/2012/programming-paradigms/网友李遥对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:只要你能定义一个规则系统(无论多简单),就等于定义了一个编程语言随便什么中学生都能做到网友蒙面大侠对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:因为新语言的发明人总觉得已有的那些语言“不够好”网友codedump对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:你可以看看coursera上的编译器课程,有一部分讲解了为什么这个世界需要这么多的编程语言。老师给出的原因大致是这么几点:1)没有哪一种编程语言可以解决所有的问题。2)编程语言实际上与它们所要解决的问题领域相关,当问题随着环境变化有变化的时候,就需要创造新的编程语言来适配它。网友happyli对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:因为需求不一样,比如,c,c++等语言就比较适合开发硬件或运算量特别大程序,付出的代价是,什么东西都要开放人员管理,如内存释放等。java等比较适合开发服务器端程序,企业应用,因为有很多开源程序是java的。php则比较适合web开发,你用了php就会发现,虽然这个语言很多奇怪的规定,但用在web上,你就发现和很多其他语言相比,会少了很多麻烦,大部分web开发中碰到的问题都有内置函数了,这样就非常方便了。javascript则是浏览器的语言,这种语言当然主要是为浏览器开发的,也非常灵活,做web显示的各种效果和服务器互动都少不了它。其实你自己也可以开发一套自己喜欢的语言。比如我就开发过一套我的聊天机器人用的开发语言,就是为了图形化的程序开发,提高我开发聊天机器人程序的速度。这就象每个人擅长领域不一样。如果一个语言什么都擅长,那么它里面就会非常复杂,学习成本就很高,也就没有很多人用了。比如c,c++几乎什么程序都可以开发,不过学习起来里面乱七八糟的东西也很多,淘汰的技术,新推荐的技术都沉积在里面。网友张无忌对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:就像为什么世界上有这么多种类的车一个道理。有的车快,比较适合放到F1赛场上竞速。有的车耗油少,比较省钱。有的车长得漂亮,适合开出去兜风。有的车内部空间大,适合车震。要想更深入的了解这个领域,可以去听一下coursera上华盛顿大学的programming languages公开课,深入浅出。网友蒙面大侠对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:简单来说,就是权衡的结果。作为最早出现的编程语言之一,Lisp实际上仅晚于汇编。但它已经有了非常多的高级特性,表达能力非常强大,非常适合解决各种复杂问题,但是当时的计算机性能实在太低了,还无法用于解决许多很高级的问题,因此Lisp并没有流行起来。直到再在Lisp并不是一种热门的语言,但是它的的主要特性都已经被更加流行的语言部分或全部吸收了,比如垃圾收集。这些语言包括Ruby,Python,Haskell,Javascript等等。除了表达能力、性能等因素以外,还要考虑语言的学习难度、问题领域、安全性、抽象能力、编写难度、修改难度等各个方面。不同的需求对各个方面的要求是不同的。还有个人偏好的问题,有人喜欢s表达式,而有的人就是喜欢中缀表达式。于是各种语言就出现了。题主的设想“让少数几种语言适应各种情况”,实际上并不是最佳实践。理想的情况是,不同领域的问题使用不同的语言,这样能做到用尽可能少的代码及尽可能高的模块化解决问题。一个非常容易理解的例子是web页面,HTML负责内容,CSS负责外观,Javascript负责逻辑。再比如SQL,正则表达式,它们所解决的问题一般是用一两句话解决的,换作Java、C#等语言,将变成长篇大论。网友赖勇浩对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:因为业务和硬件都在变化。你对比一下 10 年前、20 年前的业务和硬件,就知道为什么了。网友林俊对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:计算机做的事情,实际是在用计算机的方式,去实现现实世界中的工作。但是中间显然有个断层:实现之前,需要理解。因此,计算机所作的实际是“用计算机的方式,去实现它所理解的现实世界”。这个“理解”,在面向对象里叫做“抽象”。而人所做的,就是从现实世界中获取这个“抽象”,并将它告诉计算机。而这个抽象,就是依托于编程语言,由人去获取、由人告诉计算机、由计算机实现的。简单的比喻就是,要委托工厂给你造一堆车模(四个轮子的那种),得有个真的车,然后根据真车翻出一个那叫什么,母版?然后把母版交给工厂,由工厂去批量生产。但是不同的语言所具有的抽象层次和抽象能力不同。比如水墨画和油画,印象派和野兽派,对艺术的表达层次和能力是不一样的吧?而且在提取抽象的时候,侧重点也不一样。国画大师画画重意象,油画大师未必吧?日本盖房子重抗震,中国未必吧?放到编程语言上来说,有的语言非常底层,只能在特定机器上执行运算过程;有些不再限定“特定机器”了;有些不再把计算机运算当过程看了。这是抽象层次和能力上的差别。而在侧重点上,有些语言运行效率特别高,有些一直在吹“到处运行”,有的特别适合做数学运算,有的特别适合写手机app。总而言之,还是人们对编程语言的要求不同,才产生了这么多的编程语言。网友郭远航对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:我的观点是,这是不同的人,对于“如何与计算机有效交流”这个问题,进行的不同方向上的的尝试。计算机应该为人工作,而不是反过来。问题在于它并没有被制造的足够好。在这个问题上,足够好的定义是,人能够与之轻松的交流,人的意图能够被正确的领会和执行。在轻松的交流问题上,理想情况下责任应该是计算机的。包括应用软件(对一般用户)、编程语言(对专业人员)、操作系统以及硬件都负有责任。站在编程者的角度,编程语言极大的影响着人和计算机的交流。就好像人和人的交流一样,好的语言应该让你和计算机之间建立起默契,只言片语就能传达及领悟意图,把精力集中在事情本身。而不是你满怀智慧的告诉他我有一个精妙的构想,它不解风情的回复你“类型未定义”。网友匿名用户对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:实际上现在也确实只有几种语言:汇编、面向对象、面向过程。像学了C、再学PHP,会觉得这根本就是一个语法,PHP可以说就是一个C框架,一个用在C语言上的jQuery。$基本编程思想就上面三种。网友高峻对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:就像生物界为啥没进化成只有几种生物一样。总会有新的想法,新的需求。就是古老的c也变了好多次。网友杨天杰对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:语言即工具,不同的工具可以解决不同的方面的问题.网友蒙面大侠对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:抽象出来的不同的操作集合而已因为应用的场景越来越多,必然针对不同场景的操作集合的使用成本也不相同,当然如果说针对不同的场景再抽象出不同的库,也是可以的,但成本依旧很高,并且层次多了质量堪忧,就这样抽象就不断产生了。网友贾宝玉对[计算机编程语言]为什么现在会有这么多种编程语言?给出的答复:以前觉得发明一门计算机语言是一件很难的事情,就好像发明一门新的自然语言或者说人类语言一样难,后来了解到相关资料之后,发现并没有想象中那么难,但写得出和写得好又是另外一回事。至于为什么有如此多的语言,看一些知名语言的产生,可以得出结论,有的是无意为之,有的是某些人觉得某个语言还不够棒,或者不够方便,在某个方面运用起来不够顺手。总之大多数是在具体的实践环境中产生的,慢慢由解决独特的类需求的语言,转变为一门近乎完整的语言。欢迎您转载分享:
更多精彩:}

我要回帖

更多关于 北京今天有雾吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信