D - Pre-initialized constants.
- Ilya Minkov (55/55) Jan 21 2003 A while ago in a "preprocessor" thread, a need to have constants defined...
- Walter (4/59) Jan 21 2003 I think that could be done without changing the semantics of D, but it w...
- Ilya Minkov (10/12) Jan 21 2003 Yes, I figured it out by the time I wrote that, so we'll wait 'till
A while ago in a "preprocessor" thread, a need to have constants defined in a flexible way was shown. Most people used macros for this purpose. You use tools spewing some code. I think there is a better solution. I also used a kind of a tiny tool, "bin2c", which generated constant attays of pre-calculations, images, music, etc., which i needed to include into the application in binary. Resulting files are huge, the GCC went on my 'bit older notebook into swapping and got so slow that it took more than ten minutes to compile the project. And though it had 64 MB RAM and was running Windows 98. Plenty of ram IMO to compile a project using 3 Megs of code and generating less-then-a-meg executable. Most of the size were precalcs, bitmaps and sound. I just wanted to have it in one EXE and with less then a meg of binary data it does make sense. It all boils down to the same class of problems. I propose the following "hint". When a global constant is defined using a function call, for example: const SomeType = callGenerator("StringPar", 2, 3); It could be understood to execute the function at compile time with these parameters and to save the result into the executable. This function could, for exampe, do one of the following: - load a file into this constant array, so that the binary file gets compiled into the executable; - pre-compute an internal representation of a pattern-matching machine or similar. So that text can be typed inside a D programme, which is not evaluated at runtime into a usable structure, but instead at compile time. Even more useful for larger things like parsers, which take much less space in parsed representation; - simply compile strings out of parts ;) I don't think there is any ambiguity, since if someone wants to initialize his precalcs at run-time, he simply has to remove the const qulifier. He shouldn't be able to change an immutable array anyway. ;) This basically puts a number of limitation on such a function: - it may not use globals, as it would be an unnecessary complication and almost always a sign of a bug; - it may use APIs at its own risc... just not to leave any post-effects. It is very important for programmers to understand that this function may or may not be run during program execution, so that they can't rely upon the effects it may leave, nor may it be allowed to corrupt anything that a running programme may be using. You might call it "pure", but you can't actually check the purity when it uses external APIs to access the disk or something. Since not everything is an array, the implemetation would get complex. I'm sure there has to be a possibility to explore types at runtime, which would allow to: - optimise GC drastically without further complication to the compiler; - write a "persistent" library, allowing to save any structured data to disc (with pointer analysis and such), and read it back easily. As soon as a persistent library is done, making such things is a trivial matter, so it would better get delayed till then. I'll try to devise a consistent and compiler-friendly way to implement type browsing. I think that we would make use of type methods (it's their purpose, right?), apart from classes which already have a type information. The easy way would be to be able to retrieve pointer positions inside structures, and save the rest as "raw". However, that leads to problems when endianness has to be taken care of. -i.
Jan 21 2003
I think that could be done without changing the semantics of D, but it would require a much more advanced compiler. -Walter "Ilya Minkov" <midiclub tiscali.de> wrote in message news:b0jif1$2kc2$1 digitaldaemon.com...A while ago in a "preprocessor" thread, a need to have constants defined in a flexible way was shown. Most people used macros for this purpose. You use tools spewing some code. I think there is a better solution. I also used a kind of a tiny tool, "bin2c", which generated constant attays of pre-calculations, images, music, etc., which i needed to include into the application in binary. Resulting files are huge, the GCC went on my 'bit older notebook into swapping and got so slow that it took more than ten minutes to compile the project. And though it had 64 MB RAM and was running Windows 98. Plenty of ram IMO to compile a project using 3 Megs of code and generating less-then-a-meg executable. Most of the size were precalcs, bitmaps and sound. I just wanted to have it in one EXE and with less then a meg of binary data it does make sense. It all boils down to the same class of problems. I propose the following "hint". When a global constant is defined using a function call, for example: const SomeType = callGenerator("StringPar", 2, 3); It could be understood to execute the function at compile time with these parameters and to save the result into the executable. This function could, for exampe, do one of the following: - load a file into this constant array, so that the binary file gets compiled into the executable; - pre-compute an internal representation of a pattern-matching machine or similar. So that text can be typed inside a D programme, which is not evaluated at runtime into a usable structure, but instead at compile time. Even more useful for larger things like parsers, which take much less space in parsed representation; - simply compile strings out of parts ;) I don't think there is any ambiguity, since if someone wants to initialize his precalcs at run-time, he simply has to remove the const qulifier. He shouldn't be able to change an immutable array anyway. ;) This basically puts a number of limitation on such a function: - it may not use globals, as it would be an unnecessary complication and almost always a sign of a bug; - it may use APIs at its own risc... just not to leave any post-effects. It is very important for programmers to understand that this function may or may not be run during program execution, so that they can't rely upon the effects it may leave, nor may it be allowed to corrupt anything that a running programme may be using. You might call it "pure", but you can't actually check the purity when it uses external APIs to access the disk or something. Since not everything is an array, the implemetation would get complex. I'm sure there has to be a possibility to explore types at runtime, which would allow to: - optimise GC drastically without further complication to the compiler; - write a "persistent" library, allowing to save any structured data to disc (with pointer analysis and such), and read it back easily. As soon as a persistent library is done, making such things is a trivial matter, so it would better get delayed till then. I'll try to devise a consistent and compiler-friendly way to implement type browsing. I think that we would make use of type methods (it's their purpose, right?), apart from classes which already have a type information. The easy way would be to be able to retrieve pointer positions inside structures, and save the rest as "raw". However, that leads to problems when endianness has to be taken care of. -i.
Jan 21 2003
Walter wrote:I think that could be done without changing the semantics of D, but it would require a much more advanced compiler. -WalterYes, I figured it out by the time I wrote that, so we'll wait 'till we've got persistancy, then it shouldn't be a problem anymore. Just an idea. And i think that it is important that the result is well-defined, so that it's no "surprise" that some structure wasn't compiled and thus the EXE is dependant on some other file which should be a part of it. But maybe implement it for a simple case when these are arrays? Or an intrinsic initializer function, which would basically only load binaries from disk? -i.
Jan 21 2003