人们习惯性的认为程序是作为文本来存储的,也就是说,一个字节流;为什么不应该是呢?毕竟有无数的工具来编辑、显示、操作文本;今天的编程语言的核心部分是文法器,解析器,编译器和面向行的调试器;但是程序的文本只是程序的一种表现形式;程序不是文本;强行把程序塞到文本里引起了大量你可能还不知道的问题;我们需要一种不同的方法来存储并和我们程序一起工作
当编译器编译源代码时,它把文本解析成称作抽象语法树的树状结构;当程序员阅读源代码时,他们在脑海中做了本质上相同的事情;我们仍然不得不考虑程序的树状结构;这就是为什么我们要有花括号,方括号,圆括号等;这也是为什么我们需要格式化和缩进代码和遵守编码规范,因为这样就能够更容易的阅读源代码
我们为什么使用文本存储呢?因为当前,阅读和编辑程序最方便和最通用的方法还是使用文本编辑器;但是我们会为此付出代价,因为程序的文本表示有重大的缺点,其中最重要的是基于文本的编程语言非常难于扩展;如果程序以文本的形式存储,你就会需要一个无歧义的文法器来解析程序;当为语言加入新特性时,维护语言无二义性的扩展变得日益困难;我们将需要发明更多类型的括号、操作符、关键字、顺序规则、嵌套,等等;语言的设计者们花费了无数时间来思考语法,并试图发现扩展语言的新方法
如果我们打算让创建语言变得容易,我们就需要将程序的表示和存储从程序本身分离开;我们应该直接将程序存为结构图,因为这允许我们对语言做任何我们喜欢的扩展;有时,我们甚至根本不需要考虑文本存储;今天的一个很好的例子是Excel spreadsheet.百分之九十九的人根本不需要处理存储格式,当这成为问题时总会有各种导入导出功能可用;今天我们使用文本的真正原因是我们没有比文本编辑器更好的编辑器,但是我们可以改变这一点
问题是文本编辑器很愚蠢,并且不知道如何与程序的图状结构一起工作;但是使用正确的工具,编辑器将能够直接和图状结构一起工作,并且能够让我们自由的使用任何编辑器提供的我们喜欢的可视化表现形式;我们可以把程序做成文本、表、图、树、或其它任何形式;我们甚至能为不同目的使用不同的表现形式,比方说,图形化表示用来浏览,文本化表示用来编辑;我们能够为代码的不同部分使用领域相关的表示,比如为数学公式使用图形化的数学符号,为图表使用图形化的图表,为 spreadsheets使用行和列,等等;我们能够为问题域使用最合适的表现形式,可以是文本,但不限于文本;最好的表现形式依赖于我们如何思考问题域;表现形式的灵活性也将使我们的编辑器比以往更加强大,因为不同的表现形式有不同的方式去编辑它们
What Is a Language in LOP?
最后,我应该阐明我认为的“语言”是什么;在LOP中,一种语言是通过三个主要的要素来定义的:结构、编辑器、和语义;结构定义了抽象语法、支持的概念、以及如何安排它们;编辑器定义了具体的语法,如何描绘和编辑语言;语义定义了行为,它如何被解释,和/或它如何被转换成可执行代码;当然,语言还可以有其它方面,比如约束和类型系统
Part II. INTRODUCTION TO META PROGRAMMING SYSTEM
Creating Languages in MPS
我已经解释了为什么我们需要容易的创建新的语言,但是,我们如何才能让它容易呢?如果你turn around这个问题,并且把Language Oriented Programming应用于它自身,你会很快看到答案;This calls for a little self-referential bootstrapping, which can seem tricky, but be patient. 一旦你理解了这个,你将得到LOP真正的力量(一个LOP的元层次)
文章来源于领测软件测试网 https://www.ltesting.net/