所以我现在正在学习MSIL来学习调试我的c# . net应用程序。
我一直在想:堆栈的目的是什么?
把我的问题联系起来: 为什么要从内存转移到堆栈或“加载”? 另一方面,为什么要从堆栈转移到内存或“存储”? 为什么不把它们都放在内存里呢?
是因为它更快吗? 是因为它是基于内存的吗? 效率呢?
我试图抓住这一点,以帮助我更深入地理解CIL代码。
所以我现在正在学习MSIL来学习调试我的c# . net应用程序。
我一直在想:堆栈的目的是什么?
把我的问题联系起来: 为什么要从内存转移到堆栈或“加载”? 另一方面,为什么要从堆栈转移到内存或“存储”? 为什么不把它们都放在内存里呢?
是因为它更快吗? 是因为它是基于内存的吗? 效率呢?
我试图抓住这一点,以帮助我更深入地理解CIL代码。
当前回答
I looked for "interrupt" and nobody included that as an advantage. For each device that interrupts a microcontroller or other processor, there are usually registers that are pushed onto a stack, an interrupt service routine is called, and when it is done, the registers are popped back off of the stack, and put back where they were. Then the instruction pointer is restored, and normal activity picks up where it left off, almost as if the interrupt never happened. With the stack, you can actually have several devices (theoretically) interrupt each other, and it all just works -- because of the stack.
There is also a family of stack-based languages called concatenative languages. They are all (I believe) functional languages, because the stack is an implicit parameter passed-in, and also the changed stack is an implicit return from each function. Both Forth and Factor (which is excellent) are examples, along with others. Factor has been used similar to Lua, for scripting games, and was written by Slava Pestov, a genius currently working at Apple. His Google TechTalk on youtube I have watched a few times. He talks about Boa constructors, but I'm not sure what he means ;-).
I really think that some of the current VM's, like the JVM, Microsoft's CIL, and even the one I saw was written for Lua, should be written in some of these stack-based languages, to make them portable to even more platforms. I think that these concatenative languages are somehow missing their callings as VM creation kits, and portability platforms. There is even pForth, a "portable" Forth written in ANSI C, that could be used for even more universal portability. Anybody tried to compile it using Emscripten or WebAssembly?
使用基于堆栈的语言,有一种称为零点的代码风格,因为您可以只列出要调用的函数而不传递任何参数(有时)。如果这些函数完美地结合在一起,那么除了所有零点函数的列表之外,什么都没有,这就是您的应用程序(理论上)。如果你深入研究Forth或Factor,你就会明白我在说什么。
Easy Forth是一个用JavaScript编写的在线教程,这里有一个小样本(注意“sq sq sq sq”作为零点调用风格的例子):
: sq dup * ; ok
2 sq . 4 ok
: ^4 sq sq ; ok
2 ^4 . 16 ok
: ^8 sq sq sq sq ; ok
2 ^8 . 65536 ok
另外,如果你看一下Easy Forth的网页源代码,你会在底部看到它是非常模块化的,由大约8个JavaScript文件编写。
I have spent a lot of money on just about every Forth book I could get my hands on in an attempt to assimilate Forth, but am now just beginning to grok it better. I want to give a heads up to those who come after, if you really want to get it (I found this out too late), get the book on FigForth and implement that. The commercial Forths are all too complicated, and the greatest thing about Forth is that it is possible to comprehend the whole system, from top to bottom. Somehow, Forth implements a whole development environment on a new processor, and though the need for that has seemed to pass with C on everything, it is still useful as a rite of passage to write a Forth from scratch. So, if you choose to do this, try the FigForth book -- it is several Forths implemented simultaneously on a variety of processors. A kind of Rosetta Stone of Forths.
为什么我们需要一个堆栈——效率、优化、零点、中断时保存寄存器,对于递归算法来说,它是“正确的形状”。
其他回答
I looked for "interrupt" and nobody included that as an advantage. For each device that interrupts a microcontroller or other processor, there are usually registers that are pushed onto a stack, an interrupt service routine is called, and when it is done, the registers are popped back off of the stack, and put back where they were. Then the instruction pointer is restored, and normal activity picks up where it left off, almost as if the interrupt never happened. With the stack, you can actually have several devices (theoretically) interrupt each other, and it all just works -- because of the stack.
There is also a family of stack-based languages called concatenative languages. They are all (I believe) functional languages, because the stack is an implicit parameter passed-in, and also the changed stack is an implicit return from each function. Both Forth and Factor (which is excellent) are examples, along with others. Factor has been used similar to Lua, for scripting games, and was written by Slava Pestov, a genius currently working at Apple. His Google TechTalk on youtube I have watched a few times. He talks about Boa constructors, but I'm not sure what he means ;-).
I really think that some of the current VM's, like the JVM, Microsoft's CIL, and even the one I saw was written for Lua, should be written in some of these stack-based languages, to make them portable to even more platforms. I think that these concatenative languages are somehow missing their callings as VM creation kits, and portability platforms. There is even pForth, a "portable" Forth written in ANSI C, that could be used for even more universal portability. Anybody tried to compile it using Emscripten or WebAssembly?
使用基于堆栈的语言,有一种称为零点的代码风格,因为您可以只列出要调用的函数而不传递任何参数(有时)。如果这些函数完美地结合在一起,那么除了所有零点函数的列表之外,什么都没有,这就是您的应用程序(理论上)。如果你深入研究Forth或Factor,你就会明白我在说什么。
Easy Forth是一个用JavaScript编写的在线教程,这里有一个小样本(注意“sq sq sq sq”作为零点调用风格的例子):
: sq dup * ; ok
2 sq . 4 ok
: ^4 sq sq ; ok
2 ^4 . 16 ok
: ^8 sq sq sq sq ; ok
2 ^8 . 65536 ok
另外,如果你看一下Easy Forth的网页源代码,你会在底部看到它是非常模块化的,由大约8个JavaScript文件编写。
I have spent a lot of money on just about every Forth book I could get my hands on in an attempt to assimilate Forth, but am now just beginning to grok it better. I want to give a heads up to those who come after, if you really want to get it (I found this out too late), get the book on FigForth and implement that. The commercial Forths are all too complicated, and the greatest thing about Forth is that it is possible to comprehend the whole system, from top to bottom. Somehow, Forth implements a whole development environment on a new processor, and though the need for that has seemed to pass with C on everything, it is still useful as a rite of passage to write a Forth from scratch. So, if you choose to do this, try the FigForth book -- it is several Forths implemented simultaneously on a variety of processors. A kind of Rosetta Stone of Forths.
为什么我们需要一个堆栈——效率、优化、零点、中断时保存寄存器,对于递归算法来说,它是“正确的形状”。
维基百科上有一篇非常有趣/详细的文章,堆栈机器指令集的优点。我需要完全引用它,所以简单地放一个链接更容易。我将简单地引用副标题
非常紧凑的目标代码 简单的编译器/简单的解释器 最小处理器状态
如果不遵循堆栈/堆的概念,数据被加载到随机内存位置或数据从随机内存位置存储…它将是非结构化和无管理的。
这些概念用于以预定义的结构存储数据,以提高性能、内存使用……因此被称为数据结构。
To add a little more to the stack question. The stack concept derives from CPU design where the machine code in the arithmetic logic unit (ALU) operates on operands that are located on the stack. For example a multiply operation may take the two top operands from the stack, multiple them and place the result back on the stack. Machine language typically has two basic functions to add and remove operands from the stack; PUSH and POP. In many cpu's dsp's (digital signal processor) and machine controllers (such as that controlling a washing machine) the stack is located on the chip itself. This gives faster access to the ALU and consolidates the required functionality into a single chip.
通过使用连续传递的编码风格,可以让系统在没有堆栈的情况下工作。然后调用帧成为在垃圾回收堆中分配的continuation(垃圾回收器将需要一些堆栈)。
参见Andrew Appel的旧文章:使用延续和垃圾收集进行编译可以比堆栈分配更快
(由于缓存问题,他今天可能会有一点错误)