javascript - change - page title angular 4
¿Qué "compila" el compilador angular? (6)
La mecanografía transpira a JS. Luego está el movimiento de los árboles, "menos" (opcional) y qué más en el proceso de implementación. Pero nada de eso (afaik) tiene algo que ver con "compilar". Todo se agrupa y se optimiza mucho, pero en realidad no se compila, ¿verdad?
La compilación significa transformar un programa escrito en un lenguaje A en un programa semánticamente equivalente escrito en el lenguaje B de manera que evaluar el programa compilado de acuerdo con las reglas del lenguaje B (por ejemplo, interpretarlo con un intérprete para B ) arroje el mismo resultado y tenga el los mismos efectos secundarios que evaluar el programa original de acuerdo con las reglas del lenguaje A (por ejemplo, interpretarlo con un intérprete para A ).
La compilación simplemente significa traducir un programa del lenguaje A al lenguaje B. Eso es todo lo que significa. (Tenga en cuenta también que es perfectamente posible que A y B sean el mismo idioma).
En algunos casos, tenemos nombres más especializados para ciertos tipos de compiladores, dependiendo de qué son A y B , y qué hace el compilador:
- si A se percibe como lenguaje ensamblador y B se percibe como lenguaje máquina, entonces lo llamamos ensamblador ,
- si A se percibe como lenguaje de máquina y B se percibe como lenguaje ensamblador, entonces lo llamamos desensamblador ,
- si se percibe que A es de nivel inferior a B , entonces lo llamamos descompilador ,
- si A y B son el mismo idioma, y el programa resultante es de alguna manera más rápido o más ligero, entonces lo llamamos optimizador ,
- si A y B son los mismos idiomas, y el programa resultante es más pequeño, entonces lo llamamos minificador ,
- si A y B son los mismos idiomas, y el programa resultante es menos legible, entonces lo llamamos ofuscador ,
- Si se percibe que A y B tienen aproximadamente el mismo nivel de abstracción, entonces lo llamamos transpilador , y
- si se percibe que A y B tienen aproximadamente el mismo nivel de abstracción y el programa resultante conserva el formato, los comentarios y la intención del programador de modo que sea posible mantener el programa resultante de la misma manera que el programa original, entonces llamamos Es una herramienta de reingeniería .
Además, tenga en cuenta que las fuentes más antiguas pueden usar los términos "traducción" y "traductor" en lugar de "compilación" y "compilador". Por ejemplo, C habla de "unidades de traducción".
También puede tropezar con el término "procesador de idiomas". Esto puede significar un compilador, un intérprete o ambos compiladores e intérpretes, según la definición.
Javascript en sí mismo todavía se interpreta, ¿verdad?
JavaScript es un lenguaje. Los idiomas son un conjunto de reglas y restricciones lógicas. Los idiomas no se interpretan ni se compilan. Los idiomas simplemente son .
La compilación y la interpretación son rasgos de un compilador o intérprete (¡duh!). Cada idioma puede implementarse con un compilador y cada idioma puede implementarse con un intérprete. Muchos idiomas tienen compiladores e intérpretes. Muchos motores de ejecución modernos de alto rendimiento tienen al menos un compilador y al menos un intérprete.
Estos dos términos pertenecen a diferentes capas de abstracción. Si el inglés fuera un idioma escrito, "lenguaje interpretado" sería un error de tipo.
Tenga en cuenta también que algunos idiomas no tienen intérprete ni compilador. Hay idiomas que no tienen implementación en absoluto. Aún así, son idiomas, y puedes escribir programas en ellos. Simplemente no puedes ejecutarlos.
Además, tenga en cuenta que todo se interpreta en algún momento : si desea ejecutar algo, debe interpretarlo. La compilación solo traduce el código de un idioma a otro. No lo ejecuta. La interpretación lo ejecuta. (A veces, cuando se implementa un intérprete en hardware, lo llamamos "CPU", pero sigue siendo un intérprete).
Caso en cuestión: cada implementación de JavaScript convencional actualmente existente tiene un compilador.
V8 comenzó como un compilador puro: compiló JavaScript directamente a un código de máquina nativo moderadamente optimizado. Más tarde, se agregó un segundo compilador. Ahora, hay dos compiladores: un compilador liviano que produce código moderadamente optimizado pero el compilador en sí mismo es muy rápido y usa poca RAM. Este compilador también inyecta código de creación de perfiles en el código compilado. El segundo compilador es un compilador más pesado, más lento y más costoso, que, sin embargo, produce un código mucho más estricto y mucho más rápido. También utiliza los resultados del código de creación de perfiles inyectado por el primer compilador para tomar decisiones de optimización dinámica. Además, la decisión de qué código volver a compilar utilizando el segundo compilador se toma en función de esa información de perfil. Tenga en cuenta que en ningún momento hay un intérprete involucrado. V8 nunca interpreta, siempre compila. Ni siquiera contiene un intérprete. (En realidad, creo que hoy en día lo hace, estoy describiendo las dos primeras iteraciones).
SpiderMonkey compila JavaScript en el código de bytes de SpiderMonkey, que luego interpreta. El intérprete también perfila el código, y luego el código que se ejecuta con mayor frecuencia es compilado por un compilador en código máquina nativo. Entonces, SpiderMonkey contiene dos compiladores: uno desde JavaScript hasta el código de bytes de SpiderMonkey, y otro desde el código de bytes de SpiderMonkey hasta el código de máquina nativo.
Casi todos los motores de ejecución de JavaScript (con la excepción de V8) siguen este modelo de un compilador AOT que compila JavaScript para bytecode, y un motor de modo mixto que alterna entre interpretar y compilar ese bytecode.
Escribiste en un comentario:
Realmente estaba pensando que el código de máquina está involucrado en algún lugar.
¿Qué significa "código máquina"?
¿Qué es el lenguaje de máquina de un hombre es el lenguaje intermedio de otro hombre y viceversa? Por ejemplo, hay CPU que pueden ejecutar de forma nativa el código de bytes JVM, en tal CPU, el código de bytes JVM es código de máquina nativo. Y hay intérpretes para el código de máquina x86, cuando ejecuta ese código de máquina x86 se interpreta bytecode.
Hay un intérprete x86 llamado JPC escrito en Java. Si ejecuto el código de máquina x86 en JPC que se ejecuta en una CPU JVM nativa ... ¿cuál es el código de bytes y cuál es el código nativo? Si compilo el código de máquina x86 a JavaScript (sí, hay herramientas que pueden hacer eso) y lo ejecuto en un navegador en mi teléfono (que tiene una CPU ARM), ¿cuál es el código de bytes y cuál es el código de máquina nativo? ¿Qué sucede si el programa que estoy compilando es un emulador SPARC y lo uso para ejecutar el código SPARC?
Tenga en cuenta que cada lenguaje induce una máquina abstracta, y es lenguaje de máquina para esa máquina. Por lo tanto, cada idioma (incluidos los idiomas de muy alto nivel) es un código de máquina nativo. Además, puede escribir un intérprete para cada idioma. Por lo tanto, cada idioma (incluido el código de máquina x86) no es nativo.
Me lo pidieron hoy y no pude dar una respuesta adecuada.
La mecanografía se transpila a JS. Luego está el movimiento de los árboles, "menos" (opcional) y qué más en el proceso de implementación. Pero nada de eso (afaik) tiene algo que ver con "compilar". Todo se agrupa y se optimiza mucho, pero en realidad no se compila, ¿verdad?
Incluso hay un compilador anticipado, que realmente hace un trabajo notable. ¿Qué extraño?
Javascript en sí mismo todavía está interpretado, ¿verdad?
CONSEJOS PARA TODOS: ¡Siempre siempre COMIENCE las respuestas (e investigue) con DEFINICIONES! DICCIONARIO MERRIAM-WEBSTER ... Compile: verbo computadoras: "para cambiar (instrucciones de programación de computadoras) en una forma que la computadora pueda entender y usar"
WIKIPEDIA ... Un compilador es un software de computadora que transforma el código de computadora escrito en un lenguaje de programación (el idioma de origen) en otro lenguaje de programación (el idioma de destino). Los compiladores son un tipo de traductor que admite dispositivos digitales, principalmente computadoras. El compilador de nombres se utiliza principalmente para programas que traducen el código fuente de un lenguaje de programación de alto nivel a un lenguaje de nivel inferior (por ejemplo, lenguaje ensamblador, código objeto o código máquina) para crear un programa ejecutable. [1]
DISCUSIÓN: El diccionario Webster debe considerarse la máxima autoridad aquí, sin embargo, su definición es frustrantemente vaga.
Wikipedia es de hecho una fuente autorizada de facto también. Si en este caso consideramos que su explicación es la autoridad superior, entonces se sale de su camino (por lo general) para ofrecer algunas ideas realmente útiles, particularmente las siguientes:
- Compilar en su sentido más estricto significaba "la traducción del código de programación DESDE un lenguaje que NO era directamente ejecutable por una computadora en código que era directamente ejecutable por una computadora ".
- SI aceptamos lo anterior como la definición GENUINA de "compilar" ... SI todo lo que sucede en Angular es la "traducción" de Typecript a Javascript ... SI el código Javascript todavía requiere "Interpretación" en bytecode ... Si bytecode es luego interpretado por node.js en código ejecutable por la computadora ... LUEGO lo que Angular está haciendo NO SE "COMPILA" en el sentido más verdadero. Período.
Eso dijo ...
- SI atenuamos nuestra definición de "compilar" para que simplemente signifique "traducir el código de programación de un lenguaje de nivel superior a un lenguaje de nivel inferior " ... SI aceptamos que el mecanografiado ES (en numerosas formas) lenguaje de "nivel superior" que Javascript ... ENTONCES lo que hace Angular (traducir el mecanografiado a Javascript) ES "compilar" ...
Eso dijo ...
-
SI presentamos algunos TIPOS nuevos de compilación (según Wikipedia):
- Compilación: traducción de código de un lenguaje de nivel superior a uno de nivel inferior;
- Transpiling: traducción de código entre lenguajes esencialmente "equivalentes"; y
- Descompilación: traducir código de un lenguaje de nivel inferior a uno de nivel superior; ENTONCES, si las "compilaciones" o las "transpilaciones" angulares dependen de si acepta o no la afirmación de que Typecript es (aunque sea ligeramente) un lenguaje de nivel "superior" que Javascript.
¿Yo? a. Prefiero que la "definición de trabajo" de compilación sea "traducir de mayor a menor"; (es más generalizado y deja espacio para la evolución de la definición) b. De hecho, también considero TypeScript un lenguaje posiblemente de "nivel superior" que Javascript; SO c. Estoy de acuerdo con Angular afirmando que está "compilando"
LA ALTERNATIVA NO ES DESEABLE: SI exigimos "compilar" debe significar "traducir al código ''ejecutable''"; SI aceptamos que Typecript ES "superior" que Javascript; ENTONCES Angular NO "compila": - | pero TAMBIÉN Angular NO está "transpilando" :-(! DE HECHO NO PODEMOS DESCRIBIR AUN QUÉ ESTÁ HACIENDO Angular usando el vocabulario disponible!
Así que "generalizo" (léase "relájese") mi definición de "compilar" significa simplemente "mayor a menor" en lugar de "mayor a máquina", y ahora mi vocabulario disponible PUEDE describir lo que Angular está haciendo. ES "compilar"
SI el objetivo de esta discusión es MEJORAR EL ENTENDIMIENTO, entonces espero que mi pequeña oferta sea útil para algunos.
Saludos, -Mark en North Aurora IL
Obtener el código que ha escrito para ejecutarse en un navegador implica dos cosas:
1) Transpilar el mecanografiado a JavaScript . Este es un tipo de problema resuelto. Creo que solo usan webpack.
2) Compilar las abstracciones angulares en JavaScript . Me refiero a cosas como componentes, tuberías, directivas, plantillas, etc. Esto es en lo que trabaja el equipo de núcleo angular.
En caso de que esté realmente interesado en ese segundo bit, el compilador angular, el autor del compilador de reloj , Tobias Bosch, explica el compilador angular en AngularConnect 2016 .
Creo que hay un poco de confusión entre la recopilación y la compilación. No importa y es una cuestión de gusto personal, ambos se transforman entre representaciones de código. Pero la definition que uso personalmente es que la transpilación se realiza entre dos idiomas diferentes en un nivel de abstracción similar (por ejemplo, mecanografiado a javascript), mientras que la compilación requiere un nivel inferior de abstracción. Creo que desde plantillas, componentes, tuberías, directivas, etc. hasta solo JavaScript es un paso hacia abajo en la escala de abstracción, y es por eso que se llama un compilador.
Para obtener más detalles, siga: https://en.wikipedia.org/wiki/Angular_(web_framework)
Straight answer to your question is:
angular no tiene un compilador. Porque no es un lenguaje .
Pero mecanografiado tiene un compilador , en el que se escribe la biblioteca angular de lenguaje / FrameWork .
Entonces, como no tiene compilador, no puede compilar nada.
1.) '' Angular '' (2.xy versiones superiores) es una biblioteca / FrameWork escrita usando el lenguaje llamado mecanografiado .
--Así que usa el compilador TypeScript.
2.) En contraste, '' angularjs '' (versiones 1.x) es una biblioteca / FrameWork escrita usando un lenguaje llamado script java .
--Así que usa el intérprete de JavaScript.
por qué compilador:
Debido a que angular se escribe usando mecanografiado, es desconocido para el navegador (es una plataforma real donde se ejecuta código funcional para aplicaciones web).
Entonces, al usar el compilador de mecanografía , los componentes angulares se transforman en componentes de script java comprensibles para el navegador.
Parece que haces tres preguntas en una:
- ¿Cuál es la diferencia entre un compilador y un transpilador?
- ¿Angular y TypeScript implementan compiladores o transpiladores?
- ¿Hay un compilador angular separado? ¿Qué compila?
¿Cuál es la diferencia entre un compilador y un transpilador?
@ JörgWMittag proporcionó una muy buena respuesta a esta pregunta.
¿Angular y TypeScript implementan compiladores o transpiladores?
Tanto TS como Angular implementan compiladores reales . Siguen las mismas etapas de análisis léxico, análisis, análisis semántico y generación de código que los compiladores C / C ++ que producen código de ensamblaje (excepto probablemente para la optimización). Puede ver que la clase / carpeta se llama "compilador" tanto en Angular como en TS .
El compilador angular no está realmente relacionado con el compilador TypeScript. Estos son compiladores muy diferentes.
¿Hay un compilador angular separado? ¿Qué compila?
Angular tiene dos compiladores:
- Ver compilador
- Compilador del módulo
El trabajo del compilador de vistas es transformar la plantilla que especifique para la plantilla del componente en la representación interna de un componente que es una fábrica de vistas que luego se utiliza para crear una instancia de vista .
Además de transformar la plantilla, el compilador de vistas también compila información de varios metadatos en forma de decoradores como
@HostBinding
,
@ViewChild
, etc.
Supongamos que define un componente y su plantilla así:
@Component({
selector: ''a-comp'',
template: ''<span>A Component</span>''
})
class AComponent {}
Con estos datos, el compilador genera la siguiente fábrica de componentes ligeramente simplificada:
function View_AComponent {
return jit_viewDef1(0,[
elementDef2(0,null,null,1,''span'',...),
jit_textDef3(null,[''My name is '',...])
]
Describe la estructura de una vista de componente y se utiliza al crear instancias del componente. El primer nodo es la definición del elemento y el segundo es la definición del texto. Puede ver que cada nodo obtiene la información que necesita cuando se instancia a través de la lista de parámetros. Es un trabajo de un compilador resolver todas las dependencias requeridas y proporcionarlas en tiempo de ejecución.
Recomiendo leer estos artículos:
- Esto es lo que necesita saber sobre los componentes dinámicos en Angular.
- Aquí es por qué no encontrarás componentes dentro de Angular
Además, vea la respuesta a ¿Cuál es la diferencia entre el compilador Angular AOT y JIT?
El trabajo del compilador de módulos es crear una fábrica de módulos que básicamente contenga definiciones fusionadas de los proveedores.
Para más información, lea:
Supone que compilar significa tomar el código fuente y producir código de máquina, códigos de bajo nivel, etc. Pero compilar en realidad solo significa tomar un código fuente y convertirlo en otro. Por lo tanto, parece razonable decir que tomar Typecript y producir JavaScript es una forma de compilación. No es diferente a lo que (por ejemplo) hace C # cuando se compila en lenguaje IL.
Dicho esto, diría que una mejor palabra para esto es Transpiling . Sugeriría que el compilador de mecanografiado se describe mejor como un Transpiler.
La diferencia es sutil y un transpilador puede considerarse como un tipo de compilador; pero un lenguaje compilado (puro) está (generalmente) convirtiendo un lenguaje de alto nivel en un lenguaje de bajo nivel (más cercano al código de máquina), como el ejemplo de C #. Un transpilador convierte un lenguaje de alto nivel en un lenguaje de nivel similar (de abstracción) (también de alto nivel). * *
El resultado del código compilado generalmente no es un lenguaje que usted mismo escribiría . El resultado de un transpiler es otro lenguaje de alto nivel. En teoría, podría escribir IL (como ejemplo), pero está realmente diseñado para ser producido por un compilador y no hay herramientas o soporte para hacerlo, usted produce IL compilando C # / vb.net, solo. Mientras que Javascript es un lenguaje de programación utilizable (y usado) por derecho propio.
* Muchas advertencias ya que las definiciones de estas palabras y su uso son bastante vagas