调试公共Lisp(SBCL)中的实时堆栈帧。调试器/编译器如何实现此功能?

调试公共Lisp(SBCL)中的实时堆栈帧。调试器/编译器如何实现此功能?,lisp,sbcl,Lisp,Sbcl,Lisp允许在调试过程中重新编译代码段,生成实时堆栈帧。我知道lisp是动态的,很容易重新绑定与方法关联的符号。然而,Lisp也可以轻松地在函数中重新定义单个表单。这比C#和Java调试器所能做的更强大、更灵活。它为什么以及如何工作?为什么现代语言不提供相同程度的诡辩?我在哪里可以找到一些论文或书籍来了解更多信息?这不是魔术。我在过去的集会上也是这样做的。我创建了一个DOS TSR程序,它将我可以处理的中断指向我自己的位置。当你用0除法或类似的方法除法时,它跳入我的程序,堆栈中有以前所有的程序堆

Lisp允许在调试过程中重新编译代码段,生成实时堆栈帧。我知道lisp是动态的,很容易重新绑定与方法关联的符号。然而,Lisp也可以轻松地在函数中重新定义单个表单。这比C#和Java调试器所能做的更强大、更灵活。它为什么以及如何工作?为什么现代语言不提供相同程度的诡辩?我在哪里可以找到一些论文或书籍来了解更多信息?

这不是魔术。我在过去的集会上也是这样做的。我创建了一个DOS TSR程序,它将我可以处理的中断指向我自己的位置。当你用0除法或类似的方法除法时,它跳入我的程序,堆栈中有以前所有的程序堆栈,以及它出错的地方。我只是提供了一个菜单来修复它,这样它就不会以DOS默认行为退出

在CL中,您有一个默认的异常处理程序,它调用一个函数,您可以在重新启动时看到您的选项。重新启动就像是在错误发生的范围内的代码,并提供了修复情况的方法。在任何有异常和闭包的语言中,都可以实现类似的功能。调试器和重新启动成为正在运行的程序的一部分,因此它以较低的性能为代价变得更加安全


有一种方法可以关闭它,它可能会使您的程序在CL中更快。该标准不要求执行任何操作,因此它是可选的,但是实现确实会生成不安全的快速代码,这些代码最终可能会成为分段错误,而不是调试器。

因此,基本上您要说的是,因为堆栈不像其他传统托管语言(如c)中的堆栈那样是无意识的,所以仍然有一种方法可以修补错误的函数,并从系统中的正确位置恢复执行新编译的函数,对吗?为了能够重新编译、替换函数或重新调用堆栈帧,它与条件系统没有任何联系……Kent Pitman写过关于条件系统的文章。还有一个有趣的讨论。Stackoverflow最适合于实际的编程问题。一般问题和获得外部资源(如书籍等)的建议最好在其他地方询问。。。Stackoverflow帮助说:“要求我们推荐或查找书籍、工具、软件库、教程或其他非网站资源的问题对于Stack Overflow来说是离题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决问题所做的工作。”