Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://www.haskell.org/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Re: A problem with a simple csv file parser (Aleksandar Dimitrov)
2. Re: A problem with a simple csv file parser (Daniel Fischer)
3. GHC-generated executables size (.)
4. Re: GHC-generated executables size (Aleksandar Dimitrov)
5. Re: GHC-generated executables size (Daniel Fischer)
6. Re: GHC-generated executables size (.)
----------------------------------------------------------------------
Message: 1
Date: Sat, 16 Oct 2010 10:59:10 +0200
From: "Aleksandar Dimitrov" <[email protected]>
Subject: Re: [Haskell-beginners] A problem with a simple csv file
parser
To: beginners <[email protected]>, "Andy Elvey"
<[email protected]>
Message-ID: <op.vknu8uzejdv...@bylha>
Content-Type: text/plain; charset=utf-8; format=flowed; delsp=yes
On Sat, 16 Oct 2010 07:23:04 +0200, Andy Elvey
<[email protected]> wrote:
> -- A simple csv parser Module parseCSV where
> import Text.ParserCombinators.Parsec
That's your problem. I'm assuming the newline got chomped up, so your
source file reads
--A simple csv parser
Module parseCSV where
That's wrong. Module is *not* to be capitalized, the module *name*,
however, *is*. Change it to:
module ParseCsv where
Runhaskell should be absolutely fine running it that way, no need to
remove the module name. GHC (the compiler itself) on the other hand, will
just not produce a binary as long as your module name isn't "Main."
% runhaskell Test.hs ~
"Hello"
% ghc --make -O2 -o Test Test.hs ~
Warning: output was redirected with -o, but no output will be generated
because there is no Main module.
% cat Test.hs ~
module Test where
main = print "Hello"
Most programs will typically have a File "Main.hs" which does all the
duties of a main executable.
Best wishes,
Aleks
------------------------------
Message: 2
Date: Sat, 16 Oct 2010 11:39:31 +0200
From: Daniel Fischer <[email protected]>
Subject: Re: [Haskell-beginners] A problem with a simple csv file
parser
To: [email protected]
Message-ID: <[email protected]>
Content-Type: text/plain; charset="utf-8"
On Saturday 16 October 2010 10:59:10, Aleksandar Dimitrov wrote:
> . GHC (the compiler itself) on the other hand, will Â
> just not produce a binary as long as your module name isn't "Main."
If your module name isn't Main, you have to tell GHC what to regard as the
main module by passing the "-main-is" flag on the command line
$ ghc -O2 --make -main-is Test -o Test Test.hs
works. And your main function may also have a different name, e.g.
$ ghc -O2 --make -main-is MultiMain.main2 -o main2 MultiMain.hs
with
module MultiMain where
main1 :: IO ()
main1 = putStrLn "main1"
main2 :: IO ()
main2 = putStrLn "You chose main two."
------------------------------
Message: 3
Date: Sat, 16 Oct 2010 12:26:00 +0200
From: "." <[email protected]>
Subject: [Haskell-beginners] GHC-generated executables size
To: [email protected]
Message-ID: <1287224760.9018.5.ca...@eddy>
Content-Type: text/plain; charset="UTF-8"
Hi,
I was playing around with ghc again, and I was wondering what makes
the executables so large and how I could make them smaller (strip works,
but is there anything more I can do?)
More specifically, I am compiling a program that uses the GTK+ bindings,
HDBC, and some things from Prelude.
The program simply displays a window, and reads and writes values
from/into a data base file. Not much, really.
Anyway, the program size is 20MB without stripping, and 10MB after
stripping ...
Any hints?
Thanks and good night for now ..
Christian
------------------------------
Message: 4
Date: Sat, 16 Oct 2010 12:43:59 +0200
From: "Aleksandar Dimitrov" <[email protected]>
Subject: Re: [Haskell-beginners] GHC-generated executables size
To: [email protected], "." <[email protected]>
Message-ID: <op.vknz3ljkjdv...@bylha>
Content-Type: text/plain; charset=utf-8; format=flowed; delsp=yes
Hi Christian,
> I was playing around with ghc again, and I was wondering what makes
> the executables so large and how I could make them smaller (strip works,
> but is there anything more I can do?)
> More specifically, I am compiling a program that uses the GTK+ bindings,
> HDBC, and some things from Prelude.
> The program simply displays a window, and reads and writes values
> from/into a data base file. Not much, really.
> Anyway, the program size is 20MB without stripping, and 10MB after
> stripping ...
GHC links statically. There is some effort to bring dynamic linking to GHC:
http://hackage.haskell.org/trac/ghc/wiki/SharedLibraries/PlatformSupport?redirectedfrom=DynamicLinking
You'll have to ask more knowledgeable people about its status and if it's
recommended for current projects. Since the GTK libraries are so vast,
even including one call (which forces the libs to be linked into the
executable) will dramatically increase the statically linked executable's
size.
Regards,
Aleks
------------------------------
Message: 5
Date: Sat, 16 Oct 2010 13:23:17 +0200
From: Daniel Fischer <[email protected]>
Subject: Re: [Haskell-beginners] GHC-generated executables size
To: [email protected]
Cc: "." <[email protected]>
Message-ID: <[email protected]>
Content-Type: text/plain; charset="utf-8"
On Saturday 16 October 2010 12:26:00, . wrote:
> Hi,
> I was playing around with ghc again, and I was wondering what makes
> the executables so large and how I could make them smaller (strip works,
> but is there anything more I can do?)
> More specifically, I am compiling a program that uses the GTK+ bindings,
> HDBC, and some things from Prelude.
> The program simply displays a window, and reads and writes values
> from/into a data base file. Not much, really.
> Anyway, the program size is 20MB without stripping, and 10MB after
> stripping ...
>
> Any hints?
Two things spring to mind (in addition to the static linking mentioned by
Aleksandar).
1) If you didn't compile the packages with -split-objs, when you use one
function from a module, the entire object file for the module is linked in.
For packages with many modules or many dependencies, that adds up pretty
fast.
If you set
split-objs: True
in your ~/.cabal/config, packages installed via cabal-install (the cabal
executable) will be built with -split-objs and only the needed functions
will be linked in (at least if you compile your programmes with
optimisations, I don't know whether -O0 uses split object files or the
monolithic ones).
(Downside: building the packages takes longer, duh; and you need more disk
space for monolithic+split object files, duh again).
2) If it's not (only) that,
it's probably the same effect as discussed in
http://hackage.haskell.org/trac/ghc/ticket/4387
Simon (PJ) says:
"Every module has a module-initialisation routine. Apart from initialising
the module, it calls the module-initialisation routine for each imported
module. So if M imports module SpecConstr from package ghc, then the
module-initialisatin routine for M will call the initialisation routine for
SpecConstr. Even though nothing from SpecConstr is ultimately used."
So if you import a module (you don't even need to use anything from it)
which transitively imports a lot of modules, you get a ton of module-
initialisation routines.
People are thinking about how to handle this best (since it affects the
vector package, on which a lot of other packages depend, it's not
unimportant).
>
> Thanks and good night for now ..
> Christian
>
------------------------------
Message: 6
Date: Sat, 16 Oct 2010 15:03:52 +0200
From: "." <[email protected]>
Subject: Re: [Haskell-beginners] GHC-generated executables size
To: Daniel Fischer <[email protected]>
Cc: [email protected]
Message-ID: <1287234232.9018.18.ca...@eddy>
Content-Type: text/plain; charset="UTF-8"
Hi Daniel,
thanks for the explanations.
I have tried reinstalling with
cabal --reinstall gtk,
having set
split-objs: True
in ~/.cabal/config before.
However, the compile yielded a single .o file again, and recompiling and
re-linking my little program does not change its size ...
Any other idea what I might be doing wrong?
Also, I saw in the ghc documentatio about -split-objs that one should
only use it "if you know exactly what you're doing".
Do you know what the caveats are?
Thanks again,
Christian
On Sat, 2010-10-16 at 13:23 +0200, Daniel Fischer wrote:
> On Saturday 16 October 2010 12:26:00, . wrote:
> > Hi,
> > I was playing around with ghc again, and I was wondering what makes
> > the executables so large and how I could make them smaller (strip works,
> > but is there anything more I can do?)
> > More specifically, I am compiling a program that uses the GTK+ bindings,
> > HDBC, and some things from Prelude.
> > The program simply displays a window, and reads and writes values
> > from/into a data base file. Not much, really.
> > Anyway, the program size is 20MB without stripping, and 10MB after
> > stripping ...
> >
> > Any hints?
>
> Two things spring to mind (in addition to the static linking mentioned by
> Aleksandar).
>
> 1) If you didn't compile the packages with -split-objs, when you use one
> function from a module, the entire object file for the module is linked in.
> For packages with many modules or many dependencies, that adds up pretty
> fast.
>
> If you set
>
>
> in your ~/.cabal/config, packages installed via cabal-install (the cabal
> executable) will be built with -split-objs and only the needed functions
> will be linked in (at least if you compile your programmes with
> optimisations, I don't know whether -O0 uses split object files or the
> monolithic ones).
> (Downside: building the packages takes longer, duh; and you need more disk
> space for monolithic+split object files, duh again).
>
> 2) If it's not (only) that,
> it's probably the same effect as discussed in
> http://hackage.haskell.org/trac/ghc/ticket/4387
>
> Simon (PJ) says:
> "Every module has a module-initialisation routine. Apart from initialising
> the module, it calls the module-initialisation routine for each imported
> module. So if M imports module SpecConstr from package ghc, then the
> module-initialisatin routine for M will call the initialisation routine for
> SpecConstr. Even though nothing from SpecConstr is ultimately used."
>
> So if you import a module (you don't even need to use anything from it)
> which transitively imports a lot of modules, you get a ton of module-
> initialisation routines.
> People are thinking about how to handle this best (since it affects the
> vector package, on which a lot of other packages depend, it's not
> unimportant).
>
> >
> > Thanks and good night for now ..
> > Christian
> >
>
------------------------------
_______________________________________________
Beginners mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/beginners
End of Beginners Digest, Vol 28, Issue 26
*****************************************