我在框架中看到了很多代码,比如下面的代码。@pragma注释是做什么的?
@pragma("vm:entry-point", "call")
@pragma("vm:entry-point", "set")
@pragma("vm:entry-point", "get")
@pragma("vm:prefer-inline")`
......发布于 2021-04-13 22:48:51
对于@pragma的一般含义,NKSM的答复以上的cfr。
我将列举两个重要的具体用例:
@pragma('vm:prefer-inline')到内嵌函数
(我的意思是编译时内联,它与“内联功能”无关,它是闭包/lambda的同义词,有时会这样做)
这个注释类似于Kotlin中的内联关键字。@pragma("vm:entry-point")将一个函数(或其他实体)标记为类,以向编译器指示它将是本机代码中使用的。没有这个注释,dart编译器就可以删除未使用的函数,内联它们,缩小名称等等,而本机代码将无法调用它。
关于entry-point的一个非常好的文档(比平时写得更清楚)是pragma.md。如果您想在dart中使用内联进行第一次测试,我建议您使用dart2js进行编译,它输出相当可读的javascript代码(至少在超出默认的收缩级别之前是这样;而且可读性显然只在最小的程序中是合适的)。但是,dart/js中的内联需要一个稍微不同的@杂注:@pragma ('dart2js: tryInline')。
关于省道衬里的有趣讨论可在dart-lang问题#40522 -方法内衬注释中找到。
总的来说,我建议姆拉尔夫博客。他最近的一篇文章是关于dart的基准测试,同时也展示了@pragma(vm:entry-point)的使用。Mraleph是一名Dart Sdk开发人员(他也是上面提到的官方文档的作者),它是关于Dart VM相关主题的一个非常宝贵的来源。
发布于 2020-10-13 20:51:25
Flutter使用Dart编程语言。
Pragma类是对工具的提示。
使用Dart程序的工具可以接受提示,将其作为声明上的pragma注释来指导它们的行为。每个工具都决定它接受哪些提示,它们意味着什么,以及它们是否和如何应用于注释实体的子部分。
识别pragma提示的工具应该选择一个语用前缀来标识该工具。他们应该识别任何以其前缀开头的名称的提示,后面跟着:,就好像它是用于该工具的。应该忽略带有另一个工具前缀的提示(除非与另一个工具的兼容性是一个目标)。
一个工具也可以识别没有前缀的名字,如果他们能识别前面有自己前缀的名字。
如果提示可以参数化,也可以添加额外的options对象。
例如:
@pragma('Tool:pragma-name', [param1, param2, ...])
class Foo { }
@pragma('OtherTool:other-pragma')
void foo() { }这里,类 foo 用特定于OtherTool的工具特定的语用“语用名称”进行注释,而函数foo则使用特定于OtherTool的“其他-语用”注释。
以上内容可在dart.dev文档上找到。
这里的
@pragma('vm:entry-point')注释。它的核心逻辑是树摇动。在AOT (提前)编译中,如果应用程序的主条目不能调用它,它将作为无用的代码被丢弃。AOP代码的注入逻辑是非侵入性的,因此主条目显然不会调用它。因此,需要这个注释来告诉编译器不要放弃这个逻辑。
https://stackoverflow.com/questions/64314719
复制相似问题