caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Executable size?
@ 2003-11-12 16:14 John J Lee
  2003-11-12 17:33 ` Richard Jones
                   ` (3 more replies)
  0 siblings, 4 replies; 53+ messages in thread
From: John J Lee @ 2003-11-12 16:14 UTC (permalink / raw)
  To: caml-list

How does O'Caml compare with languages like Haskell (ghc), C and C++ for
executable size?  Does compiled code depend on a runtime library (and how
big is that, if so)?

Are there any easily-identifiable, non-obvious, factors that affect
executable size (I'm talking about end-use factors, rather those resulting
from the design decisions taken by the language designers and
implementors)?

I currently use Python by preference, but I'm interested in a language
(other than C/C++!) that doesn't depend on a big runtime library and
generates "reasonably" small executables -- modems are here to stay for a
while yet.

Thanks for any help


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 16:14 [Caml-list] Executable size? John J Lee
@ 2003-11-12 17:33 ` Richard Jones
  2003-11-12 18:06   ` Dustin Sallings
                     ` (2 more replies)
  2003-11-12 18:05 ` Dustin Sallings
                   ` (2 subsequent siblings)
  3 siblings, 3 replies; 53+ messages in thread
From: Richard Jones @ 2003-11-12 17:33 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

On Wed, Nov 12, 2003 at 04:14:54PM +0000, John J Lee wrote:
> How does O'Caml compare with languages like Haskell (ghc), C and C++ for
> executable size?  Does compiled code depend on a runtime library (and how
> big is that, if so)?

This is not a criticism of OCaml, but the executables do tend to be
quite large. This seems mainly down to the fact that OCaml links the
runtime library in statically. There was previous discussion on this
list about the merits and problems with linking the runtime
dynamically.

Of course you can always use OCaml as a scripting language (ie.  tiny
"executables" preceeded by #!/usr/bin/ocaml), or distribute the
bytecode, which tends to be small, so you have more choices than the
languages you've listed above.

Rich.

-- 
Richard Jones. http://www.annexia.org/ http://freshmeat.net/users/rwmj
Merjis Ltd. http://www.merjis.com/ - improving website return on investment
"My karma ran over your dogma"

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 16:14 [Caml-list] Executable size? John J Lee
  2003-11-12 17:33 ` Richard Jones
@ 2003-11-12 18:05 ` Dustin Sallings
  2003-11-12 18:36   ` John J Lee
  2003-11-13  1:23 ` Nicolas Cannasse
  2003-11-15 12:09 ` skaller
  3 siblings, 1 reply; 53+ messages in thread
From: Dustin Sallings @ 2003-11-12 18:05 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list


On Nov 12, 2003, at 8:14, John J Lee wrote:

> How does O'Caml compare with languages like Haskell (ghc), C and C++ 
> for
> executable size?  Does compiled code depend on a runtime library (and 
> how
> big is that, if so)?

	Well, the bin is bigger than a minimal C app with the same 
functionality.  There is no runtime library required (I build and 
distribute apps).  I somehow don't have ghc on my machines here to do a 
comparison.

> Are there any easily-identifiable, non-obvious, factors that affect
> executable size (I'm talking about end-use factors, rather those 
> resulting
> from the design decisions taken by the language designers and
> implementors)?

	(don't know)

> I currently use Python by preference, but I'm interested in a language
> (other than C/C++!) that doesn't depend on a big runtime library and
> generates "reasonably" small executables -- modems are here to stay 
> for a
> while yet.

	The stuff I build on my Mac ends up being about 300k so far.  That 
seems reasonably small to me.

	I'm not sure what a modem has to do with your distribution, but there 
are options.  You could distribute the source to your app (which will 
be way smaller than the equivalent C or C++ application) and compile 
elsewhere, or you can use the transfer time to bask in your 
productivity and performance gains.  :)

	Python is a bad reference for two reasons:

	1) You don't typically distribute compiled python apps (and when you 
do, it's always bytecode).
	2) Ocaml's runtime is *amazingly* fast.

	I've prototyped a few apps in python before rewriting in ocaml for 
performance.  The speed gains alone are beginning to push python away 
from being my primary utility app language.  I like a lot about the 
language as well.

-- 
Dustin Sallings

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 17:33 ` Richard Jones
@ 2003-11-12 18:06   ` Dustin Sallings
  2003-11-12 18:31     ` Sven Luther
  2003-11-12 18:21   ` John J Lee
  2003-11-12 19:06   ` Brian Hurt
  2 siblings, 1 reply; 53+ messages in thread
From: Dustin Sallings @ 2003-11-12 18:06 UTC (permalink / raw)
  To: Richard Jones; +Cc: John J Lee, caml-list


On Nov 12, 2003, at 9:33, Richard Jones wrote:

> Of course you can always use OCaml as a scripting language (ie.  tiny
> "executables" preceeded by #!/usr/bin/ocaml), or distribute the
> bytecode, which tends to be small, so you have more choices than the
> languages you've listed above.

	I haven't seen the bytecode be much smaller than native executables:

-rwx--x--x  1 dustin  staff   320900 12 Nov 10:06 parseTimingLog*
-rwx------  1 dustin  staff   306614 12 Nov 09:59 parseTimingLogbc*


-- 
Dustin Sallings

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 17:33 ` Richard Jones
  2003-11-12 18:06   ` Dustin Sallings
@ 2003-11-12 18:21   ` John J Lee
  2003-11-12 22:53     ` Richard Jones
  2003-11-15 12:48     ` skaller
  2003-11-12 19:06   ` Brian Hurt
  2 siblings, 2 replies; 53+ messages in thread
From: John J Lee @ 2003-11-12 18:21 UTC (permalink / raw)
  To: caml-list

On Wed, 12 Nov 2003, Richard Jones wrote:

> On Wed, Nov 12, 2003 at 04:14:54PM +0000, John J Lee wrote:
> > How does O'Caml compare with languages like Haskell (ghc), C and C++ for
> > executable size?  Does compiled code depend on a runtime library (and how
> > big is that, if so)?
>
> This is not a criticism of OCaml, but the executables do tend to be
> quite large. This seems mainly down to the fact that OCaml links the
> runtime library in statically.
[...]

How big is the runtime?  Does the compiler only link in the parts of the
runtime that you use, or do you just non-negotiably get the whole thing
every time you link?

Probably this is a naive question, but: Is it impractical to have a
functional language that uses the C runtime?

Does anyone have recommendations for languages (not necessarily
functional) with a compiler that generates small executables (including
runtime code) for multiple platforms (at least Unix and Windows), with a
decent FFI (foreign function interface), and preferably MS COM support?

Am I really stuck with C++??


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:06   ` Dustin Sallings
@ 2003-11-12 18:31     ` Sven Luther
  2003-11-12 18:50       ` John J Lee
  0 siblings, 1 reply; 53+ messages in thread
From: Sven Luther @ 2003-11-12 18:31 UTC (permalink / raw)
  To: Dustin Sallings; +Cc: Richard Jones, John J Lee, caml-list

On Wed, Nov 12, 2003 at 10:06:52AM -0800, Dustin Sallings wrote:
> 
> On Nov 12, 2003, at 9:33, Richard Jones wrote:
> 
> >Of course you can always use OCaml as a scripting language (ie.  tiny
> >"executables" preceeded by #!/usr/bin/ocaml), or distribute the
> >bytecode, which tends to be small, so you have more choices than the
> >languages you've listed above.
> 
> 	I haven't seen the bytecode be much smaller than native executables:
> 
> -rwx--x--x  1 dustin  staff   320900 12 Nov 10:06 parseTimingLog*
> -rwx------  1 dustin  staff   306614 12 Nov 09:59 parseTimingLogbc*

But then, you can link it dynamically :

  $ file  /usr/bin/ledit
  /usr/bin/ledit: a /usr/bin/ocamlrun script text executable
  $ ls -l  /usr/bin/ledit
  -rwxr-xr-x    1 root     root        94857 2003-09-30 22:40 /usr/bin/ledit

But then, you would only gain for packages using huge C bindings.

Friendly,

Sven Luther

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:05 ` Dustin Sallings
@ 2003-11-12 18:36   ` John J Lee
  2003-11-12 19:04     ` Dustin Sallings
  2003-11-12 20:01     ` Vitaly Lugovsky
  0 siblings, 2 replies; 53+ messages in thread
From: John J Lee @ 2003-11-12 18:36 UTC (permalink / raw)
  To: caml-list

On Wed, 12 Nov 2003, Dustin Sallings wrote:

> On Nov 12, 2003, at 8:14, John J Lee wrote:
[...]
> > I currently use Python by preference, but I'm interested in a language
> > (other than C/C++!) that doesn't depend on a big runtime library and
> > generates "reasonably" small executables -- modems are here to stay
> > for a while yet.
>
> 	The stuff I build on my Mac ends up being about 300k so far.  That
> seems reasonably small to me.

Thanks.  From how many lines of source code?

How big is the "hello world" executable?


> 	I'm not sure what a modem has to do with your distribution, but there

If you're distributing executables over the internet to people who use
modems (ie., most people ;-), download size is important.


> are options.  You could distribute the source to your app (which will
> be way smaller than the equivalent C or C++ application) and compile
> elsewhere, or you can use the transfer time to bask in your
> productivity and performance gains.  :)

Unfortunately, neither is an option.  I want to distribute single
executables (for Windows, anyway).  Actually, another issue: can O'Caml
generate Windows DLLs?  ISTR some issue about that...


> 	Python is a bad reference for two reasons:
>
> 	1) You don't typically distribute compiled python apps (and when you
> do, it's always bytecode).
> 	2) Ocaml's runtime is *amazingly* fast.

Well, bad reference for what purposes?  I don't care whether there's
bytecode, machine code, or lemon jelly in my .exes, as long as they're
small :-)  And I don't need any speed above what Python provides.


> 	I've prototyped a few apps in python before rewriting in ocaml for
> performance.  The speed gains alone are beginning to push python away
> from being my primary utility app language.  I like a lot about the
> language as well.

Great.


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 19:06   ` Brian Hurt
@ 2003-11-12 18:38     ` Sven Luther
  2003-11-12 19:04       ` Karl Zilles
  2003-11-12 20:03       ` Brian Hurt
  2003-11-12 18:46     ` John J Lee
  1 sibling, 2 replies; 53+ messages in thread
From: Sven Luther @ 2003-11-12 18:38 UTC (permalink / raw)
  To: Brian Hurt; +Cc: Richard Jones, John J Lee, caml-list

On Wed, Nov 12, 2003 at 01:06:08PM -0600, Brian Hurt wrote:
> On Wed, 12 Nov 2003, Richard Jones wrote:
> 
> > On Wed, Nov 12, 2003 at 04:14:54PM +0000, John J Lee wrote:
> > > How does O'Caml compare with languages like Haskell (ghc), C and C++ for
> > > executable size?  Does compiled code depend on a runtime library (and how
> > > big is that, if so)?
> > 
> > This is not a criticism of OCaml, but the executables do tend to be
> > quite large. This seems mainly down to the fact that OCaml links the
> > runtime library in statically. There was previous discussion on this
> > list about the merits and problems with linking the runtime
> > dynamically.
> 
> This isn't as bad as it sounds.  A simplistic "hello world!" application
> in Ocaml weighs in at 112K, versus 11K for the equivelent (dynamically
> linked) C program- almost entirely either statically linked standard

Mmm (on i386 and with 3.07+2) :

 $ cat hello.ml
 Printf.printf "Hello World!\n"
 $ ocamlc hello.ml -o hello.byte
 $ ls -l hello.byte
 36025 hello.byte
 $ ocamlc hello.ml -custom -o hello.custom
 $ ls -l hello.custom
 181718 hello.custom
 $ ocamlopt hello.ml -o hello.native
 $ ls -l hello.native
 149877 hello.native

That said :

 $ cat hello
 #!/usr/bin/ocamlrun /usr/bin/ocaml
 Printf.printf "Hello World!\n";;
 $ ls -l hello
 68 hello

Friendly,

Sven Luther

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 19:06   ` Brian Hurt
  2003-11-12 18:38     ` Sven Luther
@ 2003-11-12 18:46     ` John J Lee
  2003-11-12 20:40       ` Brian Hurt
  1 sibling, 1 reply; 53+ messages in thread
From: John J Lee @ 2003-11-12 18:46 UTC (permalink / raw)
  To: caml-list

On Wed, 12 Nov 2003, Brian Hurt wrote:

> On Wed, 12 Nov 2003, Richard Jones wrote:
[...]
> > This is not a criticism of OCaml, but the executables do tend to be
> > quite large. This seems mainly down to the fact that OCaml links the
> > runtime library in statically. There was previous discussion on this
[...]
> This isn't as bad as it sounds.  A simplistic "hello world!" application
> in Ocaml weighs in at 112K, versus 11K for the equivelent (dynamically
> linked) C program- almost entirely either statically linked standard
> libraries and infrastructure (garbage collections, etc.)- stuff that
> doesn't expand with larger programs.

OK.  Is that 100K difference for "hello world" (which doesn't necessarily
stay the same for larger programs, as you say below) simply a result of
the fact that C has the "unfair" advantage of already having its runtime
sitting on everyone's hard drive already?


> A naive assumption would be that an Ocaml program is about 100K or so
> larger than the equivelent C program.  Not much, considering how easy it
> is to get executables multiple megabytes in size.

[...]
> Ocaml gets a lot more code reuse, and thus can actually lead to smaller
> executables.

I don't understand what you mean by that (probably my fault).  What do you
mean by "code reuse" here?  I usually understand that phrase to mean using
code written by people other than me, but you seem to mean it in a
different sense.


> Unless you have special constraints, the difference between C program
> sizes and Ocaml program sizes are not enough to be worth worrying about.

I don't really agree that the problem of distributing simple (few lines of
code) applications in small executables is all that "special".  Certainly
there are *many* applications where you don't need that; equally, there
are quite a few where you do need/want that.


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:31     ` Sven Luther
@ 2003-11-12 18:50       ` John J Lee
  2003-11-13  9:10         ` Sven Luther
  0 siblings, 1 reply; 53+ messages in thread
From: John J Lee @ 2003-11-12 18:50 UTC (permalink / raw)
  To: caml-list

On Wed, 12 Nov 2003, Sven Luther wrote:

> On Wed, Nov 12, 2003 at 10:06:52AM -0800, Dustin Sallings wrote:
[...]
> But then, you can link it dynamically :
>
>   $ file  /usr/bin/ledit
>   /usr/bin/ledit: a /usr/bin/ocamlrun script text executable
>   $ ls -l  /usr/bin/ledit
>   -rwxr-xr-x    1 root     root        94857 2003-09-30 22:40 /usr/bin/ledit
>
> But then, you would only gain for packages using huge C bindings.
[...]

This may be of interest to others, but personally, it doesn't matter much
to me how it's linked.  The problem is minimising the total data to be
transferred over the wire, including any shared libraries.


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:38     ` Sven Luther
@ 2003-11-12 19:04       ` Karl Zilles
  2003-11-12 21:29         ` Brian Hurt
  2003-11-12 20:03       ` Brian Hurt
  1 sibling, 1 reply; 53+ messages in thread
From: Karl Zilles @ 2003-11-12 19:04 UTC (permalink / raw)
  Cc: Brian Hurt, Richard Jones, John J Lee, caml-list

Sven Luther wrote:

 >  $ cat hello.ml
 >  Printf.printf "Hello World!\n"
 >  $ ocamlc hello.ml -o hello.byte
 >  $ ls -l hello.byte
 >  36025 hello.byte
 >  $ ocamlc hello.ml -custom -o hello.custom
 >  $ ls -l hello.custom
 >  181718 hello.custom
 >  $ ocamlopt hello.ml -o hello.native
 >  $ ls -l hello.native
 >  149877 hello.native


Don't forget to strip out debugging info.  When I did that on cygwin I 
dropped from 165K to 100K.


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:36   ` John J Lee
@ 2003-11-12 19:04     ` Dustin Sallings
  2003-11-12 20:17       ` John J Lee
  2003-11-12 20:01     ` Vitaly Lugovsky
  1 sibling, 1 reply; 53+ messages in thread
From: Dustin Sallings @ 2003-11-12 19:04 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list


On Nov 12, 2003, at 10:36, John J Lee wrote:

>> 	The stuff I build on my Mac ends up being about 300k so far.  That
>> seems reasonably small to me.
>
> Thanks.  From how many lines of source code?

	Probably around 800 of my own and whatever the unix library brings.

> How big is the "hello world" executable?

-rwx--x--x  1 dustin  staff   138452 12 Nov 10:55 a.out*
(or stripped)
-rwx------  1 dustin  staff  111532 12 Nov 10:55 a.out*

>> 	I'm not sure what a modem has to do with your distribution, but there
>
> If you're distributing executables over the internet to people who use
> modems (ie., most people ;-), download size is important.

-rwx------  1 dustin  staff  42425 12 Nov 10:55 a.out.gz*

>> are options.  You could distribute the source to your app (which will
>> be way smaller than the equivalent C or C++ application) and compile
>> elsewhere, or you can use the transfer time to bask in your
>> productivity and performance gains.  :)
>
> Unfortunately, neither is an option.  I want to distribute single
> executables (for Windows, anyway).  Actually, another issue: can O'Caml
> generate Windows DLLs?  ISTR some issue about that...

	I'm happy to say I've never written any code that was intended to run 
under Windows, so I can't answer that question.

>> 	Python is a bad reference for two reasons:
>>
>> 	1) You don't typically distribute compiled python apps (and when you
>> do, it's always bytecode).
>> 	2) Ocaml's runtime is *amazingly* fast.
>
> Well, bad reference for what purposes?  I don't care whether there's
> bytecode, machine code, or lemon jelly in my .exes, as long as they're
> small :-)  And I don't need any speed above what Python provides.

	I wasn't aware you could distribute python exes.  That was my point.  
You can for OS X because of the way applications work in OS X, but 
that's quite different from anything I've seen in Windows (which, 
AFAIK, doesn't even ship with python).

	I have to say I'm really surprised by such a strong emphasis on 
executable size.  I've been learning various programming languages 
specifically because I want to create more reliable applications with 
reasonable performance with less effort (both initially and throughout 
the lifetime of the application).

-- 
Dustin Sallings

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 17:33 ` Richard Jones
  2003-11-12 18:06   ` Dustin Sallings
  2003-11-12 18:21   ` John J Lee
@ 2003-11-12 19:06   ` Brian Hurt
  2003-11-12 18:38     ` Sven Luther
  2003-11-12 18:46     ` John J Lee
  2 siblings, 2 replies; 53+ messages in thread
From: Brian Hurt @ 2003-11-12 19:06 UTC (permalink / raw)
  To: Richard Jones; +Cc: John J Lee, caml-list

On Wed, 12 Nov 2003, Richard Jones wrote:

> On Wed, Nov 12, 2003 at 04:14:54PM +0000, John J Lee wrote:
> > How does O'Caml compare with languages like Haskell (ghc), C and C++ for
> > executable size?  Does compiled code depend on a runtime library (and how
> > big is that, if so)?
> 
> This is not a criticism of OCaml, but the executables do tend to be
> quite large. This seems mainly down to the fact that OCaml links the
> runtime library in statically. There was previous discussion on this
> list about the merits and problems with linking the runtime
> dynamically.

This isn't as bad as it sounds.  A simplistic "hello world!" application
in Ocaml weighs in at 112K, versus 11K for the equivelent (dynamically
linked) C program- almost entirely either statically linked standard
libraries and infrastructure (garbage collections, etc.)- stuff that
doesn't expand with larger programs.

A naive assumption would be that an Ocaml program is about 100K or so 
larger than the equivelent C program.  Not much, considering how easy it 
is to get executables multiple megabytes in size.  But in my experience 
(depending upon the program), Ocaml gets a lot more code reuse, and thus 
can actually lead to smaller executables.

Unless you have special constraints, the difference between C program 
sizes and Ocaml program sizes are not enough to be worth worrying about.

-- 
"Usenet is like a herd of performing elephants with diarrhea -- massive,
difficult to redirect, awe-inspiring, entertaining, and a source of
mind-boggling amounts of excrement when you least expect it."
                                - Gene Spafford 
Brian

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:36   ` John J Lee
  2003-11-12 19:04     ` Dustin Sallings
@ 2003-11-12 20:01     ` Vitaly Lugovsky
  1 sibling, 0 replies; 53+ messages in thread
From: Vitaly Lugovsky @ 2003-11-12 20:01 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list


On Wed, 12 Nov 2003, John J Lee wrote:

> Unfortunately, neither is an option.  I want to distribute
> single executables (for Windows, anyway).  Actually, another
> issue: can O'Caml generate Windows DLLs?  ISTR some issue about
> that...

 Yes, it can. There exists a patch.


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:38     ` Sven Luther
  2003-11-12 19:04       ` Karl Zilles
@ 2003-11-12 20:03       ` Brian Hurt
  2003-11-13  4:14         ` Kamil Shakirov
  2003-11-13  9:18         ` Sven Luther
  1 sibling, 2 replies; 53+ messages in thread
From: Brian Hurt @ 2003-11-12 20:03 UTC (permalink / raw)
  To: Sven Luther; +Cc: Richard Jones, John J Lee, caml-list

On Wed, 12 Nov 2003, Sven Luther wrote:

> > This isn't as bad as it sounds.  A simplistic "hello world!" application
> > in Ocaml weighs in at 112K, versus 11K for the equivelent (dynamically
> > linked) C program- almost entirely either statically linked standard
> 
> Mmm (on i386 and with 3.07+2) :
> 
>  $ cat hello.ml
>  Printf.printf "Hello World!\n"
>  $ ocamlc hello.ml -o hello.byte
>  $ ls -l hello.byte
>  36025 hello.byte
>  $ ocamlc hello.ml -custom -o hello.custom
>  $ ls -l hello.custom
>  181718 hello.custom
>  $ ocamlopt hello.ml -o hello.native
>  $ ls -l hello.native
>  149877 hello.native
> 
> That said :
> 
>  $ cat hello
>  #!/usr/bin/ocamlrun /usr/bin/ocaml
>  Printf.printf "Hello World!\n";;
>  $ ls -l hello
>  68 hello
>

i386 (Athlon 2200+, actually), Redhat 9.0 and Ocaml 3.07 unpatched:

$ cat temp2.ml
let _ = print_string "Hello, world!";;
 
$ ocamlopt -o temp2 temp2.ml
$ ls -l temp2
-rwxrwxr-x    1 bhurt    bhurt      112213 Nov 12 13:48 temp2
$ cat temp3.c
#include <stdio.h>
 
int main (void) {
    puts("Hello, world!");
    return 0;
}
 
$ gcc -Os -o temp3 temp3.c
$ ls -l temp3
-rwxrwxr-x    1 bhurt    bhurt       11228 Nov 12 13:49 temp3
$


Using printf brings in most of the printf library, and adds about 40K to
the size of the executable.  But you only ever need to include it once.
Doing an ls -l `ocamlc -where`/*.cma shows at most about a meg of total
libraries to include everything in the standard library (I'm assuming that
the 988K toplevellib.cma is only needed by the top level).

If I was willing to let my code out, and download size was important, and
I didn't mind requiring my users to have a compiler/interpreter for the
language installed, then I'd be inclined to just ship bzipped source code
tarballs around.  Maybe with a little compile/install script bundled.  
That way you don't have to ship around the libraries at all, and source
code tends to be smaller than binary executables, and compresses a lot
better than equivelent executables (source code should get at least 10:1 
compression- playing with compressing Ocaml executables I'm only getting 
about 5:2 compression).

That being said, binary executables- especially binary executables with 
any special libraries they need statically linked- have the advantage of 
the making the client need to preinstall as little as possible.
 
> Friendly,
> 
> Sven Luther
> 
> -------------------
> To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
> Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> 

-- 
"Usenet is like a herd of performing elephants with diarrhea -- massive,
difficult to redirect, awe-inspiring, entertaining, and a source of
mind-boggling amounts of excrement when you least expect it."
                                - Gene Spafford 
Brian

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 20:40       ` Brian Hurt
@ 2003-11-12 20:10         ` Basile Starynkevitch
  2003-11-12 20:35         ` John J Lee
  2003-11-13 13:37         ` Florian Hars
  2 siblings, 0 replies; 53+ messages in thread
From: Basile Starynkevitch @ 2003-11-12 20:10 UTC (permalink / raw)
  To: Brian Hurt, caml-list

On Wed, Nov 12, 2003 at 02:40:56PM -0600, Brian Hurt wrote: [....]

> Actually, I think Ocaml uses C's runtime libraries and builds on top of
> them.  For example, if I understand things correctly, Ocaml's printf is a
> wrapper which calls C's printf. 

Sorry to be picky, but this particular claim is wrong:

Ocaml printf routine is implemented in ocaml/stdlib/printf.ml

and does not call C printf related stuff (except perhaps for
float_to_string conversions).

The format4 type is wired inside the compiler, notably inside
ocaml/typing/typecore.ml function type_format.

Actually, I tend to believe that on the contrary

1. Ocaml runtime (mostly the GC) uses the C library

2. Ocaml standard library (and others, notably the Unix module) don't
use that much the C library except thru trivial wrappers (which
essentially deals with Ocaml data representation and its conversion to
native C data types). Most of the standard library is coded in Ocaml,
not in C.

Regards.

-- 
Basile STARYNKEVITCH -- basile dot starynkevitch at inria dot fr
Project cristal.inria.fr - 
http://cristal.inria.fr/~starynke --- all opinions are only mine 

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 19:04     ` Dustin Sallings
@ 2003-11-12 20:17       ` John J Lee
  0 siblings, 0 replies; 53+ messages in thread
From: John J Lee @ 2003-11-12 20:17 UTC (permalink / raw)
  To: caml-list

On Wed, 12 Nov 2003, Dustin Sallings wrote:
[...]
> > If you're distributing executables over the internet to people who use
> > modems (ie., most people ;-), download size is important.
>
> -rwx------  1 dustin  staff  42425 12 Nov 10:55 a.out.gz*

That's interesting, and I admit I'd forgotten about compression, but if
you add standard code to make it a self-extracting archive, you might lose
all of the benefit of compression for really small programs (libz.so is
around 60k on my machine, dunno about standard Windows self-extracting
stuff).  But 100k isn't too bad, so it looks like this isn't a significant
problem for O'Caml, for most cases.

[...]
> 	I wasn't aware you could distribute python exes.  That was my point.

py2exe and McMillan Installer.  I think py2exe actually requires a few
DLLs with the .exe, but Installer can generate single .exes (and supports
platforms other than Windows).  The smallest "hello world" I've seen is
459k, though (that was with some unpublished .exe-creation software).


> 	I have to say I'm really surprised by such a strong emphasis on
> executable size.  I've been learning various programming languages
> specifically because I want to create more reliable applications with
> reasonable performance with less effort (both initially and throughout
> the lifetime of the application).

Most of the time, I don't care about it at all -- would I be using Python
if it were otherwise??  But executable size is the only strong push on me
to use anything other than Python (there's the pull of functional
languages, yes, but that's definitely a pull, not a push :-).


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 20:40       ` Brian Hurt
  2003-11-12 20:10         ` Basile Starynkevitch
@ 2003-11-12 20:35         ` John J Lee
  2003-11-12 21:51           ` Brian Hurt
  2003-11-12 22:12           ` Eric Dahlman
  2003-11-13 13:37         ` Florian Hars
  2 siblings, 2 replies; 53+ messages in thread
From: John J Lee @ 2003-11-12 20:35 UTC (permalink / raw)
  To: caml-list

On Wed, 12 Nov 2003, Brian Hurt wrote:

> On Wed, 12 Nov 2003, John J Lee wrote:
[...]
> > OK.  Is that 100K difference for "hello world" (which doesn't necessarily
> > stay the same for larger programs, as you say below) simply a result of
> > the fact that C has the "unfair" advantage of already having its runtime
> > sitting on everyone's hard drive already?
>
> Actually, I think Ocaml uses C's runtime libraries and builds on top of
> them.  For example, if I understand things correctly, Ocaml's printf is a
[...]
> In addition to a more complicated and complete standard library and
> bultins, Ocaml also has garbage collection, which is non-trivial to
> implement.  I wouldn't be surprised if half or more of that 100K of
> overhead is just the GC.

Ah, of course!


> Currying, exceptions, etc. also have small size penalties.

OK.  I'm now enlightened on that point -- clearly, O'Caml's runtime is an
absolute requirement for an O'Caml program (unlike C/C++).



> On the other hand, I would argue that these features [are very
> valuable], while bloating the application.  Which is exactly the sort of
> thing small "benchmark"  programs don't show.  I don't know how many
> times I've read or written C code like:
[...]
> Vr.s the same code in Ocaml:
[...]

Absolutely, I'm quite in agreement there.


> The ocaml executable code for copyfile function will be smaller than the C
> version, simply because the ocaml version takes advantage of various
> features of the larger ocaml library and infrastructure- especially (in
> this case) exceptions and garbage collection.

Right.  Obviously, this kind of thing is highly dependent on exactly what
facilities are provided in your execution environment.  For example,
Windows provides a huge amount of stuff that you can build on if you have
access to Win32 and COM, without needing to statically link anything
(regardless of the language you're using).


> > [...]
> > > Ocaml gets a lot more code reuse, and thus can actually lead to smaller
> > > executables.
> >
> > I don't understand what you mean by that (probably my fault).  What do you
> > mean by "code reuse" here?  I usually understand that phrase to mean using
> [...]
> I was using it in the most literal sense- using code more than once, in
> more than one way.  In general, it's much better to have only one copy of
> a function, used in two places, than two copies of the function.  The
[...]

Got you.  The template explosion problem in C++, eg.


> > > Unless you have special constraints, the difference between C program
> > > sizes and Ocaml program sizes are not enough to be worth worrying about.
> >
> > I don't really agree that the problem of distributing simple (few lines of
> > code) applications in small executables is all that "special".  Certainly
> > there are *many* applications where you don't need that; equally, there
> > are quite a few where you do need/want that.
>
> I was thinking of special cases where the difference of a 100K or 1M or so
> is the difference between working and not working.  If you are, for
> example, trying to fit your program on a 512K ROM, Ocaml's overhead might
> be a problem.

Or if people are willing to download 100k but not 1M.


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:46     ` John J Lee
@ 2003-11-12 20:40       ` Brian Hurt
  2003-11-12 20:10         ` Basile Starynkevitch
                           ` (2 more replies)
  0 siblings, 3 replies; 53+ messages in thread
From: Brian Hurt @ 2003-11-12 20:40 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

On Wed, 12 Nov 2003, John J Lee wrote:

> On Wed, 12 Nov 2003, Brian Hurt wrote:
> 
> > On Wed, 12 Nov 2003, Richard Jones wrote:
> [...]
> > > This is not a criticism of OCaml, but the executables do tend to be
> > > quite large. This seems mainly down to the fact that OCaml links the
> > > runtime library in statically. There was previous discussion on this
> [...]
> > This isn't as bad as it sounds.  A simplistic "hello world!" application
> > in Ocaml weighs in at 112K, versus 11K for the equivelent (dynamically
> > linked) C program- almost entirely either statically linked standard
> > libraries and infrastructure (garbage collections, etc.)- stuff that
> > doesn't expand with larger programs.
> 
> OK.  Is that 100K difference for "hello world" (which doesn't necessarily
> stay the same for larger programs, as you say below) simply a result of
> the fact that C has the "unfair" advantage of already having its runtime
> sitting on everyone's hard drive already?

Actually, I think Ocaml uses C's runtime libraries and builds on top of
them.  For example, if I understand things correctly, Ocaml's printf is a
wrapper which calls C's printf.  Which is why I haven't bothered comparing
Ocaml's size to C programs being statically linked.  Ocaml is at least
nice enough to only link libraries you are actually using (see the
print_string v. printf results).

In addition to a more complicated and complete standard library and 
bultins, Ocaml also has garbage collection, which is non-trivial to 
implement.  I wouldn't be surprised if half or more of that 100K of 
overhead is just the GC.  Currying, exceptions, etc. also have small size 
penalties.

On the other hand, I would argue that these features, while bloating the 
application.  Which is exactly the sort of thing small "benchmark" 
programs don't show.  I don't know how many times I've read or written C 
code like:

int copy_file(char * src, char * dst) {
    char * buf;
    FILE * inf;
    FILE * outf;

    if ((src == NULL) || (dst == NULL)) {
        return EINVAL;
    }

    inf = fopen(src, "rb");
    if (inf == NULL) {
        return errno;
    }

    outf = fopen(dst, "wb");
    if (outf == NULL) {
        fclose(inf);
        return errno;
    }

    buf = (char *) malloc(4096);
    if (buf == NULL) {
        fclose(outf);
        fclose(inf);
        return errno;
    }

    blah blah blah you get the idea

Vr.s the same code in Ocaml:

let copyfile src dst =
    let inf = open_in_bin src
    and outf = open_out_bin dst
    and buf = String.make 4096 ' '
    in
    let rec loop () =
        let c = input inf buf 0 4096 in
        if (c > 0) then
            begin
                output outf buf 0 c;
                loop ()
            end
        else
            ()
    in
    loop ()

The ocaml executable code for copyfile function will be smaller than the C 
version, simply because the ocaml version takes advantage of various 
features of the larger ocaml library and infrastructure- especially (in 
this case) exceptions and garbage collection.  

> 
> 
> > A naive assumption would be that an Ocaml program is about 100K or so
> > larger than the equivelent C program.  Not much, considering how easy it
> > is to get executables multiple megabytes in size.
> 
> [...]
> > Ocaml gets a lot more code reuse, and thus can actually lead to smaller
> > executables.
> 
> I don't understand what you mean by that (probably my fault).  What do you
> mean by "code reuse" here?  I usually understand that phrase to mean using
> code written by people other than me, but you seem to mean it in a
> different sense.
> 

I was using it in the most literal sense- using code more than once, in
more than one way.  In general, it's much better to have only one copy of
a function, used in two places, than two copies of the function.  The 
trick is that generally the two copies are not exactly identical- if 
the functions are, for example, the length of a linked list, one function 
might operate on a linked list of integers, another a linked list of 
floats.  Ocaml encourages you to program in a generic way- you actually 
have to work at it to write a linked list length routine that *isn't* 
generic, the naive implementation is (so is the optimized version).

Again, this generally isn't a problem in small programs, which easily fit 
into you brain as a whole.  Code reuse becomes more of a trick on moderate 
to large programs, especially moderate to large programs with more than 
one programmer.  How many times have we reimplemented linked lists in C?

> 
> > Unless you have special constraints, the difference between C program
> > sizes and Ocaml program sizes are not enough to be worth worrying about.
> 
> I don't really agree that the problem of distributing simple (few lines of
> code) applications in small executables is all that "special".  Certainly
> there are *many* applications where you don't need that; equally, there
> are quite a few where you do need/want that.

I was thinking of special cases where the difference of a 100K or 1M or so 
is the difference between working and not working.  If you are, for 
example, trying to fit your program on a 512K ROM, Ocaml's overhead might 
be a problem.  

-- 
"Usenet is like a herd of performing elephants with diarrhea -- massive,
difficult to redirect, awe-inspiring, entertaining, and a source of
mind-boggling amounts of excrement when you least expect it."
                                - Gene Spafford 
Brian

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 19:04       ` Karl Zilles
@ 2003-11-12 21:29         ` Brian Hurt
  0 siblings, 0 replies; 53+ messages in thread
From: Brian Hurt @ 2003-11-12 21:29 UTC (permalink / raw)
  To: Karl Zilles; +Cc: Richard Jones, John J Lee, caml-list

On Wed, 12 Nov 2003, Karl Zilles wrote:

> Don't forget to strip out debugging info.  When I did that on cygwin I 
> dropped from 165K to 100K.
> 
> 

Good point.  Continuing on my pedantic rant:
$ cat temp2.ml
let _ = Printf.printf "Hello, world!\n";;
                                                                                
$ ocamlopt -o temp2 temp2.ml
$ ls -l temp2
-rwxrwxr-x    1 bhurt    bhurt      150448 Nov 12 15:19 temp2
$ strip temp2
$ ls -l temp2
-rwxrwxr-x    1 bhurt    bhurt      101500 Nov 12 15:24 temp2
$ bzip2 -9v temp2
  temp2:    2.287:1,  3.498 bits/byte, 56.27% saved, 101500 in, 44387 out.
$ ls -l temp2.bz2
-rwxrwxr-x    1 bhurt    bhurt       44387 Nov 12 15:24 temp2.bz2
$ cat temp3.c
#include <stdio.h>
 
int main (void) {
    puts("Hello, world!");
    return 0;
}
 
$ gcc -Os -o temp3 temp3.c
$ ls -l temp3
-rwxrwxr-x    1 bhurt    bhurt       11228 Nov 12 15:27 temp3
$ strip temp3
$ ls -l temp3
-rwxrwxr-x    1 bhurt    bhurt        2768 Nov 12 15:27 temp3
$ bzip2 -9v temp3
  temp3:    2.009:1,  3.983 bits/byte, 50.22% saved, 2768 in, 1378 out.
$ ls -l temp3.bz2
-rwxrwxr-x    1 bhurt    bhurt        1378 Nov 12 15:27 temp3.bz2
$



-- 
"Usenet is like a herd of performing elephants with diarrhea -- massive,
difficult to redirect, awe-inspiring, entertaining, and a source of
mind-boggling amounts of excrement when you least expect it."
                                - Gene Spafford 
Brian


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 21:51           ` Brian Hurt
@ 2003-11-12 21:35             ` David Brown
  0 siblings, 0 replies; 53+ messages in thread
From: David Brown @ 2003-11-12 21:35 UTC (permalink / raw)
  To: Brian Hurt; +Cc: John J Lee, caml-list

On Wed, Nov 12, 2003 at 03:51:54PM -0600, Brian Hurt wrote:

> Actually, about a third of it seems to be debugging information, which 
> goes away with strip.

Be sure you try the executables when you strip them.  Strip on many
systems will remove the byte code from custom executables.

Dave

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 20:35         ` John J Lee
@ 2003-11-12 21:51           ` Brian Hurt
  2003-11-12 21:35             ` David Brown
  2003-11-12 22:12           ` Eric Dahlman
  1 sibling, 1 reply; 53+ messages in thread
From: Brian Hurt @ 2003-11-12 21:51 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

On Wed, 12 Nov 2003, John J Lee wrote:

> > In addition to a more complicated and complete standard library and
> > bultins, Ocaml also has garbage collection, which is non-trivial to
> > implement.  I wouldn't be surprised if half or more of that 100K of
> > overhead is just the GC.
> 
> Ah, of course!
>

Actually, about a third of it seems to be debugging information, which 
goes away with strip.
 
> > I was using it in the most literal sense- using code more than once, in
> > more than one way.  In general, it's much better to have only one copy of
> > a function, used in two places, than two copies of the function.  The
> [...]
> 
> Got you.  The template explosion problem in C++, eg.
>

I've been trying hard not to badmouth C++ here :-).  
 
> 
> > I was thinking of special cases where the difference of a 100K or 1M or so
> > is the difference between working and not working.  If you are, for
> > example, trying to fit your program on a 512K ROM, Ocaml's overhead might
> > be a problem.
> 
> Or if people are willing to download 100k but not 1M.
>

It would be an exceeding large program- or a delibertly perverse one- 
which managed to use *all* the libraries Ocaml provides.

And speaking as someone who still gets onto the internet via a 56K baud 
modem, download a megabyte isn't that bad.  I routinely get 5K/second on 
downloads, so a megabyte is ~3.5 minutes.  It's a bathroom break, sure, 
but not unreasonable.
 
-- 
"Usenet is like a herd of performing elephants with diarrhea -- massive,
difficult to redirect, awe-inspiring, entertaining, and a source of
mind-boggling amounts of excrement when you least expect it."
                                - Gene Spafford 
Brian

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 20:35         ` John J Lee
  2003-11-12 21:51           ` Brian Hurt
@ 2003-11-12 22:12           ` Eric Dahlman
  2003-11-12 23:32             ` Brian Hurt
  2003-11-12 23:44             ` John J Lee
  1 sibling, 2 replies; 53+ messages in thread
From: Eric Dahlman @ 2003-11-12 22:12 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

John J Lee wrote:
> On Wed, 12 Nov 2003, Brian Hurt wrote:
>>Currying, exceptions, etc. also have small size penalties. 
> OK.  I'm now enlightened on that point -- clearly, O'Caml's runtime is an
> absolute requirement for an O'Caml program (unlike C/C++).

C and C++ are not special in this regard, they just happen to be shipped 
with the operating system.  On my box hello world links against  libc.so 
and ld.so which are 1,531,964 and 103,044 bytes respectively.

One way to even things up is require the C version to link to all of its 
libraries statically.  Compiling with 'gcc -static test.c' I get an 
a.out file which is 423,441 bytes long.  So the static linker was able 
to throw better than 2/3 of libc but it still isn't to light.

Really what you need to do is lobby Microsoft and Apple to include ocaml 
as part of the base system install and then things might even out ;-)

-Eric

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:21   ` John J Lee
@ 2003-11-12 22:53     ` Richard Jones
  2003-11-12 23:50       ` John J Lee
  2003-11-15 12:48     ` skaller
  1 sibling, 1 reply; 53+ messages in thread
From: Richard Jones @ 2003-11-12 22:53 UTC (permalink / raw)
  Cc: caml-list

On Wed, Nov 12, 2003 at 06:21:11PM +0000, John J Lee wrote:
> How big is the runtime?  Does the compiler only link in the parts of the
> runtime that you use, or do you just non-negotiably get the whole thing
> every time you link?

It's really not so huge. You'll have to tell us a bit more about your
situation.

As a general guide, I was recently involved in writing a large
simulation program. We distributed two natively compiled OCaml
programs in a Windows installer, plus many auxiliary files, and the
size of the installer came to between 6 and 8 MB. This was not such an
issue for our users. [The installer was written using NSIS and used
bzip2 compression].

> Probably this is a naive question, but: Is it impractical to have a
> functional language that uses the C runtime?

OCaml links (dynamically) with the C runtime as well. ie. libc on Unix.

> Does anyone have recommendations for languages (not necessarily
> functional) with a compiler that generates small executables (including
> runtime code) for multiple platforms (at least Unix and Windows), with a
> decent FFI (foreign function interface), and preferably MS COM support?

Yes, OCaml! If you want COM support, look at OCam'OLE.

> Am I really stuck with C++??

Well, one would hope not. Supply us with more details about exactly
what the limitations are that you're facing, and we'll be able to
provide some more meaningful information.

Rich.

-- 
Richard Jones. http://www.annexia.org/ http://freshmeat.net/users/rwmj
Merjis Ltd. http://www.merjis.com/ - improving website return on investment
"I wish more software used text based configuration files!"
 -- A Windows NT user, quoted on Slashdot.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 23:32             ` Brian Hurt
@ 2003-11-12 22:53               ` Eric Dahlman
  2003-11-12 23:35               ` John J Lee
  1 sibling, 0 replies; 53+ messages in thread
From: Eric Dahlman @ 2003-11-12 22:53 UTC (permalink / raw)
  To: Brian Hurt; +Cc: John J Lee, Ocaml Mailing List

Brian Hurt wrote:

> Ocaml uses at least some of these libraries itself (although not via
> printf- I was wrong about that).  So, to be fair, you need to statically
> link them into Ocaml binary as well- increasing it's size by half a
> megabyte or so as well.

Who said anything about being fair ;-)  I just was trying to point out 
the problems with the statement that C/C++ didn't need a library.

> As a side note, I just finished downloading a ~10M compressed program 
> (Adobe Acrobat reader) over a 56K baud modem.  Took about 45 minutes or 
> so.  Modems teach you to be patient.  If not, I'll trot out long winded, 
> boring stores about how as a kid I was forced to use a 300 baud modem to 
> connect to the internet, through fourteen feet of snow, up hill, both 
> ways!  :-)
> 
> (eagerly awaiting the IP Transmission over string and 2 tin cans stories 
> from the good old days)

Well you have me beat I started out with 1200 baud of blazing speed.

-Eric


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 22:12           ` Eric Dahlman
@ 2003-11-12 23:32             ` Brian Hurt
  2003-11-12 22:53               ` Eric Dahlman
  2003-11-12 23:35               ` John J Lee
  2003-11-12 23:44             ` John J Lee
  1 sibling, 2 replies; 53+ messages in thread
From: Brian Hurt @ 2003-11-12 23:32 UTC (permalink / raw)
  To: Eric Dahlman; +Cc: John J Lee, Ocaml Mailing List

On Wed, 12 Nov 2003, Eric Dahlman wrote:

> John J Lee wrote:
> > On Wed, 12 Nov 2003, Brian Hurt wrote:
> >>Currying, exceptions, etc. also have small size penalties. 
> > OK.  I'm now enlightened on that point -- clearly, O'Caml's runtime is an
> > absolute requirement for an O'Caml program (unlike C/C++).
> 
> C and C++ are not special in this regard, they just happen to be shipped 
> with the operating system.  On my box hello world links against  libc.so 
> and ld.so which are 1,531,964 and 103,044 bytes respectively.

Ocaml uses at least some of these libraries itself (although not via
printf- I was wrong about that).  So, to be fair, you need to statically
link them into Ocaml binary as well- increasing it's size by half a
megabyte or so as well.

As a side note, I just finished downloading a ~10M compressed program 
(Adobe Acrobat reader) over a 56K baud modem.  Took about 45 minutes or 
so.  Modems teach you to be patient.  If not, I'll trot out long winded, 
boring stores about how as a kid I was forced to use a 300 baud modem to 
connect to the internet, through fourteen feet of snow, up hill, both 
ways!  :-)

(eagerly awaiting the IP Transmission over string and 2 tin cans stories 
from the good old days)

-- 
"Usenet is like a herd of performing elephants with diarrhea -- massive,
difficult to redirect, awe-inspiring, entertaining, and a source of
mind-boggling amounts of excrement when you least expect it."
                                - Gene Spafford 
Brian

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 23:32             ` Brian Hurt
  2003-11-12 22:53               ` Eric Dahlman
@ 2003-11-12 23:35               ` John J Lee
  1 sibling, 0 replies; 53+ messages in thread
From: John J Lee @ 2003-11-12 23:35 UTC (permalink / raw)
  To: Ocaml Mailing List

On Wed, 12 Nov 2003, Brian Hurt wrote:

> On Wed, 12 Nov 2003, Eric Dahlman wrote:
[...]
> As a side note, I just finished downloading a ~10M compressed program
> (Adobe Acrobat reader) over a 56K baud modem.  Took about 45 minutes or
> so.  Modems teach you to be patient.  If not, I'll trot out long winded,
[...]

Modems teach *geeks* to be patient, they teach some other people to go out
into the sunlight occasionally <0.9 wink>.


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 22:12           ` Eric Dahlman
  2003-11-12 23:32             ` Brian Hurt
@ 2003-11-12 23:44             ` John J Lee
  2003-11-13  0:26               ` Karl Zilles
  2003-11-13 15:43               ` [Caml-list] Executable size? Eric Dahlman
  1 sibling, 2 replies; 53+ messages in thread
From: John J Lee @ 2003-11-12 23:44 UTC (permalink / raw)
  To: caml-list

On Wed, 12 Nov 2003, Eric Dahlman wrote:

> John J Lee wrote:
> > On Wed, 12 Nov 2003, Brian Hurt wrote:
> >>Currying, exceptions, etc. also have small size penalties.
> > OK.  I'm now enlightened on that point -- clearly, O'Caml's runtime is an
> > absolute requirement for an O'Caml program (unlike C/C++).
>
> C and C++ are not special in this regard, they just happen to be shipped
> with the operating system.  On my box hello world links against  libc.so
> and ld.so which are 1,531,964 and 103,044 bytes respectively.
[...]

I don't understand what this has to do with what I said in the quote.
Yes, C runtime is present on essentially all systems, but the point is
that C and O'Caml are fundamentally different: with C, you can *ignore*
that runtime, and write a program that simply doesn't use it at all.  Not
so with O'Caml (for perfectly good and sensible reasons).

> One way to even things up is require the C version to link to all of its
[...]

Also, I'm simply looking for a way to distribute code, not trying to start
a pissing contest between C and O'Caml :-) so I'm not interested in
"evening things up".


> Really what you need to do is lobby Microsoft and Apple to include ocaml
> as part of the base system install and then things might even out ;-)

Well, I guess they already have, in the sense that O'Caml has a .NET
implementation -- right?  Always assuming that implementation is more than
the publicity stunt that the Python one was, of course...


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 22:53     ` Richard Jones
@ 2003-11-12 23:50       ` John J Lee
  0 siblings, 0 replies; 53+ messages in thread
From: John J Lee @ 2003-11-12 23:50 UTC (permalink / raw)
  To: caml-list

On Wed, 12 Nov 2003, Richard Jones wrote:
[...]
> size of the installer came to between 6 and 8 MB. This was not such an
> issue for our users. [The installer was written using NSIS and used

Sometimes that's small enough, sometimes not.  No need for debate there...

[...]
> > Am I really stuck with C++??
>
> Well, one would hope not. Supply us with more details about exactly
> what the limitations are that you're facing, and we'll be able to
> provide some more meaningful information.

You already have: the O'Caml runtime executable size overhead is small
enough for me.


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 23:44             ` John J Lee
@ 2003-11-13  0:26               ` Karl Zilles
  2003-11-13  1:29                 ` [Caml-list] F-sharp (was: Executable size?) Oleg Trott
  2003-11-13 15:43               ` [Caml-list] Executable size? Eric Dahlman
  1 sibling, 1 reply; 53+ messages in thread
From: Karl Zilles @ 2003-11-13  0:26 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

John J Lee wrote:
> Well, I guess they already have, in the sense that O'Caml has a .NET
> implementation -- right?  Always assuming that implementation is more than
> the publicity stunt that the Python one was, of course...

You're referring to F#.  It appears to be more of a research project 
than a full fledged implementation:

http://groups.google.com/groups?selm=fa.qe3mh18.1p1m8jk%40ifi.uio.no

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 16:14 [Caml-list] Executable size? John J Lee
  2003-11-12 17:33 ` Richard Jones
  2003-11-12 18:05 ` Dustin Sallings
@ 2003-11-13  1:23 ` Nicolas Cannasse
  2003-11-15 12:09 ` skaller
  3 siblings, 0 replies; 53+ messages in thread
From: Nicolas Cannasse @ 2003-11-13  1:23 UTC (permalink / raw)
  To: John J Lee, caml-list

> How does O'Caml compare with languages like Haskell (ghc), C and C++ for
> executable size?  Does compiled code depend on a runtime library (and how
> big is that, if so)?
>
> Are there any easily-identifiable, non-obvious, factors that affect
> executable size (I'm talking about end-use factors, rather those resulting
> from the design decisions taken by the language designers and
> implementors)?
>
> I currently use Python by preference, but I'm interested in a language
> (other than C/C++!) that doesn't depend on a big runtime library and
> generates "reasonably" small executables -- modems are here to stay for a
> while yet.

If you need COM support , look at OCaml'OLE :
http://tech.motion-twin.com/ocamole
If you need to make Windows DLL , look at ODLL :
http://tech.motion-twin.com/odll
If you need access to the win32 API, look at the ocaml port here :
http://www.speakeasy.org/~hchomsky/ocaml-win32.html

About the size of the executables (in native mode) :
The main problem for a Window developper is that usually when you link a
library staticly, the inclusion is made on a function basis, and not on a
module basis as ocaml do. Then if you have big Ocaml libraries, you should
split them into several indepent modules if feasible to avoid linking all.

I also found recently (is it a 3.07 "feature" - i didn't compare with 3.06
?) that classes compiled natively are taking an huge amount of space : a
~2000 lines library defining ~25 classes with actually not so much code is
compiling into a 100 Ko library in bytecode and into 440 Ko in native...
Using dynamic linking of C stubs will help here , but there is actually no
way of dynlinking Ocaml librairies ( the Dynlink module is not actually
doing any linking.... only loading ).

>From my own experience, executables size are growing faster in OCaml than in
C/C++, with a big leap every time you're linking with an additional
library.... but their size worth it !

Nicolas Cannasse

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [Caml-list] F-sharp (was: Executable size?)
  2003-11-13  0:26               ` Karl Zilles
@ 2003-11-13  1:29                 ` Oleg Trott
  2003-11-14  6:04                   ` [Caml-list] float_of_num Christophe Raffalli
  0 siblings, 1 reply; 53+ messages in thread
From: Oleg Trott @ 2003-11-13  1:29 UTC (permalink / raw)
  To: Karl Zilles, John J Lee; +Cc: caml-list, dsyme

On Wednesday 12 November 2003 07:26 pm, Karl Zilles wrote:
> John J Lee wrote:
> > Well, I guess they already have, in the sense that O'Caml has a .NET
> > implementation -- right?  Always assuming that implementation is more
> > than the publicity stunt that the Python one was, of course...
>
> You're referring to F#.  It appears to be more of a research project
> than a full fledged implementation:
>
> http://groups.google.com/groups?selm=fa.qe3mh18.1p1m8jk%40ifi.uio.no

Cc: Don Syme

I'm curious why F# (as I understood it), implements Caml from scratch instead 
of just changing the bytecode compiler in Caml a bit to suite its needs.

By the way, are there benchmarks comparing code produced by ocamlc, ocamlopt 
and F# (together with SML.NET and SML/NJ for that matter) on a variety of 
algorithm and numerics-intensive tasks?

IIRC, when .NET/C# just came out, there were claims that it was almost as fast 
as C.
-- 
Oleg Trott <oleg_trott@columbia.edu>

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 20:03       ` Brian Hurt
@ 2003-11-13  4:14         ` Kamil Shakirov
  2003-11-13  9:06           ` Richard Jones
  2003-11-13  9:18         ` Sven Luther
  1 sibling, 1 reply; 53+ messages in thread
From: Kamil Shakirov @ 2003-11-13  4:14 UTC (permalink / raw)
  To: Brian Hurt; +Cc: caml-list

Hello,

--------- hello.cc ---------------
#include <iostream>

using namespace std;

int main ()
{
	cout << "Hello, world!" << endl;
	return 0;
}
--------- hello.ml ---------------
let _ = print_endline "Hello, world!";;

kamil$ uname -a
Linux tornado.force 2.4.22 #1 Fri Oct 24 12:29:16 MSD 2003 i586 i586 i386 GNU/Linux

kamil$ gcc --version
gcc (GCC) 3.3.2
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

kamil$ ocamlc -version 
3.07[+Shared]

kamil$ g++ -Os -o hello_cpp hello.cc && strip hello_cpp && ldd hello_cpp
        libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x4001d000)
        libm.so.6 => /lib/libm.so.6 (0x400d1000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x400f2000)
        libc.so.6 => /lib/libc.so.6 (0x400fa000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

kamil$ ocamlopt -compact -o hello_mln hello.ml && strip hello_mln && ldd ./hello_mln
        libm.so.6 => /lib/libm.so.6 (0x4001c000)
        libdl.so.2 => /lib/libdl.so.2 (0x4003e000)
        libc.so.6 => /lib/libc.so.6 (0x40041000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

kamil$ g++ -Os -static -o hello_cpp_stat hello.cc && strip hello_cpp_stat

kamil$ ocamlopt -compact -ccopt -static -o hello_mln_stat hello.ml \
       && strip hello_mln_stat

kamil$ ls -l hello_*
-rwxr-xr-x    1 kamil    homeusers     3988 Nov 13 07:00 hello_cpp
-rwxr-xr-x    1 kamil    homeusers   787660 Nov 13 07:00 hello_cpp_stat
-rwxr-xr-x    1 kamil    homeusers    72044 Nov 13 07:00 hello_mln
-rwxr-xr-x    1 kamil    homeusers   458236 Nov 13 07:02 hello_mln_stat

It is more fair in relation to the OCaml. ;)

-- 
 Kamil.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-13  4:14         ` Kamil Shakirov
@ 2003-11-13  9:06           ` Richard Jones
  0 siblings, 0 replies; 53+ messages in thread
From: Richard Jones @ 2003-11-13  9:06 UTC (permalink / raw)
  Cc: caml-list

On Thu, Nov 13, 2003 at 07:14:15AM +0300, Kamil Shakirov wrote:
[bogus hello world example]

There are two factors which are actually important when comparing
executable size:

(1) How space efficient are the two compilers when compiling similar code. You
    would have to compare things like two functions which performed the same
    operation, or two equivalent for loops, etc. It's likely that OCaml must
    generate a bit more machine code, because (a) it has to add various
    run-time bounds checks, and (b) it has to do more bit shifts and boxing
    because of the representation of OCaml values.

(2) How much less code do you have to write in OCaml because it has efficiency
    features like polymorphism, garbage collection, data structure matching and
    so on. These features means you have to write, & hence compile, less code
    overall.

I would suggest that (2) outweighs (1), but I've not measured it.

Rich.

-- 
Richard Jones. http://www.annexia.org/ http://freshmeat.net/users/rwmj
Merjis Ltd. http://www.merjis.com/ - improving website return on investment
PTHRLIB is a library for writing small, efficient and fast servers in C.
HTTP, CGI, DBI, lightweight threads: http://www.annexia.org/freeware/pthrlib/

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:50       ` John J Lee
@ 2003-11-13  9:10         ` Sven Luther
  2003-11-13 13:46           ` John J Lee
  0 siblings, 1 reply; 53+ messages in thread
From: Sven Luther @ 2003-11-13  9:10 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

On Wed, Nov 12, 2003 at 06:50:52PM +0000, John J Lee wrote:
> On Wed, 12 Nov 2003, Sven Luther wrote:
> 
> > On Wed, Nov 12, 2003 at 10:06:52AM -0800, Dustin Sallings wrote:
> [...]
> > But then, you can link it dynamically :
> >
> >   $ file  /usr/bin/ledit
> >   /usr/bin/ledit: a /usr/bin/ocamlrun script text executable
> >   $ ls -l  /usr/bin/ledit
> >   -rwxr-xr-x    1 root     root        94857 2003-09-30 22:40 /usr/bin/ledit
> >
> > But then, you would only gain for packages using huge C bindings.
> [...]
> 
> This may be of interest to others, but personally, it doesn't matter much
> to me how it's linked.  The problem is minimising the total data to be
> transferred over the wire, including any shared libraries.

Well, this is because you ship only one ocaml program. But the user
wanting to run many of those will hugely benefit from dynamic linking.
And the distribution integrators (or whatever those are called) will
benefit from it.

Friendly,

Sven Luther

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 20:03       ` Brian Hurt
  2003-11-13  4:14         ` Kamil Shakirov
@ 2003-11-13  9:18         ` Sven Luther
  1 sibling, 0 replies; 53+ messages in thread
From: Sven Luther @ 2003-11-13  9:18 UTC (permalink / raw)
  To: Brian Hurt; +Cc: Sven Luther, Richard Jones, John J Lee, caml-list

On Wed, Nov 12, 2003 at 02:03:35PM -0600, Brian Hurt wrote:
> Using printf brings in most of the printf library, and adds about 40K to
> the size of the executable.  But you only ever need to include it once.
> Doing an ls -l `ocamlc -where`/*.cma shows at most about a meg of total
> libraries to include everything in the standard library (I'm assuming that
> the 988K toplevellib.cma is only needed by the top level).
> 
> If I was willing to let my code out, and download size was important, and
> I didn't mind requiring my users to have a compiler/interpreter for the
> language installed, then I'd be inclined to just ship bzipped source code
> tarballs around.  Maybe with a little compile/install script bundled.  

Notice that the debian package, which is currently split in ocaml-base
and ocaml, where ocaml-base contains only the ocamlrun executable and
the needed dll.so, and is 400Ko of installed size, will soon be changed
to include a ocaml-interpreter or ocaml-toplevel package, of around 3Mo
installed size, containing the ocaml toplevel and all the .cma/.cmi
needed to run ocaml scripts interactively, without needing to install
the full ocaml package, and all its dependencies.

In this case, you just need to add ocaml-interpreter to the dependency
of the package containing your scripts, and everything will load from
itself when you apt-get it :)))

Naturally this will only work if you run debian, or macos X. Maybe
Cygnus also, but i am not sure.

Friendly,

Sven Luther

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 20:40       ` Brian Hurt
  2003-11-12 20:10         ` Basile Starynkevitch
  2003-11-12 20:35         ` John J Lee
@ 2003-11-13 13:37         ` Florian Hars
  2 siblings, 0 replies; 53+ messages in thread
From: Florian Hars @ 2003-11-13 13:37 UTC (permalink / raw)
  To: Brian Hurt; +Cc: caml-list

Brian Hurt wrote:
> I don't know how many times I've read or written C code like:
[...]
>     outf = fopen(dst, "wb");
>     if (outf == NULL) {
>         fclose(inf);
>         return errno;
>     }

> Vr.s the same code in Ocaml:
> 
> let copyfile src dst =
>     let inf = open_in_bin src
>     and outf = open_out_bin dst
>     and buf = String.make 4096 ' '
 >     in

[...]

This isn't the same code: The C version gets the ressource management right,
while the ocaml version leaks open files like hell.

See http://caml.inria.fr/archives/200307/msg00324.html and followups.

Yours, Florian.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-13  9:10         ` Sven Luther
@ 2003-11-13 13:46           ` John J Lee
  2003-11-13 14:28             ` Sven Luther
  0 siblings, 1 reply; 53+ messages in thread
From: John J Lee @ 2003-11-13 13:46 UTC (permalink / raw)
  To: caml-list

On Thu, 13 Nov 2003, Sven Luther wrote:
[...John wrote:]
> > to me how it's linked.  The problem is minimising the total data to be
> > transferred over the wire, including any shared libraries.
>
> Well, this is because you ship only one ocaml program. But the user
> wanting to run many of those will hugely benefit from dynamic linking.
[...]

Sure, but in the Windows world, it's often the case that the user is
running only one executable from one software developer.


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-13 13:46           ` John J Lee
@ 2003-11-13 14:28             ` Sven Luther
  0 siblings, 0 replies; 53+ messages in thread
From: Sven Luther @ 2003-11-13 14:28 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

On Thu, Nov 13, 2003 at 01:46:57PM +0000, John J Lee wrote:
> On Thu, 13 Nov 2003, Sven Luther wrote:
> [...John wrote:]
> > > to me how it's linked.  The problem is minimising the total data to be
> > > transferred over the wire, including any shared libraries.
> >
> > Well, this is because you ship only one ocaml program. But the user
> > wanting to run many of those will hugely benefit from dynamic linking.
> [...]
> 
> Sure, but in the Windows world, it's often the case that the user is
> running only one executable from one software developer.

Which is why windows has DLLs, no ?

Friendly,

Sven Luther

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 23:44             ` John J Lee
  2003-11-13  0:26               ` Karl Zilles
@ 2003-11-13 15:43               ` Eric Dahlman
  2003-11-13 19:58                 ` John J Lee
  2003-11-15 13:36                 ` skaller
  1 sibling, 2 replies; 53+ messages in thread
From: Eric Dahlman @ 2003-11-13 15:43 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

John J Lee wrote:

[snip...]
> I don't understand what this has to do with what I said in the quote.
> Yes, C runtime is present on essentially all systems, but the point is
> that C and O'Caml are fundamentally different: with C, you can *ignore*
> that runtime, and write a program that simply doesn't use it at all.  Not
> so with O'Caml (for perfectly good and sensible reasons).

My point was that if you are making these sorts of comparisons you 
cannot just *ignore* the runtime in the C/C++ case and more importantly 
that C and O'Caml are not fundamentally different in this regard.  By 
definition it is impossible to write a program in C or C++ which does 
not use the respective runtime, it cannot be ignored.

The runtime for any language implements the irreducible primitives of 
that language implementation and is usually quite small.  In the case of 
  C this includes implementations of primitive data types and operators 
not natively supported on a given architecture as well as support for 
the setting up the initial environment.  In the case of gcc this is 
captured in three files which a linked with each C program.  They are

crtbegin.o 1.6k
crtend.o   1.2k
libgcc.a  46.3k

So it would be reasonable to say that the C runtime is 49k.

Now in the case of O'Caml I don't know what the exact numbers are but 
the ZINC interpreter is on the order of 75k and that includes the ocaml 
runtime. So they are really similar, really the only big difference in 
runtime requirements for OCaml is the garbage collector.

Now we have been talking much larger numbers in this thread and that is 
because people have been using some imprecise definitions for runtime. 
These bigger numbers have been including the notion of a standard 
library into the runtime.  In that case C looks smaller because its 
"standard runtime library" is already present on the system awhile 
OCaml's is not.

>>One way to even things up is require the C version to link to all of its
> 
> [...]
> 
> Also, I'm simply looking for a way to distribute code, not trying to start
> a pissing contest between C and O'Caml :-) so I'm not interested in
> "evening things up".

Nor am I (but I bet my language can hit that fly up on the wall...)  The 
   problem is that the measures being discussed were incorrect and 
misleading, I was trying to point out that fact.  When honestly looking 
at things from the standpoint of the runtime C is the smallest OCaml a 
close second and C++ is huge (libsupc++.a is 162k, which I think is the 
one we want).

This is an exact parallel to the old argument that Common Lisp runtime 
is HUGE while Scheme is small.  When you separate out the runtime from 
the library they are really about the same but that does not make for 
good flame wars.

Language implementation and runtime size is really an interesting topic 
but it is not a practical metric for measuring a language.  Furthermore, 
going back to the beginning of this thread it actually doesn't relate to 
your original problems with download size - those are really problems of 
politics, economics and a little engineering.

-Eric

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-13 15:43               ` [Caml-list] Executable size? Eric Dahlman
@ 2003-11-13 19:58                 ` John J Lee
  2003-11-13 20:36                   ` Eric Dahlman
  2003-11-15 13:41                   ` skaller
  2003-11-15 13:36                 ` skaller
  1 sibling, 2 replies; 53+ messages in thread
From: John J Lee @ 2003-11-13 19:58 UTC (permalink / raw)
  To: caml-list

On Thu, 13 Nov 2003, Eric Dahlman wrote:
[...]
> My point was that if you are making these sorts of comparisons you
> cannot just *ignore* the runtime in the C/C++ case and more importantly
> that C and O'Caml are not fundamentally different in this regard.  By
> definition it is impossible to write a program in C or C++ which does
> not use the respective runtime, it cannot be ignored.

Hmm, you're right.

I had confused myself, I guess, by absorbing the widespread use of "C
runtime" to mean MSVCRT.DLL (or libc.so, or whatever).

[...]
> the setting up the initial environment.  In the case of gcc this is
> captured in three files which a linked with each C program.  They are
>
> crtbegin.o 1.6k
> crtend.o   1.2k
> libgcc.a  46.3k
>
> So it would be reasonable to say that the C runtime is 49k.
>
> Now in the case of O'Caml I don't know what the exact numbers are but
> the ZINC interpreter is on the order of 75k and that includes the ocaml
> runtime. So they are really similar, really the only big difference in
> runtime requirements for OCaml is the garbage collector.
[...]

OK.  Getting back to the original question again (how to reduce data to be
transferred over the network), both O'Caml and C statically link this
runtime stuff, right?  So, why is O'Caml's "hello world" (compressed) 45k,
to C's 1 or 2k?  Is that 43k the garbage collector?  Or is it mostly that
O'Caml, in contrast to C, is linking in a bunch of stuff from its standard
library that isn't strictly required for "hello world"?  Or something else
again??

Hope I'm not going round in circles here...


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-13 19:58                 ` John J Lee
@ 2003-11-13 20:36                   ` Eric Dahlman
  2003-11-13 22:16                     ` John J Lee
  2003-11-15 13:41                   ` skaller
  1 sibling, 1 reply; 53+ messages in thread
From: Eric Dahlman @ 2003-11-13 20:36 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

John J Lee wrote:

>>the setting up the initial environment.  In the case of gcc this is
>>captured in three files which a linked with each C program.  They are
>>
>>crtbegin.o 1.6k
>>crtend.o   1.2k
>>libgcc.a  46.3k
>>
>>So it would be reasonable to say that the C runtime is 49k.
>>
>>Now in the case of O'Caml I don't know what the exact numbers are but
>>the ZINC interpreter is on the order of 75k and that includes the ocaml
>>runtime. So they are really similar, really the only big difference in
>>runtime requirements for OCaml is the garbage collector.
> 
> [...]
> 
> OK.  Getting back to the original question again (how to reduce data to be
> transferred over the network), both O'Caml and C statically link this
> runtime stuff, right?  So, why is O'Caml's "hello world" (compressed) 45k,
> to C's 1 or 2k?  Is that 43k the garbage collector?  Or is it mostly that
> O'Caml, in contrast to C, is linking in a bunch of stuff from its standard
> library that isn't strictly required for "hello world"?  Or something else
> again??

I can't say off hand and I don't have the time to research it.  My back 
of the envelope guess is that it is just not worth the effort to throw 
more stuff away in ocaml.  On a high level you can think of the 
language's runtime as providing the features of the hardware that it 
needs but are not present.  So if you were to port ocaml to run on an 
old Symbolics Lisp machine you could rely on the hardware GC and leave 
that out of your runtime.  This is where C has its first "advantage" in 
that it generally is a close match to the hardware model it is running 
on so there is less for the runtime to implement.  If you want to get an 
idea of what is in such a runtime the documentation for the one GCC uses 
is here:

http://gcc.gnu.org/onlinedocs/gccint/Libgcc.html#Libgcc

Now the second advantage that C has is that it is easier for the linker 
to identify which functions could never be called and strip them out of 
the resulting binary.  That is why in the case of a simple hello world 
program you can get down to basically having none of the runtime code left.

In the old days this was very important and I have used old Unix 
machines that only had static linking.  Those machines also had tiny 
disk drives so there was significant pressure when C was developing to 
make sure you could strip everything down as much as possible.

The basic problem with getting a language like ocaml down that small is 
that there is really no need or desire to do so and even then payoff is 
really small.  You can only leave out the parts you don't use but then 
again if you want to do something cool you will be using those parts. 
You will only win if you are writing primitive C style programs in ocaml 
(not that C programs are primitive but a fancy C program would also pull 
in library dependencies).

So I would say that it is totally possible to "enhance" a language like 
ocaml to generate tiny hello world executables, but I would much rather 
have the bright people working on O'Caml write something of more value. 
  I know that my definition of value is probably at odds with yours in 
this case. ;-)

-Eric



-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-13 20:36                   ` Eric Dahlman
@ 2003-11-13 22:16                     ` John J Lee
  0 siblings, 0 replies; 53+ messages in thread
From: John J Lee @ 2003-11-13 22:16 UTC (permalink / raw)
  To: caml-list

On Thu, 13 Nov 2003, Eric Dahlman wrote:
[...]
> So I would say that it is totally possible to "enhance" a language like
> ocaml to generate tiny hello world executables, but I would much rather
> have the bright people working on O'Caml write something of more value.

Sure, that makes sense.


>   I know that my definition of value is probably at odds with yours in
> this case. ;-)

Well, maybe not: 45k is very far from huge even for a puny modem, after
all, and a worthwhile factor of ten improvement over the smallest Python
"hello world" I've seen.  (though that 45k doesn't include decompression
for initial unzipping, so the comparison I make there isn't quite correct)

Thanks for everybody's responses.


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [Caml-list] float_of_num
  2003-11-13  1:29                 ` [Caml-list] F-sharp (was: Executable size?) Oleg Trott
@ 2003-11-14  6:04                   ` Christophe Raffalli
  0 siblings, 0 replies; 53+ messages in thread
From: Christophe Raffalli @ 2003-11-14  6:04 UTC (permalink / raw)
  Cc: caml-list

  What is the property of float_of_num ? How is it computed ?

Given x : num, I need to find two floats a,b such that a <= x <= b.

Changing the rounding mode and calling float_of_num twice doesnot work 
(this was likely, because I do not know the operation done inside 
float_of_num)

If I know that c = float_of_num is the nearest float, then I can go for
a = x-e and b = x+e with e = x*1e-n with n well chosen.

I think there should be three float_of_num in num.mli:

float_of_num (nearest)
float_of_num_above(nearest above)
float_of_num_bellow (nearest bellow)




-- 
Christophe Raffalli
Universite' de Savoie
Batiment Le Chablais, bureau 21
73376 Le Bourget-du-Lac Cedex

te'l: (33) 4 79 75 81 03
fax: (33) 4 79 75 87 42
mail: Christophe.Raffalli@univ-savoie.fr
www: http://www.lama.univ-savoie.fr/~RAFFALLI
---------------------------------------------
IMPORTANT: this mail is signed using PGP/MIME
At least Enigmail/Mozilla, mutt or evolution
can check this signature
---------------------------------------------

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 16:14 [Caml-list] Executable size? John J Lee
                   ` (2 preceding siblings ...)
  2003-11-13  1:23 ` Nicolas Cannasse
@ 2003-11-15 12:09 ` skaller
  3 siblings, 0 replies; 53+ messages in thread
From: skaller @ 2003-11-15 12:09 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

On Thu, 2003-11-13 at 03:14, John J Lee wrote:
> How does O'Caml compare with languages like Haskell (ghc), C and C++ for
> executable size?  

For x86, native code compiler:

 520 -rwxrwxr-x    1 skaller  skaller    525379 Nov 15 02:18 flxl
 800 -rwxrwxr-x    1 skaller  skaller    812242 Nov 15 02:18 flxp
 872 -rwxrwxr-x    1 skaller  skaller    887235 Nov 15 02:18 flxm
 920 -rwxrwxr-x    1 skaller  skaller    934253 Nov 15 02:18 flxd
1184 -rwxrwxr-x    1 skaller  skaller   1205490 Nov 15 02:18 flxb
1368 -rwxrwxr-x    1 skaller  skaller   1393890 Nov 15 02:18 flxg

Each program listed is the same as the previous one,
but adds a few more modules: flxl is a lexer,
flxp lex and parse, flxm macro processes, flxd also
does some desugaring (term rewriting), flxb binds code
(does lookups) and flxg generates code (C++ text is output).

Although not evident from this data, the sizes are
roughly proportional to the input text.

A count on the source code is:

 31427  116463  835506 total

[which includes regeression tests, documentation etc ..]


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-12 18:21   ` John J Lee
  2003-11-12 22:53     ` Richard Jones
@ 2003-11-15 12:48     ` skaller
  2003-11-15 15:25       ` John J Lee
  1 sibling, 1 reply; 53+ messages in thread
From: skaller @ 2003-11-15 12:48 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

On Thu, 2003-11-13 at 05:21, John J Lee wrote:
> On Wed, 12 Nov 2003, Richard Jones wrote:

> Probably this is a naive question, but: Is it impractical to have a
> functional language that uses the C runtime?

Felix does that. Its own runtime is tiny
(it has a naive exact garbage collector .. only a page of
source code or two).

It also generates shared libraries by default, which don't
include any runtime at all (you invoke the library with
a driver like ocamlrun).

Here is the Hello World program in Felix:
-----------------------
include "std";
print "Hello World\n";
-------------------------

and the output for Linux x86 generated by g++ without optimisation:

  20 -rwxrwxr-x    1 skaller  skaller     18847 Nov 15 02:23 tut101.so

It is run by this program:

  72 -rwxrwxr-x    1 skaller  skaller     69083 Nov 15 02:19 flx_run

[Of course the C and C++ libraries are dynamically linked so are
not included]

> Does anyone have recommendations for languages (not necessarily
> functional) with a compiler that generates small executables (including
> runtime code) for multiple platforms (at least Unix and Windows), with a
> decent FFI (foreign function interface), and preferably MS COM support?
> 
> Am I really stuck with C++??

Felix generates simple ISO C++, so the output is portable.

The foreign function interface  .. well .. example:

header "include <cstdio>";
type file = "FILE*";
fun fopen: string -> file = 'std::fopen($1.data(),"rt")';

MS_COM support you'll have to add yourself.
Should be trivial using the above kind of mechanism.

http://felix.sf.net

It works fine on Linux and has been built with
Cygwin on Windows. Ocaml, Python, and a C++ compiler 
are required. And some courage since it is 'pre-alpha'
software :-)

Read the tutorial to discover the functional features
including first class functions, currying, pattern matching,
etc. Note that polymorhism is fully parametric but compile
time only at the moment since boxing is not used.


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-13 15:43               ` [Caml-list] Executable size? Eric Dahlman
  2003-11-13 19:58                 ` John J Lee
@ 2003-11-15 13:36                 ` skaller
  2003-11-15 15:01                   ` John J Lee
  1 sibling, 1 reply; 53+ messages in thread
From: skaller @ 2003-11-15 13:36 UTC (permalink / raw)
  To: Eric Dahlman; +Cc: John J Lee, caml-list

On Fri, 2003-11-14 at 02:43, Eric Dahlman wrote:
> John J Lee wrote:

> My point was that if you are making these sorts of comparisons you 
> cannot just *ignore* the runtime in the C/C++ case and more importantly 
> that C and O'Caml are not fundamentally different in this regard.  By 
> definition it is impossible to write a program in C or C++ which does 
> not use the respective runtime, it cannot be ignored.

That is not true for C, unless you are pedantic and refer to ISO C,
and even then, ISO C has a concept of 'hosted' and 'non-hosted'
systems, with the requirements for non-hosted systems
being considerably less.

A very large number of people do in fact build C all the
time without any runtime library at all: embedded systems
typically don't use any runtime.

You can also do this for C++, even g++ can do it I think
by turning off support for features that require run
time support such as exception handling.

Ocaml on the other hand cannot function at all without the gc.


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-13 19:58                 ` John J Lee
  2003-11-13 20:36                   ` Eric Dahlman
@ 2003-11-15 13:41                   ` skaller
  2003-11-15 15:13                     ` John J Lee
  1 sibling, 1 reply; 53+ messages in thread
From: skaller @ 2003-11-15 13:41 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

On Fri, 2003-11-14 at 06:58, John J Lee wrote:
> On Thu, 13 Nov 2003, Eric Dahlman wrote:

> 
> OK.  Getting back to the original question again (how to reduce data to be
> transferred over the network), both O'Caml and C statically link this
> runtime stuff, right?  So, why is O'Caml's "hello world" (compressed) 45k,
> to C's 1 or 2k?  Is that 43k the garbage collector?  Or is it mostly that
> O'Caml, in contrast to C, is linking in a bunch of stuff from its standard
> library that isn't strictly required for "hello world"?  Or something else
> again??
> 
> Hope I'm not going round in circles here...

The Ocaml equivalent of a C stub program which dynamically
links to the C run time is bytecode.

Ocaml native code compiler, at least on the x86,
does not generate relocatable code, and so Ocaml 
library functions cannot be dynamically linked.
[At present .. :]

In my opinion, you best bet is to generate bytecode
and distribute that. Your clients WILL have to download
the bigger ocamlrun driver harness, but hopefully
only once.


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-15 13:36                 ` skaller
@ 2003-11-15 15:01                   ` John J Lee
  2003-11-15 17:53                     ` skaller
  0 siblings, 1 reply; 53+ messages in thread
From: John J Lee @ 2003-11-15 15:01 UTC (permalink / raw)
  To: caml-list

On Sat, 16 Nov 2003, skaller wrote:
[...]
> A very large number of people do in fact build C all the
> time without any runtime library at all: embedded systems
> typically don't use any runtime.

When you say "runtime", do you mean stuff like libc.so, or libgcc.a, or
both?

When, if ever, can you avoid linking with libgcc.a (or its equivalent)?
What do you lose by not linking with it?

I don't ask for any practical reason, just to try and sort out how O'Caml,
C and C++ differ here.


> You can also do this for C++, even g++ can do it I think
> by turning off support for features that require run
> time support such as exception handling.
>
> Ocaml on the other hand cannot function at all without the gc.


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-15 13:41                   ` skaller
@ 2003-11-15 15:13                     ` John J Lee
  2003-11-15 18:07                       ` skaller
  0 siblings, 1 reply; 53+ messages in thread
From: John J Lee @ 2003-11-15 15:13 UTC (permalink / raw)
  To: caml-list

On Sat, 16 Nov 2003, skaller wrote:
> On Fri, 2003-11-14 at 06:58, John J Lee wrote:
[...]
> > OK.  Getting back to the original question again (how to reduce data to be
> > transferred over the network), both O'Caml and C statically link this
> > runtime stuff, right?  So, why is O'Caml's "hello world" (compressed) 45k,
> > to C's 1 or 2k?  Is that 43k the garbage collector?  Or is it mostly that
> > O'Caml, in contrast to C, is linking in a bunch of stuff from its standard
> > library that isn't strictly required for "hello world"?  Or something else
> > again??
> >
> > Hope I'm not going round in circles here...
>
> The Ocaml equivalent of a C stub program which dynamically
> links to the C run time is bytecode.

And, you're implying, even C's "hello world" *is* using the C standard
library, because of printf -- and O'Caml is using it's standard library
for the same reason.  So part of the O'Caml standard library is statically
linked into hello world, thus explaining part of the 43k difference?  In
that case, I wonder what the C / O'Caml executable size discrepancy for
"hello world" becomes if you use only OS routines directly?


> Ocaml native code compiler, at least on the x86,
> does not generate relocatable code, and so Ocaml
> library functions cannot be dynamically linked.
> [At present .. :]

So, an O'Caml .DLL or .so is implemented using O'Caml bytecode?


> In my opinion, you best bet is to generate bytecode
> and distribute that. Your clients WILL have to download
> the bigger ocamlrun driver harness, but hopefully
> only once.

That's not useful in the case where the user is only downloading one
program, unfortunately.


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-15 12:48     ` skaller
@ 2003-11-15 15:25       ` John J Lee
  0 siblings, 0 replies; 53+ messages in thread
From: John J Lee @ 2003-11-15 15:25 UTC (permalink / raw)
  To: caml-list

On Sat, 15 Nov 2003, skaller wrote:
> On Thu, 2003-11-13 at 05:21, John J Lee wrote:
[...]
> > Probably this is a naive question, but: Is it impractical to have a
> > functional language that uses the C runtime?
>
> Felix does that. Its own runtime is tiny
> (it has a naive exact garbage collector .. only a page of
> source code or two).

Thanks for the pointer.  I'd looked at it before and thought it looked
interesting (somebody mentioned it in a comp.lang.python post).


[...]
> > Am I really stuck with C++??
>
> Felix generates simple ISO C++, so the output is portable.
>
> The foreign function interface  .. well .. example:
[...]
> MS_COM support you'll have to add yourself.
> Should be trivial using the above kind of mechanism.

For you, I'm sure.  I'm afraid might make heavy weather of it even so :-(

I've only used COM (when using C++, that is) from MSVC++, and ISTR that
people have said that, for example, using COM from mingw is not easy
unless you know a lot about it (I'm not talking about the language
extensions in MSVC++ -- at least, I don't *think* I am -- but I don't know
what the issues are that cause the alleged problems).


John

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-15 15:01                   ` John J Lee
@ 2003-11-15 17:53                     ` skaller
  0 siblings, 0 replies; 53+ messages in thread
From: skaller @ 2003-11-15 17:53 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

On Sun, 2003-11-16 at 02:01, John J Lee wrote:
> On Sat, 16 Nov 2003, skaller wrote:
> [...]
> > A very large number of people do in fact build C all the
> > time without any runtime library at all: embedded systems
> > typically don't use any runtime.
> 
> When you say "runtime", do you mean stuff like libc.so, or libgcc.a, or
> both?

Neither, crt0 is the key. It isn't a library, but initialisation
code.

> When, if ever, can you avoid linking with libgcc.a (or its equivalent)?
> What do you lose by not linking with it?

You cannot make a traditional 'main' program without some
runtime support. This does things like pass command line
arguments to 'main'. It also sets up registers for the
generated code. For example on the x86 it is common
to set all the segment registers equal. The startup
code may also set up the floating point unit, signal
handlers, etc.

However, no 'library' code is ever required by ISO C
programs unless you actually call the functions or
refer to some variable. Still, if you consider
say 'errno', evil as it is, you might refer to it
even if you never do any file IO, so it had better
be correctly initialised.

Finally, even if you don't do IO, something like
an 'assert' macro might, so perhaps *some* initialisation
of some thing might be done in case you use them,
with the compiler not really knowing if it is necessary or not.

In C++, some initialisation for exception handling, RTTI,
and other stuff may be needed .. even if you don't use it,
it may be included *in case* you use it. In particular,
this may be necessary if you dynamically link to a shared
library that does use these features, and they're global
and have to be set up on startup (RTTI and exception handling
spring to mind here ..)

Even on embedded systems, there is usually initialisation
code, though it is often hand written by the client 
(in assembler).

Finally, there is a special case where you must NOT
use a runtime library, even on a hosted machine.

And that is when bootstrapping the compiler and compiling
the run time :-)

> I don't ask for any practical reason, just to try and sort out how O'Caml,
> C and C++ differ here.

Well, for Ocaml the gc must be set up. In addition, signal and
thread handling might have to be initialised. Perhaps some
data such as command line arguments is fetched by startup
code, whether or not you actually try to access it.

The principal difference between Ocaml and C is that
C is designed to be able to generate things like Linux
kernels, and you certainly don't want to use the standard C
library doing that: you're trying instead to build particular
machine code in a 'high level way', and need to actually
write all the functions you need yourself... since it is
this kernel that actually provides some of the resources
accessed by user space C libraries :-)

Ocaml doesn't try to be a systems programming language,
that's the difference.


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Caml-list] Executable size?
  2003-11-15 15:13                     ` John J Lee
@ 2003-11-15 18:07                       ` skaller
  0 siblings, 0 replies; 53+ messages in thread
From: skaller @ 2003-11-15 18:07 UTC (permalink / raw)
  To: John J Lee; +Cc: caml-list

On Sun, 2003-11-16 at 02:13, John J Lee wrote:
> On Sat, 16 Nov 2003, skaller wrote:

> > The Ocaml equivalent of a C stub program which dynamically
> > links to the C run time is bytecode.
> 
> And, you're implying, even C's "hello world" *is* using the C standard
> library, because of printf -- and O'Caml is using it's standard library
> for the same reason.  

I think I'm saying that a 'fair' comparison would be between
C shared library partitioning of code, and Ocaml driver
program (top level) which loads bytcode dynamically:
when Ocaml is statically linking native code it is going
for all out blinding speed and ease of moving the
application executable around, instead of a small footprint
and portability of the application.


> So, an O'Caml .DLL or .so is implemented using O'Caml bytecode?

If you want dynamic loading, you have to use either bytecode
or a patched native code compiler (at least on the x86/Linux
platform).

This is a bit of a pain, I'd love to generate shared libraries.
[I only use the native code system]

> 
> > In my opinion, you best bet is to generate bytecode
> > and distribute that. Your clients WILL have to download
> > the bigger ocamlrun driver harness, but hopefully
> > only once.
> 
> That's not useful in the case where the user is only downloading one
> program, unfortunately.

True it will not reduce the footprint. Perhaps it will even be
larger. However, it *will* help make the code more portable,
since you can separate the one off task of building a custom
top level for each platform, and then building platform independent
application code.

I do this in Felix, and luckily for me the standard toplevel
has all the resources I need, so I can just rely on the Ocaml
team to build toplevels for each system, and let the client
build my product using bytecode if there is no native 
compiler for their platform.

If you do that, the footprint will vary depending on
the target platform. (Which it will anyhow I suppose :-)


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 53+ messages in thread

end of thread, other threads:[~2003-11-15 19:08 UTC | newest]

Thread overview: 53+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-11-12 16:14 [Caml-list] Executable size? John J Lee
2003-11-12 17:33 ` Richard Jones
2003-11-12 18:06   ` Dustin Sallings
2003-11-12 18:31     ` Sven Luther
2003-11-12 18:50       ` John J Lee
2003-11-13  9:10         ` Sven Luther
2003-11-13 13:46           ` John J Lee
2003-11-13 14:28             ` Sven Luther
2003-11-12 18:21   ` John J Lee
2003-11-12 22:53     ` Richard Jones
2003-11-12 23:50       ` John J Lee
2003-11-15 12:48     ` skaller
2003-11-15 15:25       ` John J Lee
2003-11-12 19:06   ` Brian Hurt
2003-11-12 18:38     ` Sven Luther
2003-11-12 19:04       ` Karl Zilles
2003-11-12 21:29         ` Brian Hurt
2003-11-12 20:03       ` Brian Hurt
2003-11-13  4:14         ` Kamil Shakirov
2003-11-13  9:06           ` Richard Jones
2003-11-13  9:18         ` Sven Luther
2003-11-12 18:46     ` John J Lee
2003-11-12 20:40       ` Brian Hurt
2003-11-12 20:10         ` Basile Starynkevitch
2003-11-12 20:35         ` John J Lee
2003-11-12 21:51           ` Brian Hurt
2003-11-12 21:35             ` David Brown
2003-11-12 22:12           ` Eric Dahlman
2003-11-12 23:32             ` Brian Hurt
2003-11-12 22:53               ` Eric Dahlman
2003-11-12 23:35               ` John J Lee
2003-11-12 23:44             ` John J Lee
2003-11-13  0:26               ` Karl Zilles
2003-11-13  1:29                 ` [Caml-list] F-sharp (was: Executable size?) Oleg Trott
2003-11-14  6:04                   ` [Caml-list] float_of_num Christophe Raffalli
2003-11-13 15:43               ` [Caml-list] Executable size? Eric Dahlman
2003-11-13 19:58                 ` John J Lee
2003-11-13 20:36                   ` Eric Dahlman
2003-11-13 22:16                     ` John J Lee
2003-11-15 13:41                   ` skaller
2003-11-15 15:13                     ` John J Lee
2003-11-15 18:07                       ` skaller
2003-11-15 13:36                 ` skaller
2003-11-15 15:01                   ` John J Lee
2003-11-15 17:53                     ` skaller
2003-11-13 13:37         ` Florian Hars
2003-11-12 18:05 ` Dustin Sallings
2003-11-12 18:36   ` John J Lee
2003-11-12 19:04     ` Dustin Sallings
2003-11-12 20:17       ` John J Lee
2003-11-12 20:01     ` Vitaly Lugovsky
2003-11-13  1:23 ` Nicolas Cannasse
2003-11-15 12:09 ` skaller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).