闲聊Backus Naur Form

我们程序员,每天都享受着巴科斯-诺尔(BNF范式)范式,给我们带来的程序语言世界。

但,大多数人,对他们二人知之甚少。我也不例外。

我也不想引用任何文献,就自己所了解的,这里做个小笔记。

先说一下ENIAC小组。

冯。诺依曼由ENIAC机研制组的戈尔德斯廷中尉介绍参加ENIAC机研制小组。

之后,冯。诺依曼写了他的著名论文,为当代计算机体系打下基础。

冯。诺依曼发明了许多东西,但冯。诺依曼是个数学家,他对计机算虽然热情相当高,因为他要用计算机来计算,说白了,他还是一个数学家,只是需要计算机进行巨量计算。

所以,冯。诺依曼发明用定点数来算浮点数据的一系列算法。

在这个小组中,还有一个狂人,就是巴科斯。

他希望能够制作出编译器,自动完成浮点数的设定。

所以,先要定义一门语言,这门语言就叫: Fortran  (源自于“公式翻译”:FormulaTranslation)

虽然说,谁都明白,如果有纯浮点数该有多好呢?不用每次计算前,进行仔细的设定(学过算法的人都理解啊,小数点设置不对,计算机可是什么也算不出来)。

从心里而言,哪个科学家,都梦想有这个东西出现。

可是,毕竟现实是残酷的。那时候,才是50年代初。那时的计算机,只是一个吞吐纸带的怪物。

所以,冯。诺依曼反对这个根本不现实的想法。当时,什么语言啊,编译器这些东西,都是全新的概念。

冯。诺依曼认为,这种设定,完全超出了现有的计算机的能力。会白白浪费科研经费。

客观来说,冯。诺依曼是对的。

不过,这里我们举一个例子:为什么哥仑布是西班牙资助的?因为西班牙当时,刚建国,不懂航海,而葡萄牙的航海已很成熟了,他们经过计算,认为,既使地球是园的,哥仑布的想法也根本不现实。

而哥仑布到死也不承认自己搞错了。事实上是他搞错了,但这不耽误他是一个伟人。

因为多数人,都有梦想,不象冯.诺依曼那么现实,巴科斯的提案最终还是获得通过。冯.诺依曼也就不反对了。

然而,现实的发展,的确是残酷的——光是有梦想是不成的。Fortran这个世界上第一个编译器(还不是计算机语言,要注意),里不其然啊,直到1960年,还是无尽的bug。

不过,就象美洲救了哥仑布,一个与计算机无关的人,偏偏在这个时候,救了整个计算机行业。

这个人,许多人,肯定想到了,就是著名的乔姆斯基。他的论文《语法结构》拯救了这个行当。

巴科斯不是全凭幸运,现在人们也搞不清楚,他是如何得知这个消息,以及,他怎么读懂了乔姆斯基那么难懂的论文。

总之,狂人,都不是一般的聪明和运气好。

巴科斯立即明白,这就是他要的。所以,他发表了巴科斯范式。是在1959年。1960年诺尔发布了他的范式,二人的有所不同。我也不清楚,但我知道,我们目前用的,更像巴科斯的。

总之,当时乔姆斯基的发现,可能是在西方世界,还是有许多人知道。事实上的确如此,乔姆斯基的《语法结构》,刚发行不久,就有人写了比他还厚的反驳他的论文,而且与之名气相当——这的确是一个有趣的事情。

反正,现实世界和程序员世界完全不同,但程序界,还是完全接受了。

前面我提到过,先有了编译器,也就是FORTRAN 第一版,来自于是IBM的,对了,当时这些科学家都被IBM招去了。

FORTRAN前面我也说了,让巴科斯泥潭深陷,一堆解决不完的BUG.

但现在不同了,有了巴科斯范式,也就真正有了计算机语言,然后基于这种语言编写编译器,这就是第二版FORTRAN。

程序员们都应当记住这个历史性事件,语算机语言第一次被实现,第一次真正有了编译器的概念,就是第二版FORTRAN。

从此,计算机世界,再也没有人能拦得住了。

巴科斯范式直到今天,仍然是个迷,巴科斯是如何想到的,我们谁也不清楚,但请大家记住这个计算机世界的真正伟人吧

参考一些文章如下:

http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form

http://blog.csdn.net/begtostudy/article/details/6026806

闲聊Backus Naur Form,布布扣,bubuko.com

时间: 2024-12-06 10:57:09

闲聊Backus Naur Form的相关文章

Yacc 与 Lex 快速入门

Yacc 与 Lex 快速入门 Lex 与 Yacc 介绍 Lex 和 Yacc 是 UNIX 两个非常重要的.功能强大的工具.事实上,如果你熟练掌握 Lex 和 Yacc 的话,它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏.Ashish Bansal 为您详细的讨论了编写自己的语言和编译器所用到的这两种工具,包括常规表达式.声明.匹配模式.变量.Yacc 语法和解析器代码.最后,他解释了怎样把 Lex 和 Yacc 结合起来. 5 评论 Ashish Bansal ([ema

语言定义的其他示例

在本章的以后部分,我们会看到有关如何解析简单的算术语言的两个扩展示例.第一个用fslex.exe 和 fsyacc.exe 实现,第二个用开源的解析库 FParsec.这种语言与前一章的非常相似,语言规范完全相同,有四则运算,只是不再使用连接符(combinator),语言本身有文字格式 *.+./.- 来表示运算.扩展的巴氏范式(Extended Backus–Naur Form,EBNF),用下面的代码定义这种语言: digit     = "1"| "2"|

Yacc 与 Lex 快速入门(词法分析和语法分析)

我们知道,高级语言,一般的如c,Java等是不能直接运行的,它们需要经过编译成机器认识的语言.即编译器的工作. 编译器工作流程:词法分析.语法分析.语义分析.IR(中间代码,intermediate Representation)产生.IR优化.代码产生.最终优化: 我们这里主要介绍的是语法分析: Lex 代表 Lexical Analyzar.Yacc 代表 Yet Another Compiler Compiler. 让我们从 Lex 开始吧. Lex Lex 是一种生成扫描器的工具.扫描器

图灵奖牛人介绍

维基的图灵奖介绍,英文原文链接https://en.wikipedia.org/wiki/Turing_Award 图灵奖作为计算机领域的世界顶级大奖,从1966年到2015年共有64位牛人获得该奖,其中有3位是杰出女性,超值得点赞,她们分别是Frances E. Allen(编译器优化).Barbara Liskov(编程语言和分布式系统).Shafi Goldwasser(加密算法复杂度理论). 分布式相关的获奖者有2位,分别是Barbara Liskov(ViewStamp Replica

编译原理-如何使用flex和yacc工具构造一个高级计算器

Flex工具的使用方法 Lex 是一种生成扫描器的工具. Lex是Unix环境下非常著名的工具,主要功能是生成一个扫描器(Scanner)的C源码. 扫描器是一种识别文本中的词汇模式的程序. 这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义.一种匹配的常规表达式可能会包含相关的动作.这一动作可能还包括返回一个标记. 当 Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配. 它一次读入一个输入字符,直到找到一个匹配的模式. 如果能够找到一个匹配的模式,Lex 就执行相关

SequoiaDB的查询执行过程

SequoiaDB的查询执行过程 继续读了SDB的代码,重点还是内核的代码.从客户端–查询优化-查询执行的过程来描述一下查询的过程.希望可以搞清楚2个问题: SDB能做什么查询? 搞清楚SDB是怎么做查询的? 第一个问题的答案是: 理论上,SDB能做mongoDB能做的所有查询,SDB还支持SQL(我指的是SDB内建的支持,不是通过PG支持的查询) 实际上,我没有一个一个去测,SDB看起来mongoDB类的查询基本上完成了:SQL的支持还更像一个玩具.至于说我怎么得到这个结论的,请看下面的分析吧

如何阅读W3C(World Wide Web Consortium)标准

所谓理想,只是同时用于实力的人才能说的“现实”.所谓弱就是一种罪——沙克洛克达尔<one piece> 万维网联盟(World Wide Web Consortium , 简称W3C),是Web技术领域最具权威和影响力的国际中立性技术标准机构.他是Web技术规范的管理者,诸如超文本标记语言(HTML),可扩展标记语言(XML)以及帮组残障人士有效获得Web内容信息无障碍指南(Web Content Accessibilty Guidelines ,简称WCAG).如果要查阅相关的规范可以访问w

2018 Multi-University Training Contest 4

Problem D. Nothing is Impossible Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 504    Accepted Submission(s): 302 Problem Description m students, including Kazari, will take an exam tomorrow

2018 Multi-University Training Contest 4 Problem K. Expression in Memories 【模拟】

任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6342 Problem K. Expression in Memories Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 2150    Accepted Submission(s): 772Special Judge Problem De