11

最近我发现了这么酷的东西,如Google Closure Compiler。是否有替代方案提供机会来获得编译的静态类型语言的好处?JavaScript“编译器”

更新

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

+3

所谓的JavaScript编译器都比较喜欢的Javascript优化。 该代码仍然需要由浏览器的JavaScript引擎执行,所以它仍然必须是有效的JS。他们所能做的一切就是缩短所有标识符并删除空格来减小文件大小,并可能对JS层做一些小的优化,但它们永远无法达到编译语言的执行速度。 – Philipp

+0

@ Philipp所以你说编译语言的执行速度比JS快?我一直认为这是相反的方式(特别是用我的电脑)...... – 0x499602D2

+0

“编译静态类型语言的好处”是什么意思?你的意思是你想编写**编译成JavaScript的C风格代码(如[dart](http://www.dartlang.org/))?正如Phillip指出的,优化不是**编译**。无论你发现什么,你仍然在运行JavaScript。 –

回答

0

是,

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


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


新:

你有没有tryed使你的JavaScript代码在一个专门的IDE? 如果你正在寻找的类型cheking,你可以尝试以下操作之一:

  • NuSphere的PhpED专业V7(最好)
  • phpDesigner 8
  • 的Aptana Studio的
  • Zend Studio的
  • DreamWeaver中CS6

现在他们对PHP有更强大的支持,不仅对于PHP,对于JavaScript来说,还有Code Auto-Complete,Type Verification ,动态语法高亮显示,多语言语法高亮显示和面向对象分析以及自动完成。

+5

Closure编译器在基本模式下充当“最小化器”,但在高级模式下,它真的非常像真正的编译器,但恰好具有JavaScript,而不是字节码或机器代码作为其目标语言。不仅有窥视片优化器,还有代码路径/可达性分析,函数内联以及所有您希望优化编译器要做的事情。 –

+0

@SperanskyDanil,试试http://fmarcia.info/jsmin/test.html – PSyLoCKe

+1

@CharlesDuffy,GCC是最先进的编程技术。这就像一些机器人阅读你的软件,然后重建它5倍。这就是谷歌如何使Gmail成为一个伟大的Web 2.0服务。 – PSyLoCKe

5

从您的评论:

我感兴趣的类型检查,检查接口,私人领域的检查等等,所有的东西让你写代码的安全,不仅极小。

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

在JavaScript minifiers领域有许多选项,如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?
2

闭合编译器(Google)是一个真正的JavaScript编译器。替代品包括打字稿(微软)和流量(脸书)。 Closure编译器使用jsdoc注释来注释类型。 Typescript使用与es3/es5不同的语法来提供编译为纯javascript的类型注释。流向OCaml语言(在类型推断方面很出色),可以推断尽可能多的类型信息,但也可以在注释语法中使用注释。 Closure编译器也在处理更好的类型推断,但尚未准备好进行生产。

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

  1. 解析一组输入.js文件和一组的extern文件(ECMA 3,5,6和普通浏览器定义的接口对象,如窗口等)到抽象语法树(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

+0

我可能会分裂头发(俗话说),但我认为你列出的第三项几乎使你的论点无效。编译器通常采用人类可读的语言并将其转换为机器码。当Closure“Compiler”将其所有工作转换回JavaScript时,是不是只会在普通JavaScript引擎上运行新代码?我并不是说闭包“编译器”所做的并不是广泛而且非常接近常规编译器所做的同样的事情,但最终它只是重构JavaScript,而不是“编译”它。 – Quantium