在多阶段编译中,我们是否应该使用标准的序列化方法来通过阶段传送对象?

2023-12-24

这个问题是在 Scala 3/Dotty 中提出的,但应该推广到 MetaML 系列之外的任何语言。

Scala 3 宏教程:

https://docs.scala-lang.org/scala3/reference/metaprogramming/macros.html https://docs.scala-lang.org/scala3/reference/metaprogramming/macros.html

开始于相位一致性原理,它明确指出在编译阶段定义的自由变量不能被下一阶段使用,因为它的绑定对象不能持久化到不同的编译器进程:

...因此,程序的结果将需要将程序状态本身作为其部分之一进行持久化。我们不想这样做,因此这种情况应该被定为非法

这应该被认为是一个已解决的问题,因为许多分布式计算框架需要类似的能力来跨多台计算机持久保存对象,最常见的解决方案(如在 Apache Spark 中观察到的)使用标准序列化/pickling 来创建绑定对象的快照( Java 标准序列化,twitter Kryo/Chill)可以保存在磁盘/堆外内存上或通过网络发送。

教程本身也两次提出了这种可能性:

一个区别是 MetaML 没有 PCP 的等效项 - MetaML 中引用的代码可以访问其直接封闭环境中的变量,但有一些限制和警告,因为此类访问涉及序列化。然而,这并不构成表现力的根本增益。

到底,ToExpr非常类似于序列化框架

相反,Scala 2 和 Scala 3(以及它们各自的生态系统)很大程度上忽略了这些开箱即用的解决方案,只为原始类型提供默认方法(Liftable在斯卡拉2中,ToExpr在 scala3 中)。此外,使用宏的现有库在很大程度上依赖于手动定义准引号/引号来完成这项琐碎的任务,从而使源代码变得更长且更难以维护,同时并没有使任何东西变得更快(因为 JVM 对象序列化是高度优化的语言组件)

造成这种现状的原因是什么?我们如何改进它?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在多阶段编译中,我们是否应该使用标准的序列化方法来通过阶段传送对象? 的相关文章

随机推荐

  • Linux 中的安全 Python 环境

    是否可以创建一个在Linux下安全运行任意Python脚本的环境 这些脚本应该是从不受信任的人那里收到的 并且可能太大而无法手动检查 一个非常暴力的解决方案是创建一个虚拟机并在每次启动不受信任的脚本后恢复其初始状态 太贵了 我想知道是否可以
  • C# 字典 ValueOrNull / ValueorDefault

    目前我正在使用 var x dict ContainsKey key dict key defaultValue 我想要某种方法让字典 key 对于不存在的键返回null 所以我可以写类似的东西 var x dict key default
  • QMessageBox.Yes/QMessageBox.No 的值

    我学习 PyQt5 对我来说看起来很复杂 我想知道为什么QMessageBox Yes 或没有 有一些特殊的价值 对我来说是16384 这就是我的意思 from PyQt5 import QApplication QWidget QMess
  • XNA BlendState 与 SpriteBatch

    我们需要一个 BlendState 来充当以下角色 透明 PNG 按预期绘制 保留其后面的任何内容 We use Color White按原样绘制 PNG 我们将改变颜色的 Alpha 通道来改变纹理的 不透明度 为了达到这个效果 Blen
  • 如何正确捕获 WinForms 应用程序中所有未处理的异常

    我想为 WinForms 应用程序中任何线程的所有未处理异常设置处理程序方法 我自己不创建任何应用程序域 根据未处理的异常 https msdn microsoft com en us library system appdomain un
  • Kendo-UI 和 Angularjs 多选选项消失

    我正在使用 Angularjs 和 Kendo UI 当我使用 Kendo ui 多重选择并且我在同一视图上有其他元素时 当我在 我在下面的链接中添加了一个简单的 plunker 演示 要使用它 只需先从多选状态列表中选择一个或多个状态 然
  • 在哪里可以找到用于访问 Exchange/Outlook 联系人和约会的示例 Delphi 代码或组件?

    我需要 Delphi 代码或组件来访问 Exchange Outlook 联系人和约会 我可能需要使用扩展 MAPI 这是为了概念验证 所以我现在还没有准备好花大钱 有什么提示 链接 经验吗 看看这个 在 MS Outlook 中创建约会
  • 如何将具有相同列值的行分组?

    给定具有 3D 空间中的坐标的矩阵和两个矩阵中两个变量 例如 a 和 b 的值 我想将相同点的行合并到一个公共矩阵中 为了清楚地解释这个问题 假设我们有矩阵 A posX posY posZ a and B posX posY posZ b
  • 在 Mahout 0.8 中运行 cvb

    当前的 Mahout 0 8 SNAPSHOT 包括用于主题建模的折叠变分贝叶斯 cvb 版本 并删除了潜在狄利克雷分析 lda 方法 因为 cvb 可以更好地并行化 不幸的是 只有文档lda https cwiki apache org
  • SignalR 请求管道、集线器生命周期

    我从使用 asp net webapi 的 signalR 开始 我试图了解整个 signalR 请求 连接管道以及集线器的生命周期是什么以及谁创建和处置集线器实例 它是否在客户端之间的每次通信上创建 和服务器 原因之一是我们需要了解应该如
  • 文件上传在 jQuery UI 对话框中不起作用

    所以我有一个相当奇怪的问题 我想看看是否有人有一些见解 我有一个页面 其中显示已上传到我们服务器的文件网格 网格工具栏使他们能够上传更多文件 当他们单击工具栏上的 添加文件 按钮时 会出现一个 jQuery UI 对话框模式窗口 其中包含一
  • 在C++中,如何将一个字符串拆分为多个整数? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个由
  • Makefile:英特尔 fortran、文件夹中的源文件和英特尔数学核心函数库

    我在文件夹 ex 中有一个 main f90 f77 子程序文件位于 ex src 中 子程序文件再次使用 BLAS 和 LAPACK 库 对于 BLAS 和 LAPACK 我必须使用 Intel Math Kernel Library I
  • 获取 Facebook 页面选项卡上的用户位置

    可口可乐似乎在这方面做得很好 即使在任何用户交互之前 他们也会设法知道您所在的位置 这适用于 IE 因此不涉及 HTML5 毕竟 Facebook 不会识别navigatorJavaScript 中的对象 他们如何做到这一点 首先 我不认为
  • Sonarqube 未注册任何 C# 问题

    大概类似于这个问题 https stackoverflow com questions 36401757 sonarqube is not registering any c sharp issues 但由于之前的版本已经回答了这个问题 所
  • 匹配多个正则表达式组并删除它们

    我收到了一个文件 我想从中提取有用的数据 文件的格式如下 LINE 1 TOKENKIND somedata TOKENKIND somedata LINE 2 TOKENKIND somedata LINE 3 etc 我想做的是删除 L
  • Tkinter 框架调整大小

    我已经被困了几天 试图弄清楚如何使用这种方法动态调整 TKInter 中的框架大小 class SampleApp tk Tk def init self args kwargs tk Tk init self args kwargs th
  • printf 函数如何处理 %f 规范?

    我有几个程序的输出我无法理解 方案1 include
  • 如何在没有部署描述符的情况下在Spring中注册监听器

    我正在通过 Spring Framework 4 1 0 慢慢步入 Java 世界 需要您在监听器方面的帮助 我创建了没有部署描述符的应用程序 所有与 Spring 相关的配置都在中管理 Configuration带注释的类 一切正常 但我
  • 在多阶段编译中,我们是否应该使用标准的序列化方法来通过阶段传送对象?

    这个问题是在 Scala 3 Dotty 中提出的 但应该推广到 MetaML 系列之外的任何语言 Scala 3 宏教程 https docs scala lang org scala3 reference metaprogramming