| The Dart Dev Compiler (DDC) is a fast, modular compiler that generates modern | |
| JavaScript (EcmaScript 6). Its primary use today is to support fast, iterative | |
| development of Dart web applications for Chrome and other modern browsers. | |
| # Support | |
| DDC is meant to be used by build systems like bazel, `build_web_compilers` and | |
| `flutter_tools` under the hood. This compiler is not meant to be used by | |
| application developers directly. | |
| While at times the code generated by this compiler may be readable, the | |
| representation is not meant to be stable and can break with time. For that | |
| reason we do not recommend using this compiler to export Dart as a | |
| JavaScript module. | |
| The recommended approach to compile Dart to JavaScript is to use `dart compile | |
| js` instead. If you intend to make a public JavaScript API based on a Dart | |
| implementation, such API should be declared explicitly using the standard | |
| Dart-JSInterop mechanisms. | |
| # Implementation details | |
| ## Modularity | |
| Unlike Dart2JS, DDC does not require an entire Dart application. Instead, it | |
| operates modularly: it compiles a set of Dart files into a JavaScript module. A | |
| DDC compilation step requires a set of input Dart files and a set of *summaries* | |
| of dependencies. It performs modular type checking as part of this compilation | |
| step, and, if the input type checks, it generates a JavaScript module. The | |
| browser (i.e., the JavaScript runtime) loads and links the generated modules | |
| when running the application. During development, a compilation step only needs | |
| to be rerun if the Dart files or summaries it relies upon change. For most | |
| changes, only a very small part of your code will require recompilation. | |
| Moreover, modules that are unchanged can be cached in the browser. | |
| ## Representation | |
| Currently Dart classes are mapped to ES6 classes, Dart fields to ES6 properties, | |
| Dart getters/setters to ES6 getters/setters, Dart methods to ES6 methods, and so | |
| on. Often names are preserved and calling conventions are natural JavaScript | |
| ones. | |
| Some Dart concepts don't map directly: | |
| - *Libraries*. Multiple Dart libraries are mapped to a single JS module. Each | |
| library appears as a first class object in the generated JS module, with its | |
| top-level symbols as members. We currently use a heuristic (based upon file | |
| paths) to ensure unique naming of generated library objects. | |
| - *Generics*. Dart generics are *reified*, i.e., they are preserved at runtime. | |
| Generic classes are mapped to factories that, given one or more type | |
| parameters, return an actual ES6 class (e.g., `HashMap$(core.String, | |
| core.int)` produces a class that represents a HashMap from strings to ints). | |
| Similarly, generic methods are mapped to factories that, given one or more | |
| type parameters, return a method. | |
| - *Dynamic*. DDC supports dynamically typed code (i.e., Dart's `dynamic` type), | |
| but it will typically generate less readable and less efficient ES6 output as | |
| many type checks must be deferred to runtime. All dynamic operations are | |
| invoked via runtime helper code. | |
| - *Constructors*. Dart supports multiple, named and factory constructors for a | |
| given class with a different initialization order for fields. Today, these | |
| are mapped to instance or static methods on the generated ES6 class. | |
| - *Private members*. Dart maps private members (e.g., private fields or | |
| methods) to ES6 symbols. For example, `a._x` may map to `a[_x]` where `_x` is | |
| a symbol only defined in the scope of the generated library. | |
| - *Scoping*. Dart scoping rules and reserved words are slightly different than | |
| JavaScript. While we try to preserve names wherever possible, in certain | |
| cases, we are required to rename. | |
| In general, the current conventions (i.e., the Application Binary Interface or | |
| ABI in compiler terminology) should not be considered stable. We reserve the | |
| right to change these in the future. | |
| # Browser support | |
| DDC currently supports Chrome stable (though users have had success running on | |
| FireFox and Safari). |