进入GHC运行时系统

时间:2015-06-17 22:27:40

标签: haskell functional-programming runtime transactional-memory

我一直在研究如何在Haskell中实现事务性内存,我不确定我是否理解暴露给程序员的STM操作如何挂钩到用C编写的运行时系统函数中。在git的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_是什么?
  4. 我只能在newTVar#

    中找到另一个ghc/compiler/prelude/primops.txt.pp
    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,这是如何定义原语,以便编译器知道它们。

1 个答案:

答案 0 :(得分:3)

(# s2#, TVar tvar# #)unboxed tuple

名称stg_newTVarzh来自:

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

  • newTVar这是newTVar#的第一部分;

  • 最终zh,即#的所谓z-encoding:此编码生成所有平台中链接器/ ABI可使用的普通名称,删除有趣的人物,如哈希(#)。