digitalmars.D - No -c no main()
- Steve Teale (8/8) Mar 19 2009 Would it be a big deal to make the compiler recognize that there is no -...
- Daniel Keep (6/18) Mar 19 2009 main might be linked in from another library/object on the command line.
- Steve Teale (2/26) Mar 19 2009 True, but maybe if there were only .d files?
- Walter Bright (1/1) Mar 19 2009 It's a good idea. Please add to bugzilla as an enhancement request!
- Yigal Chripun (8/9) Mar 19 2009 another thing that can be done is provide a compiler flag to specify the...
- Mike Parker (6/16) Mar 19 2009 It's not something that happens at compile time. All existing main
- Yigal Chripun (13/30) Mar 19 2009 Java's model is complicated. it has the concept of class-loaders.
- Mike Parker (7/40) Mar 20 2009 I understand what you were suggesting. My point is that in Java, which
- Ary Borenszweig (11/56) Mar 20 2009 It is useful. Suppose you are writing a new module and want to test
- bearophile (9/14) Mar 20 2009 It has many usages, we have already discussed about this in the past.
- Georg Wrede (20/43) Mar 20 2009 In a bigger project, this would result in quite a few main() functions,
- Christopher Wright (5/8) Mar 20 2009 Why aren't you writing a unittest?
- Yigal Chripun (5/11) Mar 20 2009 to add to what Ary and bearophile already said, that can be even more
- Steve Teale (3/18) Mar 20 2009
- bearophile (12/15) Mar 20 2009 I meant them to be kept, and not deleted.
- BCS (6/11) Mar 20 2009 The the interesting threads are the OT ones. Particularly the OT regardi...
- Mike Parker (4/8) Mar 20 2009 Discussions like this are precisely one of the strengths of this
Would it be a big deal to make the compiler recognize that there is no -c, but no instance of main() has been found, and say "Link skipped - no main()" instead of what you get if you do dmd mian.d on import std.stdio; void mian() { writefln("Hello Wolrd"); }
Mar 19 2009
Steve Teale wrote:Would it be a big deal to make the compiler recognize that there is no -c, but no instance of main() has been found, and say "Link skipped - no main()" instead of what you get if you do dmd mian.d on import std.stdio; void mian() { writefln("Hello Wolrd"); }main might be linked in from another library/object on the command line. dmd stuff.d unittest_main_stub.obj You'd have to have the compiler crack open all .lib and .obj files and look for a main. -- Daniel
Mar 19 2009
Daniel Keep Wrote:Steve Teale wrote:True, but maybe if there were only .d files?Would it be a big deal to make the compiler recognize that there is no -c, but no instance of main() has been found, and say "Link skipped - no main()" instead of what you get if you do dmd mian.d on import std.stdio; void mian() { writefln("Hello Wolrd"); }main might be linked in from another library/object on the command line. dmd stuff.d unittest_main_stub.obj You'd have to have the compiler crack open all .lib and .obj files and look for a main. -- Daniel
Mar 19 2009
It's a good idea. Please add to bugzilla as an enhancement request!
Mar 19 2009
On 19/03/2009 12:19, Walter Bright wrote:It's a good idea. Please add to bugzilla as an enhancement request!another thing that can be done is provide a compiler flag to specify the module that contains main() so the compiler will use that specific main and ignore all others. this is similar to how you specify the class with main() method in Java. Jar files have a manifest with this info and in Eclipse you specify the class in the Run dialog. I don't remember how it works with the command line (actually, I don't remember ever using the command line with Java)
Mar 19 2009
Yigal Chripun wrote:On 19/03/2009 12:19, Walter Bright wrote:It's not something that happens at compile time. All existing main methods are compiled into their respective class files. From the command line, you execute the JRE (java or javaw in Sun's case) and pass it the name of the class you want to execute. If the class has a main method, it is called. If not, you get an error.It's a good idea. Please add to bugzilla as an enhancement request!another thing that can be done is provide a compiler flag to specify the module that contains main() so the compiler will use that specific main and ignore all others. this is similar to how you specify the class with main() method in Java. Jar files have a manifest with this info and in Eclipse you specify the class in the Run dialog. I don't remember how it works with the command line (actually, I don't remember ever using the command line with Java)
Mar 19 2009
Mike Parker Wrote:Yigal Chripun wrote:Java's model is complicated. it has the concept of class-loaders. What I'm suggesting is this: given three modules a,b and c all defining the main() function, you can do the following: dmd a.d b.d c.d --main=b.d currently the compiler will complain about multiple definitions of main(), but with the above flag, it could skip over the main() functions in a and c. the next logical step would be to allow: dmd -c a.d dmd -c b.d dmd -c c.d dmd a.obj b.obj c.obj --main=b.obj in the above all three obj files have a main() method. this time it must be the *linker* that needs to understand the flag and only link the main() function into the executable. this requires changing the linker which is written in asm so less likely to happen. I was not suggesting D to use a VM or the class-loader concept as in Java. even if we want that concept in D it needs to have a different implementation than in Java since there are problems with the way Java does this. (that's besides the differences due to the JVM)On 19/03/2009 12:19, Walter Bright wrote:It's not something that happens at compile time. All existing main methods are compiled into their respective class files. From the command line, you execute the JRE (java or javaw in Sun's case) and pass it the name of the class you want to execute. If the class has a main method, it is called. If not, you get an error.It's a good idea. Please add to bugzilla as an enhancement request!another thing that can be done is provide a compiler flag to specify the module that contains main() so the compiler will use that specific main and ignore all others. this is similar to how you specify the class with main() method in Java. Jar files have a manifest with this info and in Eclipse you specify the class in the Run dialog. I don't remember how it works with the command line (actually, I don't remember ever using the command line with Java)
Mar 19 2009
Yigal Chripun wrote:Mike Parker Wrote:I understand what you were suggesting. My point is that in Java, which entry point to use is decided at run time, not compile time. From that perspective, it's a useful feature. For a statically compiled language like D, I don't see any obvious benefit. I mean, what is the benefit of this over delegating to a specific pseudo-main method based on a commandline arg or config file?Yigal Chripun wrote:Java's model is complicated. it has the concept of class-loaders. What I'm suggesting is this: given three modules a,b and c all defining the main() function, you can do the following: dmd a.d b.d c.d --main=b.d currently the compiler will complain about multiple definitions of main(), but with the above flag, it could skip over the main() functions in a and c. the next logical step would be to allow: dmd -c a.d dmd -c b.d dmd -c c.d dmd a.obj b.obj c.obj --main=b.obj in the above all three obj files have a main() method. this time it must be the *linker* that needs to understand the flag and only link the main() function into the executable. this requires changing the linker which is written in asm so less likely to happen. I was not suggesting D to use a VM or the class-loader concept as in Java. even if we want that concept in D it needs to have a different implementation than in Java since there are problems with the way Java does this. (that's besides the differences due to the JVM)On 19/03/2009 12:19, Walter Bright wrote:It's not something that happens at compile time. All existing main methods are compiled into their respective class files. From the command line, you execute the JRE (java or javaw in Sun's case) and pass it the name of the class you want to execute. If the class has a main method, it is called. If not, you get an error.It's a good idea. Please add to bugzilla as an enhancement request!another thing that can be done is provide a compiler flag to specify the module that contains main() so the compiler will use that specific main and ignore all others. this is similar to how you specify the class with main() method in Java. Jar files have a manifest with this info and in Eclipse you specify the class in the Run dialog. I don't remember how it works with the command line (actually, I don't remember ever using the command line with Java)
Mar 20 2009
Mike Parker escribió:Yigal Chripun wrote:It is useful. Suppose you are writing a new module and want to test something quickly (not with unittests, maybe make a little program to see how a specific feature you just wrote works). So you write a main right there in the module, compile it and link it saying that the main is in your new module. And you can then run it. If you couldn't do that you'd have to search for your only main in your project, change it by adding the necessary imports, compile it and run it. Way more steps. Also, that way each module can have a main method that shows some of it's funcionality with a little program.Mike Parker Wrote:I understand what you were suggesting. My point is that in Java, which entry point to use is decided at run time, not compile time. From that perspective, it's a useful feature. For a statically compiled language like D, I don't see any obvious benefit. I mean, what is the benefit of this over delegating to a specific pseudo-main method based on a commandline arg or config file?Yigal Chripun wrote:Java's model is complicated. it has the concept of class-loaders. What I'm suggesting is this: given three modules a,b and c all defining the main() function, you can do the following: dmd a.d b.d c.d --main=b.d currently the compiler will complain about multiple definitions of main(), but with the above flag, it could skip over the main() functions in a and c. the next logical step would be to allow: dmd -c a.d dmd -c b.d dmd -c c.d dmd a.obj b.obj c.obj --main=b.obj in the above all three obj files have a main() method. this time it must be the *linker* that needs to understand the flag and only link the main() function into the executable. this requires changing the linker which is written in asm so less likely to happen. I was not suggesting D to use a VM or the class-loader concept as in Java. even if we want that concept in D it needs to have a different implementation than in Java since there are problems with the way Java does this. (that's besides the differences due to the JVM)On 19/03/2009 12:19, Walter Bright wrote:It's not something that happens at compile time. All existing main methods are compiled into their respective class files. From the command line, you execute the JRE (java or javaw in Sun's case) and pass it the name of the class you want to execute. If the class has a main method, it is called. If not, you get an error.It's a good idea. Please add to bugzilla as an enhancement request!another thing that can be done is provide a compiler flag to specify the module that contains main() so the compiler will use that specific main and ignore all others. this is similar to how you specify the class with main() method in Java. Jar files have a manifest with this info and in Eclipse you specify the class in the Run dialog. I don't remember how it works with the command line (actually, I don't remember ever using the command line with Java)
Mar 20 2009
Ary Borenszweig:It is useful. Suppose you are writing a new module and want to test something quickly (not with unittests, maybe make a little program to see how a specific feature you just wrote works). So you write a main right there in the module, compile it and link it saying that the main is in your new module. And you can then run it.It has many usages, we have already discussed about this in the past. In D you can group related functions and classes into one module, so sometimes a module can be run alone (with the help of some modules it imports). So you can add demonstration code into its main, or benchmark/testing code, or module testing code, and so on. You can even create a program where certain modules can be sub-programs, that you can run alone to do specific sub-purposes, instead of using them as imported modules. Such usages are very common in Python too, there's even a idiomatic syntax to do such things. In the past other people and me have suggested some ways to do this. One of them was to add a __MAIN__ compile time constant defined as false for all the modules that the compiler is asked to not compile as the (main) module that contains the main(), so you can use a: static if (__MAIN__) { void main(string[] args) {...} } to wrap the main function. I don't remember if this very simple idea was already shot down or improved by better ideas. Bye, bearophile
Mar 20 2009
bearophile wrote:Ary Borenszweig:In a bigger project, this would result in quite a few main() functions, in several files. People tend to write them for debugging, and then forget to delete them.It is useful. Suppose you are writing a new module and want to test something quickly (not with unittests, maybe make a little program to see how a specific feature you just wrote works). So you write a main right there in the module, compile it and link it saying that the main is in your new module. And you can then run it.It has many usages, we have already discussed about this in the past. In D you can group related functions and classes into one module, so sometimes a module can be run alone (with the help of some modules it imports). So you can add demonstration code into its main, or benchmark/testing code, or module testing code, and so on. You can even create a program where certain modules can be sub-programs, that you can run alone to do specific sub-purposes, instead of using them as imported modules.The other option would be to write the new mains in new files. This would not pollute the files for the Real Project. And with a naming convention (say, myfoomodule-test2-main.d but the real main file having the appname and no main part), it would then become easy to find, remove, or list all the "other" mains. Also, having mymodule-main.d (and possibly mymodule-other-main.d) makes it possible to have an unlimited number of "mains", all without polluting the original mylib.Such usages are very common in Python too, there's even a idiomatic syntax to do such things.That would go well with Python being interpreted, and "an easy" language.In the past other people and me have suggested some ways to do this. One of them was to add a __MAIN__ compile time constant defined as false for all the modules that the compiler is asked to not compile as the (main) module that contains the main(), so you can use a: static if (__MAIN__) { void main(string[] args) {...} } to wrap the main function. I don't remember if this very simple idea was already shot down or improved by better ideas.I'd change "all the modules that the compiler is asked to not compile as the (main)" to "all the modules that the compiler is not asked to compile as the (main)". Let's say multiple mains become legal. Then this __MAIN__ idea would at least give the programmer a chance to "point it out" in source code, that this is "just an auxiliary main".
Mar 20 2009
Ary Borenszweig wrote:It is useful. Suppose you are writing a new module and want to test something quickly (not with unittests, maybe make a little program to see how a specific feature you just wrote works).Why aren't you writing a unittest? Well, you might only want to run the current module's tests, though in that case, you can compile the one module with -unittest and omit that for the others.
Mar 20 2009
On 20/03/2009 13:11, Mike Parker wrote:I understand what you were suggesting. My point is that in Java, which entry point to use is decided at run time, not compile time. From that perspective, it's a useful feature. For a statically compiled language like D, I don't see any obvious benefit. I mean, what is the benefit of this over delegating to a specific pseudo-main method based on a commandline arg or config file?to add to what Ary and bearophile already said, that can be even more useful if it's combined with D's unittesting features. for example the main() could specify what unit-tests to run and in what order, provide the before & after code, etc..
Mar 20 2009
I just asked what I thought was a very simple question. It was not intended to be the stimulus for vast changes! This newsgroup could do with some moderation. Wandering off the original topic is normal, not just common! All should bear in mind that unless this is just intellectual wanking we need to get this language stabilized. Then others might start to take it seriously.dmd -c a.d dmd -c b.d dmd -c c.d dmd a.obj b.obj c.obj --main=b.obj in the above all three obj files have a main() method. this time it must be the *linker* that needs to understand the flag and only link the main() function into the executable. this requires changing the linker which is written in asm so less likely to happen. I was not suggesting D to use a VM or the class-loader concept as in Java. even if we want that concept in D it needs to have a different implementation than in Java since there are problems with the way Java does this. (that's besides the differences due to the JVM)I understand what you were suggesting. My point is that in Java, which entry point to use is decided at run time, not compile time. From that perspective, it's a useful feature. For a statically compiled language like D, I don't see any obvious benefit. I mean, what is the benefit of this over delegating to a specific pseudo-main method based on a commandline arg or config file?
Mar 20 2009
Georg Wrede:In a bigger project, this would result in quite a few main() functions, in several files. People tend to write them for debugging, and then forget to delete them.<I meant them to be kept, and not deleted. And big projects sometimes are made of sub-systems that are isolated enough to be sometimes useful alone.That would go well with Python being interpreted, and "an easy" language.<To me now Python3 looks less simple than Java. It has now lot of features. ---------------- Steve Teale:All should bear in mind that unless this is just intellectual wanking we need to get this language stabilized.<It will stabilize once it's appropriately dead and buried. Even Fortran and C aren't "stabilized" yet, see Fortran 2008 and C1x: http://en.wikipedia.org/wiki/Fortran#Fortran_2008 http://en.wikipedia.org/wiki/C99#Future_standards_directions Here I have seen more than once people talk about D3 and its possible AST macros ;-) Bye, bearophile
Mar 20 2009
Reply to Steve,I just asked what I thought was a very simple question. It was not intended to be the stimulus for vast changes! This newsgroup could do with some moderation. Wandering off the original topic is normal, not just common!The the interesting threads are the OT ones. Particularly the OT regarding the subject line but still in CS. This comes from the point that if some thing was on topic and interesting, I would have already looked into it. So the interesting things I don't know about are general OT.
Mar 20 2009
Steve Teale wrote:I just asked what I thought was a very simple question. It was not intended to be the stimulus for vast changes! This newsgroup could do with some moderation. Wandering off the original topic is normal, not just common! All should bear in mind that unless this is just intellectual wanking we need to get this language stabilized. Then others might start to take it seriously.Discussions like this are precisely one of the strengths of this newsgroup. They sometimes lead to beneficial results, such as additions or changes to the language. The last thing we need here is moderation.
Mar 20 2009