Function 语言设计:Gotos与函数的结合

Function 语言设计:Gotos与函数的结合,function,language-design,interpreter,goto,Function,Language Design,Interpreter,Goto,我正在设计并重新思考一种与汇编语言相似的低级解释性编程语言 我很快就遇到了函数/循环/gotos决策问题,并认为像while和for这样的循环级别太高,不适合使用,而gotos级别太低,无法维护,通常又是邪恶的。 大多数语言中都有返回值和参数的函数,这些函数在语言的概念中也不合适 所以我试着在函数和goto之间找出一些能够 递归 有效循环 经过一番思考,我想出了子程序的想法: 它们像函数一样有开始和结束 它们有一个名称,但没有像goto这样的参数 您可以使用jump进入一个,然后在结束之前

我正在设计并重新思考一种与汇编语言相似的低级解释性编程语言

我很快就遇到了函数/循环/gotos决策问题,并认为像
while
for
这样的循环级别太高,不适合使用,而gotos级别太低,无法维护,通常又是邪恶的。 大多数语言中都有返回值和参数的函数,这些函数在语言的概念中也不合适

所以我试着在函数和goto之间找出一些能够

  • 递归
  • 有效循环
经过一番思考,我想出了子程序的想法:

  • 它们像函数一样有开始和结束
  • 它们有一个名称,但没有像goto这样的参数
  • 您可以使用jump进入一个,然后在结束之前使用
    return
    再次退出(不返回任何结果,只停止子例程)
  • 像普通代码一样处理->像goto一样的全局范围
所以我想知道:

  • 上面的想法好吗?(dis)的优点是什么
  • 会有一个更好的功能和转到的组合,甚至是一个全新的想法吗

    • 我认为,当您处于汇编级别时,GOTO不再是邪恶的,而是开始成为程序实际工作的方式


      但不管怎样,你的子程序有参数吗?即使没有,您的存储注册状态如何避免递归溢出?

      您正在实现的子例程与Basic中的GOSUB或汇编中的调用完全相同

      递归只有在用于递归算法时才有意义。这需要具有参数、局部变量和返回值的函数

      然而,在一些只包含全局变量的简单脚本语言中,有PUSHPOP指令用于在堆栈中存储变量(就像在汇编语言中推送和弹出寄存器一样)。这些可以用于局部变量和递归的低级实现

      我在Rosetta代码中的一些Vedit宏语言示例中使用了该方法,请参见示例和

      上面的想法好吗

      没有

      或者至少在你通过设计一种新语言更好地解释你试图解决的问题之前

      (dis)的优点是什么

      没有函数抽象,没有递归,只通过共享可变状态进行编程。很弱的合成原理。对于人类程序员来说很难使用,并且作为编译器目标毫无意义


      要想在这样的项目中有所作为,你必须有一个目标。如果你的目标是学习一些东西,你最好学习一些很棒的语言,试着找出你能偷什么,你能结合什么,或者你能实现什么。如果你有一个真正的问题要解决,而它不能用标准的汇编语言来解决,那很有趣,告诉我们它是什么


      你可以在谷歌上搜索“可移植汇编语言”,看看有没有什么有趣的东西。

      那么你基本上是在实现GOSUB?你是说从BASIC开始的?可能,但我不知道GOSUB是否支持递归。如果您的子例程没有参数或变量,那么有关递归的问题就无关紧要了。@PauliL:您所说的完全错了。我使用了一个带有跳转位置的堆栈,以便解释器知道在子例程之后返回到哪里。但是,为了避免内存消耗、缓慢和溢出,当子例程调用自身->loop.Sub时,不会使用堆栈,如果在子例程调用自身时不存储返回地址,那么它就不是真正的递归。使用“递归”实现循环是没有意义的。改用goto。