scala 编译器阶段的顺序是什么?

发布于 2024-10-09 06:28:00 字数 247 浏览 7 评论 0原文

我想加深对 scala 编译阶段的了解。我知道编译器中必须发生某些事情,但并不真正知道它们发生的顺序以及顺序如何影响我的编程。

我说以下内容是编译器功能的完整列表,对吗?

  • 解析程序
  • 类型 检查
  • 擦除
  • 隐式转换
  • 字节码 生成
  • 优化

如果是,那么它执行这些阶段的顺序是什么? 这个顺序如何影响程序员,特别是类型级程序员?

I want to sharpen my picture of the phases of scala compilation. I know that certain things have to happen in the compiler, but don't really know the order in which they happen and how the order should affect my programming.

Am I right in saying that the following things are the full list of what the compiler does?

  • parse program
  • types checked
  • do erasure
  • implicit conversion
  • byte-code generated
  • optimize

If so, what is the order that it does these phases?
How does this order affect the programmer, especially the type-level programmer?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

丑疤怪 2024-10-16 06:28:00

您可以使用 scalac -Xshow-phases 来查看各个阶段、它们的顺序和说明。

在 2.11 中,使用 -Xshow-phases -Ydebug 显示启用和禁用的阶段。

2.10.0 的情况如下:

 » scalac -Xshow-phases

             phase name  id  description
             ----------  --  -----------
                 parser   1  parse source into ASTs, perform simple desugaring
                  namer   2  resolve names, attach symbols to named trees
         packageobjects   3  load package objects
                  typer   4  the meat and potatoes: type the trees
                 patmat   5  translate match expressions
         superaccessors   6  add super accessors in traits and nested classes
             extmethods   7  add extension methods for inline classes
                pickler   8  serialize symbol tables
              refchecks   9  reference/override checking, translate nested objects
           selectiveanf  10  
           selectivecps  11  
                uncurry  12  uncurry, translate function values to anonymous classes
              tailcalls  13  replace tail calls by jumps
             specialize  14  @specialized-driven class and method specialization
          explicitouter  15  this refs to outer pointers, translate patterns
                erasure  16  erase types, add interfaces for traits
            posterasure  17  clean up erased inline classes
               lazyvals  18  allocate bitmaps, translate lazy vals into lazified defs
             lambdalift  19  move nested functions to top level
           constructors  20  move field definitions into constructors
                flatten  21  eliminate inner classes
                  mixin  22  mixin composition
                cleanup  23  platform-specific cleanups, generate reflective calls
                  icode  24  generate portable intermediate code
                inliner  25  optimization: do inlining
inlineExceptionHandlers  26  optimization: inline exception handlers
               closelim  27  optimization: eliminate uncalled closures
                    dce  28  optimization: eliminate dead code
                    jvm  29  generate JVM bytecode
               terminal  30  The last phase in the compiler chain

You see the phases, their order and explanation by using scalac -Xshow-phases.

In 2.11, use -Xshow-phases -Ydebug to show both enabled and disabled phases.

Here is how it's for 2.10.0:

 » scalac -Xshow-phases

             phase name  id  description
             ----------  --  -----------
                 parser   1  parse source into ASTs, perform simple desugaring
                  namer   2  resolve names, attach symbols to named trees
         packageobjects   3  load package objects
                  typer   4  the meat and potatoes: type the trees
                 patmat   5  translate match expressions
         superaccessors   6  add super accessors in traits and nested classes
             extmethods   7  add extension methods for inline classes
                pickler   8  serialize symbol tables
              refchecks   9  reference/override checking, translate nested objects
           selectiveanf  10  
           selectivecps  11  
                uncurry  12  uncurry, translate function values to anonymous classes
              tailcalls  13  replace tail calls by jumps
             specialize  14  @specialized-driven class and method specialization
          explicitouter  15  this refs to outer pointers, translate patterns
                erasure  16  erase types, add interfaces for traits
            posterasure  17  clean up erased inline classes
               lazyvals  18  allocate bitmaps, translate lazy vals into lazified defs
             lambdalift  19  move nested functions to top level
           constructors  20  move field definitions into constructors
                flatten  21  eliminate inner classes
                  mixin  22  mixin composition
                cleanup  23  platform-specific cleanups, generate reflective calls
                  icode  24  generate portable intermediate code
                inliner  25  optimization: do inlining
inlineExceptionHandlers  26  optimization: inline exception handlers
               closelim  27  optimization: eliminate uncalled closures
                    dce  28  optimization: eliminate dead code
                    jvm  29  generate JVM bytecode
               terminal  30  The last phase in the compiler chain
孤独难免 2024-10-16 06:28:00

您看过此处吗?该页面指向 http://www.scala-lang.org/sites/default/files/sids/nielsen/Thu,%202009-05-28,%2008:13/compiler-phases-sid .pdf (PDF),描述了 Scala 2.8 的编译器阶段。

Have you looked here? That page points to http://www.scala-lang.org/sites/default/files/sids/nielsen/Thu,%202009-05-28,%2008:13/compiler-phases-sid.pdf (PDF), which describes the compiler phases for Scala 2.8.

深府石板幽径 2024-10-16 06:28:00

你真的不应该担心编译器阶段的顺序,除非你正在编写编译器插件。即使对于类型级编程,您也应该关注语言语义。

例如,就擦除而言,了解静态类型与动态类型以及单独编译的模型非常重要。同样,了解编译器应用隐式转换的条件也很重要。这些在编译周期中发生的地方只是一个实现细节。

You really should not worry about the order of compiler phases unless you're writing a compiler plugin. Even for type-level programming, you should focus on the language semantics instead.

As far as erasure is concerned, for example, it's important to understand static vs. dynamic types and the model of separate compilation. Similarly, it's important to understand the conditions under which the compiler will apply an implicit conversion. Where these occur in the compilation cycle is just an implementation detail.

别想她 2024-10-16 06:28:00

Scala.js 0.6.23

     phase name  id  description
     ----------  --  -----------
         parser   1  parse source into ASTs, perform simple desugaring
     jspretyper   2  capture pre-typer only tree info (for Scala.js)
          namer   3  resolve names, attach symbols to named trees
 packageobjects   4  load package objects
          typer   5  the meat and potatoes: type the trees
      jsinterop   6  prepare ASTs for JavaScript interop
         patmat   7  translate match expressions
 superaccessors   8  add super accessors in traits and nested classes
     extmethods   9  add extension methods for inline classes
        pickler  10  serialize symbol tables
       xsbt-api  11  
xsbt-dependency  12  
      refchecks  13  reference/override checking, translate nested objects
        uncurry  14  uncurry, translate function values to anonymous classes
      tailcalls  15  replace tail calls by jumps
     specialize  16  @specialized-driven class and method specialization
  explicitouter  17  this refs to outer pointers
        erasure  18  erase types, add interfaces for traits
    posterasure  19  clean up erased inline classes
       lazyvals  20  allocate bitmaps, translate lazy vals into lazified defs
     lambdalift  21  move nested functions to top level
   constructors  22  move field definitions into constructors
        flatten  23  eliminate inner classes
          mixin  24  mixin composition
         jscode  25  generate JavaScript code from ASTs
        cleanup  26  platform-specific cleanups, generate reflective calls
     delambdafy  27  remove lambdas
          icode  28  generate portable intermediate code
        inliner  xx  optimization: do inlining
 inlinehandlers  xx  optimization: inline exception handlers
       closelim  xx  optimization: eliminate uncalled closures
       constopt  xx  optimization: optimize null and other constants
            dce  xx  optimization: eliminate dead code
            jvm  29  generate JVM bytecode
  xsbt-analyzer  30  
       terminal  31  the last phase during a compilation run

Scala-Native 0.3.7

     phase name  id  description
     ----------  --  -----------
         parser   1  parse source into ASTs, perform simple desugaring
          namer   2  resolve names, attach symbols to named trees
 packageobjects   3  load package objects
          typer   4  the meat and potatoes: type the trees
  nativeinterop   5  prepare ASTs for Native interop
         patmat   6  translate match expressions
 superaccessors   7  add super accessors in traits and nested classes
     extmethods   8  add extension methods for inline classes
        pickler   9  serialize symbol tables
       xsbt-api  10  
xsbt-dependency  11  
      refchecks  12  reference/override checking, translate nested objects
        uncurry  13  uncurry, translate function values to anonymous classes
      tailcalls  14  replace tail calls by jumps
     specialize  15  @specialized-driven class and method specialization
  explicitouter  16  this refs to outer pointers
        erasure  17  erase types, add interfaces for traits
    posterasure  18  clean up erased inline classes
       lazyvals  19  allocate bitmaps, translate lazy vals into lazified defs
     lambdalift  20  move nested functions to top level
   constructors  21  move field definitions into constructors
        flatten  22  eliminate inner classes
          mixin  23  mixin composition
            nir  24  
        cleanup  25  platform-specific cleanups, generate reflective calls
     delambdafy  26  remove lambdas
          icode  27  generate portable intermediate code
        inliner  xx  optimization: do inlining
 inlinehandlers  xx  optimization: inline exception handlers
       closelim  xx  optimization: eliminate uncalled closures
       constopt  xx  optimization: optimize null and other constants
            dce  xx  optimization: eliminate dead code
            jvm  28  generate JVM bytecode
  xsbt-analyzer  29  
       terminal  30  the last phase during a compilation run

Scala.js 0.6.23

     phase name  id  description
     ----------  --  -----------
         parser   1  parse source into ASTs, perform simple desugaring
     jspretyper   2  capture pre-typer only tree info (for Scala.js)
          namer   3  resolve names, attach symbols to named trees
 packageobjects   4  load package objects
          typer   5  the meat and potatoes: type the trees
      jsinterop   6  prepare ASTs for JavaScript interop
         patmat   7  translate match expressions
 superaccessors   8  add super accessors in traits and nested classes
     extmethods   9  add extension methods for inline classes
        pickler  10  serialize symbol tables
       xsbt-api  11  
xsbt-dependency  12  
      refchecks  13  reference/override checking, translate nested objects
        uncurry  14  uncurry, translate function values to anonymous classes
      tailcalls  15  replace tail calls by jumps
     specialize  16  @specialized-driven class and method specialization
  explicitouter  17  this refs to outer pointers
        erasure  18  erase types, add interfaces for traits
    posterasure  19  clean up erased inline classes
       lazyvals  20  allocate bitmaps, translate lazy vals into lazified defs
     lambdalift  21  move nested functions to top level
   constructors  22  move field definitions into constructors
        flatten  23  eliminate inner classes
          mixin  24  mixin composition
         jscode  25  generate JavaScript code from ASTs
        cleanup  26  platform-specific cleanups, generate reflective calls
     delambdafy  27  remove lambdas
          icode  28  generate portable intermediate code
        inliner  xx  optimization: do inlining
 inlinehandlers  xx  optimization: inline exception handlers
       closelim  xx  optimization: eliminate uncalled closures
       constopt  xx  optimization: optimize null and other constants
            dce  xx  optimization: eliminate dead code
            jvm  29  generate JVM bytecode
  xsbt-analyzer  30  
       terminal  31  the last phase during a compilation run

Scala-Native 0.3.7

     phase name  id  description
     ----------  --  -----------
         parser   1  parse source into ASTs, perform simple desugaring
          namer   2  resolve names, attach symbols to named trees
 packageobjects   3  load package objects
          typer   4  the meat and potatoes: type the trees
  nativeinterop   5  prepare ASTs for Native interop
         patmat   6  translate match expressions
 superaccessors   7  add super accessors in traits and nested classes
     extmethods   8  add extension methods for inline classes
        pickler   9  serialize symbol tables
       xsbt-api  10  
xsbt-dependency  11  
      refchecks  12  reference/override checking, translate nested objects
        uncurry  13  uncurry, translate function values to anonymous classes
      tailcalls  14  replace tail calls by jumps
     specialize  15  @specialized-driven class and method specialization
  explicitouter  16  this refs to outer pointers
        erasure  17  erase types, add interfaces for traits
    posterasure  18  clean up erased inline classes
       lazyvals  19  allocate bitmaps, translate lazy vals into lazified defs
     lambdalift  20  move nested functions to top level
   constructors  21  move field definitions into constructors
        flatten  22  eliminate inner classes
          mixin  23  mixin composition
            nir  24  
        cleanup  25  platform-specific cleanups, generate reflective calls
     delambdafy  26  remove lambdas
          icode  27  generate portable intermediate code
        inliner  xx  optimization: do inlining
 inlinehandlers  xx  optimization: inline exception handlers
       closelim  xx  optimization: eliminate uncalled closures
       constopt  xx  optimization: optimize null and other constants
            dce  xx  optimization: eliminate dead code
            jvm  28  generate JVM bytecode
  xsbt-analyzer  29  
       terminal  30  the last phase during a compilation run
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文