2

我一直在寻找如何事务内存在Haskell中实现,我不知道我知道如何暴露给程序员勾成C语言编写的运行系统功能的STM操作中的ghc/libraries/base/GHC/Conc/Sync.hs混帐回购协议,我看到了如下定义:挂接到GHC的运行时系统

-- |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_

我只能够找到一个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

'(#s2#,TVar tvar##)'是一个未装箱的元组。 https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/primitives.html#unboxed-tuples – chi

+1

在'stg_newTVarzh'中,最后一个'zh'是所谓的'#'的z编码:这种编码在所有平台上生成一个可由链接器/ ABI使用的普通名称,去除有趣的字符,如散列(#)。我忘了这个编码实际上定义在哪里。 'stg_'前缀对于整个GHC运行时是通用的,并且代表无主标签的G-machine,一种评估函数式语言的抽象机器。 – chi

+1

z编码详细[这里](https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/SymbolNames),以防万一有兴趣。 – user2407038

回答

3

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

名称stg_newTVarzh从内置:

  • stg_前缀,这是共同的整个GHC运行时,和代表所述没骨气-无标记G-机,一个抽象机,以评估功能的语言;

  • newTVar这是newTVar#第一部分;

  • 最终zh,这是所谓的#z-encoding:此编码生成由链接器一起使用的普通名称/ ABI的在所有平台上,除去奇怪的字符像井号(#)。