11

Recientemente he encontrado algo tan genial como Google Closure Compiler. ¿Hay alternativas que brinden oportunidades para obtener beneficios de los lenguajes compilados de tipo estático?JavaScript "compiladores"

actualización

No se trata de compiladores reales, se trata de traductores para JavaScript JavaScript, que proporcionan tipos de verificación, etc, optimización, y tal vez la compresión.

+3

Los llamados compiladores Javascript se parecen más a los optimizadores de Javascript. El código aún debe ser ejecutado por el motor de Javascript del navegador, por lo que todavía tiene que ser JS válido. Todo lo que pueden hacer es acortar todos los identificadores y eliminar los espacios en blanco para reducir el tamaño del archivo y tal vez hacer algunas optimizaciones menores en la capa JS, pero nunca pueden alcanzar la velocidad de ejecución de un lenguaje compilado. – Philipp

+0

@Philipp ¿Entonces está diciendo que la velocidad de ejecución de los lenguajes compilados es más rápida que JS? Siempre pensé que era al revés (especialmente con mi computadora) ... – 0x499602D2

+0

¿Qué quiere decir con 'beneficios de los lenguajes compilados estáticos'? ¿Quiere decir que quiere escribir código de estilo C que ** compila ** en JavaScript (como [dart] (http://www.dartlang.org/))? Como apunta Phillip, la optimización no es ** compilación **. No importa lo que encuentre, todavía está ejecutando JavaScript. –

Respuesta

0

Sí,

Hay Java, JS, PHP, CSS y HTML "minifiers". Por ejemplo, cuando utiliza Google GWT Java para programación, el código se genera como una minimización de JS.


Utilizan el término compilador, pero no es correcto. Los compiladores convierten un código de lenguaje legible para el ser humano en un código objeto que solo los intérpretes o las máquinas pueden leer. Lo que esta herramienta de Google hace es optimizar su código para que el intérprete pueda leerlo más rápido. Los lenguajes de script necesitan intérpretes para ser ejecutados. Los programas compilados en lenguaje de máquina se ejecutan más rápido que cualquier intérprete. Pero, por supuesto, cualquier velocidad del programa depende de su proyecto de flujo de ejecución y de la experiencia del equipo en desarrollo.


Nuevo:

¿Ha probado a lo que sus códigos de JavaScript en un IDE especializado? Si usted está buscando un tipo cheking, puede probar uno de estos:

  • NuSphere PhpED Profesional v7 (mejor)
  • phpDesigner 8
  • Aptana Studio
  • Zend Studio
  • Dreamweaver CS6

Tienen un mayor soporte ahora, no solo para PHP, sino para JavaScript, con Code Auto-Complete, Type Verification , Resaltado de sintaxis dinámica, Resaltado de sintaxis de múltiples idiomas y Análisis de objetos orientado y Autocompletar mientras escribe.

+5

El Compilador de Cierre actúa como un "minimizador" en el modo básico, pero en el modo avanzado realmente _se_ actúa de manera muy similar a un compilador genuino, pero que tiene JavaScript, en lugar de código de bytes o máquina como su idioma de destino. No solo se trata de un optimizador de mirilla, sino también de un análisis de ruta de acceso/lectura, función en línea y todas las demás cosas que se espera que haga un buen compilador de optimización. –

+0

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

+1

@CharlesDuffy, GCC es la programación más avanzada. Es como un robot que lee tu software y luego lo reconstruye 5 veces mejor. Es la forma en que Google convierte a Gmail en un excelente servicio Web 2.0. – PSyLoCKe

5

Desde su comentario:

Estoy interesado en la comprobación de tipos, la comprobación de interfaz, los campos privados de cheques, etc, todas las cosas le permite escribir código de seguridad, no sólo minimizador.

JavaScript es un lenguaje de tipado dinámico que no tiene soporte integrado para clases, interfaces o modificadores de acceso. Closure Compiler admite varias funciones extralingüísticas, como interfaces y modificadores de acceso, mediante el uso de información incorporada en los comentarios de JSDoc. Varios IDEs también proporcionan análisis estático usando la información de la etiqueta JSDoc, por ejemplo, consulte WebStorm & Blog de PhpStorm: New in 5.0: Google Closure Compiler JSDoc annotations.

En el área de minifiers JavaScript Existen numerosas opciones tales como YUI Compressor, UglifyJS, dojo shrinksafe, Microsoft Ajax Minifier y JSMIN. Sin embargo, ninguna de estas herramientas proporciona el mismo nivel de compatibilidad con el análisis basado en JSDoc que Closure Compiler.

relacionadas preguntas de desbordamiento de pila:

  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

El compilador de cierre (Google) es un compilador real para javascript. Las alternativas incluyen mecanografiado (Microsoft) y Flow (facebook). El compilador de cierre utiliza comentarios jsdoc para anotar tipos. Typescript utiliza una sintaxis diferente a es3/es5 para proporcionar anotaciones de tipo que se compilan en javascript. Fluya a cuestas en el lenguaje OCaml (que sobresale en la inferencia de tipo) para inferir tanta información de tipo como sea posible, pero también puede consumir anotaciones en una sintaxis de comentario. El compilador de cierre también está trabajando en una mejor inferencia de tipo, pero no está listo para la producción.

En respuesta a @EASI: El compilador de cierre es un compilador verdadero, no solo un minificador. Su acción consiste en:

  1. análisis de un conjunto de archivos de entrada .js y un conjunto de archivos (extern que las interfaces definidas para ecma 3,5,6 y el navegador de objetos comunes como Windows, etc.) en un árbol de sintaxis abstracta (AST)

  2. La ejecución de una serie de compilador pasa por encima de la AST volver a escribir, transformar, eliminar el código muerto etc.

  3. emitir la AST de nuevo en código fuente js. Concatenará los archivos junto con los comentarios eliminados (WHITESPACE_ONLY), cambiará el nombre y minificará los símbolos dentro de las definiciones de funciones (SIMPLE), o cambiará el nombre y reescribirá todos los símbolos en una forma minimizada y ofuscada (AVANZADO).

Aquí hay una lista de pases de compilación, para aquellos que estén interesados. Como se puede ver, hay mucho que hacer:

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

Es posible que esté dividiendo los pelos (como dice el refrán), pero creo que el tercer elemento que enumeró prácticamente anula su argumento. Un compilador generalmente toma un lenguaje legible por humanos y lo convierte en código de máquina. Cuando el "Compilador" de Cierre convierte todo su trabajo en JavaScript, ¿no se ejecutará ese código nuevo en un motor de JavaScript normal? No estoy diciendo que lo que está haciendo el "Compilador" de Cierre no es extenso y muy parecido a lo que hace un compilador común, pero al final solo está reestructurando JavaScript, no 'compilándolo'. – Quantium

Cuestiones relacionadas