JavaScript“编译器”

时间:2012-09-03 00:47:40

标签: javascript optimization compiler-construction compression google-closure-compiler

最近我发现Google Closure Compiler这么酷。有没有其他方法可以获得编译的静态类型语言的好处?

更新

它不是关于真正的编译器,而是关于JavaScript-JavaScript转换器,它提供类型验证等,优化和压缩。

4 个答案:

答案 0 :(得分:6)

来自你的评论:

  

我对类型检查,界面检查,私人字段检查等感兴趣,所有东西都允许你编写安全代码,而不仅仅是最小化。

JavaScript是一种动态类型语言,没有对类,接口或访问修饰符的内置支持。 Closure Compiler通过使用JSDoc注释中嵌入的信息来支持各种语言特性,例如接口和访问修饰符。一些IDE还使用JSDoc标签信息提供静态分析,例如,参见 WebStorm& PhpStorm博客:New in 5.0: Google Closure Compiler JSDoc annotations

在JavaScript缩小器区域中,有许多选项,例如YUI CompressorUglifyJSdojo shrinksafeMicrosoft Ajax MinifierJSMIN。但是,这些工具都没有像Closure Compiler那样为基于JSDoc的分析提供相同级别的支持。

相关的堆栈溢出问题:

  1. Which Javascript minifier (cruncher) does the same things that the one Google uses for its JS APIs?
  2. What are some good css and js minimizers for production code?
  3. Type checker for JavaScript?
  4. Is there a good JavaScript minimizer?
  5. JavaScript and CSS minimizer
  6. JavaScript compression
  7. What is the current state of JavaScript static type checking?

答案 1 :(得分:2)

Closure编译器(Google)是一个真正的javascript编译器。替代品包括打字稿(Microsoft)和Flow(facebook)。 Closure编译器使用jsdoc注释来注释类型。 Typescript使用与es3 / es5不同的语法来提供编译为纯JavaScript的类型注释。 Flow捎带到OCaml语言(在类型推断方面表现优异)以推断尽可能多的类型信息,但也可以在注释语法中使用注释。 Closure编译器也在进行更好的类型推断,但还没有为生产做好准备。

响应@EASI:闭包编译器是一个真正的编译器,而不仅仅是一个缩小器。它的工作原理是:

  1. 将一组输入.js文件和一组extern文件(定义了ecma 3,5,6的接口和常见的浏览器对象,如Window等)解析为抽象语法树(AST)。 / p>

  2. 通过AST运行一系列编译器来重写,转换,消除死代码等。

  3. 将AST发回js源代码。它将文件重新连接在一起并删除注释(WHITESPACE_ONLY),重命名和缩小函数定义中的符号(SIMPLE),或者将所有符号重命名并重写为缩小和混淆的形式(ADVANCED)。

  4. 以下是感兴趣的编译器传递列表。正如您所看到的,有很多事情要发生:

    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

答案 2 :(得分:0)

是,

有Java,JS,PHP,CSS和HTML“ minifiers ”。 例如,当您使用Google GWT Java进行编程时,代码将作为JS的最小化生成。


他们使用术语编译器,但它不正确。编译器将一个人类可读的语言代码转换为只有解释器或机器才能读取的目标代码。这个谷歌工具的作用是优化你的代码,以便解释器可以更快地读取它。脚本语言需要执行解释器。编译成机器语言的程序执行速度比任何解释器都快。但当然,任何程序速度都取决于它的执行流程项目和开发团队的经验。


您是否尝试在专用IDE中制作JavaScript代码? 如果您正在寻找类型检查,您可以尝试其中一种:

  • NuSphere PhpED Professional v7(最佳)
  • phpDesigner 8
  • Aptana Studio
  • Zend Studio
  • DreamWeaver CS6

现在,他们不仅支持PHP,而且支持JavaScript,支持代码自动完成,类型验证,动态语法突出显示,多语言语法突出显示和面向对象分析以及键入时自动完成。

答案 3 :(得分:0)

我认为furiascript.com可能是一个有趣的选择。