Path: csiph.com!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!news.iecc.com!.POSTED.news.iecc.com!nerds-end From: dror.openu@gmail.com Newsgroups: comp.compilers Subject: Add nested-function support in a language the based on a stack-machine Date: Mon, 12 Feb 2018 11:25:36 -0800 (PST) Organization: Compilers Central Lines: 30 Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <18-02-009@comp.compilers> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Injection-Info: gal.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="60035"; mail-complaints-to="abuse@iecc.com" Keywords: code, question, comment Posted-Date: 12 Feb 2018 15:51:16 EST X-submission-address: compilers@iecc.com X-moderator-address: compilers-request@iecc.com X-FAQ-and-archives: http://compilers.iecc.com Xref: csiph.com comp.compilers:1950 Suppose I have a simple C-like programming language: int foo() { int x = 10; int bar(y int) { return y * 2 } return bar() + x } Like you can see, it supports nested functions. I already implemented the lexing-parsing phases, and now I'm working on the code generation and the stack-machine. most of the operations, and the simple flow-control already implemented but I need some help/ideas how to solve the nested-function task. The stack-machine has two registers, accumulator, and a temporary register. Each frame contains: `[arguments, local variables, return address, caller frame and stack pointer, temporaries and data operations]`. I read about two ways to implement the nested-function. one, using an activation-link (also called static-link), and display. Is there any better idea to handle this? If I'll choose one of these idea, is it compile time calculation or do I need to store something in runtime? if it's a runtime thing, what's the time complexity for it? is it O(1) operation, or something like O(k) where k is the depth of the function. [This at least used to be a standard topic in compiler texts. You should be able to do either in O(1). -John]