11

Recentemente ho trovato qualcosa di interessante come Google Closure Compiler. Esistono alternative che offrono l'opportunità di ottenere vantaggi dalle lingue compilate in modo statico?JavaScript "compilers"

Aggiornamento

Non si tratta di veri e propri compilatori, si tratta di traduttori JavaScript JavaScript, che forniscono i tipi di verifica, ecc, l'ottimizzazione, e forse la compressione.

+3

I cosiddetti compilatori Javascript sono più come ottimizzatori Javascript. Il codice deve ancora essere eseguito dal motore Javascript del browser, quindi deve essere ancora JS valido. Tutto ciò che possono fare è abbreviare tutti gli identificatori e rimuovere gli spazi bianchi per ridurre la dimensione del file e magari fare alcune ottimizzazioni minori sul livello JS, ma non possono mai raggiungere la velocità di esecuzione di un linguaggio compilato. – Philipp

+0

@Philipp Quindi stai dicendo che la velocità di esecuzione delle lingue compilate è più veloce di JS? Ho sempre pensato che fosse il contrario (specialmente con il mio computer) ... – 0x499602D2

+0

Cosa intendi per "vantaggi delle lingue compilate in modo statico"? Vuoi dire che vuoi scrivere un codice in stile C che ** compili ** in JavaScript (come [dart] (http://www.dartlang.org/))? Come sottolinea Phillip, l'ottimizzazione non è ** compilazione **. Non importa cosa trovi, stai ancora utilizzando JavaScript. –

risposta

0

Sì,

ci sono Java, JS, PHP, CSS e HTML "minifiers". Ad esempio, quando si utilizza Google GWT Java per la programmazione, il codice viene generato come una riduzione minima di JS.


Utilizzano il termine compilatore, ma non è corretto. I compilatori trasformano un codice lingua leggibile in un codice oggetto che solo gli interpreti o le macchine possono leggere. Ciò che questo strumento di Google fa è ottimizzare il tuo codice in modo che possa essere letto più velocemente dall'interprete. I linguaggi di script richiedono l'esecuzione di interpreti. I programmi compilati nel linguaggio macchina sono eseguiti più velocemente di quanto potrebbe fare qualsiasi interprete. Ma ovviamente qualsiasi velocità del programma dipende dal suo progetto di flusso di esecuzione e dall'esperienza del team di sviluppo.


Nuovo:

Avete provato a fare i vostri codici JavaScript in un IDE specializzato? Se siete alla ricerca di tipo cheking, si potrebbe provare uno di questi:

  • NuSphere PhpED professionale v7 (migliore)
  • phpDesigner 8
  • Aptana Studio
  • Zend Studio
  • Dreamweaver CS6

Hanno un supporto maggiore ora, non solo per PHP, ma per JavaScript, con codice Auto-Completo, Tipo Verifica , Evidenziazione sintassi dinamica, sintassi della lingua multipla Evidenziazione e analisi degli oggetti orientati e completamento automatico durante la digitazione.

+5

Il Closure Compiler agisce come un "minimizzatore" in modalità base, ma in modalità avanzata agisce davvero molto come un vero compilatore, ma che ha JavaScript, piuttosto che bytecode o codice macchina come lingua di destinazione. Non c'è solo un ottimizzatore di spioncino, ma un'analisi di codepath/raggiungibilità, la funzione di inlining e tutte le altre cose che ci si aspetta da un buon compilatore di ottimizzazione. –

+0

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

+1

@CharlesDuffy, GCC è lo stato dell'arte della programmazione. È come un robot che legge il tuo software e poi lo ricostruisce 5 volte meglio. È come Google rende Gmail un ottimo servizio Web 2.0. – PSyLoCKe

5

Dal tuo commento:

Sono interessato a controllo di tipo, il controllo di interfaccia, campi privati ​​di controllo, ecc, tutte le cose consente di scrivere il codice di sicurezza, non solo minimizer.

JavaScript è un linguaggio di tipo dinamico che non dispone di supporto incorporato per classi, interfacce o modificatori di accesso. Closure Compiler supporta varie funzionalità extralinguistiche quali interfacce e modificatori di accesso utilizzando le informazioni incorporate nei commenti JSDoc. Diversi IDE forniscono anche analisi statiche utilizzando le informazioni sui tag JSDoc, ad esempio, vedere WebStorm & Blog di PhpStorm: New in 5.0: Google Closure Compiler JSDoc annotations.

Nella zona di minifiers JavaScript ci sono numerose opzioni come YUI Compressor, UglifyJS, dojo shrinksafe, Microsoft Ajax Minifier e JSMIN. Tuttavia, nessuno di questi strumenti fornisce lo stesso livello di supporto per l'analisi basata su JSDoc come Closure Compiler.

domande di overflow dello stack correlati:

  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

Il compilatore di chiusura (Google) è un vero compilatore per javascript. Le alternative includono typescript (Microsoft) e Flow (facebook). Il compilatore di chiusura utilizza i commenti jsdoc per annotare i tipi. Il dattiloscritto usa una sintassi diversa da es3/es5 per fornire annotazioni di tipo che compaiono in plain javascript. Portate i piggyback sul linguaggio OCaml (che eccelle nell'inferenza di tipo) per dedurre quante più informazioni sul tipo possibile, ma possono anche utilizzare annotazioni in una sintassi dei commenti. Anche il compilatore di chiusura sta lavorando su un'inferenza di tipo migliore, ma non è pronta per la produzione.

In risposta a @EASI: il compilatore di chiusura è un vero compilatore, non solo un minificatore. Funziona:

  1. l'analisi di una serie di file di input .js e una serie di file esterni drives (che interfacce definite per ECMA 3,5,6 e comune browser oggetti come finestre, ecc) in un albero di sintassi astratta (AST).

  2. Esecuzione di una serie di compilatore passa sopra l'AST di riscrivere, trasformare, eliminare il codice morto ecc

  3. emettono le AST indietro nel codice sorgente js. Riesce a concatenare i file insieme ai commenti eliminati (WHITESPACE_ONLY), rinominare e minimizzare i simboli all'interno delle definizioni di funzione (SEMPLICE), o rinominare e riscrivere tutti i simboli in una forma miniata e offuscata (AVANZATO).

Ecco un elenco di passaggi del compilatore, per quelli che sono interessati. Come potete vedere, c'è un sacco di cose:

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

Forse sto dividendo i capelli (come dice il proverbio), ma penso che il terzo elemento che hai elencato praticamente annulli la tua argomentazione. Un compilatore generalmente accetta un linguaggio leggibile dall'uomo e lo converte in codice macchina. Quando il "compilatore" di chiusura converte tutti i suoi lavori in JavaScript, non è che il nuovo codice verrà eseguito su un normale motore JavaScript? Non sto dicendo che ciò che il "compilatore" di chiusura sta facendo non è esteso e molto vicino alla stessa cosa che fa un compilatore regolare, ma alla fine si tratta solo di ristrutturare JavaScript, non di "compilarlo". – Quantium