当前位置: 首页 > 知识库问答 >
问题:

Angular AOT和JIT编译器有什么区别

潘璞瑜
2023-03-14

我正在潜入angular 4,我试图理解编译。我已经读到,AOT和JIT都将TypeScript编译为JavaScript,无论是在服务器端还是在客户端。如果我在用Webpack和grunt构建它时编译它,并部署简化的javascript,那么AOT和JIT又是如何出现的呢?

共有1个答案

梅庆
2023-03-14

我已经读到,AOT和JIT都将TypeScript编译为JavaScript,无论是在服务器端还是在客户端。

不,这不是AOT和JIT编译器所做的。使用TypeScript编译器将TypeScript转换为JavaScript。

有两个编译器完成编译和代码生成的艰苦工作:

    null
parse-tree (lexer) -> abstract-syntax-tree (parser) -> intermediate-code-tree -> output
// the view compiler needs this data

@Component({
   providers: ...
   template: ...
})

// the provider compiler needs this data

@NgModule({
   providers: ...
});

JIT编译器使用运行时获取数据。decorator函数@component@ngmodule被执行,它们将元数据附加到组件或模块类,然后由Angular编译器使用reflective capabiliteis(Reflection library)读取这些组件或模块类。

AOT编译器使用typescript编译器提供的静态代码分析来提取元数据,不依赖于代码计算。因此,与JIT编译器相比,它有点有限,因为它不能计算显式代码--例如,它需要导出一个函数:

// this module scoped function

function declarations() {
  return [
    SomeComponent
  ]
}

// should be exported

export function declarations() {
  return [
    SomeComponent
  ];
}
@NgModule({
  declarations: declarations(),
})
export class SomeModule {}

同样,JIT和AOT编译器大多是包装器,用于提取与组件或模块相关联的元数据,它们都使用底层视图和提供程序编译器来生成工厂

Angular提供了webpack插件,该插件在构建期间从typescript执行transpilation。这个插件还可以AOT编译您的项目,这样您就不会在包中包含JIT编译器,也不会在客户机上执行编译。

 类似资料:
  • 问题内容: Eclipse的Java编译器是否只是包裹该程序的同一个内核的包装器,还是完全独立的编译器?如果是后者,为什么还要重新发明轮子呢? 问题答案: Eclipse实现了自己的编译器,称为Java Eclipse编译器(ECJ)。 它不同于Sun JDK附带的编译器javac。一个显着的区别是Eclipse编译器使您可以运行实际上未正确编译的代码。如果永远不会运行带有错误的代码块,则您的程序

  • 在Marshmallow中,有一个添加了ART的AOT编译器。在Androidn中,除了AOT之外,还添加了另一个编译器JIT。 AOT编译器的特定工作/特性是什么?areJIT编译器的工作/特性是什么?

  • 主要内容:JIT编译器语法,JIT编译器的风险和假设JIT 编译器是用 C++ 编写的,用于将 Java 转换为字节码。现在 Java 10 可以选择启用基于 Java 的实验性 JIT 编译器 Graal 来代替标准的 JIT 编译器。Graal 正在使用 Java 9 中引入的 JVMCI,即 JVM 编译器接口。 Graal 在 Java 9 中也可用。使用 Java 10,我们可以启用 Graal 来测试和调试实验性 JVM 编译器。 JI

  • 问题内容: 即时编译器和解释器之间有什么区别,.NET和Java JIT编译器之间有什么区别? 问题答案: 即时编译是在执行之前将非本机代码(例如字节码)转换为本机代码。 从维基百科: JIT基于运行时环境中的两个较早的想法:字节码编译和动态编译。它在本地执行代码之前先在运行时将其转换,例如将字节码转换为本地机器代码。 一种解释执行程序。它可能有也可能没有抖动。 同样,来自维基百科: 解释器可能是

  • 我试图理解Java源代码是如何执行的,我对JVM中的JIT编译器究竟是什么感到困惑。首先,让我告诉您我是如何理解从Java源代码到在计算机上执行机器代码的过程的。也许,我在这一过程中误解了一些导致混淆的东西。 步骤如下: 源代码被编译成字节码(.class文件) 现在,根据维基百科关于JVM的文章,更具体地说是“字节码解释器和实时编译器”部分,为了执行Java字节码,您需要一个解释器(但我们有一个

  • 我知道这依赖于JVM,每个虚拟机都会选择实现它,但我想了解总体概念。 据说对于JVM用来执行Java程序的内存段 Java堆栈 不一定用连续内存实现,并且可能都实际分配在操作系统提供的一些堆内存上,这就引出了我的问题。 完全使用JIT机制并将字节码方法编译为本机机器码方法的JVM将这些方法存储在某个地方,那会在哪里?执行引擎(通常用C/C编写)将不得不调用这些JIT编译函数,然而内核不应该允许程序