MDN/Development/Emscripten: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 29: Line 29:
**The nature of Emscripten compiled JS
**The nature of Emscripten compiled JS
* Your first steps with Emscripten
* Your first steps with Emscripten
** Download and install
** Download and install (https://github.com/kripken/emscripten/wiki/Emscripten-SDK, https://github.com/kripken/emscripten/wiki/Getting-started-on-Mac-OS-X, https://github.com/kripken/emscripten/wiki/Getting-Started-on-Ubuntu-12.10, https://github.com/kripken/emscripten/wiki/Using-Emscripten-on-Windows)
** Hello world
** Hello world (https://github.com/kripken/emscripten/wiki/Tutorial)
*** Generating the code
*** Generating the code
*** The asm.js module
*** The asm.js module
Line 41: Line 41:
This could be a single article but may well be multiple articles under a single section as the document resource grows. The main purpose here is to provide native developers trying to research the feasibility of running their project on the web with some answers.
This could be a single article but may well be multiple articles under a single section as the document resource grows. The main purpose here is to provide native developers trying to research the feasibility of running their project on the web with some answers.


* How does the web differ to runing native code?
* How does the web differ to runing native code? (https://github.com/kripken/emscripten/wiki/Emscripten-browser-environment)
** non-threading
** non-threading
** async main loop
** async main loop
** async file loading
** async file loading
** memory model
** memory model
** https://github.com/kripken/emscripten/wiki/Browser-limitations
**networking
**networking
** performance
** performance
Line 58: Line 59:
* C++ landscape support for Emscripten
* C++ landscape support for Emscripten
** Common C++ libraries/technologies that Emscripten handles successfully (provide links forward to more detailed pages in the techniques section)
** Common C++ libraries/technologies that Emscripten handles successfully (provide links forward to more detailed pages in the techniques section)
** https://github.com/kripken/emscripten/wiki/Library-Support ?
** Common C++ libraries/technologies that Emscripten doesn't handle so well
** Common C++ libraries/technologies that Emscripten doesn't handle so well
*** https://github.com/kripken/emscripten/wiki/CodeGuidelinesAndLimitations
***What needs to be rewritten in C++
***What needs to be rewritten in C++
***What is better written from scratch on the JavaScript side?
***What is better written from scratch on the JavaScript side?
Line 70: Line 73:
** Other alternatives
** Other alternatives
** A minimal GL rendering sample that shows how to get stuff up and running?
** A minimal GL rendering sample that shows how to get stuff up and running?
* Emscripten in your build system
* Emscripten in your build system (https://github.com/kripken/emscripten/wiki/Building-Projects)
** https://github.com/kripken/emscripten/wiki/Code-Generation-Modes
** Reworking your existing build system to target emscripten
** Reworking your existing build system to target emscripten
** Co-maintaining both native and emscripten targets simultaneously
** Co-maintaining both native and emscripten targets simultaneously
Line 76: Line 80:
** Installable app packaging
** Installable app packaging
** Mobile runtime quirks
** Mobile runtime quirks
* Debugging Emscripten code output
* Debugging Emscripten code output (https://github.com/kripken/emscripten/wiki/Debugging)


===Techniques for working with Emscripten===
===Techniques for working with Emscripten===
Line 88: Line 92:
** OpenAL
** OpenAL
** EGL (see https://github.com/kripken/emscripten/wiki/EGL-Support-in-Emscripten for a good example)
** EGL (see https://github.com/kripken/emscripten/wiki/EGL-Support-in-Emscripten for a good example)
** OPENGL (https://github.com/kripken/emscripten/wiki/OpenGL-support)
** GLES2
** GLES2
** https://github.com/kripken/emscripten/wiki/GC
** https://github.com/kripken/emscripten/wiki/Linking
** others...
** others...
* Architecting around common problems - provide a case study for each? (Currently we do have some examples of "how do I do X in Emscripten" as part of the unit test suite, but naturally that's not a good format for reading as a documentation/learning material. Some of those could be hoisted or used as a basis for a better set of example apps.)
* Architecting around common problems - provide a case study for each? (Currently we do have some examples of "how do I do X in Emscripten" as part of the unit test suite, but naturally that's not a good format for reading as a documentation/learning material. Some of those could be hoisted or used as a basis for a better set of example apps.)
Line 94: Line 101:
** non-threading
** non-threading
** async main loop (async compilation is already covered at https://developer.mozilla.org/en-US/docs/Games/Techniques/Async_scripts. Perhaps include some extra explanation about what's going on inside the JS engine?)
** async main loop (async compilation is already covered at https://developer.mozilla.org/en-US/docs/Games/Techniques/Async_scripts. Perhaps include some extra explanation about what's going on inside the JS engine?)
** async file loading
** async file loading (https://github.com/kripken/emscripten/wiki/Filesystem-Guide, https://github.com/kripken/emscripten/wiki/Filesystem-API)
** memory model
** memory model
** networking
** networking
** performance
** performance
** https://github.com/kripken/emscripten/wiki/Asm-pointer-casts
** https://github.com/kripken/emscripten/wiki/Synchronous-Virtual-XHR-Backed-File-System-Usage
* Emscripten APIs (see https://github.com/kripken/emscripten/blob/master/system/include/emscripten/emscripten.h)
* Emscripten APIs (see https://github.com/kripken/emscripten/blob/master/system/include/emscripten/emscripten.h)
** x
** Embind (https://github.com/kripken/emscripten/wiki/embind)
** y
** y
** z
** z
* Combining handspun JavaScript with Emscripten code
* Combining handspun JavaScript with Emscripten code (https://github.com/kripken/emscripten/wiki/Interacting-with-code)
** Developing a JS library to solve problem X
** Developing a JS library to solve problem X
** Gluing it to your Emscripten application
** Gluing it to your Emscripten application
* Benchmarking, profiling and optimization
* Benchmarking, profiling and optimization
** e.g. minimizing data sizes
** e.g. minimizing data sizes (https://github.com/kripken/emscripten/wiki/Compressing-Downloads)
** optimize web transfers?
** optimize web transfers?
** optimizing generated code (https://github.com/kripken/emscripten/wiki/Optimizing-Code, https://github.com/kripken/emscripten/wiki/Optimizing-the-source-code)
* Creating the launch experience
* Creating the launch experience
** Creating a start page
** Creating a start page
Line 120: Line 130:
* Links to other relevant docs - Graphics, GLES2?
* Links to other relevant docs - Graphics, GLES2?
* Links to relevant tool documentation
* Links to relevant tool documentation
* Emscripten FAQ (https://github.com/kripken/emscripten/wiki/FAQ)


==Raw ideas==
==Raw ideas==


==What should we talk to?==
==What should we talk to?==

Revision as of 14:01, 25 November 2013

Project statement

Emscripten is an LLVM to JavaScript compiler. It takes LLVM bytecode (which can be generated from C/C++ using Clang, or any other language that can be converted into LLVM bytecode) and compile that into JavaScript, which can be run on the web (or anywhere else JavaScript can run). Using Emscripten, you can

  • Compile C and C++ code into JavaScript and run that on the web
  • Run code originated in languages like Python on the web as well, for example by compiling CPython from C to JavaScript

This is a really cool and very useful technology, and it is essential for the success of some of Mozilla's current initiatives, such as web gaming. But the uses of Emscripten go beyond just building amazing games, therefore I have decided that Emscripten should have its own landing page on MDN, covering Emscripten in a more generic fashion.

Emscripten currently has a wiki on github that contains some great content, but this content could use some updating and reorganization, and we have lots of other ideas for content too, to tell the full story of how useful Emscripten is to interested parties such as C++ developers.

This document outlines the plans for an MDN resource covering Emcripten.

Where will this project live?

The obvious place would be a landing page at https://developer.mozilla.org/en-US/docs/Emscripten.

What content should it have?

Although Emscripten can be used to compile a number of different languages into JavaScript, it would make sense to start with C++, as that is the best supported and most useful target laguage for our current projects. The following quote from Jukka provides some good context for the purpose of these docs:

My experience and perspective is mainly from the "Game developer who has written a native game in C/C++ for Android/iOS/PC and wants to port it to FxOS/browser" viewpoint.

Introducing Emscripten

An introduction to Emscripten, including how it works, how to get it set up and start wqorking with it, and some beginner's tutorials

Web abilities and limitations

This could be a single article but may well be multiple articles under a single section as the document resource grows. The main purpose here is to provide native developers trying to research the feasibility of running their project on the web with some answers.

Integrating Emscripten into your workflow

As a native developer, how can I get up and running with Emscripten, including it as an additional development target that fits into my existing toolchain?

Techniques for working with Emscripten

More detailed tutorials than you got with the hello world section in the introductory material. Generally these should help developers solve specific problems with their code, and porting it across. It might be an idea to, at each point, say what C++ component is being used, and what JavaScript API/construct it is being compiled into, making it easier to understand what is going on whether you are a C++ person or a JavaScript person.

Generally the C++ devs won't be initially familiar with the JS specs, and if they are presented e.g. with the Gamepad API or Web Audio API, they'll reject those docs since they are foremost looking for C/C++ solutions to their problems. This is partly because they have just learned about this Emscripten C/C++ compiler that they are now harnessing, and they are right now getting their initial problems solved in the C/C++ side without a single line of JS. Another reason is that devs might not know the JS syntax at all, or if they do, there's a considerable amount of new C/C++ <-> JS interop machinery that one needs to learn, and how to integrate JS into the native build arch, and so on, so being able to develop against JS side APIs will generally come much later during the porting cycle, when the landscape has been charted sufficiently enough to know that one can't (yet) solve all the problems with just native C/C++ code alone.

Reference documentation

Raw ideas

What should we talk to?