Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.compilers > #2707
| From | Lasse Hillerøe Petersen <lhp+news@toft-hp.dk> |
|---|---|
| Newsgroups | comp.compilers |
| Subject | Memory organisation of the Z80 Turbo Pascal compiler |
| Date | 2021-09-29 11:40 +0000 |
| Organization | SunSITE.dk - Supporting Open source |
| Message-ID | <21-09-014@comp.compilers> (permalink) |
I have been thinking about the old TurboPascal compiler (actually about its predecessor COMPAS Pascal, which I used long ago, but I believe the original Z80 CP/M TurboPascal was exactly the same in this regard.) In the TP 2.0 manual it says: "The recursion stack is used only by recursive procedures and functions, i.e. procedures and functions compiled with the A compiler directive passive (~A-}). On entry to a recursive subprogram it copies its workspace onto the recursion stack, and on exit the entire workspace is restored to its original state. The default initial value of RecurPtr at the beginning of a program, is 1 K ($400) bytes below the CPU stack pointer." In other words, all procedures in a program have their own statically located "workspace", and when recursive calls are made, the previously activation's local variables are saved away. I suppose this was practical on the Z80, because indexed operations were rather expensive and not relative to SP, using the separate IX and IY registers, whereas an LDIR instruction was reasonably efficient. As far as I can tell, this works great even for a language with nested lexical scope like Pascal. When an inner procedure refers to a containing procedure's local variable, it will get the currently active instance. However, I think there would be an issue when passing procedure local variables as VAR parameters in combination with some forms of mutual and/ or nested recursion, as the address passed would refer to the right workspace, but the workspace might contain the wrong activation instance. I'm not completely sure about this, and I don't have a setup at the moment where I could experiment and test it. In any case, I have never found any description of this style of scope management, since I actually used this compiler back in the 80es, and I don't know if it even has a name? Other than the copying (which may be considered inefficient, but only applies to recursive procedures) and the possible issue with passing references ending up pointing to the wrong variable, what would be the pros and cons of this method? /Lasse
Back to comp.compilers | Previous | Next — Next in thread | Find similar
Memory organisation of the Z80 Turbo Pascal compiler Lasse Hillerøe Petersen <lhp+news@toft-hp.dk> - 2021-09-29 11:40 +0000
Re: Memory organisation of the Z80 Turbo Pascal compiler Hans-Peter Diettrich <DrDiettrich1@netscape.net> - 2021-09-30 11:15 +0200
Re: Memory organisation of the Z80 Turbo Pascal compiler Lasse Hillerøe Petersen <lhp+news@toft-hp.dk> - 2021-10-02 10:38 +0000
Re: Memory organisation of the Z80 Turbo Pascal compiler gah4 <gah4@u.washington.edu> - 2021-10-02 13:08 -0700
Re: Memory organisation of the Z80 Turbo Pascal compiler Hans-Peter Diettrich <DrDiettrich1@netscape.net> - 2021-10-03 02:06 +0200
Re: Memory organisation of the Z80 Turbo Pascal compiler anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2021-10-02 20:45 +0000
csiph-web