首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@实用主义(“vm:偏好-内联”)在颤振中意味着什么?

@实用主义(“vm:偏好-内联”)在颤振中意味着什么?
EN

Stack Overflow用户
提问于 2020-10-12 09:02:34
回答 2查看 4.7K关注 0票数 12

我在框架中看到了很多代码,比如下面的代码。@pragma注释是做什么的?

代码语言:javascript
复制
@pragma("vm:entry-point", "call")
@pragma("vm:entry-point", "set")
@pragma("vm:entry-point", "get")
@pragma("vm:prefer-inline")`
......
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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相关主题的一个非常宝贵的来源。

票数 11
EN

Stack Overflow用户

发布于 2020-10-13 20:51:25

Flutter使用Dart编程语言。

Pragma类是对工具的提示。

使用Dart程序的工具可以接受提示,将其作为声明上的pragma注释来指导它们的行为。每个工具都决定它接受哪些提示,它们意味着什么,以及它们是否和如何应用于注释实体的子部分。

识别pragma提示的工具应该选择一个语用前缀来标识该工具。他们应该识别任何以其前缀开头的名称的提示,后面跟着:,就好像它是用于该工具的。应该忽略带有另一个工具前缀的提示(除非与另一个工具的兼容性是一个目标)。

一个工具也可以识别没有前缀的名字,如果他们能识别前面有自己前缀的名字。

如果提示可以参数化,也可以添加额外的options对象。

例如:

代码语言:javascript
复制
@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代码的注入逻辑是非侵入性的,因此主条目显然不会调用它。因此,需要这个注释来告诉编译器不要放弃这个逻辑。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64314719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档