精华内容
下载资源
问答
  • 一张图概括编程语言发展史
    千次阅读
    2018-07-26 11:12:21

    一张图概括编程语言发展史

    一张图

    编程语言是一组用来定义计算机程序的语法规则。它是一种被标准化的交流语言,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。之所以有那么多种不同的编程语言存在的原因是设计程序语言的初衷不同,对语言学习曲线的追求不同,不同程序之间的运行成本差异等。

    下面这张图片描绘了整个编程语言的历史。包括各种编程语言的发明人,编程语言的特点和适用领域,被什么网站或公司使用等。

    lang-history

    编年史

    我们一个统计出来256种编程语言,当然,这么多的语言中只有一些是常用的或实用的。

    1951 – Regional Assembly Language
    1952 – Autocode
    1954 – IPL (LISP语言的祖先)
    1955 – FLOW-MATIC (COBOL语言的祖先)
    1957 – FORTRAN (第一个编译型语言)
    1957 – COMTRAN (COBOL语言的祖先)
    1958 – LISP
    1958 – ALGOL 58
    1959 – FACT (COBOL语言的祖先)
    1959 – COBOL
    1959 – RPG
    1962 – APL
    1962 – Simula
    1962 – SNOBOL
    1963 – CPL (C语言的祖先)
    1964 – BASIC
    1964 – PL/I
    1966 – JOSS
    1967 – BCPL (C语言的祖先)
    1968 – Logo
    1969 – B (C语言的祖先)
    1970 – Pascal
    1970 – Forth
    1972 – C
    1972 – Smalltalk
    1972 – Prolog
    1973 – ML
    1975 – Scheme
    1978 – SQL
    1980 – C++ (既有类的C语言,更名于1983年7月)
    1983 – Ada
    1984 – Common Lisp
    1984 – MATLAB
    1985 – Eiffel
    1986 – Objective-C
    1986 – Erlang
    1987 – Perl
    1988 – Tcl
    1988 – Mathematica
    1989 – FL
    1990 – Haskell
    1991 – Python
    1991 – Visual Basic
    1993 – Ruby
    1993 – Lua
    1994 – CLOS (ANSI Common Lisp的一部分)
    1995 – Java
    1995 – Delphi (Object Pascal)
    1995 – JavaScript
    1995 – PHP
    1996 – WebDNA
    1997 – Rebol
    1999 – D
    2000 – ActionScript
    2001 – C#
    2001 – Visual Basic .NET
    2002 – F#
    2003 – Groovy
    2003 – Scala
    2007 – Clojure
    2009 – Go
    2011 – Dart

    从1951年2014年,人类一共发明了256种编程语言,每一种语言的出现都带有某些新特征。编程语言不断的在革新,很快就会有超出这个清单的新编程语言出现


    1801 - Joseph Marie Jacquard用打孔卡为一台织布机编写指令,在挂毯上织出了“hello, world”字样。当时的reddit网友对这项工作的反响并不热烈,因为它既缺少尾递归调用,又不支持并发,而且甚至都没有注意在拼写时恰当地区分大小写。

    Jacquard织布机是第一台可进行程序控制的织布机。用打孔卡进行编程的概念,直到电子计算机被发明出来之后仍然被广泛运用。

    最早的Hello World程序(出自K&R C)打印的是全小写的字符串:”hello, world”。

    在许多英文技术社区里,不正确地使用大小写发贴会被视作是小白的行为。(如把“Python”拼作“python”,把“FreeBSD”拼作“freebsd”,把“Qt”拼作“QT”)


    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)上尤为典范。

    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,即美国海军准将。


    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语言终于让它们变得有名了起来。通过 不包含它们这件事情。


    1970 - Niklaus Wirth创造了Pascal,一个过程式的语言。很快就有人开始声讨Pascal,因为它使用了类似“x := x + y”这样的语法,而不是更为人熟知的类C语法“x = x + y”。尽管存在着这样的批评,而事实上当时C还没有被发明出来。


    1972 - Dennis Ritchie发明了一把射击时能同时向前和向后两个方向发射子弹的绝世好枪。但他对此发明造成的致死和终身残疾数量感到还不够满意,所以他又发明了C语言和Unix。


    1972 - Alain Colmerauer设计了逻辑编程语言Prolog。他的目标是创造一个具有两岁小孩智商的程序语言。为了证明他成功达到了这个目标,他展示了一个Prolog程序,它对于每条查询都会机智地给出相同的回答:“No”。


    1973 - Robin Milner创造了ML,一个建立在M&M类型理论基础上的语言。由ML衍生而来的SML加上了一套形式语义的规范。当被要求给这个形式语义本身 书写一套形式语义时,Milner的脑子爆掉了。其他ML家族的著名语言还包括OCaml,F#,和,Visual Basic。


    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++。最后得到的语言是如此地复杂,以至于程序必须被送到未来去让“天网”人工智能 进行编译。编译时间难以容忍。天网开展这项服务的动机仍然不为人知,但来自未来的发言人说道:“没什么好担心的,宝贝。”带着一口奥地利腔的机械口音。有 一些来自坊间的推测,所谓的天网只不过是个自命不凡的缓冲区溢出而已。


    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)说白了不过就是自函子范畴上的一个幺 半群而已,这有什么难以理解的?”


    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基金会今年在欧洲还卷入了一场商标之争了不是)


    1995 - Brendan Eich读完了历史上所有在程序语言设计中曾经出现过的错误,自己又发明了一些更多的错误,然后用它们创造出了LiveScript。之后,为了紧跟 Java语言的时髦潮流,它被重新命名为JavaScript。再然后,为了追随一种皮肤病的时髦潮流,这语言又被命名为ECMAScript。


    1996 - James Gosling发明了Java。Java是一个相对繁冗的、带垃圾收集的、基于类的、静态类型的、单分派的面向对象语言,拥有单实现继承和多接口继承。Sun不遗余力地宣传着Java的独一无二不同凡响之处。


    2001 - Anders Hejlsberg发明了C#。C#是一个相对繁冗的、带垃圾收集的、基于类的、静态类型的、单分派的面向对象语言,拥有单实现继承和多接口继承。微软不遗余力地宣传着C#的独一无二不同凡响之处。


    2003 - 一个叫Martin Odersky的醉汉看见了好时瑞森花生酱杯的广告,展示了某个人的花生酱倒入另一个人的巧克力的场景,他忽然有了个点子。他创造了Scala,一种结合 了面向对象和函数式编程的语言。这同时激怒了两个阵营的忠实信徒,他们立刻宣布要发动圣战烧死异教徒。


    • 转载自微信公众号 STEAM解密
    更多相关内容
  • 编译器发展史

    千次阅读 2020-05-04 16:09:01
    编译器的工作就是将用代码编写的源程序翻译为计算机可以执行的目标程序,例如.c编译后生成.exe 前面会涉及一些老基础,可以直接看第四标题的内容 机器语言 计算机刚发明的时候人们通过各种开关和电缆来编写程序。这...

    编译器的工作就是将用代码编写的源程序翻译为计算机可以执行的目标程序,例如.c编译后生成.exe
    前面会涉及一些基础,可以直接看第四标题的内容

    机器语言

    计算机刚发明的时候人们通过各种开关和电缆来编写程序。这时候的程序是真正的二进制,例如000110101011。
    后来做出了改进,把程序打在穿孔带上,让机器读取。但本质还是没有改变,还是在使用二进制编程。下面举一个例子:
    0001表示加
    1010表示寄存器a
    1011表示寄存器b
    那么把a和b的值加起来放在a,就是0001 1010 1011
    当时的程序员比大熊猫还稀少,每天脑子里除了0就是1

    汇编语言

    既然二进制这么难记,人们就想到了给这些指令记一个好记的名字
    0001:add
    1010:a
    1011:b
    这样子就变成了,add a b
    但计算机太笨了,只能执行二进制,所以汇编器出来了,用来把汇编语言转换为机器语言

    高级语言

    机器语言和汇编语言一直被统一称为低级语言
    人类一直探索一种更高级的语言来写程序。这个语言应该是面向人而不是面向机器。
    能使用变量来存放数据,而不是寄存器:int a=10;
    能用表达式来表示自己的意图:a++;
    能用判断语句来处理分支:if(a>=0) ;else a=-a;
    能用循环语句:for(int i=1;i<=100;i++) sum+=i;
    能定义一个函数处理一段多次使用的操作:int getmax(){}
    编译器的工作就是把高级语言翻译成机器语言

    编译器的操作

    我们先看看编译的过程:

    源程序
    语法分析
    语义分析
    中间代码生成
    代码优化
    代码生成
    目标程序

    词法分析:
    简单来说,就是删除语句中的空格,建立一张符号表,例如sum+=i;
    在这里插入图片描述语法分析:把符号表根据语法规则组建成一棵语法树
    在这里插入图片描述
    语义分析:判断标识符的类型、作用域是否正确,运算是否合法,取值范围是否有问题等等

    中间代码生成:
    temp1=id1+id4;
    id1=temp1;

    翻译成汇编语言:
    MOV R1 id1;sum的值放入寄存器R1
    MOV R2 id4;i的值放入寄存器R2
    ADD R2 R1;R1和R2的值相加,放入R1
    MOV id1 R1;把R1的值放入id1

    接下来就是汇编成二进制了。

    欢迎关注我的公众号

    在这里插入图片描述

    展开全文
  • 编译器发展史5个十年3大人物及编译器知识(公号回复“编译器”下载PDF资料,欢迎转发、赞赏、支持科普) 原创: 秦陇纪 科学Sciences 今天 科学Sciences导读:继本号操作系统、指令集等计算机科普...A编译器发展史5...

    编译器发展史5个十年3大人物及编译器知识(公号回复“编译器”下载PDF资料,欢迎转发、赞赏、支持科普)

    原创: 秦陇纪 科学Sciences 今天

    科学Sciences导读:继本号操作系统、指令集等计算机科普文章后,接着介绍编译器相关知识。本文按事、人、物的顺序,介绍编译器的发展史、典型人物、技术知识。

    编译器发展史5个十年3大人物及编译器知识(25289字)

    目录

    A编译器发展史5个十年(6864字)

    第一个十年

    第二个十年

    第三个十年

    第四个十年

    第五个十年

    置身于平行世界

    B编译器发展史3大人物(12591字)

    1.世界首个编译器作者GraceMurray Hopper格蕾丝·穆雷·霍珀

    2.编译器优化奠基人JohnCocke约翰·科克

    3.矢量化Parafrase编译系统作者DavidJ. Kuck大卫·卡克

    C编译器知识(5721字)

    1工作原理

    2种类(▪处理器▪前端▪后端)

    3代码分析

    4工作方法

    5编译器优化

    6进行对比

    7历史

    参考文献(3832字)

    Appx.数据简化DataSimp社区简介(835字)


    A编译器发展史5个十年(6864)

    编译器发展史5个十年

    文|Michael Wolfe,科学Sciences20181019Fri

    作者:自20世纪70年代就读伊利诺伊大学研究生院以来,Michael Wolfe就一直主攻并行计算方面的语言和编译器。在此过程中,他与别人创办Kuck and Associates(已被英特尔收购),在俄勒冈州研究生院(自与俄勒冈健康与科学大学合并以来)投身学术界,并在PGI开发高性能Fortran(PGI先被意法半导体收购,最近被英伟达收购)。如今大部分时间,他在一个为高度并行计算、尤其是为英伟达GPU加速器开发和改进PGI编译器的团队担任技术主管。

    如果想了解我们在计算机架构和驱动计算机架构的编译器方面的现状,有必要看看编译器如何在六十年间由一种架构改用另一种架构。

    先让目光回到1957年的第一个在IBM 704计算机上实现的编译器IBM Fortran,并首次成功运行了FORTRAN程序。之前在1951年,美国IBM公司约翰·贝克斯(John Backus)针对汇编语言的缺点着手研究开发FORTRAN语言(注1:源自于“公式翻译”的英语FormulaTranslation的缩写)。FORTRAN是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。如果你看看它的起源和取得的成果,付出的巨大努力是今天的人都无法想象的,这种编程语言是一项了不起的技术。

    IBM想要销售计算机,想要销售让更多的人能够进行编程的计算机。当时编程是用汇编语言完成的。这太难了,IBM很清楚这一点。于是蓝色巨人希望人们有办法更快地编写程序,又不牺牲性能。Fortran的开发人员(注2:指发明Fortran的那些人,而不是发明使用编译器和语言的程序的那些人)希望利用如今所谓的高级编程语言编写的程序,提供尽可能接近手动调整的机器代码的性能。

    说到编译器,你必须考虑三个P:性能、生产力和可移植性。Fortran的发明者拿机器代码的性能作了比较。生产力方面的好处是,程序员再也不必编写机器代码。我不知道IBM在可移植性方面的最初意图,不过你在1957年无法为软件获得专利权,IBM也没有抱怨其他企业组织实现Fortran。因此没过多久,市面上出现了来自其他供应商的面向其他机器的Fortran编译器。这立即为Fortran程序提供了机器代码无法想象的可移植性。

    从这一刻起,编译器开始迅猛发展起来。让我们看看每个十年的情况。

    第一个十年

    20世纪60年代(注3:作者出生前),计算机架构师编译器编写者首先开始考虑并行性。即使那样,人们仍然认为计算机速度不够快,速度提升也不够快,觉得并行性有望解决这个问题。我们看到指令级并行性引入到了Seymour Cray公司的CDC 6600和CDC 7600以及IBM System/360 Model 91中。更为激进的做法是开发出了由伊利诺伊大学的研究人员设计并由Burroughs公司制造的ILLIAC IV、Control Data Corp STAR-100以及德州仪器(TI)Advanced Scientific Computer。CDC和TI的系统是内存到内存的长向量机,而ILLIAC IV是我们今天所说的SIMD机器。(注4:SingleInstruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。)ILLIAC之所以功能有限,是由于没有主要的标量处理器,编程起来确实很难。面向STAR-100的Fortran编译器添加了用于描述长连续向量操作的语法。TI ASC机器最值得关注,因为它拥有第一个自动向量化编译器。TI做了一番了不起的工作,确实提升了当时编译器分析的最新水平。

    第二个十年

    20世纪70年代Cray-1成为第一台商业上大获成功的超级计算机。它有众多的跟随者和模仿者,许多读者可能了如指掌。Cray机器的成功很大程度上归功于引入了向量寄存器。就像标量寄存器一样,向量寄存器让程序可以对小小的数据向量执行许多操作,没必要从内存加载和存储到内存。Cray Research还开发了一种非常大胆的向量化编译器。它在许多方面与早期的TI编译器类似,但Cray编译器拥有让它非常备受关注的附加功能。其中最重要的一项功能是能够为程序员提供编译器反馈。

    如今开发人员编译程序时,如果程序含有语法错误,编译器将生成出错消息。程序员不断修复这些错误并重新编译,直到拥有一个正常运行的程序。如果开发人员希望程序运行得更快,可以启用编译器优化标志,好让生成的可执行文件运行得更快——他们希望如此。在大多数计算机上,优化代码非优化代码之间的性能可能相差两倍,通常差异小得多,比如相差10%、20%或者50%。与之相比的是原始Cray机器上可用的向量指令集。在这种情况下,代码被Cray编译器优化和向量化后,程序员常常会看到性能提升5倍到10倍。程序员、尤其是高性能计算(HPC)程序员愿意做大量工作,以便将性能提升5倍或更高。

    来自Cray编译器的反馈将告诉程序员它在第110行向量化了一个循环(loop),在第220行向量化了另一个循环,但是没有在第230行向量化循环,原因是第235行有无法被向量化的I/O语句或函数调用。或者,可能存在编译器无法分析的数组引用,或者某个数组的第二个下标中的一个未知变量阻碍了依赖项分析,因此该循环无法进行向量化。想要获得向量性能的Cray程序员格外注意这些消息。他们根据这种反馈修改了代码,可能从循环中取出I/O语句,或者将循环推入到子程序,或者修改数组引用以删除某个未知变量。有时他们会添加一个编译器指令,以便向编译器传达可以安全地进行向量化这一信息,即使编译器无法通过依赖项分析来确定这一点。

    多亏了编译器的反馈,发生了三件事。首先,更多的程序被向量化,更多的程序员得益于Cray向量性能。其次,Cray程序员受过了培训,不再将I/O语句、条件语句和过程调用放入到循环的中间。他们明白一个步长(stride)的数据访问很重要,确保内部循环中的数组访问是一个步长。第三,用Cray编译器自动向量化的程序可以在来自Alliant、Convex、Digital、富士通、日立、IBM和NEC的许多类似的向量机上重新编译。所有这些系统都拥有带向量寄存器的向量处理器和自动向量化编译器,之前针对Cray优化的代码在所有这些机器上都可以进行向量化,并很顺畅地运行。简而言之,Cray程序员终于实现了性能、生产力和可移植性这三个目标。

    这个编译器反馈有多重要、培训整整一代HPC开发人员为向量机编程有多成功,怎么强调都不为过。每个使用它的人都很高兴。那时候,我还在伊利诺伊大学,我们考虑开一家立足于并行化编译器技术的公司。当然,我们的技术比别人的要好,因为我们是一流的学者。在Cray编译器的早期阶段,用户抱怨编译器无法对任何内容进行向量化,因而不得不重写代码。我们认为自己有望解决这些问题,于是开了这家小公司专门搞这一块。几年后,我们接触同样那样用户、展示我们用于并行化和向量化循环的工具时,他们回复自己不需要这类工具,因为Cray编译器已经向量化了所有循环。倒不是说Cray编译器变得更聪明,不过我确信它会渐渐变得更好。主要是程序员在如何编写可向量化的循环方面训练有素。

    第三个十年

    20世纪80年代,多处理得到了广泛的实施和使用。早些时候已有多处理器,包括IBM System /370sBurroughs系统。但是32位单片微处理器的问世推动多处理技术进入了主流。要开一家计算机公司,你不再需要设计处理器——可以径直购买。你没必要编写操作系统,可以购买Unix的许可。只需要有人全部组装起来、贴上铭牌。要是有编译器就好了。Sequent、Encore和SGI都构建了有一个微处理器、性能出色的系统,但如果可以让一批处理器并行运行,那就更好了。

    不像大获成功的自动向量化,自动并行化基本上一败涂地。它适用于最内层循环,但要实现大幅的并行加速,通常需要对外层循环进行并行化。不过当然,外层循环增添了控制流的复杂性,常常包括过程调用,现在你的编译器分析完全崩溃了。一种确实可行的方法是,让程序员参与其中,分析并行性,并输入编译器指令来驱动它。我们由此看到了面向并行循环的各种指令集纷纷出现。Cray、Encore、IBM和Sequent都有各自的指令集,唯一的共同点就是SGI采用Sequent指令。同样,许多可扩展的系统要传递网络消息,这促使开发了众多针对特定供应商的、学术性的消息传递库

    第四个十年

    20世纪90年代,所有那些消息传递库都被消息传递接口(MPI)取而代之,所有那些针对特定供应商的并行化指令都被OpenMP取而代之。出现了扩展性更强的并行系统,比如Thinking Machines CM-5以及有成千上万个商用微处理器的其他系统。基于微处理器的可扩展系统主要用MPI进行编程,但MPI是一个库,对编译器来说不透明。MPI作为一种编程模型而具有的优点是,虽然通信开销很大,但通信在程序中是完全暴露的。MPI程序员知道何时插入显式通信调用,他们不遗余力地尽可能减少和优化通信。缺点是从编程模型的角度来看,它非常低级,MPI程序员没有得到编译器的帮助。

    OpenMP诞生于针对特定供应商的并行指令集百花齐放的时期,因为用户需要它。用户们才不愿仅仅为了能在可供使用的所有不同系统上运行程序而将程序重写12次。OpenMP的整个宗旨就是以同样的方式彰显“并行性可以”。不像MPI,编译器必须支持指令,因为指令是语言的一部分。你无法将OpenMP作为一个库来实现。

    同样在20世纪90年代,市面上出现了面向单芯片微处理器的SIMD指令集,比如来自英特尔的SSE和SSE2,我们看到编译器恢复了当时已有20年或25年历史的同样的向量化技术,以便自动利用那些SIMD指令。(注5:同注4的SIMD单指令多数据流)

    第五个十年

    2000年后不久,众多供应商开始普遍提供多核微处理器。全世界突然意识到必须为大家解决这个并行编程问题

    当时,许多应用程序在一块芯片上的所有核心上以及分布式内存节点上使用扁平的MPI编程模型。你始终可以添加更多的MPI序号(rank)来使用更高的并行性。这一招效果有限,但是你开始获得大量序号时,一些MPI程序会遇到扩展问题。数据在每个MPI序号中复制时,内存使用会有点失控。一旦你开始在每个节点上放置一二十个核心,复制的每一项数据可供使用的内存量是12倍或24倍。如果是为单个节点编程,OpenMP及其他共享内存并行编程模型开始受到追捧。比如在20世纪90年代,英特尔推出了线程构建模块(又名TBB);有人声称,TBB是如今最受欢迎的并行编程语言。

    大概在同一时期,异构HPC系统开始出现,不过异构性其实不是新话题。我们在20世纪60年代就遇到了异构性,使用附加的协处理器用于数组处理。附加的处理器大受欢迎,原因是它们可以比CPU更快地完成专门操作。它们常常能够以小型机的价格提供大型机的性能,大约15年来浮点系统在这方面做得很好。在21世纪初期,有几款专门为HPC市场开发或加以改造的加速器,比如ClearSpeed加速器和IBM Cell处理器。这两款产品都取得了一些真正的技术成功,但是HPC市场规模太小,无法支持开发独立的定制处理器芯片。

    这给GPU计算留下了缺口。GPU相对定制加速器的优势在于,GPU的主打功能很好——早期的主要任务是图形游戏,现在还包括AI深度学习,因此从最新硅片技术和驱动硅片所需的软件方面来看,开发处理器非常高昂的成本维持得下去。

    伴随异构性而来的是这个显而易见的问题:我们如何为这些系统编程?早在那时,浮点系统提供了在底层使用加速器的子程序库。程序员调用该库,HPC用户可以高效地使用加速器,无需实际编程(不过有一些程序员进行了编程)。今天,想支持多年来在标量、向量和可扩展系统上开发的众多应用程序,HPC开发人员需要能够为加速器高效地编程,他们希望程序看起来尽可能正常。使用OpenCL或CUDA可以为你提供了很强的控制性,但是对于现有HPC源代码的影响可能非常大。程序员通常将有待在加速器上运行的代码提取到特别注释的函数中,而且编写的方式常常与为主机编写的方式全然不同。这时候,专门为通用并行编程设计的基于指令的编程模型和语言就有一些优势,而优秀的优化编译器大有用场。

    置身于平行世界

    这给我们引出了另一个至关重要的方面。20世纪60年代为指令级并行性开发的所有技术现在都在微处理器里面。20世纪70年代的向量处理概念存在于微处理器里面的SIMD寄存器中。20世纪80年代Cray和基于商用处理器的系统的多个处理器都以多个核心的形式存在于微处理器里面。今天的微处理器可以说整合了过去50年来所做的全部架构工作,而由于我们现在拥有出色的晶体管技术(数十亿个门),我们可以这么做。另外我们现在还有异构性;在一些情况下,我们甚至可以在同一块芯片上做到异构性。比如说,中国太湖之光系统中的神威芯片从封装的角度来看是一块芯片,但芯片上每个四分之一的部分都包括一个主处理器和64个计算处理器。因此,它基本上是异构的,编程起来更像是CPU-GPU混合体,而不是像多核处理器。

    为了充分利用异构的GPU加速节点,程序需要具有很强的并行性,而且是类型合适的并行性。这些高度并行处理器不是通过更快的时钟提供性能,不是由于某种异常奇特的架构。确切地说,那是由于更多的可用门用于并行核心,而这些并行核心用于缓存、乱序执行或分支预测。商用CPU的所有那些主要任务被排除在GPU之外,结果是大规模并行处理器在合适的内核和应用程序上提供更高的吞吐量

    这让我们回到了三个P,而性能不是HPC开发人员的唯一目标。程序员需要高性能、良好的生产力和广泛的可移植性。大多数程序员希望程序只编写一次,而不是多次。

    在当时只有节点上的单处理器、所有并行性横跨节点的时期,程序员可以使用扁平的MPI来应付。这类程序可在一系列广泛的机器上顺畅运行,但这不再是我们现在所置身的HPC环境。我们在一个节点中有多个处理器,有SIMD指令,还有异构加速器,引入了更多类型的并行性。为了获得可移植性,我们需要能够编写针对不同数量的核心、不同的SIMD或向量长度可以高效映射的程序,以及同构或异构的系统,没必要每次改用新系统就要重写程序。为了确保生产力,我们需要把其中尽可能多的部分抽取出来。我们使用编译器为今天的HPC系统试图做到的是与IBM在六十年前使用第一个Fortran编译器做到同样的抽象质量,后者实际上是第一种任何类型的高级语言编译器。

    目标是在如今极其复杂的硬件上获得尽可能接近手动编程的性能。今天,就小小的简单代码块而言,针对英伟达GPU的PGI OpenACC编译器常常可以提供接近原生CUDA的性能。对于像大型函数这种更复杂的代码序列,或者整批调用树被移植到GPU时,接近原生代码性能要困难得多。

    客观地说,OpenACC编译器天生处于劣势。在CUDA中重写代码时,程序员可能查明某个数据结构不适合GPU,可能改变数据结构以增强并行性或性能。也许程序员查明程序逻辑的一部分不是很适合GPU,或者查明数据访问模式并不理想,因此重写该逻辑或循环以改进数据访问模式。如果你在对应的OpenACC程序中进行同样这些更改,常常也会获得好得多的性能。但是你最好不这么做,如果重写减慢了多核CPU上代码的运行速度,更是如此。因此,OpenACC代码可能无法获得与你花了这番编程工作量同样的性能级别。即便如此,如果OpenACC代码的性能足够接近GPU上的CUDA,基于指令的编程模型在生产力和可移植性方面的好处常常很明显。

    尽管过去的60年间我们在编译器技术方面取得了诸多进展,但一些人仍然认为编译器与其说是解决办法,还不如说是问题。他们想要的是来自编译器的可预测性,而不是在后台优化编译器的高级分析代码转换。这可能引出了这条道路:我们尝试从编译器中获取功能,将更多的责任交到程序员的手里。有人会说,这正是OpenMP今天所走的道路;我看到的危险是,我们到头来可能为了可预测性而牺牲了可移植性和生产力。比如说,设想你仍然得使用英特尔的SSE和AVX内部函数,对每个循环进行手动向量化,而不是针对英特尔至强处理器上的SIMD指令进行自动向量化。你实际上在编写内联汇编代码。这具有很强的可预测性,但很少有程序员想要在该层面编写所有的计算密集型代码,你要为每一代SIMD指令重写代码,或者在非X86 CPU上使用SIMD指令时更是如此。

    计算机架构方面任何合理的进步都伴随编译器技术方面合理的进步。不能仅用那些架构和编译器所提供的性能来衡量好处,还要用程序从一代HPC系统移植到下一代(不必完全重写)后,节省的人力和提高的生产力来衡量。


    B编译器发展史3大人物(12591)

    编译器发展史3大人物

    文|秦陇纪,科学Sciences20181107Wed1118Sun

    写出一个操作系统,还是写出一个编译器的程序员,哪个更厉害?

    一般人可能会想,虽然没写过编译器,但应该写操作系统比编译器要简单多了。

    非也!讲操作系统实现的书很多,但讲编译器调试器实现的则极少,参考资料很难找。多年从事开发的程序员,如果需要写操作系统(类Linux等简单的),花一定时间能做成;但要写个编译器或调试器,则可能束手无策。写编译器难在词法分析、语法分析、逻辑分析、嵌套分解、优化算法、CPU二进制码对应等,是真正的计算机科学。完全从源码分析,如GDB源码,会让人看不下去而崩溃放弃,更不要说GCC之类的源码,极其枯燥、抽象、难梳理。事实上,编译器是与CPU架构一起发展的,从基础的程序-指令体系不断演进越来越复杂。识字读书思考的伪专家编写的CSEEIT专业教科书,基本都是碎片化表达的语文知识,缺乏科学性理论和技术演进过程。这方面的差距不是一天两天是事,而是长期以来外行领导专业领域、不注重科学理论和工程实践造成的。

    这里,秦陇纪整理维基百科、百度百科、IT网站等公开资料,列举3名经典编译器作者、奠基人,他们无不具备坚实的数学、逻辑功底。未来再整理其他计算机语言相关的编译器。

    1.世界首个编译器作者Grace Murray Hopper格蕾丝·穆雷·霍珀

    世界上第一位程序员是女性;世界上第一个编译器也是女性开发的!下面介绍开发世界上第一个编译器的女牛人:Grace Murray Hopper格蕾丝·穆雷·霍珀

    1.1 启蒙

    格蕾丝·霍珀Grace Hopper(1906–1992)本姓穆雷Murray,Hopper为夫姓。1906年12月9日生于美国纽约一个海军世家,其祖父军衔曾达少将。她的外祖父则是一名高级土木工程师,常带她去上班,她也十分高兴地帮着扶红白相间的测量杆,这培养了她对于几何学和数学的兴趣。Grace的父亲因患动脉硬化导致双腿截肢,长期住院,这使得作为长女的她从小就更加懂事和勤奋。

    Grace回忆她小时候最喜欢上的课是数学课,特别是几何课。因为在几何课上,她可以把铅笔盒里所有彩色的笔全部拿出来用。虽然她是个女孩子,可是各种量角器、计算尺她都喜欢拿来玩,研究它们的原理和作用。她还做过一些很像男孩子做的事情:她曾经在六、七岁的时候,把家里所有的钟都拆开,但是没有一个成功装回去,因此还受到了严厉的处罚。

    1.2 教育

    进入大学前,Grace就读于私立Wardlaw-Hartridge学校。1928年她大学毕业于瓦萨学院(Vassar College)并取得数学和物理的双学士学位,在校期间是美国资优学生联谊会(Phi-Beta-Kappa Society)成员(PBK是一个有着两百多年历史、很好很强大的学生社团,成员如老布什、克林顿、厄普代克)。随后去耶鲁大学(Yale University)攻读数学硕士,1930年获硕士学位。1930年6月15日她与VincentFoster Hopper结婚(注1:Vincent纽约大学英文系教授,1945年过世,Hopper与她没有生育子女)。

    结婚没多久,Grace就决定攻读博士。她一边教书一边在耶鲁大学进修博士学位,并在1934年取得博士学位,前后只花了四年时间,这算是相当快的。博士论文题为《代数方程可约的一个新准则》(A NewCriterion for Reducibility of Algebraic Equations),但是让许多人惊奇的是,她是用几何方法证明这个准则的。

    作为女性,获得数学博士学位是一个很大的成就,因为在数学上取得成就而获得博士学位本身就很困难。据统计,从1862-1934年间,全美总共授予1279个博士学位,平均每年不到18个,而女性获得数学博士学位更是凤毛麟角。在求职方面,女数学家通常只能到高中教课,极难上大学讲台。但Grace做到了,硕士毕业后被母校瓦萨学院聘任,短短几年就从助教升到副教授。不过,到这个阶段为止,我们还看不出来她会跟计算机产生任何关系。

    1.3 转折

    1941年是Grace人生的转折点。珍珠港事件后,Grace有了从军念头,她想加入海军。当时女性从军都是做后备军人,大部分都是护士,要不然就是做后勤。如果是受过高等教育的女性,就会被分配去做有关计算的工作。由于家族传统,她选择参加海军的WAVES组织(Women Accepted forVoluntary Emergency Service)

    马萨诸塞州北安普敦(Northampton, MA)海军军官学校接受培训后,她被授予上尉军衔。考虑到她的数学背景,她被派到哈佛大学著名计算机专家霍德·艾肯Howard Aiken(1900-1973)教授手下参与Mark I研制工作。Aiken教授是1939年哈佛物理博士,是Mark I、II、III、IV一系列电机计算机的设计及制造者。(注2:Mark I原来叫ASCC(Automatic Sequence Controlled Calculator),由哈佛大学与IBM合资建造,完成于1943年,重35吨,内部线路长达500英里。但在1944年Mark I启用典礼之后,IBM和哈佛就闹翻了,原因是哈佛认为IBM只是个出钱的财主,主要的智力贡献是哈佛人的功劳,IBM认为自己也在工程上做了许多研究和创新,而哈佛却认为那些工程上的创新都不值一提。所以IBM就从哈佛的Mark计划中退出。后来的十年间,IBM在学术界的主要合作伙伴,变成了哥伦比亚大学。)

    Grace从小就喜欢各种计算尺,当她走进哈佛的计算工厂见到这台电机计算机时,她说这是她看过最有趣的计算尺。在她之前,有两名男工程师在Mark上写过程序,这两个男士帮助Grace在三天之内写出了她的第一个程序。所以算起来,Grace是世界上第三个在电机计算机上写程序的人。

    1.4 荣耀

    1945年9月9日,发生了一件对计算机界而言非常重要的轶事。那天的天气很热,工作人员把窗户都打开了,后来有一只蛾飞了进来,结果那只蛾死在一只继电器里面,造成电路不通,机器死机,他们没办法算出他们要的结果。经过了近一天的检查,Grace找到了那只蛾,她设法用她的发夹把那只蛾弄了出来,还把那只蛾的尸体贴在她的管理日志上,上面写道:“就是这个Bug,害我们今天的工作无法完成。”这个消息传开之后,那个实验室里的人每逢老板询问为何还没做出结果时,都把过错推给Bug。尔后,”bug”(小虫)和”debug”(除虫)这两个本来普普通通的词汇,成了计算机领域中特指莫明其妙的“错误”和“排除错误”的专用词汇流传至今。

    Grace对计算机界的贡献相当多,Bug这个名词的引用,其实只算是一个小小的插曲。

    她对计算机的最大贡献是发明了世界上第一个编译器(Compiler),名字叫做A-0。当时没有任何组合语言及程序语言存在,所有的程序设计人员都要把程序翻译成机器码,即“0011000101011”这样的形式,在纸上打孔,再送到机器里去读。Grace进入Eckert-Mauchley公司后产生一种想法,想设计一种程序,让人可以用类似英文的语法,把想做的事写下来,然后用这个程序把英文翻译成机器的语法,交给机器去执行。这个想法就是今日的Compiler(编译器)。

    当初她提出这样的构想时,众人皆曰不可。所有人都告诉她计算机只能做计算,只能处理数字,计算机是不懂英文的。在50年代,大部分人都尚未意识到计算机是用来处理信息的工具,所有的人就认为计算机只是个计算器而已。

    Grace Hopper可能是第一个想到这个问题并且有机会做下去的人。尔后,她就到处去演讲以筹集资金来做这项计划。这段期间,有很多朋友问她:“你怎么这么勇敢呢?万一搞砸了,你该怎么办?”Grace回答道:“It isalways easier to ask forgiveness than it is to get permission.”(以后要道歉,比现在要拿到钱简单多了。)这句话后来成为她一生中的至理名言之一。

    当初在写世界上第一个编译器A-0时,为了向能出钱的老板炫耀,Grace还设计了三个版本:英文版、德文版、法文版,表明编译器不仅看得懂英文,也看得懂德文跟法文。但后来德文版和法文版的编译器都没再做下去。到1956年,她开发出来一套很完整的程序语言,叫做FLOW-MATIC

    海军采用了这套系统(这时Grace还是海军的一员)。因为海军幅员广大,如果各地自行稍加将编译器修改一小部分,就会发生A地的程序在B地无法执行的问题。于是Grace写了一套程序,用来检查这些程序之间是不是采用同样的编译方式,称作Validation。后来影响到民间,渐渐发展出一套新的语言,偏向于商业使用的语法,这套程序语言就是著名的COBOL(Common BusinessOriented Language)。这也是Grace Hopper对计算机界的第二个重大贡献

    那个年代,总共只有三种程序语言:COBOL、ART、FORTRAN(IBM的产品)。有人把Grace叫做“COBOL之母”,这个称号虽然被学术界的某些人所反对(因为她没有直接参COBOL语言的设计工作),但她对COBOL的形成与发展所起的重大作用却是世人一致公认的。据20世纪80年代初的统计,全美在运行中的程序有80%是用COBOL语言编写的,由此可见COBOL语言对计算机应用发展所起的作用。1971年,为了纪念现代数字计算机诞生25周年,美国计算机学会特别设立了“格蕾丝·霍珀奖”,颁发给每年最优秀的30岁以下的青年计算机工作者,因此,“霍珀奖”也是全球电脑界“少年英雄”的标志。1980年,霍珀获得国际IEEE组织颁发的首届计算机先驱奖

    1.5 后记

    Grace Hopper是个非常amazing的人(常被称为AmazingGrace),崇拜她的人相当多。虽然她的事迹很多,但是还有很多有类似事迹的人并没有像她这样受到众人的崇拜。由其中一点我们可以看出来:从1947年开始(二战结束第二年),她获得第一个荣誉博士学位(宾州大学)以后,她先后被40多所大学授予荣誉博士学位,其中包括芝加哥大学、华盛顿大学、马里兰大学等知名学府。

    各种妇女社会团体和学术组织都曾授予Grace各种称号和奖励。1991年,布什总统在白宫授予她的美国国家技术奖”(National Medal of Technology)是其中的最高奖项,她也是至今惟一获此殊荣的美国女性。她的名言有很多,她自己最喜欢的,也是她最喜欢对所谓的“年轻人”说的(在她年老时,她所谓的年轻人就是“年龄不到我的一半的人就叫做年轻人”),这句话是:“A ship in port is safe, but that is not what ships are builtfor.”(船舶入港安全,但这不是造船目的。)

    1992年1月7日,华盛顿阿灵顿国家公墓,美国海军为在元旦凌晨睡梦中安然去世的退休海军女军官格蕾丝·穆雷·霍珀(Grace Murray Hopper)举行了隆重的葬礼。海军仪仗队和众多肃穆的海军官兵按照海军的礼仪向这位令人尊敬的长者作最后的告别。千千万万的美国人则通过电视转播观看了葬礼的实况。格蕾丝·霍珀珍惜生命,她希望能够活到94岁新世纪来临那天,却未能如愿。

    四年后的1996年1月6日,美国海军在缅因州的巴斯港(Bath, Maine)为它新建造的一艘阿利·伯克级驱逐舰举行了隆重的命名仪式,把它命名为霍珀号。这是第二次世界大战以后第一次、整个美国海军历史上第二次以一位女性的名字命名一艘战舰。

    2.编译器优化奠基人John Cocke约翰·科克

    RISC(Reduced InstructionSet Computer精简指令系统计算机)架构设计师JohnCocke约翰·科克,1972年获得IBM公司颁赠给内部员工的最高荣誉称号“IBM小子”,同年还获得了美国国家技术勋章和图灵奖。1991年,老布什总统亲自授予他国家科学奖(国家技术勋章和国家科学奖是美国最具荣耀的两项政府大奖)。作为科学家的一生中,Cocke在高性能系统设计中取得的革命性进步,为信息技术的发展做出独一无二的创造性贡献。在系统架构和编译器优化研究领域取得了大量进步,他当之无愧地成为编译器优化的奠基人和革新带头人。

    约翰·科克John Cocke,1925年,出生于北卡罗莱那州(North Carolina)夏洛特(Charlotte)。他是从机械到数学、又从数学转到计算机方向上来的学者。1946年,杜克大学(Duke University)先后取得机械工程学士学位和硕士证书,干了几年实际工作以后,他又回到母校读研究生,于1956年取得数学博士学位。第二年,他加盟IBM公司直到退休。在IBM开始了他的计算机生涯并为IBM计算机市场的开拓和计算机科学技术的发展,尤其是RISC架构编译器优化[11],做出了巨大贡献。

    中文名:约翰·科克,外文名:John Cocke,国籍:美国,出生地:美国北卡罗来纳州夏洛特,出生日期:1925年,职业:IBM老资格的研究员,计算机科学家,毕业院校:杜克大学,主要成就:RISC架构之父、ACM图灵奖(1987)[12],IEEE约翰·冯诺依曼奖(1994)[13],美国国家科学奖章(1994)[14],代表作品:《各种变换的优化方法》(A Catalogof Optimizing Transformations)

    2.1 学术生涯

    他的计算机生涯始于IBM,在计算机市场开拓和计算机科学技术发展均做出巨大贡献。由于学过机械和数学,基础扎实、知识面广,加上科克兴趣广泛,善于动脑,他在IBM许多产品的设计开发和技术问题的解决中都起过至关重要的作用,有众多的发明创造。在沃特森研究中心,在很长一段时间里,每当人们有疑难问题需要解决的时候,自然就会说:“找约翰讨论去”。事实上,科克也总能提出有益的建议,因而受到其同事的普遍敬仰和尊重[11]。

    Cocke在IBM公司从事的第一个项目是研究Stretch计算机(世界上第一个“超级计算机”型号),他很快成为大型机专家。1974年,Cocke和他领导的研究小组开始尝试研发每秒能够处理300线呼叫的电话交换网络。为了实现这个目标,他不得不寻找一种办法来提高交换系统已有架构的交换率。1975年,Cocke研究IBM370的CISC(ComplexInstruction Set Computing复杂指令集计算)系统,发现占总指令数20%的简单指令发出了80%程序调用,而占总指令数80%的复杂指令却只有20%的机会被用到。由此,他提出了RISC概念,其中心思想就是简化硬件设计,硬件只执行一部分很有限的最常用的指令,大部分复杂的操作则使用成熟的编译技术,由简单指令合成。RISC的最大特点是指令长度固定,指令格式种类少,寻址方式种类少,大多数是简单指令且都能在一个时钟周期内完成,易于设计超标量与流水线,寄存器数量多,大量操作在寄存器之间进行。

    1980年,Cocke在IBM位于约克城(Yorktown)华生研究中心(Watson Research Center)里开始研制IBM801(PowerPC前身),首台RISC机器就作为801微电脑项目的一部分最终开发成功。RISC技术推出以来,由于其优化指令系统带来运算速度提高的优势,使得RISC技术在1980年代后期,逐渐在高端服务器和工作站领域中取代了CISC成为主流微处理器设计架构之一。各个具备一定技术实力的厂家开始在这个架构上研发出自己的处理器,经过近二十年的发展,各大型计算机和超级服务器都采用RISC架构的处理器。现在,RISC处理器已经成为高性能计算机的代名词。

    RISC模型

    2.2 贡献成就

    科克的贡献和成就首先是在高性能计算机的体系结构方面。科克是60年代IBM推出的晶体管大型计算机,也是世界上第一个“超级计算机”(Supercomputer)型号STRETCH的技术负责人。Stretch包含15万只晶体管,其速度比IBM上一个主流计算机型号IBM704快75倍。STRETCH首创的灵活的寻址技术、指令提前执行(即流水线技术)、差错校正码ECC(Error Correcting Code)等至今仍被广泛使用着。Stretch共生产了8台,被洛斯阿拉莫斯(Los Alamos)国家实验室(这是研制出了世界上第一颗原子弹的著名的原子能研究中心)等机构所采用。

    模型

    70年代中期,科克又主持了一个801计算机项目。(注3:或叫“80号大楼”项目,这是IBM的传统,按研制小组所在建筑物命名项目) 801计算机原是为每小时能处理100万次呼叫的全数字电话交换机设计的专用机,但实现中被发展为一种具有小指令集、每个指令都是单地址、有固定格式、以流水线方式重叠执行、指令高速缓存和数据高速缓存则分开并互相独立的一种超级通用小型机。IBM推出这种体系结构引起加州大学伯克利分校D.Patterson和斯坦福大学J.Hennessy的极大兴趣和重视,经过进一步研究、改进和发展,最后形成为一种崭新的计算机体系结构,即大家熟知的“精简指令集计算机”RISC(ReducedInstruction Set Computer)。因此,RISC这个名词虽然是1980年由Patterson提出的,但学术界公认科克是RISC概念的首创者。

    计算机体系结构外,科克在编译器优化方面有很多重要贡献。高级语言编译器发展的初期,技术上不够成熟,生成的目标代码大,执行效率低,影响了高级语言的推广应用。科克对编译器代码生成技术进行了深入研究,提出了一系列优化方法,如过程(Procedure)的集成、循环(loop)的变换、公共子表达式(common subexpression)的消除、代码移动(code motion)、寄存器定位、存储单元重用等,编译器质量大大提高,使编译技术发展到一个新阶段。科克在其主编的《各种变换的优化方法》(A Catalogof Optimizing Transformations, Prentice Hall, 1972)中详细介绍了这些方法。

    此外,科克在磁记录技术、机器翻译的统计方法等方面也都有过创造和发明。

    在获得图灵奖以前,科克于1985年获得过ACM的另一个奖项:Eckert Mauchly奖。这个奖是1979年纪念世界上第一台电子计算机ENIAC的两位设计者而设立的,主要用来奖励在计算机体系结构方面作出杰出贡献的科学家。1991年,科克又荣获美国全国性的国家技术创新奖章“National Medal of Technology”。

    不知什么原因,科克没有出席图灵奖颁奖仪式,由他的同事A.Peled代为领奖并致词。但科克发表题为对科学处理器性能的探索”(Thesearch for Performance in Scientific Processors)的书面图灵奖演说,回顾了他一生追求高性能计算机的历程,认为对计算机性能影响最大的三个因素是算法、编译器和机器组织。虽然他本人从事机器组织和编译器方面研究工作,但他认为,这三者中,算法改进是最重要的。Peled致词和科克书面演说全文在Communicationsof ACM19883月号刊载。

    2.3 荣誉

    “IBM小子”是RISC(Reduced InstructionSet Computer,精简指令系统计算机)架构设计师——JohnCocke,在1972年得到的IBM公司颁赠给内部员工的最高荣誉称号。

    约翰·科克

    在IBM以外,他也受到广泛的认可,获得无数奖项,其中代表性的有:

    ACM图灵奖(1987)[12]

    IEEE计算机先驱奖(1989)[15]

    美国国家技术奖章(1991)[16]

    美国国家科学奖章(1994)[14]

    IEEE约翰·冯诺依曼奖(1994)[13]

    国家技术勋章和国家科学奖是美国最具荣耀的两项政府大奖,在作为科学家的一生中,他在高性能系统设计中取得的革命性进步,Cocke为信息技术的发展做出了独一无二的创造性贡献。在系统架构和编译器优化研究领域取得了大量进步,当之无愧地成为编译器优化的奠基人和革新带头人。

    2.4 评价

    “从1957到1992年,John Cocke在工作中把自己近40年的精力毫无保留地奉献给了IBM,他取得了了不起(amazing)的成绩”,Cocke的同事兼密友Peter Capek这样评价他:“他的经历非同一般。他因为计算机架构而闻名,但他对很多领域同样充满浓厚兴趣。包括逻辑模拟(logicsimulation)、编码理论(coding theory)和编译器优化(compiler optimization),他都可以把这些技术当成艺术来研究。”Cocke退休后还依然为IBM公司发挥余热,直到2002年7月16日病故。

    2.5 关于RISC

    简介

    RISC(reduced instruction set computer精简指令集计算机)是一种执行较少类型计算机指令的微处理器,起源于80年代MIPS主机(即RISC机),RISC机中采用的微处理器统称RISC处理器。这样一来,能够以更快的速度执行操作(每秒执行更多百万条指令MIPS)。因为计算机执行每个指令类型都需要额外的晶体管和电路元件,计算机指令集越大就会使微处理器更复杂,执行操作也会更慢。

    RISC&amp;CISC

    纽约约克镇IBM研究中心的JohnCocke证明,计算机中约20%的指令承担了80%的工作,于1974年,他提出RISC的概念。第一台得益于这个发现的电脑是1980年IBM的PC/XT。再后来,IBM的RISCSystem/6000也使用了这个思想。RISC这个词本身属于伯克利加利福尼亚大学的一个教师David Patterson。RISC这个概念还被用在Sun公司的SPARC微处理器中,并促成了现在所谓的MIPS技术的建立,它是Silicon Graphics的一部分。许多当前的微芯片现在都使用RISC概念。

    RISC概念已经引领了微处理器设计的一个更深层次的思索。设计中必须考虑到:指令应该如何较好的映射到微处理器的时钟速度上(理想情况下,一条指令应在一个时钟周期内执行完);体系结构需要多“简单”;以及在不诉诸于软件的帮助下,微芯片本身能做多少工作等等。

    除了性能的改进,RISC的一些优点以及相关的设计改进还有:

    @如果一个新的微处理器其目标之一是不那么复杂,那么其开发与测试将会更快。

    @使用微处理器指令的操作系统及应用程序的程序员将会发现,使用更小指令集使得代码开发变得更加容易。

    @RISC的简单使得在选择如何使用微处理器上的空间时拥有更多的自由。

    @比起从前,高级语言编译器能产生更有效的代码,因为编译器使用RISC机器上的更小的指令集。

    除了RISC,任何全指令集计算机都使用的是复杂指令集计算(CISC)。RISC典型范例如:MIPSR3000、HP—PA8000系列,MotorolaM88000等均属于RISC微处理器。

    主要特点

    RISC微处理器不仅精简了指令系统,采用超标量和超流水线结构;它们的指令数目只有几十条,却大大增强了并行处理能力。如:1987年SunMicrosystem公司推出的SPARC芯片就是一种超标量结构的RISC处理器。而SGI公司推出的MIPS处理器则采用超流水线结构,这些RISC处理器在构建并行精简指令系统多处理机中起着核心的作用。

    RISC处理器是当今UNIX领域64位多处理机的主流芯片

    性能特点一:由于指令集简化后,流水线以及常用指令均可用硬件执行;

    性能特点二:采用大量的寄存器,使大部分指令操作都在寄存器之间进行,提高了处理速度;

    性能特点三:采用缓存—主机—外存三级存储结构,使取数与存数指令分开执行,使处理器可以完成尽可能多的工作,且不因从存储器存取信息而放慢处理速度。

    1、应用特点:由于RISC处理器指令简单、采用硬布线控制逻辑、处理能力强、速度快,世界上绝大部分UNIX工作站和服务器厂商均采用RISC芯片作CPU用。如原DEC的Alpha21364、IBM的PowerPCG4、HP的PA—8900、SGI的R12000A和SUNMicrosystem公司的UltraSPARC-II。

    2、运行特点:RISC芯片的工作频率一般在400MHZ数量级。时钟频率低,功率消耗少,温升也少,机器不易发生故障和老化,提高了系统的可靠性。单一指令周期容纳多部并行操作。在RISC微处理器发展过程中。曾产生了超长指令字(VLIW)微处理器,它使用非常长的指令组合,把许多条指令连在一起,以能并行执行。VLIW处理器的基本模型是标量代码的执行模型,使每个机器周期内有多个操作。有些RISC处理器中也采用少数VLIW指令来提高处理速度。

    RISCCISC区别

    RISC和CISC是目前设计制造微处理器的两种典型技术,虽然它们都是试图在体系结构、操作运行、软件硬件、编译时间和运行时间等诸多因素中做出某种平衡,以求达到高效的目的,但采用的方法不同,因此,在很多方面差异很大,它们主要有:

    (1)指令系统:RISC设计者把主要精力放在那些经常使用的指令上,尽量使它们具有简单高效的特色。对不常用的功能,常通过组合指令来完成。因此,在RISC机器上实现特殊功能时,效率可能较低。但可以利用流水技术和超标量技术加以改进和弥补。而CISC计算机的指令系统比较丰富,有专用指令来完成特定的功能。因此,处理特殊任务效率较高。

    (2)存储器操作:RISC对存储器操作有限制,使控制简单化;而CISC机器的存储器操作指令多,操作直接。

    (3)程序:RISC汇编语言程序一般需要较大的内存空间,实现特殊功能时程序复杂,不易设计;而CISC汇编语言程序编程相对简单,科学计算及复杂操作的程序社设计相对容易,效率较高。

    (4)中断:RISC机器在一条指令执行的适当地方可响应中断;而CISC机器在一条指令执行结束后响应中断。

    (5)CPU:RISCCPU包含有较少的单元电路,因而面积小、功耗低;而CISCCPU包含有丰富的电路单元,因而功能强、面积大、功耗大。

    (6)设计周期:RISC微处理器结构简单,布局紧凑,设计周期短,且易于采用最新技术;CISC微处理器结构复杂,设计周期长。

    (7)用户使用:RISC微处理器结构简单,指令规整,性能容易把握,易学易用;CISC微处理器结构复杂,功能强大,实现特殊功能容易。

    (8)应用范围:由于RISC指令系统的确定与特定的应用领域有关,故RISC机器更适合于专用机;而CISC机器则更适合于通用机。[17]

    词条标签:非教师,行业人物,教师,人物。词条统计:浏览11252次,编辑16次历史版本,最近更新:w_ou(2018-08-11)。[17]

    3.矢量化Parafrase编译系统作者David J. Kuck大卫·卡克

    大卫·卡克David J. Kuck,密西根大学(Universityof Michigan)研究生毕业。(注4:奥运会银牌得主Jonathan Kuck的父亲) 1965年至1993年,他是伊利诺伊大学厄本那-香槟分校计算机科学系(Computer Science Department the University of Illinois at Urbana-Champaign)教授,开发了Parafrase编译系统(1977)——自动矢量化和相关程序转换(automaticvectorization and related programtransformations)开发的第一个测试平台。作为超级计算研究与开发中心(CSRD-UIUC, Center for Supercomputing Research andDevelopment)主任(1986-93),Kuck领导了CEDAR项目的建设——1988年在伊利诺伊大学完成的分层共享内存32处理器SMP超级计算机(a hierarchicalshared-memory 32-processor SMP supercomputer)。[19]

    1979年,他创建Kuck and Associates(KAI)公司,以构建一系列行业标准的优化编译器(aline of industry-standard optimizing compilers),专注于利用并行性(parallelism)。在CSRD之后,Kuck将他的全部注意力转移到KAI及其在美国国家实验室(US National Laboratories)的客户身上。KAI于2000年3月被英特尔收购,Kuck目前在英特尔研究员、软件和服务组(SSG, an IntelFellow, Software and ServicesGroup),开发人员产品部(DPD, Developer Products Division)任职。

    与所有其他面向硬件的成员相比,Kuck是ILLIACIV项目中唯一的软件人员。Kuck不仅负责开发许多关于如何重新构建计算机源代码以实现并行性的初步想法,而且还负责培训该领域许多该领域的主要参与者。

    3.1 杰出博士论文奖Outstanding PhD Thesis Award

    Kuck是1965-1993年的计算机科学教授。1977年,他开发了Parafrase编译系统,该系统被用作开发关于矢量化和程序转换的许多新想法的试验台。他于1985年领导了Cedar的建设,这是一台在伊利诺伊州建造的32处理器SMP超级计算机。他是Kuck and Associates的创始人,并获得了无数奖项,包括ACM/IEEE的Eckert-Mauchly奖,IEEE计算机学会的计算机先锋奖,Charles Babbage杰出科学家奖以及CS@ILLINOIS杰出教育家奖。2015年,Kuck入选工程学院名人堂(College of Engineering Hall of Fame)。

    3.2 荣誉Honors

    Kuck是美国科学促进会(AmericanAssociation for the Advancement of Science)计算机协会(ACM, the Association for Computing Machinery)电气和电子工程师协会(the Instituteof Electrical and Electronics Engineers)成员。他也是国家工程院(the National Academy of Engineering)成员。他赢得了ACM/IEEE颁发的Eckert-MauchlyAward奖和IEEE计算机协会CharlesBabbage奖(the IEEE Computer Society Charles BabbageAward)。Kuck是创建OpenMP的主要贡献者。OpenMP是一种跨平台,基于指令的并行编程方法,在多核环境中尤其友好。2010年,Kuck被ACM和IEEE计算机学会高性能计算创新奖授予Ken Kennedy Award奖。[20][21]


    C编译器知识(5721)

    编译器

    文|秦陇纪,源|百度百科,科学Sciences2018110Thu

    编译器是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的计算机程序。一个现代编译器的主要工作流程:源代码(sourcecode)→预处理器(preprocessor)→编译器(compiler)→目标代码(objectcode)→链接器(Linker)→可执行程序(executables)。

    高级计算机语言便于人编写、阅读交流、维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言(High-level language),如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)

    对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)

    图1 MS VC++编译器函数演示图

    中文名:编译器,外文名:Compiler,别称:译码器,表达式:源代码→预处理器→编译器→目标代码,提出者:葛丽丝·霍普,提出时间:20世纪50年代末,应用学科:计算机,适用领域范围:计算机,单片机,编程语言。

    1 工作原理

    编译[1]是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器语言)的翻译过程。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。

    图2 MS宏汇编编译器

    典型的编译器输出是由包含入口点的名字和地址,以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,所以我们电脑上的文件都是经过编译后的文件。

    2 种类(▪处理器▪前端▪后端)

    编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高级语言作为输入,输出也是高级语言的编译器。例如:自动并行化编译器经常采用一种高级语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。

    图3 ISTool编译器

    处理器

    作用是通过代入预定义等程序段将源程序补充完整。

    前端

    前端主要负责解析(parse)输入的源代码,由语法分析器和语意分析器协同工作。语法分析器负责把源代码中的词块’(Token)找出来,语意分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句,函数等等。例如“a = b + c;”前端语法分析器看到的是“a,=,b,+,c;”,语意分析器按定义的语法,先把他们组装成表达式“b + c”,再组装成“a = b + c”的语句。前端还负责语义(semantic checking)的检查,例如检测参与运算的变量是否是同一类型的,简单的错误处理。最终的结果常常是一个抽象的语法树(abstract syntax tree,或AST),这样后端可以在此基础上进一步优化,处理。。(注5:token词义为象征、标志、纪念品、代币、代价券,和sign意思相同但比sign庄重文雅,常用于严肃场合。token有语言学词义:[语言学]语言符号,计算机词义:[计算机]令牌、标记。秦陇纪认为“符标”更合意,但常见NLP文献里token译为“词块”,随大流吧。)

    图4 c/c++编译器选项

    后端

    编译器后端主要负责分析,优化中间代码(Intermediaterepresentation)以及生成机器代码(Code Generation)。一般说来所有的编译器分析,优化,变型都可以分成两大类:函数内(intraprocedural)还是函数之间(interprocedural)进行。很明显,函数间的分析,优化更准确,但需要更长的时间来完成。

    3 代码分析

    编译器分析(compiler analysis)的对象是前端生成并传递过来的中间代码,现代的优化型编译器(optimizing compiler)常常用好几种层次的中间代码来表示程序,高层的中间代码(high level IR)接近输入的源程序的格式,与输入语言相关(language dependent),包含更多的全局性的信息,和源程序的结构;中层的中间代码(middle level IR)与输入语言无关,低层的中间代码(Low level IR)与机器语言类似。不同的分析,优化发生在最适合的那一层中间代码上。

    图6 编译器工作流程

    常见的编译分析有函数调用树(call tree),控制流程图(Control flow graph),以及在此基础上的变量定义-使用,使用-定义链(define-use/use-defineor u-d/d-u chain),变量别名分析(alias analysis),指针分析(pointeranalysis),数据依赖分析(data dependence analysis)等。

    程序分析结果是编译器优化(compiler optimization)和程序变形(compiler transformation)的前提条件。常见的优化和变形有:函数内嵌(inlining),无用代码删除(Dead code elimination),标准化循环结构(loop normalization),循环体展开(loop unrolling),循环体合并,分裂(loop fusion,loop fission),数组填充(arraypadding),等等。优化和变形的目的是减少代码的长度,提高内存(memory),缓存(cache)的使用率,减少读写磁盘,访问网络数据的频率。更高级的优化甚至可以把序列化的代码(serial code)变成并行运算,多线程的代码(parallelized,multi-threadedcode)。

    图7 编译器内部结构图

    机器代码的生成是优化变型后的中间代码转换成机器指令的过程。现代编译器主要采用生成汇编代码(assemblycode)的策略,而不直接生成二进制的目标代码(binaryobject code)。即使在代码生成阶段,高级编译器仍然要做很多分析,优化,变形的工作。例如如何分配寄存器(register allocatioin),如何选择合适的机器指令(instruction selection),如何合并几句代码成一句等等。

    4 工作方法

    首先编译器进行语法分析,也就是要把那些字符串分离出来。

    然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。

    最后生成的是目标文件,也称为obj文件

    再经过链接器的链接就可以生成最后的EXE文件了。有些时候需要把多个文件产生的目标文件进行链接,产生最后的代码。这一过程称为交叉链接

    5 编译器优化

    应用程序之所以复杂,是由于它们具有处理多种问题以及相关数据集的能力。实际上,一个复杂的应用程序就象许多不同功能的应用程序“粘贴”在一起。源文件中大部分复杂性来自于处理初始化和问题设置代码。这些文件虽然通常占源文件的很大一部分,具有很大难度,但基本上不花费CPU执行周期。

    尽管存在上述情况,大多数Makefile文件只有一套编译器选项来编译项目中所有的文件。因此,标准的优化方法只是简单地提升优化选项的强度,一般从O 2到O3。这样一来,就需要投人大量精力来调试,以确定哪些文件不能被优化,并为这些文件建立特殊的make规则。

    一个更简单但更有效的方法是通过一个性能分析器,来运行最初的代码,为那些占用了85一95% CPU的源文件生成一个列表。通常情况下,这些文件大约只占所有文件的1%。如果开发人员立刻为每一个列表中的文件建立其各自的规则,则会处于更灵活有效的位置。这样一来改变优化只会引起一小部分文件被重新编译。进而,由于时间不会浪费在优化不费时的函数上,重编译全部文件将会大大地加快。[25]

    6 进行对比

    许多人将高阶程序语言分为两类:编译型语言和直译型语言。然而,实际上,这些语言中的大多数既可用编译型实现也可用直译型实现,分类实际上反映的是那种语言常见的实现方式。(但是,某些直译型语言,很难用编译型实现。比如那些允许在线代码更改的直译型语言。)

    7 历史

    20世纪50年代,IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的研究。他的发现最终使得编译器的结构异常简单,甚至还带有了一些自动化。Chomsky的研究导致了根据语言文法的难易程度以及识别它们所需要的算法来对语言分类。正如Chomsky架构(Chomsky Hierarchy),它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法,且其中的每一个都是其前者的特殊情况。2型文法(或上下文无关文法)被证明是程序设计语言中最有用的,而且今天它已代表着程序设计语言结构的标准方式。分析问题(parsing problem,用于上下文无关文法识别的有效算法)的研究是在60年代和70年代,它相当完善的解决了这个问题。它已是编译原理中的一个标准部分。

    图8 反编译器

    有限状态自动机(FiniteAutomation)和正则表达式(RegularExpression)同上下文无关文法紧密相关,它们与Chomsky的3型文法相对应。对它们的研究与Chomsky的研究几乎同时开始,并且引出了表示程序设计语言的单词的符号方式。

    人们接着又深化了生成有效目标代码的方法,这就是最初的编译器,它们被一直使用至今。人们通常将其称为优化技术(Optimization Technique),但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实际上应称作代码改进技术(Code ImprovementTechnique)

    当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究这一部分的编译器自动构造。这些程序最初被称为编译器的编译器(Compiler-compiler),但更确切地应称为分析程序生成器(ParserGenerator),这是因为它们仅仅能够自动处理编译的一部分。这些程序中最著名的是Yacc(Yet Another Compiler-compiler),它是由SteveJohnson在1975年为Unix系统编写的。类似的,有限状态自动机的研究也发展了一种称为扫描程序生成器(Scanner Generator)的工具,Lex(与Yacc同时,由MikeLesk为Unix系统开发)是这其中的佼佼者。

    在20世纪70年代后期和80年代早期,大量的项目都贯注于编译器其它部分的生成自动化,这其中就包括了代码生成。这些尝试并未取得多少成功,这大概是因为操作太复杂而人们又对其不甚了解。

    编译器设计最近的发展包括:首先,编译器包括了更加复杂算法的应用程序它用于推断或简化程序中的信息;这又与更为复杂的程序设计语言的发展结合在一起。其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法。其次,编译器已越来越成为基于窗口的交互开发环境(Interactive DevelopmentEnvironmentIDE)的一部分,它包括了编辑器、连接程序、调试程序以及项目管理程序。这样的IDE标准并没有多少,但是对标准的窗口环境进行开发已成为方向。另一方面,尽管在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变,它正迅速地成为计算机科学课程中的中心环节。

    在20世纪90年代,作为GNU项目或其它开放源代码项目标一部分,许多免费编译器和编译器开发工具被开发出来。这些工具可用来编译所有的计算机程序语言。它们中的一些项目被认为是高质量的,而且对现代编译理论感兴趣的人可以很容易的得到它们的免费源代码。

    大约在1999年,SGI公布了他们的一个工业化的并行化优化编译器Pro64的源代码,后被全世界多个编译器研究小组用来做研究平台,并命名为Open64。Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。

    编译器相关专业术语: [26]

    1.

    compiler编译器;编译程序

    2.

    on-line compiler 连线编译器

    3.

    precompiler 预编译器

    4.

    serial compiler 串行编译器

    5.

    system-specific  compiler 特殊系统编译器

    6.

    Information  Presentation Facility Compiler 信息展示设施编译器

    7.

    Compiler Monitor  System 编译器监视系统

    权威合作编辑

    科普中国”百科科学词条编写与应用工作项目.资源提供中国电子学会(Chinese Instituteof Electronic)提供资源类型:内容。详情请大家直接看英文资料https://en.wikipedia.org/wiki/Compiler词条标签:科学百科信息科学分类,中国电子学会,软件,网站,互联网。词条统计:浏览558610次,编辑51次历史版本,最近更新:w_ou(2018-08-12)。

    —END—


    参考文献(3832字)

    1.wikipedia.Compiler.[EB/OL];wikipedia,https://en.wikipedia.org/wiki/Compiler,2018-11-16.

    2.云头条.编译器的“五个十年”发展史.[EB/OL];云头条企鹅号,https://new.qq.com/omn/20181103/20181103A1R61K.html,2018-11-03.

    3.wikipedia.John Cocke.[EB/OL];wikipedia,https://en.wikipedia.org/wiki/John_Cocke,2018-11-16.

    4.Schofield, Jack (2002-07-27). "John Cocke". The Guardian. GuardianMedia Group. Retrieved 2011-05-10. "Cocke's idea was to use fewerinstructions, but design chips that performed simple instructions very quickly.[...] Later, this approach became known as reduced instruction set computing(Risc) [...]"

    5.Jelinek, Frederick, "The Dawn of Statistical ASR and MT",Computational Linguistics, 35(4), 2009, pp. 483-494, doi:10.1162/coli.2009.35.4.35401

    6.John Cocke, The search for performance in scientific processors: the TuringAward lecture. Communications of the ACM, Volume 31 Issue 3, March 1988, Pages250-253. doi:10.1145/42392.42394

    7."National Science Foundation - The President's National Medal ofScience". Nsf.gov. Retrieved 2014-06-19.

    8."John Cocke". thocp.net. Retrieved 21 December 2015.

    9."John Cocke". Computer History Museum. Archived from the original on2013-05-09. Retrieved 2013-05-23.

    10.在线阅读.编译器优化奠基人:John Cocke.[EB/OL];中国Linux联盟,http://www.lisdn.com/html/97/n-297.html,引用日期2012-12-05.

    11.Association for Computing Machinery.CHRONOLOGICAL LISTING OFA.M. TURING AWARD WINNERS.[EB/OL];ACM官网,https://amturing.acm.org/byyear.cfm,引用日期2015-07-11,访问日期2018-11-16.

    12.Institute of Electrical and Electronics Engineers.IEEE John von NeumannMedal Recipients.[EB/OL];IEEE官网,https://www.ieee.org/about/awards/bios/vonneumann-recipients.html#top,引用日期2015-07-11,访问日期2018-11-16.

    13.National Science Foundation.The President's NationalMedal of Science: Recipient Search.[EB/OL];National ScienceFoundation官网https://www.nsf.gov/od/nms/recipients.jsp,引用日期2015-07-11,访问日期2018-11-16.

    14.Institute of Electrical and Electronics Engineers.Computer Pioneer Award.[EB/OL];IEEE计算机协会官网,http://www.computer.org/web/awards/pioneer,引用日期2015-07-12,访问日期2018-11-16.

    15.Office of the Chief Communications Officer,National Medal ofTechnology and Innovation (NMTI).The National Medal ofTechnology and Innovation 1991 Laureates.[EB/OL];The United States Patentand Trademark Office官网,https://www.uspto.gov/learning-and-resources/ip-programs-and-awards/national-medal-technology-and-innovation-nmti,引用日期2015-07-12,访问日期2018-11-16.

    16.IT世界网..[EB/OL];IT世界网,http://www.it.com.cn/,访问日期2018-11-16.

    17.最近更新:w_ou(2018-08-11).约翰·科克.[EB/OL];百度百科,https://baike.baidu.com/item/%E7%BA%A6%E7%BF%B0%C2%B7%E7%A7%91%E5%85%8B/7868274,2018-08-12,访问日期2018-11-14.

    18.blackhu.[IT名人堂] 编译器优化奠基人:John Cocke.[EB/OL];CSDN,https://blog.csdn.net/blackhu/article/details/673604?utm_source=blogxgwz5,2006-04-23.

    19.单片机论坛»论坛›非技术区›电子工程师杂谈›51hei小林.世界上第一个编译器的作者--女牛人Grace Murray Hoppe.[EB/OL];51黑电子论坛,http://www.51hei.com/bbs/dpj-55880-1.html,2016-9-24.

    20.Alumn.David J. KuckOutstanding PhD Thesis Award.[EB/OL];the University of Illinoisat Urbana-Champaign,https://cs.illinois.edu/about-us/awards/graduate-fellowships-awards/david-j-kuck-outstanding-thesis-awards,访问日期2018-11-16.

    21.wikipedia.David Kuck.[EB/OL];wikipedia,https://en.wikipedia.org/wiki/David_Kuck,2018-03-13.

    22.秦陇纪,计算机的数学思想源头(回复“计算机数学”可下载PDF典藏版).[EB/OL];数据简化DataSimp,https://mp.weixin.qq.com/s/JLGCOPN-OIyfyM5Rb0EKIw,2018-04-16.

    23.最近更新:ActLikeDove(2018-10-28).约翰·冯·诺依曼.[EB/OL];百度百科,https://baike.baidu.com/item/%E7%BA%A6%E7%BF%B0%C2%B7%E5%86%AF%C2%B7%E8%AF%BA%E4%BE%9D%E6%9B%BC/986797,2018-10-28,访问日期2018-11-18.

    24.编译互动的博客,胡月军聊天的博客.置顶:从实战中理解编译原理1(一断、二比、三译).[EB/OL];wikipedia,http://blog.sina.com.cn/compileinteract,2013-07-16,引用日期2013-07-31.

    25.David Levinthal Vladimir Tsymbal.注重性能的编译器使用:电脑编程技巧与维护,2005年:08期.

    26.最近更新:w_ou(2018-08-12).编译器.[EB/OL];百度百科,https://baike.baidu.com/item/%E7%BC%96%E8%AF%91%E5%99%A8,2018-08-12,访问日期2018-11-14.

    x.秦陇纪.数据简化社区Python官网Web框架概述;数据简化社区2018年全球数据库总结及18种主流数据库介绍;数据科学与大数据技术专业概论;人工智能研究现状及教育应用;信息社会的数据资源概论;纯文本数据溯源与简化之神经网络训练;大数据简化之技术体系.[EB/OL];数据简化DataSimp(微信公众号),http://www.datasimp.org,2017-06-06.

    编译器发展史5个十年3大人物及编译器知识(25289字)

    秦陇纪

    简介:编译器发展史5个十年3大人物及编译器知识。公号回复“编译器”文末“阅读原文”可下载31k字1表17图21页PDF资料,欢迎转发、赞赏、支持科普。蓝色链接“科学Sciences”关注后下方菜单项有文章分类页。作者:秦陇纪。来源:Michael Wolfe/维基百科/百度百科/数据简化社区/秦陇纪微信群聊公众号,引文出处附参考文献。主编译者:秦陇纪,数据简化DataSimp/科学Sciences/知识简化新媒体创立者,数据简化社区创始人OS架构师/C/Java/Python/Prolog程序员,IT教师。每天大量中英文阅读/设计开发调试/文章汇译编简化,时间精力人力有限,欢迎转发/赞赏/加入支持社区。版权声明:科普文章仅供学习研究,公开资料©版权归原作者,请勿用于商业非法目的。秦陇纪2018数据简化DataSimp综合汇译编,投稿合作、转载授权、侵权错误(包括原文错误)等请联系DataSimp@126.com沟通。欢迎转发:“数据简化DataSimp、科学Sciences、知识简化”新媒体聚集专业领域一线研究员;研究技术时也传播知识、专业视角解释和普及科学现象和原理,展现自然社会生活之科学面。秦陇纪发起,期待您参与各领域~~


    Appx.数据简化DataSimp社区简介(835字)

    信息社会之数据、信息、知识、理论持续累积,远超个人认知学习的时间、精力和能力。应对大数据时代的数据爆炸、信息爆炸、知识爆炸,解决之道重在数据简化(DataSimplification):简化减少知识、媒体、社交数据,使信息、数据、知识越来越简单,符合人与设备的负荷。数据简化2018年会议(DS2018)聚焦数据简化技术(DataSimplificationTechniques)对各类数据从采集、处理、存储、阅读、分析、逻辑、形式等方面做简化,应用于信息及数据系统、知识工程、各类数据库、物理空间表征、生物医学数据,数学统计、自然语言处理、机器学习技术、人工智能等领域。欢迎投稿数据科学技术、简化实例相关论文提交电子版(最好有PDF格式)。填写申请表加入数据简化DataSimp社区成员,应至少一篇数据智能、编程开发IT文章:①高质量原创或翻译美欧数据科技论文;②社区网站义工或完善S圈型黑白静态和三彩色动态社区LOGO图标论文投稿、加入数据简化社区,详情访问www.datasimp.org社区网站,网站维护请投会员邮箱DataSimp@163.com。请关注公众号“数据简化DataSimp”留言,或加微信QinlongGEcai(备注:姓名/单位-职务/学校-专业/手机号),免费加入投稿群科学Sciences学术文献读者微信群等。长按下图“识别图中二维码”关注三个公众号(搜名称也行,关注后底部菜单有文章分类页链接):

    数据技术公众号“数据简化DataSimp”:

    科普公众号“科学Sciences”:

    社会教育知识公众号“知识简化”:

    (转载请写出处:©秦陇纪2010-2018汇译编,欢迎技术、传媒伙伴投稿、加入数据简化社区!“数据简化DataSimp科学Sciences知识简化”投稿反馈邮箱DataSimp@126.com。)

    普及科学知识,分享到朋友圈

    转发/留言/打赏后“阅读原文”下载PDF

    阅读原文

    微信扫一扫
    关注该公众号

    展开全文
  • C语言发展史

    2021-05-21 05:29:38
    原标题:C语言发展史C语言发展史世界上本来没有计算机,工程师因为工作需要而创造了它。为了告诉计算机的正常运行,工程师发明了程序设计语言。 临近C语言考试,筒子们是不是和小编一样内心在抓狂、在咆哮呢?那今天...

    原标题:C语言发展史

    C语言发展史

    世界上本来没有计算机,工程师因为工作需要而创造了它。为了告诉计算机的正常运行,工程师发明了程序设计语言。

    7f580a1bbb304506343819fc5e21cd37.png

    0b5a12947d46246acfe130ab9b98f52a.png

    临近C语言考试,筒子们是不是和小编一样内心在抓狂、在咆哮呢?那今天就和小编一起来 了解一下C语言的发展史吧。

    1

    原始时代

    一般认为,最原始的程序设计语言是机器语言,也就是0和1,其实这没有意义,因为人不可能真的去写0和1,所以人们把这些0和1转写成好看一点的格式,然后让机器翻译成0和1再保存下来。这就是原始汇编语言。

    2

    远古时代

    人们在汇编语言的基础上,发明了很多高层语言,C语言就是其中最为成功的一个。C语言解决了汇编语言中所产生的问题,无需考虑类型、存储位置带来的指令的变化。

    简单说就是C语言大大的抽象了汇编语言,通过C语言的编译器将C语言代码翻译成处理器指令集所支持的代码形式,这一过程被称之为编译。

    3

    中古时代

    为了更好的开发GUI的应用程序,面向对象(OO)程序设计思想成为主流,于是人们开始在C语言的基础上增加一些特性使得其可以进行OO的编程。这其中的佼佼者就是C++语言。

    早期的C++语言在语法上几乎完全兼容C语言,并且提供了强大的OO程序设计能力,利用C语言现存的内存分配模式以及指针操作实现了对象的创建、继承和多态等特性。但也是这一套模式带来了另一个灾难,也就是内存泄露。C++把OO引入语言后,对象被创建而忘记释放的问题开始爆发,C++语言一度被认为是最容易犯错的语言。

    4

    近代

    为了解决C++暴露出来的问题,Java语言被发明出来。Java提出了中间语言和虚拟机的概念,Java程序会先编译为一种中间语言(ByteCode),然后再由运行在各个电脑上的Java运行时分析和执行这种中间语言。

    事实上一次编译,到处运行针对的是C/C++这种直接编译为本地代码的语言。在这个意义上来说,Java是做到了理论上的一次编译,到处运行的可能性。

    f6904343ede136b615835f3949db6070.png

    看到这里是不是越看越晕了呢?别急,让小编我来总结一下:

    7893f52f24bda5528ebf8b02cc12e9f4.png

    C语言于1972年发明,首次使用是用于重写UINX操作系统。

    随着UNIX操作系统的成功,C语言也得到了大幅度地推广,被先后使用到大、中、小、微型主机上,至今还是世界上最流行、使用最广泛的高级程序设计语言之一。

    C语言是一门面向过程的语言,非面向对象的语言。

    9579bd05f6f269b1640e90f5e6f27282.png

    文字来源|网络

    微信编辑|刘月

    责任编辑:

    展开全文
  • 第一讲 序论; 软件的基本组成部分是完成其功能的程序 程序设计语言也被称为编程语言Programming Language是... 对于编译执行方式人们实现了高级语言编译器Compiler完成这种转换工作编译器把高级语言程序看成是符合一定
  • 文章目录前言一、密码进化二、密码存储安全进化三、密码编译器总结 前言 写这篇博客的目的是了解下登录密码的进化,好清楚自己以后登录密码的设置方式,已经方向,然后如果系统密码编码格式固定,后期新的...
  • c++发展史

    2020-10-27 17:40:29
    c++发展史 引言: c++作为
  • Linux发展史之简要概述

    千次阅读 2022-04-06 13:00:14
    文章目录前言一、Linux发展史二、本篇重要内容:总结 前言 本篇博客简要介绍一下Linux发展史 Unics -> Unix -> Linux 一、Linux发展史 Unics诞生(Unix前身) 1965年,贝尔实验室Bell、麻省理工学院MIT、...
  • C语言 | 快速了解C的发展史

    千次阅读 多人点赞 2021-10-13 15:56:25
    C语言 | 快速了解C的发展史 C语言 | 【耗费一夜总结三本C语言系列】之 指针、数组 一文透彻~~~ C语言 | 【耗费一夜总结三本C语言系列】之 结构体、联合、枚举 C语言 | 【耗费一夜总结三本C语言系列】之 声明 C语言 ...
  • 以及 Fedora 16(作为Red Hat Enterprise Linux 7性能的说明) 需要指出的是,Scientific Linux 5.7采用的是Linux 2.6.18内核,GNOME 2.16.0桌面,X.Org 7.11,Mesa 6.5.1,GCC 4.1.2 编译器以及EXT3文件系统。...
  • 一、汇编语言基础 汇编语言 = 操作码+操作数 ...注:.bin文件为二进制文件,里面是纯净的机器指令,纯净的意思就是注释什么的等等都没有。.lst是列表文件,lst是list...十二、操作系统发展史相关
  • C语言发展史的点点滴滴

    万次阅读 多人点赞 2020-09-21 18:00:00
    作者:李彦锋,腾讯 IEG 运营开发工程师一直想写一篇关于C语言的文章,里面包含C语言的发展史、创始人等相关事迹。但是却迟迟未写,主要原因是因为:在我看来,这个语言太过于伟大、耀眼。作为...
  • 一、编程语言发展史1、机器语言机器能理解的语言,二进制,0,1,0,1...... 是直接操作硬件的的底层语言。执行效率高,开发效率底,跨平台性差。2、汇编语言通过英文字符组成的二进制,直接操作系统,也是底层语言,...
  • JAVA发展史

    2022-03-26 11:47:32
    发展史 1.1990年年末,Sun公司成立了一个由James Gosling领导的“Green计划 ” 2.Sun公司在1995年年初发布了Java语言,Sun公司直接把Java放到互联网上,免费给大家使用,甚至连源代码也不保密,也放到互联网上向所有...
  • Linux 发展史

    万次阅读 2016-07-10 00:00:07
    Minix没有任何代码抄袭Unix,所以它们之间并没有任何继承关系,Minix作为当时有以来的第一个开源的操作系统放到网上以后,短期之内得到了飞速发展,大量的人进行下载学习。 由于Minix是教授一人所写,所以存在...
  • 编译器历史简要

    千次阅读 2006-03-10 12:16:00
    一、 历史背景上世纪50年代,IBM的John Backus带领一个研究小组对FORTRAN语言及其编译器进行开发。但由于当时人们对编译理论了解不多,开发工作变得既复杂又艰苦。与此同时,Noam Chomsky开始了他对自然语言结构的...
  • 科学上,优美的理论预言最终没能通过实验的检验是再常见不过的事。 另一类未能实现的理论构想存在于工程设计中。很多童鞋可能都知道达·芬奇的“飞机”设计手稿,这里我们说另外一个例子——英国数学家和工程师 ...
  • 编程语言的发展史

    千次阅读 2020-12-30 14:28:19
    自从1946年世界上第一台电子计算机问世,人类和机器的交流方式和语言就成为了软件工程师和计算机从业者的主要研究方向,更有效更简便的编程语言成为了软件工程师的新宠儿,伴随着计算机的飞速发展,计算机的硬件升级...
  • 《ACM图灵奖(1966-1999)---计算机发展史的缩影》读后感 计算机的诞生与发展不得不说是世界发展的里程碑,在科学技术发展突飞猛进的今天,计算机的作用是无可比拟的.我曾经看了一本书, 《ACM图灵奖(1966―1999)――...
  • JDK发展史

    千次阅读 2020-12-08 19:06:29
    3、JDK 1.2 1998年12月,分为三个方向:面向桌面应用开发—J2SE、面向企业级开发—J2EE、面向手机移动终端开发—J2ME 技术:EJB、Java Plug-in、Java IDL、Swing,内置了JIT即使编译器,加入了strictfp关键字,引入...
  • 【Linux】一步一步学Linux——Linux发展史(01)

    千次阅读 多人点赞 2019-07-04 22:39:46
    Minix没有任何代码抄袭Unix,所以它们之间并没有任何继承关系,Minix作为当时有以来的第一个开源的操作系统放到网上以后,短期之内得到了飞速发展,大量的人进行下载学习。 由于Minix是教授一人所写,所以存在...
  • Java简介和发展史

    千次阅读 2020-11-24 16:14:43
    Java简介和发展史 1. JAVA发展史 计算机硬件发展的同时,软件始终伴随其步伐迅猛发展,就计算机的编程语言而言,也划分为三代。 第一代:机器语言。每条指令用二进制编码,效率很低。 第二代:汇编语言。用符号编程...
  • Python的发展史和发展趋势

    千次阅读 2020-09-25 19:46:27
    一、Python发展史 Python是一种计算机程序设计语言。你可能在之前听说过很多编程语言,比如难学的C语言(语法和实现难度),非常流行的JAVA语言(尤其是现在分布式存储和服务),非常有争议的PHP(常见 WordPress ...
  •  在谈标准C/C++语言发展史之前,我们不得不先谈谈标准,既然是标准那就是说大家都得遵循,当然标准一般只是一个最小子集,再演化一下到各个国家就出现国家标准和行业标准了,本文可能提到的标准化组织主要包括ISO...
  • 了解操作系统的发展历史 知道 Linux 内核及发行版的区别知道 Linux 的应用领域 01. 操作系统的发展历史1.1Unix 1965 年之前的时候,电脑并不像现在一样普遍,它可不是一般人能碰的起的,除非是军事或者学院的研究...
  • 编译器概述

    2020-04-22 16:05:25
    什么是编译器编译器是一个程序,核心功能是把 源代码 翻译成 目标代码 。 源代码: c/c++,Java,c#,html,sql,… 目标代码: x86,IA64,ARM,MIPS,… 编译器的核心功能: 源代码经过编译器的翻译,生成了目标代码,...
  • UNIX操作系统发展史简介

    千次阅读 2020-10-02 21:37:32
    注:BCPL(Basic Combined Programming Language)是Martin Richards写的,他在1967年写了篇文章“编译器编写和系统编程工具(A tool for compiler writing and systems programming)”。因为B是“BCPL的精简版”...
  • java发展史java已经有20多年的历史了,我将2021算上已经有26年了,按照成年人的年纪来算,算是已经毕业可以出来赚钱准备养家的路上了,虽然说现在java很火特别最近几年的微服务盛...
  • 计算机语言的发展史

    万次阅读 多人点赞 2018-10-03 18:02:57
    语言的发展历史 计算机语言的发展 总体分三个阶段 第一代 机器语言 (相当于人类的原始阶段) 第二代 汇编语言 (相当于人类的手工业阶段) 第三代 高级语言 (相当于人类的工业阶段) 开篇:记住一个人 冯•诺依曼 ...
  • Java语言发展史 1995年,互联网的蓬勃发展给了Oak机会。5月23日,Sun公司在Sun world会议上正式发布Java和HotJava浏览器。 1996年1月,Sun公司发布了Java的第一个开发工具包(JDK 1.0),这是Java发展历程中的重要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,539
精华内容 4,615
关键字:

编译器的发展史