Recently I found such cool thing as Google Closure Compiler. Are there alternatives which provide opportunities to get benefits of compiled statically-typed languages?
Update
It is not about real compilers, it is about JavaScript-JavaScript translators, which provide types verification etc, optimization, and maybe compression.
From your comment:
I am interested in type checking, interface checking, private fields checking etc, all things allows you to write safety code, not only minimizer.
JavaScript is a dynamically-typed language that does not have built-in support for classes, interfaces, or access modifiers. Closure Compiler supports various extralinguistic features such as interfaces and access modifiers by using information embedded in JSDoc comments. Several IDEs also provide static analysis using JSDoc tag information, for example, see WebStorm & PhpStorm Blog: New in 5.0: Google Closure Compiler JSDoc annotations.
In the area of JavaScript minifiers there are numerous options such as YUI Compressor, UglifyJS, dojo shrinksafe, Microsoft Ajax Minifier, and JSMIN. However, none of these tools provide the same level of support for JSDoc-based analysis as Closure Compiler.
Related stack overflow questions:
Closure compiler (Google) is a true compiler for javascript. Alternatives include typescript (Microsoft) and Flow (facebook). Closure compiler uses jsdoc comments to annotate types. Typescript uses a different syntax than es3/es5 to provide type annotations that compiles to plain javascript. Flow piggybacks onto the OCaml language (which excels in type inference) to infer as much type information as possible, but can consume annotations in a comment syntax as well. Closure compiler is also working on better type inference, but it is not ready for production.
In response to @EASI: The closure compiler is a true compiler, not just a minifier. It works by:
Parsing a set of input .js files and a set of extern files (that defined interfaces for ecma 3,5,6 and common browser objects like Window, etc) into an abstract syntax tree (AST).
Running a series of compiler passes over the AST to rewrite, transform, eliminate dead code etc.
Emit the AST back into js source code. It will either concatenate the files back together with comments stripped out (WHITESPACE_ONLY), rename and minify symbols within function definitions (SIMPLE), or rename and rewrite all symbols into a minified and obfuscated form (ADVANCED).
Here's a list of compiler passes, for those that are interested. As you can see, there is a lot going on:
    AliasExternals.java
    AliasStrings.java
    AmbiguateProperties.java
    AnalyzeNameReferences.java
    AnalyzePrototypeProperties.java
    AstValidator.java
    CallGraph.java
    ChainCalls.java
    CheckConformance.java
    CheckDebuggerStatement.java
    CheckEventfulObjectDisposal.java
    CheckGlobalNames.java
    CheckMissingGetCssName.java
    CheckRegExp.java
    CheckSideEffects.java
    ClosureCodeRemoval.java
    ClosureOptimizePrimitives.java
    CollapseAnonymousFunctions.java
    CollapseProperties.java
    CollapseVariableDeclarations.java
    ConstCheck.java
    ConstParamCheck.java
    ConvertDeclaredTypesToJSDoc.java
    ConvertToDottedProperties.java
    ConvertToTypedES6.java
    CoverageInstrumentationPass.java
    CreateSyntheticBlocks.java
    CrossModuleCodeMotion.java
    CrossModuleMethodMotion.java
    DeclaredGlobalExternsOnWindow.java
    DefaultPassConfig.java
    Denormalize.java
    DisambiguateProperties.java
    ErrorPass.java
    Es6ToEs3ClassSideInheritance.java
    ExpandJqueryAliases.java
    ExportTestFunctions.java
    ExternExportsPass.java
    ExtractPrototypeMemberDeclarations.java
    FlowSensitiveInlineVariables.java
    FunctionNames.java
    FunctionRewriter.java
    GatherExternProperties.java
    GatherRawExports.java
    GenerateExports.java
    GlobalNamespace.java
    GlobalTypeInfo.java
    GroupVariableDeclarations.java
    ImplicitNullabilityCheck.java
    InferConsts.java
    InjectEs6RuntimeLibrary.java
    InlineFunctions.java
    InlineObjectLiterals.java
    InlineProperties.java
    InlineVariables.java
    InstrumentFunctions.java
    JsMessageVisitor.java
    MarkNoSideEffectCalls.java
    MethodCompilerPass.java
    MinimizeExitPoints.java
    NameAnalyzer.java
    NameAnonymousFunctions.java
    NameAnonymousFunctionsMapped.java
    NameReferenceGraphConstruction.java
    NewTypeInference.java
    Normalize.java
    ObjectPropertyStringPostprocess.java
    ObjectPropertyStringPreprocess.java
    OptimizeArgumentsArray.java
    OptimizeCalls.java
    OptimizeParameters.java
    PeepholeOptimizationsPass.java
    PhaseOptimizer.java
    PrepareAst.java
    ProcessCommonJSModules.java
    ProcessDefines.java
    ProcessTweaks.java
    PureFunctionIdentifier.java
    RecordFunctionInformation.java
    RemoveUnusedClassProperties.java
    RemoveUnusedNames.java
    RemoveUnusedPrototypeProperties.java
    RemoveUnusedVars.java
    RenameLabels.java
    RenameProperties.java
    RenamePrototypes.java
    RenameVars.java
    ReplaceCssNames.java
    ReplaceIdGenerators.java
    ReplaceStrings.java
    RescopeGlobalSymbols.java
    RuntimeTypeCheck.java
    SanityCheck.java
    ShadowVariables.java
    SideEffectsAnalysis.java
    SimpleDefinitionFinder.java
    StrictModeCheck.java
    StripCode.java
    SymbolTable.java
    TransformAMDToCJSModule.java
    TypeInferencePass.java
    TypedScopeCreator.java
    UnreachableCodeElimination.java
    VariableVisibilityAnalysis.java
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With