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