了解 STG

2024-04-02

GHC 的设计基于 STG,它代表“无脊椎、无标签的 G 机器”。

现在G-machine显然是“图缩减机”的缩写,它定义了惰性是如何实现的。未评估的 thunk 存储为表达式树,执行程序涉及reducing这些都归结为正常形式。 (Atree是一个无环图,但 Haskell 普遍的递归意味着 Haskell 表达式形成了一般形式graphs,因此是图缩减而不是树缩减。)

不太清楚的是术语“无骨气”和“无标签”。

  1. I think“无脊椎”是指功能应用程序没有功能应用程序节点的“脊椎”。相反,您有一个对象,该对象命名被调用的函数并指向其所有参数。那是对的吗?

  2. 我认为“无标记”是指构造函数节点没有使用构造函数 ID“标记”,而是使用跳转指令解析 case 表达式。但现在我不确定这是否正确。相反,它似乎指的是节点没有标记其评估状态的事实。谁能澄清这些解释中哪一个(如果有的话)是正确的?


GHC 维基包含一个关于STG的介绍文章 https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/GeneratedCode马克斯·博林布鲁克写的:

STG 机器是世界领先的 GHC 的重要组成部分 哈斯克尔编译器。它定义了 Haskell 评估模型应该如何 在标准硬件上有效实施。尽管有这个键 但 GHC 用户普遍对其了解甚少。这 本文旨在概述 STG 机器的现代、 基于 eval/apply 的、指针标记的化身,由一系列简单的 显示 Haskell 源代码如何编译的示例。

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

了解 STG 的相关文章

  • 由于标志字节串 -lt-0_10_4,无法使用 Stack 构建 hello world 程序

    通过生成一个裸露的 hello world 项目 stack new myproject simple 每当我跑步时stack setup stack init or stack build我总是出现以下错误 Downloading lts
  • 在 Haskell 中提升 State monad 中的值

    我正在 Haskell 中编写一个数独生成器 求解器作为学习练习 My solve函数接受一个UArray但返回一个State Int UArray 这样它也可以返回解决问题时发现的最大难度级别 到目前为止 这是我的功能 仍处于实验性的早期
  • 让 GHC 生成“带进位加法 (ADC)”指令

    下面的代码将表示 192 位数字的两个未装箱字三元组添加到新的未装箱字三元组中 并且还返回任何溢出 LANGUAGE MagicHash LANGUAGE UnboxedTuples import GHC Prim plusWord2 Wo
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • 显示未定义的实例

    可以采取任何措施来为未定义的值定义 Show 实例吗 也许存在一些 GHC 扩展 我想要这样的东西 gt print 1 undefined 1 undefined 根据Haskell 2010 报告 第 9 章 http www hask
  • Haskell/GHC:使用相同模式匹配多个一元构造函数

    所以我正在尝试定义 TrieSet 数据类型 尽管我知道我不需要 http hackage haskell org package TrieMap module Temp where import Data Map data TrieSet
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 访问函数中的环境

    In main我可以读取我的配置文件 并将其提供为runReader somefunc myEnv正好 但somefunc不需要访问myEnv读者提供 链中的下一对也没有提供 需要 myEnv 中某些内容的函数是一个微小的叶函数 如何在不将
  • 如何让 xcodebuild 将编译错误和警告打印到 stderr?

    似乎 xcodebuild 将所有内容打印到标准输出 Applications Xcode app Contents Developer usr bin xcodebuild project test xcodeproj build tar
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 如何调试内部错误?

    所以我有课Foo最终应该调整并重新加载类 它也有一个方法 private void redefineClass String classname byte bytecode ClassFileLocator cfl ClassFileLoc
  • 无点镜头创建不进行类型检查

    在函数中test 我遍历一个列表 从它的成员生成镜头 然后打印一些数据 当我使用有针对性的呼叫风格时 这会起作用 当我使其成为无点时 它无法进行类型检查 为什么会出现这种情况 我该如何解决这个问题 在我看来 GHC 并没有保留排名较高的信息
  • 在 Haskell 中,为什么我必须在这段代码中使用美元符号?

    我仍在尝试破解这段代码 import Data Char groupsOf groupsOf n xs take n xs groupsOf n tail xs problem 8 x maximum map product groupsO
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 搜索重写规则

    有什么办法可以浏览或搜索重写规则吗 当我使用像这样的标志时 ddump rule firings or ddump rule rewrites我只是得到了触发的规则的名称以及它引起的重写 但没有得到实际的规则本身 理想情况下 我想通过 GH
  • Haskell - 用防护罩替换外壳

    我想知道在这部分代码中是否可以用守卫替换 case 语句 firstFunction String gt Maybe MyType secondFunction MyType gt Integer myFunction String gt
  • 以下两个 lambda 函数的空间复杂度

    我正在阅读以下内容 https en wikibooks org wiki Haskell Graph reduction https en wikibooks org wiki Haskell Graph reduction 其内容如下
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • 在后台从 gVim 运行 :make

    我在 Windows 中使用 gVim 来编辑我的代码 主要是 C 我在 gVim 中使用 make 来编译项目 但这是一个阻塞操作 在编译完成之前我无法使用 gVim 我怎样才能异步执行 make 并仍然获得将错误读回 Vim 并跳转到源

随机推荐

  • 整理一行中的多个对象

    我有一行来自数据库 select John Name Male Gender 20 Age Rex PetName Male PetGender 5 PetAge many more 使用 Dapper 我想将此行拉入两个对象 class
  • 核心数据迁移——如何将两个实体合二为一

    我有一个包含两个实体的旧核心数据模型 第一个实体 FirstString 有一个属性 string1 它是 NSString 第二实体 SecondString 有一个属性 string2 它是 NSString 它们具有一对多关系 第一个
  • SymPy 和复数的平方根

    使用时solve为了计算二次方程的根 SymPy 返回可以简化的表达式 但我无法让它简化它们 一个最小的例子如下所示 from sympy import sqrt 24 70 I 在这里 SymPy 只是返回sqrt 24 70 I 而 M
  • 如何动态更改悬停和按下的 extjs 按钮的背景

    你好 我需要能够动态更改按钮不同状态 正常 悬停 按下 的背景颜色 到目前为止我想到的如下 http jsfiddle net suamikim c3eHh http jsfiddle net suamikim c3eHh Ext onRe
  • 为什么方法参数不适用于赋值?

    在 Ruby 中 与许多语言一样 方法的参数不会自动分配为实例变量 这有效 def initialize a a a end 这不会 def initialize a end 例如 在 CoffeeScript 中 这是有效的 constr
  • 升级到 .net 4 时 MembershipUser / System.Web.ApplicationServices 出现问题

    我有一个大型 vb net Web 项目 我正在尝试将其升级到 net4 VS2010 在编译期间我收到以下错误 程序集 System Web Version 4 0 0 0 Culture neutral PublicKeyToken b
  • 如何在没有gradle或Maven或Eclipse的情况下将jar文件添加到java项目中

    我可以添加一个jar文件到我在桌面上手动创建的 Java 项目without使用 gradle Maven 或任何依赖管理工具或任何 Java IDE 目前该项目是一个包含 5 个 java 文件的文件夹 我从终端运行它 是否可以在此类项目
  • 如何使用 BigQuery DML 转换嵌套在数组、结构体、数组内的结构体的某些字段?

    我认为这是问题的一个更复杂的版本更新 BigQuery 中结构体数组中的值 https stackoverflow com questions 61408952 update values in struct arrays in bigqu
  • MySQL 中 int 转字符串

    可以做这样的事情吗 本质上 我想将一个 int 转换为一个字符串 并在连接上使用该字符串 注意 t1 id select t2 from t1 join t2 on t2 url site com path t1 id more where
  • Mule 方法无法转换为字符串

    我对骡子工作室很陌生 这是环境设置 VM1 Windows 7 Visual Studio 2012 IIS 7 IIS 7 中托管的 net 4 5 WCF Web 服务 具有接受字符串并返回字符串的操作 VM2 Ubuntu 13 4
  • Titanium 用于 Windows 平台上的 iOS 开发

    我已经下载了 Windows 平台的 Titanium 正确安装后 我发现它需要iOS SDK 那么我应该从哪里获取iOS SDK 在Windows平台上可以开发iOS吗 使我的 Hello World 示例在适用于 iOS 的 Windo
  • 错误:R 中的下标类型“列表”无效

    这里有一个问题 我正在使用 eclipse 参数创建一个函数来处理不同的函数参数 我重新创建了类似的情况来显示我不断遇到的问题 gt d lt data frame alpha 1 3 beta 4 6 gamma 7 9 gt d alp
  • where 和having 关于别名的区别

    如果我在中创建一个别名select那么我不能在where子句因为根据sql查询的执行顺序where出现在之前select 但我可以在中创建一个别名select子句并将其用于having虽然条款having出现在之前select 为什么会这样
  • Knockoutjs 当父级可观察到的更改时更新子级

    当使用 KnockoutJs 父可观察更改时 如何触发子元素的更新 在我的应用程序中 我正在构建一个翻译工具 我有一个淘汰赛类 表示某些文本的原始 默认 值 以及翻译后的子项的集合 function ParentObject id defa
  • CSS 动画 - 动画缓慢且抖动

    我想问一下 这段CSS代码有什么问题吗 它用于动画背景图像 缩放效果 media min width 1000px anim on background size 110 110 background position center cen
  • 在 Golang 中访问上传的文件

    我在访问使用 golang 上传的文件时遇到问题 我对这门语言真的很陌生 并且已经进行了多次尝试 在网上也找不到任何答案 我究竟做错了什么 在此代码中 我从未到达列出已上传文件数的块 func handler w http Response
  • 野田时间:Period.Between() 返回错误的天数?

    鉴于下面的代码片段 为什么最后四个输出周期相同 我希望这些行的天数部分为 4 3 2 1 而不是 4 4 4 4 这是一个错误还是我遗漏了一些明显的东西 已经很晚了 我也累了 所以很可能是后者 我使用的是Noda Time 1 2 0 fo
  • 阻止 robots.mouseMove 生成​​ MouseEvent?

    我有一个 3D 游戏 每次移动光标时 我希望它重置到中间 问题是 robots mouseMove 调用 MouseEvent 它确实有意义 并重置位置 所以我无法旋转 谢谢你 我更喜欢如下代码 component removeMouseL
  • 如何重写对象ArrayList的ToString方法?

    class Person public String firstname public String lastname Person p1 new Person Jim Green Person p2 new Person Tony Whi
  • 了解 STG

    GHC 的设计基于 STG 它代表 无脊椎 无标签的 G 机器 现在G machine显然是 图缩减机 的缩写 它定义了惰性是如何实现的 未评估的 thunk 存储为表达式树 执行程序涉及reducing这些都归结为正常形式 Atree是一