
When I compile it I get three files, an actual runnable binary (at only 5M in size), a .o file and a .hi file. I'm sure these additional files are usefull in someway and as soon as I come across the right piece of documentation everything should make sense. But as a person new to the language I'm just left wondering why. [..] javac often creates tens or hundreds of .class files, some with strange names like MyClass$1.class, MyClass$2.class, and so on (yes, I know what they are for), and doesn't even generate a native binary.
[..]
When I use javac every file that is created is necessary for the application to run. This can't be said of the ghc compiler. Having an excuse that this is way the C compiler does it or that this is the way its always been done is to poor of a reason to even argue against. If a file isn't needed then it shouldn't be left there.
This isn't really true for Java either. You surely don't intend to distribute your app as a bunch of .class files - you distribute the .jar file. The .class files are just intermediate files that javac leaves lying around; and javac isn't even capable of building the .jar itself! You have to use a separate utility. Just think of ghc as a combined javac and jar, the .o files as .class files, and the executable as a .jar. In fact, this is how ghci treats .o files - it loads them as needed, in a way not that different from the Java VM (except that of course .o files are native, not bytecode). Anyway, this has already descended into advocacy, and I'll stop here. --KW 8-)