Debugging crystal build上无codegen选项的目的?

Debugging crystal build上无codegen选项的目的?,debugging,compilation,crystal-lang,Debugging,Compilation,Crystal Lang,在构建crystal项目时,no-codegen选项的目的是什么 我有相当大的代码库,当构建时没有这个选项,它可能需要20秒来构建。当我使用no-codegen选项时,它将构建时间减少到6秒。但我不明白,当包含该选项时,是否可以调试可执行文件(目前我在使用--debug标志构建时使用LLDB进行调试)?简而言之,它允许检查一切是否正常,但不生成二进制文件 总的来说,Crystal编译器有四个主要阶段: 类型检查和宏扩展 LLVM的代码生成 优化(通过LLVM) 二进制生成(通过LLVM) 每个过

在构建crystal项目时,
no-codegen
选项的目的是什么


我有相当大的代码库,当构建时没有这个选项,它可能需要20秒来构建。当我使用
no-codegen
选项时,它将构建时间减少到6秒。但我不明白,当包含该选项时,是否可以调试可执行文件(目前我在使用
--debug
标志构建时使用LLDB进行调试)?

简而言之,它允许检查一切是否正常,但不生成二进制文件

总的来说,Crystal编译器有四个主要阶段:

  • 类型检查和宏扩展
  • LLVM的代码生成
  • 优化(通过LLVM)
  • 二进制生成(通过LLVM)
  • 每个过程都需要一些时间。在第一阶段,编译器只检查所有类型并展开程序中的宏。在第二阶段,废弃的代码被丢弃,一些其他特定于语言的优化发生,程序被生成为LLVM。在第四阶段(仅使用
    --release
    ),Crystal调用LLVM对生成的代码进行许多优化。在最后一个阶段,LLVM创建特定于平台的二进制文件

    在您的情况下,执行类型检查需要6秒,执行所有其他阶段需要14秒(3除外)。

    --无代码生成意味着没有生成代码。它不产生任何二进制代码


    此标志的目的是检查程序的有效性,而不是实际构建程序。这在无法执行结果时非常有用,然后可以跳过二进制生成。例如,这用于Crystal repo中的代码示例:它们是在CI中使用
    --no codegen
    构建的,只是为了检查代码是否有效,但验证它们的执行是否超出自动测试的范围。

    那么,使用
    --debug--no codegen
    构建的Crystal二进制文件可以由LLDB进行配音吗<代码>无代码生成
    只会减少LLVM所做的一些优化,对吗?是的,我现在看到二进制文件在输出时不可用。所以只需要检查代码是否有效,很好。非常感谢。