簡體   English   中英

尾位置上下文 GHC 連接點論文是如何形成的?

[英]How are tail-position contexts GHC join points paper formed?

Compiling without Continuations描述了一種使用連接點擴展 ANF System F 的方法。 GHC 本身在 Core(一種中間表示)中具有連接點,而不是直接在表面語言(Haskell)中公開連接點。 出於好奇,我開始嘗試編寫一種簡單地使用連接點擴展 System F 的語言。 也就是說,連接點是面向用戶的。 但是,我不明白論文中的打字規則。 以下是我理解的部分:

  • 有兩種環境,一種用於普通值/函數,另一種僅具有連接點。
  • 在幾個規則中的有理數是ε 在表達式let x:σ = u in...u不能引用任何連接點 ( VBIND ),因為它的連接點不能返回到任意位置。
  • JBIND的奇怪打字規則。 這篇論文很好地解釋了這一點。

這是我不明白的。 論文介紹了一種我稱之為“頭頂箭頭”的符號,但論文本身並沒有明確地給它命名或提及它。 從視覺上看,它看起來像一個指向右側的箭頭,並且位於表達式上方。 粗略地說,這似乎表明了一個“尾部上下文”(論文確實使用了這個術語)。 在本文中,這些箭頭可以應用於術語、類型、數據構造函數甚至環境。 它們也可以嵌套。 這是我遇到的主要困難。 有幾條前提規則包括頂箭頭下的類型環境。 JUMPCASERVBINDRJBIND都包含具有這種類型環境的前提(本文中的圖 2)。 但是,沒有任何類型的規則得出結論,其中類型環境位於頂箭頭下方。 所以,我看不出JUMPCASE等如何被使用,因為前提不能由任何其他規則推導出來。

這就是問題所在,但如果有人有任何提供更多上下文的補充材料是頭頂箭頭約定,或者如果有人知道 System-F-with-join-points 類型系統的實現(除了 GHC 的 IR),那將也有幫助。

在本文中, x⃗表示“由適當分隔符分隔的x序列”

幾個例子:

如果x是一個變量,則 λ x⃗ e是 λ x 1的縮寫。 λ × 2 ... λ x n e 換句話說,許多嵌套的 1 參數 lambda,或多參數 lambda。

如果στ是類型,則 σ⃗τσ 1σ 2 → ... → σ nτ的縮寫。 換句話說,一個具有許多參數類型的 function 類型。

如果a是類型變量且σ是類型,則 ∀ a⃗ σ是 ∀ a 1的縮寫。 2 … ∀一個n σ 換句話說,許多嵌套的多態函數,或具有許多類型參數的多態 function。

在論文的圖 1 中,跳轉表達式的語法定義為:

e , u , v ⩴ … | 跳躍j φ⃗ e⃗ τ

如果將此聲明轉換為 Haskell 數據類型,它可能如下所示:

data Term
  -- | A jump expression has a label that it jumps to, a list of type argument
  -- applications, a list of term argument applications, and the return type
  -- of the overall `jump`-expression.
  = Jump LabelVar [Type] [Term] Type
  | ... -- Other syntactic forms.

也就是說,一個數據構造函數采用 label 變量j ,類型為 arguments φ⃗的序列,項序列 arguments e⃗和返回類型τ

將事物“壓縮”在一起:

有時,頭頂箭頭的多次使用會隱含約束它們的序列具有相同的長度。 發生這種情況的一個地方是替換。

{ φ /⃗ a } 的意思是“用 φ 1 替換 a 1 φ 2替換a 2 ,……,用φ n替換a n ”,隱含地斷言a⃗φ⃗具有相同的長度n

工作示例: JUMP規則:

JUMP規則很有趣,因為它提供了排序的多種用途,甚至是前提序列。 這里又是一條規則:

( j : ∀ a⃗ . σ⃗ → ∀ r . r ) ∈ Δ

(Γ; ε ⊢⃗ u : σ { ϕ /⃗ a })


Γ; Δ ⊢跳轉j ϕ⃗ u⃗ τ : τ

第一個前提應該相當簡單,現在:在 label 上下文 Δ 中查找j ,並檢查j的類型是否以一堆 ∀ 開頭,然后是一堆 function 類型,以∀3DC24B353B0AEE356B結尾 r

第二個“前提”實際上是一系列前提。 它在循環什么? 到目前為止,我們在 scope 中的序列是φ⃗σ⃗a⃗u⃗

ϕ⃗a⃗在嵌套序列中使用,所以可能不是這兩個。

另一方面,如果考慮它們的含義, u⃗σ⃗似乎很合理。

σ⃗是 label j期望的參數類型列表,而u⃗是提供給 label j的參數術語列表,您可能希望一起迭代參數類型和參數術語是有道理的。

所以這個“前提”實際上是這樣的:

對於每對σu

Γ; εu : σ { ϕ /⃗ a }

偽 Haskell 實現

最后,這里有一個稍微完整的代碼示例,說明了這個打字規則在實際實現中的樣子。 x⃗被實現為x值的列表,當不滿足前提時,一些 monad M用於表示失敗。

data LabelVar
data Type
  = ...
data Term
  = Jump LabelVar [Type] [Term] Type
  | ...

typecheck :: TermContext -> LabelContext -> Term -> M Type
typecheck gamma delta (Jump j phis us tau) = do
  -- Look up `j` in the label context. If it's not there, throw an error.
  typeOfJ <- lookupLabel j delta
  -- Check that the type of `j` has the right shape: a bunch of `foralls`,
  -- followed by a bunch of function types, ending with `forall r.r`. If it
  -- has the correct shape, split it into a list of `a`s, a list of `\sigma`s
  -- and the return type, `forall r.r`.
  (as, sigmas, ret) <- splitLabelType typeOfJ
  
  -- exactZip is a helper function that "zips" two sequences together.
  -- If the sequences have the same length, it produces a list of pairs of
  -- corresponding elements. If not, it raises an error.
  for each (u, sigma) in exactZip (us, sigmas):
    -- Type-check the argument `u` in a context without any tail calls,
    -- and assert that its type has the correct form.
    sigma' <- typecheck gamma emptyLabelContext u
    
    -- let subst = { \sequence{\phi / a} }
    subst <- exactZip as phis
    assert (applySubst subst sigma == sigma')
  
  -- After all the premises have been satisfied, the type of the `jump`
  -- expression is just its return type.
  return tau
-- Other syntactic forms
typecheck gamma delta u = ...

-- Auxiliary definitions
type M = ...
instance Monad M

lookupLabel :: LabelVar -> LabelContext -> M Type
splitLabelType :: Type -> M ([TypeVar], [Type], Type)
exactZip :: [a] -> [b] -> M [(a, b)]
applySubst :: [(TypeVar, Type)] -> Type -> Type

據我所知,SPJ 的符號風格,這與我在論文中看到的一致,它只是意味着“0 或更多”。 例如,您可以將\overarrow{a}替換為a_1, …, a_n , n >= 0

在某些情況下它可能是“1 或更多”,但不難確定兩者中的哪一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM