我看到很多框架中有这样的代码:
@pragma
@pragma
注释是做什么用的?
@pragma("vm:entry-point", "call")
@pragma("vm:entry-point", "set")
@pragma("vm:entry-point", "get")
@pragma("vm:prefer-inline")`
......
关于@pragma
的一般含义,请参考上述NKSM答案。
我将引用两个重要的具体用例:
@pragma('vm:prefer-inline')
用于内联函数
(我指的是编译时内联,这与“内联函数”作为闭包/lambda的同义词无关,有时会这样做)
此注释类似于Kotlin中的inline关键字。
@pragma("vm:entry-point")
用于标记函数(或其他实体,如类),以向编译器指示它将从本地代码中使用。如果没有此注释,dart编译器可能会削减未使用的函数、内联函数、缩小名称等,而本机代码将无法调用它。
关于entry-point
的非常好的文档(比通常更清晰)在https://github.com/dart-lang/sdk/blob/master/runtime/docs/compiler/aot/entry_point_pragma.md中。
如果你想在Dart中进行内联的第一次测试,我建议你使用dart2js编译,这将输出相当易读的JavaScript代码(至少在缩小级别超出默认级别之前;并且可读性显然仅在最小程序中达到)。但是,在Dart/JS中进行内联需要略微不同的@pragma注释:@pragma('dart2js: tryInline')
。
关于Dart中的内联的有趣讨论可以在dart-lang issue #40522 - Annotation for method inlining中找到。
总的来说,我推荐Mraleph博客。他的最新文章是关于 在Dart中进行基准测试,并展示了@pragma(vm:entry-point)
的使用。Mraleph是Dart SDK开发人员(他也是上面引用的官方文档的作者),对于与Dart VM相关的主题,这是一个非常宝贵的资源。
Flutter使用Dart编程语言。
Pragma类是向工具提供的一种提示。
处理Dart程序的工具可以接受在声明上作为pragma
注释的提示来指导它们的行为。每个工具都决定接受哪些提示、它们的意义以及它们是否以及如何应用于注释实体的子部分。
识别pragma
提示的工具应该选择一个pragma
前缀来标识该工具。如果提示名称以该前缀开头,后跟:
,则应该将其视为针对该工具而发出的提示。 对于另一个工具的前缀提示应该被忽略(除非与那个工具的兼容性是目标)。
如果提示可以参数化,则还可以添加额外的选项对象。
例如:
@pragma('Tool:pragma-name', [param1, param2, ...])
class Foo { }
@pragma('OtherTool:other-pragma')
void foo() { }
Foo类使用工具特定的编译指示符“”进行注释,而函数foo则使用针对其他工具的编译指示符“”进行注释。@pragma('vm:entry-point')
,其核心逻辑是树摇。在AOT(提前编译)编译中,如果它不能由应用程序的主入口调用,它将被作为无用代码丢弃。AOP代码的注入逻辑是非侵入式的,因此显然不会被主入口调用。因此,需要使用此注解告诉编译器不要丢弃此逻辑。