For --closure 2, the main issue is closure advanced requires special
handing of externs, see
https://developers.google.com/closure/compiler/docs/api-tutorial3

See the NO_FILESYSTEM and NO_BROWSER options for reducing code size further.

We could add an option to only include code that is explicitly in
EXPORTED_FUNCTIONS, even runtime support. That would take some work though.
But it would be great if it were contributed.



On Wed, Jun 24, 2015 at 11:27 AM, Alan deLespinasse <[email protected]
> wrote:

> I'm trying to compile a fairly straightforward C library into JavaScript
> so I can use it in Web applications. I've got it working, but I think it's
> larger than it should be.
>
> The library is basically math functions. I just want to call them and get
> their results. They don't do I/O or anything.
>
> As an example, I'll use the int_sqrt function example from the
> documentation
> <http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html#calling-compiled-c-functions-from-javascript-using-ccall-cwrap>
> :
>
>
> int int_sqrt(int x) {
>   return sqrt(x);
> }
>
>
> Compiling this with -O3 results in an a.out.js file of 143k bytes. I had
> thought that -O3 would automatically run the Closure Compiler to do some
> minification (vaguely implied by the statement that --closure 0 is the 
> "default
> in -O2 and below
> <http://kripken.github.io/emscripten-site/docs/tools_reference/emcc.html#emcc-closure>"),
> but this doesn't seem to be the case.
>
> After a bit more research, I settled on this command line:
>
> emcc -O3 hello_function.cpp --closure 1 -s
> EXPORTED_FUNCTIONS="['_int_sqrt']" -s MODULARIZE=1
>
> This gets it down to 80k, a huge improvement, but still rather large for
> such a tiny input. I tried --closure 2, but (a) that only gets it down to
> 77k, and (b) then the code no longer works. I get "Uncaught TypeError: Kc
> is not a function" in the console when I try to call it from JavaScript.
>
> I've seen vague suggestions in various docs that --closure 2 would
> "require modifications to the source". I think there may have been
> something about requiring Closure type annotations. But that doesn't make
> sense to me, since the source code I'm dealing with is C.
>
> So what's actually needed for --closure 2?
>
> Also, looking at the generated code, there seems to be a lot of
> unnecessary stuff, even with --closure 2. For example, I see standard
> library stuff like malloc, free, memset, memcpy, etc. It's true that I
> might want to call those functions from my JavaScript code (in fact, for
> the actual library I'm trying to use, I do need at least malloc and free),
> but I thought I would need to declare such things in the EXPORTED_FUNCTIONS
> variable.
>
> Basically what I'm asking is, is it possible to get the compiled code much
> smaller?
>
> If the answer is "that would require more optimization in Emscripten,
> which we haven't had time to implement yet", then I'm curious what it would
> take. I might consider contributing. (I'm pretty experienced with
> JavaScript, though new to Emscripten.)
>
> --
> You received this message because you are subscribed to the Google Groups
> "emscripten-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to