简短但(非常)准确的PL/SQL历史记录

2020-05-05 16:11:00

PL/SQL是全球排名前二十的编程语言之一。虽然我不是Matthew Symonds的成员,这也不是什么软件,但是PL/SQL的历史比“Oracle7拥有先进的体系结构,并且像Sybase一样,可以通过其优雅的新PL/SQL编程语言完全可编程”更有价值。这就是为什么在我的OOW/OCO会议和相关的博客系列“揭开PL/SQL的神秘面纱:编译单元的生命”的过程中,我想包括一些历史的原因。

当我第一次开始写这段历史时,我想最多只有几段。然而,我挖掘得越深,与我交谈的人越多,这个故事就变得越有趣。有一次,我决定我不能把所有这段令人印象深刻的历史留在剪辑室的地板上。

由于这是我写过的最长的帖子-而且我有更多的内容可用-我正在与甲骨文的Aaron Lazenby合作(希望)将这篇文章扩展为Oracle Connect的协作多部分文章集。因此,此条目仅涵盖PL/SQL来源的子集。虽然许多原始的底层代码仍然存在,但这篇文章并没有介绍优化编译器改进的历史。

彼得·克莱尔的职业生涯始于1972年在美国疾病控制数据公司(CDC)。虽然CDC已不复存在,但在整个20世纪60年代和70年代,它都是美国最顶尖的大型机和超级计算机公司之一。在软件方面,CDC的编译器产品部打造了首个商用的PASCAL编译器。Peter在这个部门的角色包括语言和编译器开发,专注于构建世界上最快的计算机语言处理器。在他六年的任期内,Peter不仅改进了CDC的编译器,还学到了很多关于整体语言发展的知识,更重要的是,了解了与之相关的实际问题。有了这些知识,彼得离开了疾控中心,成为了一名顾问。

几年后,也就是1984年,彼得翻阅了当地一家旧金山湾区的技术出版物,寻找更多与咨询相关的工作。该出版物中包含的是一则来自甲骨文的广告。通过小道消息,彼得听说甲骨文正在将数据库移植到许多不同的平台上,其中一个他相当了解。彼得认为这可能是一些合同工作的绝佳机会,于是给甲骨文打了个电话。几天后,彼得会见了他的鲍勃·米纳和比尔·弗莱德接受采访。

最初,三人回顾了彼得与运动相关的经历。由于甲骨文还在开发SQL和预编译器,以及与Oracle数据库连接的基于表单的界面,因此小组还讨论了Peter在语言和编译器开发方面的背景。在那次会议结束时,鲍勃和比尔说服彼得接受了一份全职工作;彼得成为甲骨文的第13位开发人员。

Peter不是典型的Oracle开发人员。他的队友形容彼得是一位友好、随和、能干、能力很强的建筑师,他不仅以聪明著称,而且还因为他对水和帆板运动的热爱而闻名,他几乎每天都这样做。彼得把“努力工作,努力玩耍”这句古老的座右铭放在心上,努力实现令人满意的工作与生活的平衡-这是他在整个职业生涯中磨练得完美的。

在甲骨文的头六个月里,Peter的职责更多的是与项目管理相关的,而不是技术上的。Bob希望专注于开发,并依赖Peter来管理日常项目任务。虽然彼得喜欢这份工作,但沟通却变得越来越有挑战性。“到那时,鲍勃和拉里已经在一起工作了很长一段时间,”彼得回忆道,“对他们来说,直接交流是很自然的,作为中间人,没过多久,每个人都意识到我是第三者。”为了减少这种摩擦,每个人都认为彼得专注于技术工作会更好。

考虑到他在编程语言方面的背景,Peter开始研究Oracle的预编译器。没过多久,另一个问题就出现了:竞争。

在那些日子里,几个数据库供应商有简单的数据触发器。同样,数据库执行过程函数的唯一方法是用另一种语言编写、编译和编写接口。PL/SQL最初的产品经理Ken Rudin回忆说:“由于这些方法有一定的局限性,而不是实现类似的功能,Oracle希望超越竞争对手,并提供数据库内部的完整过程编程能力。值得庆幸的是,甲骨文很早就意识到,一致的过程性语言将在多种工具中受益。“。这种语言就是PL/SQL,而最适合发明它的人是彼得·克莱尔(Peter Clare)。

为了创建PL/SQL,Peter与第一位正式的PL/SQL开发人员Kendall Jensen密切合作。“Kendall是关键人物,”Peter提到,“他真的了解构建现代编译器,并且了解所有最新的工具。”首先,彼得要求肯德尔尽其所能地寻找有关Ada编程语言的一切信息。

肯德尔立即直奔斯坦福图书馆,搜索任何可以找到的艾达研究资料。肯德尔抓起他能拿到的每一本书,回到甲骨文办公室,开始阅读。他拿起的其中一本书是由Gerhard Goos、William A.Wulf、Arthur Evans Jr.和Kenneth J.Butler出版的一本名为“戴安娜:Ada的中间语言”的书,作者是Gerhard Goos、William A.Wulf、Arthur Evans Jr.和Kenneth J.Butler。本出版物作为参考手册编写,不仅包含Ada语言和语法,还包含Ada的描述性中间属性表示法的接口定义语言(IDL)规范-Ada是当时占主导地位的Ada和中间表示法。有了这些信息,1987年1月,PL/SQL编译器代码的第一行就编写完成了。

PL/SQL编译器一开始是规范的逐字副本。Kendall使用手册的Ada语法编写了原始的基于YACC的解析器,并直接从语法规则操作生成了一棵Diana树。与其他语言的编译器不同,其他语言的编译器通常会生成一个非常抽象的语法树,然后将该树翻译成中间语言,而这种直接的方法对于类似Ada的语言很有效-特别是当参考手册以交错的方式表示IDL和语法时。为什么PL/SQL的语法和功能集模仿Ada?

Ada在20世纪80年代被认为是Pascal的继任者,是一种后起之秀的编程语言,在美国政府中特别受欢迎。正是因为这一点,以及甲骨文当时与政府众所周知的工作关系,许多人认为Ada被选中。虽然这一方面增加了语言的可信度,但它更多的是一种切题的好处,而不是故意的设计决定。实际上,开发团队希望PL/SQL成为一种更强类型的语言。在那些日子里,大多数编程语言都是强类型的,Oracle不想在数据库中提供缩减的功能。尽管开发人员在数据库和PL/SQL引擎之间的类型转换方面做出了让步,一些人后来对此感到遗憾,但Ada被认为是一种简单、安全和模块化的语言。同样,PL/I是SQL和Ada的基础,这意味着它们有许多相似之处,并使Ada成为建模Oracle过程性语言的理想之选。

最终,彼得和肯德尔无法独自完成更多的任务。因此,更多的开发人员加入了团队。虽然Kendall继续拥有解析器和整个PL/SQL语法,这是他喜欢的,但每个新开发人员都专门研究一个特定的组件。第一个是劳伦斯·休斯(Laurence Hughes),他做了一些清理工作,拿起了各种零碎的东西,开始朝着某种表面上的面向对象的方向构建,并开始监督代码的生成和执行。Pierre Dufour很快就加入了,在专注于更高的语义层之前,他对解析器做了一些改进,并改进了Diana树的注释。最后加入的是格雷·克洛斯曼。

Gray回忆道:“到我来到甲骨文的时候,该团队已经为其常用的控制流命令和标量数据类型实现了编译器和解释器。”PL/SQL的发展来得正是时候,因为学术界已经探索了许多编程语言的概念,但还没有用于商业产品的脚本语言。Gray致力于该语言的几个方面,例如改进内存管理,以及接管Laurence在面向对象支持方面的最初工作。“Gray对语言的理解是我所认识的任何人都无法比拟的,”Peter回忆道,“他在函数式编程方面有丰富的经验,对所有与之相关的问题都有清晰的理解。”当多个开发人员都在开发PPL/SQL时,有一个人在与之合作:James Mallory。

1987年,詹姆斯在斯坦福大学的暑假期间开始了他在甲骨文的第一次工作。作为不开发语言本身的“第一个PL/SQL程序员”,他为PL/SQLV1编写了规范的“Hello World”和质量保证测试套件。“我们研究这门语言已经有一段时间了,”Peter回忆道,“当你自己测试一门语言时,你知道要避免编译器无法处理的某些事情。每隔一段时间,能有一双新鲜的眼睛玩弄这门语言是很好的。“。

随着时间的推移,Kendall的远见卓识(预先实现整个规范,而不仅仅是支持PL/SQLV1所需的子集)增强了在以后的开发中添加附加功能的能力。例如,虽然PL/SQL V1只支持简单的过程,但是在PL/SQL V2中添加包主要需要添加代码生成器和解释器-大多数解析器和DIANA支持已经存在。格雷记得,“肯德尔总是对项目保持一个清晰的概述;他从不迷失在杂草丛生的杂草中,总是冷静地看待优先事项,并且随时可以帮助解决棘手的问题。”

这一切都是在鲍勃·米纳的太平洋高地家庭办公室进行的一系列讨论中开始的。在那里,Bob、Peter和Roger Bamford会面,就如何向非Oracle开发人员提供轻松扩展核心服务器功能的能力交换意见。“与Roger面对面地聚在一起总是有益的,”Peter回忆道,“他是一个非常聪明的人-我总是从他那里学到了很多关于数据库的知识,他也从我那里学到了很多关于PL/SQL的知识。”

PL/SQL引擎的体系结构作为Oracle产品的可嵌入组件,为Oracle提供了几个优势。首先,引擎可以从数据库本身内部执行服务器端。其次,引擎可以在客户端运行,并集成到其他Oracle产品(例如SQL*Forms)中。最后,引擎可以以类似的客户端方式执行,但更加独立,因为它在TimesTen中提供PL/SQL支持。

虽然服务器端PL/SQL是大多数人熟悉的形式,但它需要花费大量的时间和精力才能开始工作。“让PL/SQL在服务器端运行是一场噩梦,”Pierre回忆说,“最初,它适合数据库,就像梯形的圆形钉子一样。”Peter还记得,“将PL/SQL放入V7数据库有点像是一项黑客工作,但这是一项必要的黑客工作。”“第一次削减是有益的,”Peter继续说,“因为数据库团队从我们那里学到了很多,我们也从他们那里学到了很多。这是每个团队第一次看到另一个团队面临的问题。“。

从客户端的角度来看,PL/SQL引擎不仅可以在表单中使用,还可以在几个自定义垂直工具中使用。Gray回忆说,“我们与Oracle客户端产品的设计人员进行了紧张的会议,我们试图展示他们如何通过使用作用域而不是名称空间在PL/SQL中对其应用程序的语义进行建模。事实上,如果没有名字资格,这并不总是可能的,一些设计师认为这很尴尬。

尽管PL/SQL引擎依赖于与Oracle数据库共享的大量底层平台支持和内存管理代码,但是PL/SQL引擎向底层数据库展示了一个非常抽象的游标接口。“我们用来将数据库与PL/SQL分开的游标接口是最整洁的部分之一,”Kendall回忆道。在Oracle中,PL/SQL游标接口映射到数据库内核查询层,而在TimesTen中,它是与TimesTen引擎完全独立的连接。

在1989年末或1990年初,甲骨文已经有了相当大的发展。因此,出现了将多个开发团队合并为更大的团队的情况。PL/SQL团队也不例外,预编译组的其他几名成员也加入了PL/SQL开发。考虑到开发人员技能的相似性,这种重组对Oracle有利,并立即改进了PL/SQL。值得注意的立竿见影的改进是特里和杰弗里·奥尔金的工作成果;这对兄弟亲切地被称为“神奇双胞胎”。

Pierre回忆说:“Terry非常幸运,他拥有我们的YACC技术,该技术是PL/SQL和预编译器的基础。”Terry一直对编程语言充满热情。特里说:“构建一种编程语言,允许用户在高层次上指定计算机应该做什么,并将这种愿望转化为计算机能够理解和执行的东西,在我看来一直都有些神奇。”这就是为什么在加入PL/SQL开发之前,他花了几年时间改进Oracle的预编译器。在此期间,除了许多其他事情外,Terry还对SQLLIB(所有Oracle预编译器都为其生成代码的底层共享库)进行了重大改进,并创建了SLAX,这是PL/SQL至今仍依赖的语法分析器生成器。但是,SLAX不是为PL/SQL创建的。

在20世纪80年代,Oracle支持将SQL预编译器用于Ada、C/C++、COBOL、FORTRAN、PASCAL和PPL/I等宿主编程语言。当时,每个预编译器都使用手写解析器-这使得跟踪每个预编译器支持哪些功能变得困难。或者,通过使用解析器生成器,开发人员可以更容易地指定宿主语言的语法并生成用于解析它的代码。不幸的是,虽然这使得定义预编译器(通过exec SQL)和宿主语言支持的嵌入式SQL的语法变得很容易,但是同时解析两者是有问题的。

在语言分析中,孤岛文法是一种包含在另一种编程语言中的编程语言的语法。存储在宿主语言(C、COBOL等)中的嵌入式SQL被认为是孤岛语法。YACC是当时卓越的解析器生成器,它没有(现在仍然没有)真正支持孤岛语法。让YACC解析孤岛语法是很痛苦的。

从技术角度看,要使YACC在同一解析器中的多个语法之间切换,必须指定用户看不见的特定语法符号。然后,解析器和词法分析器必须围绕要标记化的语言和要解析的语言相互通信。当词法分析器识别到孤岛语法时,它会切换状态并必须注入此特定符号,以便YACC可以选择正确的孤岛语法规则(而不是宿主语言规则)。同样,当YACC认为它已经解析了孤岛语法时,它必须通知词法分析器它应该将其状态切换回宿主语言。尽管YACC还有其他方法可以做到这一点,但所有方法都同样痛苦。由于预编译组需要能够在多个宿主语言中集成相同的嵌入式SQL解析器,因此他们需要一种工具来轻松实现这一点。输入SLAX。

SLAX的发音是slack,它是一个内部解析器生成器,基本上与YACC兼容。虽然它看起来像一个缩写,但其实不然。SLAX代表分段语言YACC。没错,SLAX中X的正确发音是K。虽然SLAX没有与YACC共享代码,但当他给它命名时,Terry决定恭敬地向YACC致敬。像大多数工具一样,它做得很好。然而,过了一段时间,SLAX需要修改,并最终被重写。约翰·西明斯基用特里所说的“正确的方式”进行了重写。SLAX已经是一个经过验证的工具,它是PL/SQL解析器使用YACC的天然替代品。Terry在1990年的某个时候开始研究PL/SQL时,将PL/SQL从YACC转换到了SLAX,之后改进了底层解析器本身。

在此期间,特里把他的弟弟杰弗里带上了船。与享受前端编译器工作的Terry不同,Jeffrey更喜欢后端:具体地说,就是代码生成和执行。“杰弗里是非凡的,”彼得说。

最初,PL/SQL开发的重点是语言本身,性能不是关键因素。但是,随着越来越多的客户开始使用PL/SQL,性能成为一个问题。主要的性能瓶颈是第一个版本的PL/SQL虚拟机程序(“VM”),它是一个基于堆栈的字节码解释器,类似于当时的标准PASCAL字节码(p-code)解释器。

在基于堆栈的虚拟机中,表达式操作数被推送到堆栈上,然后在需要计算时弹出。对于当时的机器来说,这太慢了。在软件中解释每个字节码指令的开销是相当大的;一个简单的计算可能需要几十条指令,而执行中花费的大部分时间都花在了这个开销上。

在Ada中,这更糟糕,因为操作数可以引用多个作用域内的变量,也可以跨多个软件包引用变量。因此,Jeffrey首先重写了所有这些内容,并为操作数创建了一种“迷你解释器”,这样,无论操作数的地址多么复杂,都可以作为单字节码指令的一部分来检索操作数。这一改变大大降低了指令解码的开销,并使大型PL/SQL程序更加可行。肯德尔回忆说,关于这一改进,“我记得我看到过它。这是一段精彩而美丽的代码--真的很优雅。“。1990年重新加入甲骨文的James也提到了新虚拟机的效率有多高。

最终,从最初的日子开始,每个人都将从PL/SQL转向-要么离开Oracle,要么转到其他项目。Gray Clossman接着在甲骨文构建了其他与语言相关的功能,例如SSQLJ。Pierre Dufour转到了客户端应用程序端,在那里他从事CRM工作,并构建了一个仅限内部的PL/SQL编译器Rosetta,这使得在Java和PL/SQL之间无需修改就可以进行调用成为可能。在周末看到一个实现ANSI SQL模块语言的工具的演示后,Terry Olkin构建了一个原型,该原型为Oracle做了同样的事情,这导致了Oracle SQL*Module产品的创建。

当被问及在甲骨文工作的想法时,彼得说:“我度过了黄金岁月。数据库团队令人惊叹,一群真正令人难以置信的开发人员。我也喜欢和销售人员一起工作--精力充沛--如果你有一个想法,并能让别人相信你能执行,你就能做到。“。“这是一场爆炸,”Kendall回忆道,“直到PL/SQL变得流行起来,我们才开始管理它的一切。”格雷也有类似的记忆,“这个团队是自我启动的,完全可靠。每个成员都支持任何联合开发努力。和他们一起工作是一种乐趣。“。

从领导力的角度来看,所有最初的团队成员在个性和技术能力方面都对Peter有着美好的回忆。肯德尔说,“我从来没有与任何人合作过,他们的沟通水平如此之高。”Terry继续说,“Peter是PL/SQL背后的智囊,也是我见过的最好的人之一。”格雷附和道:“彼得是最好的位置。

..