11

最近我发现了Google Closure Compiler这样很酷的东西。是否有替代方案可以提供从编译的静态类型语言中获益的机会?

更新

它不是关于真正的编译器,而是关于 JavaScript-JavaScript 翻译器,它提供类型验证等、优化,也许还有压缩。

4

4 回答 4

6

从您的评论中:

我对类型检查、接口检查、私有字段检查等感兴趣,所有东西都可以让你编写安全代码,而不仅仅是最小化程序。

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

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

相关堆栈溢出问题:

  1. 哪个 Javascript minifier (cruncher) 与 Google 用于其 JS API 的功能相同?
  2. 生产代码有哪些好的 css 和 js 最小化器?
  3. JavaScript 的类型检查器?
  4. 有没有好的 JavaScript 最小化器?
  5. JavaScript 和 CSS 最小化器
  6. JavaScript 压缩
  7. JavaScript 静态类型检查的当前状态是什么?
于 2012-09-03T01:32:04.863 回答
2

Closure compiler (Google) 是一个真正的 javascript 编译器。替代方案包括 typescript (Microsoft) 和 Flow (facebook)。闭包编译器使用 jsdoc 注释来注释类型。Typescript 使用与 es3/es5 不同的语法来提供编译为纯 javascript 的类型注释。Flow 搭载 OCaml 语言(擅长类型推断)以推断尽可能多的类型信息,但也可以使用注释语法中的注释。闭包编译器也在致力于更好的类型推断,但它还没有准备好投入生产。

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

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

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

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

这是编译器通行证的列表,供感兴趣的人使用。如您所见,发生了很多事情:

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

于 2015-04-07T18:51:00.933 回答
0

是的,

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


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


新的:

您是否尝试过在专门的 IDE 中编写 JavaScript 代码?如果您正在寻找类型检查,您可以尝试以下方法之一:

  • NuSphere PhpED Professional v7(最佳)
  • phpDesigner 8
  • 阿普塔纳工作室
  • 禅德工作室
  • DreamWeaver CS6

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

于 2012-09-03T01:05:14.757 回答
0

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

于 2015-04-02T21:05:19.640 回答