基本语言的基本功能?DSL建议?


9

我终于开始理解创建解释器和编译器背后的复杂性。在达到这一点之前,我已经构建了TinyBasic,1964(Dartmouth)Basic的多个版本,并对这些语言进行了自己的扩展。最近的项目是一个我称为Open Source Basic的项目,因为我认为该语言没有其他会引起人们兴趣的功能。为了能够打开语言的源代码并了解如何完成某些复杂的事情(如何完成扫描,解析,解释和编译)

首先将Open Source Basic解释为基于堆栈的语言。然后,将基于该堆栈的语言立即进行解释和执行,或者将其转换为CLR可执行文件。

我的问题全部归结为:

  • 基于Basic的语言的基本特征/构造是什么?我已经有了这些基本构造:赋值,表达式,变量,一些函数(Random,ToUpper,ToLower),循环(for和do-while / until),If(块和单行)其他决策,基于控制台的输入(输入),输出(打印)和子例程(尚无参数)。
  • 当我“完成”将基本结构添加到我的语言中时,应该如何分支?进入哪个域?换句话说,一旦我使所有通用构造都起作用,我的开源基础语言应该朝哪个方向发展?

感谢您的时间,

多米尼克


3
我一直想要一种具有内置的,语法支持的AOP功能的语言。
FrustratedWithFormsDesigner

@Dominick:LINQ功能如何?
捕食者

@Frustrated ... AOP-面向方面的编程功能?你能举个例子吗?
多米尼克

5
您不应该从基本命令性功能开始发明特定领域的语言。首先将您的领域正式化,将这些知识转换为一种语言,然后再添加基本功能(如果有必要的话)。您甚至可能会得到一个图灵不完整的完美DSL,它是DSL的最佳特性之一。
SK-logic

1
当然,“ goto”是任何BASIC的必需功能吗?
佩里

Answers:


1

我在Commodore [Vic-20,C-64]上使用早期BASIC的经验给我的印象是,行号是BASIC的核心“功能”。似乎它们已不再用于现代实现中,这对我来说是有害的,因为我对BASIC的主要观点是将其作为学习语言,从中跃跃而出。


1

绝对是一项崇高的努力,但我认为您的工作重点已经逆转。

您首先要关心的是您的语言要解决的“域”问题。这就是为什么它首先被称为“领域特定语言”的原因。只有当DSL小巧,简单且专注范围窄时,它才能解决特定的问题,例如刀切黄油,才能容忍DSL 。

在确定了域以及语言在域中的工作方式之后,您可以确定特定的结构或功能。

最后,考虑使用内部DSL还是外部DSL可能会有所帮助。


0

我一直在为CAE / FEA应用程序开发脚本语言,发现对最终用户有用的一些功能包括:局部和全局变量具有动态分配和扩展的矩阵,带有参数的函数以及通过引用传递的结构(用户定义的类型)以及您自己提到的功能应该成为一门功能非常强大的语言。然后您将根据用户要求进行开发。


这是一种有趣且非常特定领域的语言(计算机辅助工程/有限元分析)。我明白了为什么您需要矩阵。您的所有建议都是非常好的建议,我会牢记在心的。谢谢。
多米尼克

0

如果已经存在,可以添加或扩展多个功能,但是...

...类似于基础的编程语言,与脚本语言非常相似,后来很多人错过或包含的功能就是名称空间或模块。

C,C ++,PHP,Visual Basic,开始时没有模块/名称空间,以后又添加了。

下一个可能是子例程(不返回值的过程或函数)和函数(返回特殊值的子例程)。


0

了解如何完成一些复杂的事情(如何完成扫描,解析,解释和编译)

在Stack Overflow网站上有一个很好的问题,资源可以理解编译器。您也可以查看我的Compilers类页面

当我“完成”将基本结构添加到我的语言中时,应该如何分支?

考虑到您已经构建的功能,我建议添加三种数据类型:int,string,boolean。您将需要做三件事,每件事都比以前做的难一点:

  1. 修改语法,以便您可以解析这些关键字。测试。
  2. 创建(或添加到现有的)符号表,以便您可以将数据类型以及变量名和其他属性包括在内。然后进行调试开关,以便您可以对其进行测试并查看符号表。
  3. 在代码生成到MsIL之前或在解释过程中,检查兼容类型。在每种执行模式下针对所有类型测试错误和非错误情况。

如果一切顺利,那么我建议使用范围(子例程中的局部与全局)。如果您需要一些建议,请告诉我。

祝好运。享受!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.