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: Louis Krupp Newsgroups: comp.compilers Subject: Re: Add nested-function support in a language the based on a stack-machine Date: Tue, 13 Feb 2018 00:42:00 -0700 Organization: Newshosting.com - Highest quality at a great price! www.newshosting.com Lines: 45 Sender: news@iecc.com Approved: comp.compilers@iecc.com Message-ID: <18-02-012@comp.compilers> References: <18-02-009@comp.compilers> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit Injection-Info: gal.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="85254"; mail-complaints-to="abuse@iecc.com" Keywords: code, GCC Posted-Date: 13 Feb 2018 11:14:30 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:1952 On Mon, 12 Feb 2018 11:25:36 -0800 (PST), dror.openu@gmail.com wrote: >Suppose I have a simple C-like programming language: ... >Like you can see, it supports nested functions. gcc supports nested functions as an extension to C. Compiling this program with -O0 -fdump-tree-all and looking at the generated files might give you an idea of one way to do it: #include int main(void) { int k1 = 1; int p1(void) { int k2 = 2; int p2(void) { int k3 = 3; int p3(void) { return k1 + k2 + k3; } return p3(); } return p2(); } int n; n = p1(); printf("%d\n", n); return 0; } Apparently, gcc chains stack frames, and accessing uplevel variables, as when p3 uses k1 and k2, seems like it would take O(n) time, where n is the nesting level. The alternative, a display vector, seems like it would be easier to implement unless you're doing this for a real machine with a real (and therefore limited) set of registers. Louis