【问题标题】:Hook into GHC runtime system挂钩 GHC 运行时系统
【发布时间】:2015-06-17 22:27:39
【问题描述】:

我一直在研究事务内存是如何在 Haskell 中实现的,但我不确定我是否理解暴露给程序员的 STM 操作如何挂钩到用 C 编写的运行时系统函数中。在 git repo 的ghc/libraries/base/GHC/Conc/Sync.hs 中,我看到以下定义:

-- |A monad supporting atomic memory transactions.
newtype STM a = STM (State# RealWorld -> (# State# RealWorld, a #))
            deriving Typeable

-- |Shared memory locations that support atomic memory transactions.
data TVar a = TVar (TVar# RealWorld a)
          deriving Typeable

-- |Create a new TVar holding a value supplied
newTVar :: a -> STM (TVar a)
newTVar val = STM $ \s1# ->
    case newTVar# val s1# of
         (# s2#, tvar# #) -> (# s2#, TVar tvar# #)

然后在ghc/rts/PrimOps.cmm,我看到下面的C--定义:

stg_newTVarzh (P_ init){
  W_ tv;

  ALLOC_PRIM_P (SIZEOF_StgTVar, stg_newTVarzh, init);

  tv = Hp - SIZEOF_StgTVar + WDS(1);
  SET_HDR (tv, stg_TVAR_DIRTY_info, CCCS);

  StgTVar_current_value(tv) = init;
  StgTVar_first_watch_queue_entry(tv) = stg_END_STM_WATCH_QUEUE_closure;
  StgTVar_num_updates(tv) = 0;

  return (tv);
}

我的问题:

  1. (# s2#, TVar tvar# #) 中的第一个和最后一个 # 是什么意思。我之前读过,在变量后面加上# 只是一个命名约定,表明某些东西是未装箱的,但它本身意味着什么?
  2. 我们如何从newTVar#stg_newTVarzh?似乎我错过了这两者之间的另一个定义。编译器是否将 newTVar# 重写为对所列 C-- 函数的调用?
  3. C-- 代码中的P_W_ 是什么?

我只能在ghc/compiler/prelude/primops.txt.pp 中找到另一处出现的newTVar#

primop  NewTVarOp "newTVar#" GenPrimOp
   a
    -> State# s -> (# State# s, TVar# s a #)
 {Create a new {\tt TVar\#} holding a specified initial value.}
with
 out_of_line  = True
 has_side_effects = True

根据https://ghc.haskell.org/trac/ghc/wiki/Commentary/PrimOps,这是定义原语的方式,以便编译器了解它们。

【问题讨论】:

  • (# s2#, TVar tvar# #) 是一个未装箱的元组。 downloads.haskell.org/~ghc/latest/docs/html/users_guide/…
  • stg_newTVarzh 中最后一个zh# 的所谓z 编码:这种编码生成一个简单的名称,可供所有平台的链接器/ABI 使用,去除有趣的字符像哈希 (#)。我忘了这个编码实际上是在哪里定义的。 stg_ 前缀是整个 GHC 运行时通用的,代表无脊椎无标签 G 机器,一种评估函数式语言的抽象机器。
  • z编码详细here,以防有人感兴趣。
  • 太好了,谢谢大家。 @chi,如果您想将您的 cmets 复制到答案中,我很乐意接受。

标签: haskell functional-programming runtime transactional-memory


【解决方案1】:

(# s2#, TVar tvar# #) 是一个unboxed tuple

stg_newTVarzh 的名称源自:

  • stg_ 前缀,在整个 GHC 运行时通用,代表无脊椎无标签 G-machine,一种评估函数式语言的抽象机器;

  • newTVarnewTVar#的第一部分;

  • 最后的zh,也就是#的所谓z-encoding:这种编码生成了一个简单的名称,所有平台的链接器/ABI都可以使用,去除了像hash(# )。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多