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);
}
我的问题:
- 什么是第一个和最后
#
意味着(# s2#, TVar tvar# #)
。我已经阅读过,在变量仅仅是一个命名约定,表明某些东西被拆箱之后放置了一个#
,但是它本身是什么意思? - 我们怎样从
newTVar#
到stg_newTVarzh
?似乎我错过了这两者之间的另一个定义。编译器是否将newTVar#
重写为对列出的C函数的调用? - 什么都在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,这是原语的定义方式,这样编译器知道它们。
'(#s2#,TVar tvar##)'是一个未装箱的元组。 https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/primitives.html#unboxed-tuples – chi
在'stg_newTVarzh'中,最后一个'zh'是所谓的'#'的z编码:这种编码在所有平台上生成一个可由链接器/ ABI使用的普通名称,去除有趣的字符,如散列(#)。我忘了这个编码实际上定义在哪里。 'stg_'前缀对于整个GHC运行时是通用的,并且代表无主标签的G-machine,一种评估函数式语言的抽象机器。 – chi
z编码详细[这里](https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/SymbolNames),以防万一有兴趣。 – user2407038