FFI 및 DSL 바인딩
Haskell LLVM 바인딩 에서 가변 개수의 인수를 사용하여 함수를 정의하려고합니다 (실제로 컴파일 타임에 알려지지 않은 상수를 의미합니다). 이 질문을 찾았고 대답을 따르려고 노력하고 있습니다.
LLVM을 생성하기 위해 FFI를 사용하는 것으로 완전히 돌아가고 싶지 않고 DSL을 최대한 사용하고 DSL을 통해 할 수없는 작업 만 FFI를 사용하고 싶습니다.
functionType을 통해 유형을 정의 할 수 있었지만 여전히을 호출하여 만든 모듈에 함수를 추가 할 수 없습니다 defineModule
. 또한 다음 단계는 FFI.appendBasicBlock
쉽게 생각 하는 함수에 기본 블록을 추가하는 것이라고 생각합니다.하지만 모나드 FFI.getParam
의 do 블록 내부를 통해 인수를 얻는 방법은 무엇 CodeGenFunction
입니까?
인수 목록의 크기가 '런타임까지 알려지지 않은 경우, 어쨌든 목록에서 작동하는 함수로 변환해야합니다. (IORef [Word32]) 유형은 IO 작업이 프로그램 실행 중에 (변경 가능한) Word32 목록을 읽고 쓸 것임을 의미합니다. Haskell 프로그램 은 목록을 변경 / 읽기 / 쓰기하는 방법 만 말하면 되므로 IO () 모나드가됩니다.
참조한 LLVM git 프로젝트에 examples / List.hs 파일이 있습니다. LLVM 어셈블리 루틴 "arrayLoop"을 구성합니다.
arrayLoop ::
(Phi a, IsType b,
Num i, IsConst i, IsInteger i, IsFirstClass i, CmpRet i Bool) =>
Value i -> Value (Ptr b) -> a ->
(Value (Ptr b) -> a -> CodeGenFunction r a) ->
CodeGenFunction r a
arrayLoop len ptr start loopBody = do
int, p 목록에 대한 포인터를 증가시키고 'body'블록을 호출 할 때마다 나머지 길이 i를 감소시킵니다. 이 블록은 반복적으로 'loopBody'를 호출하고 결과를 'vars'에 저장하며, 결과는 mList 함수 내에서 결국 's'로 반환됩니다 (0에서 변경되지 않음).
mList ::
CodeGenModule (Function
(StablePtr (IORef [Word32]) -> Word32 -> Ptr Word32 -> IO Int32))
mList =
createFunction ExternalLinkage $ \ ref size ptr -> do
next <- staticFunction nelem
let _ = next :: Function (StablePtr (IORef [Word32]) -> IO Word32)
s <- arrayLoop size ptr (valueOf 0) $ \ ptri y -> do
flip store ptri =<< call next ref
return y
ret (s :: Value Int32)
nelem / NextListElement에 대한 모든 추가 항목은 목록을 한 번 왼쪽으로 이동하는 'loopBody'에 대한 예제 내에서 사용됩니다. 이 저장소에는 haskell-llvm@projects.haskellorg와 같은 메일 링리스트도 언급되어 있습니다.
GHC7은 LLVM을 사용하여 컴파일 할 수 있지만 GHC가 JIT 컴파일을 수행하지 않는 한 언어를 해석하는 Haskell 프로그램에서는 도움이되지 않을 것이라고 생각합니다. 이것이 사실인지 아는 사람이 있습니까?
참조 URL : https://stackoverflow.com/questions/9018449/binding-ffi-and-dsl
'programing' 카테고리의 다른 글
Ember CLI 테스트 복잡한 모델 관계 (0) | 2021.01.16 |
---|---|
Composer를 업데이트 한 후 Nelmio Api Doc에서 그룹 제외가 작동하지 않음 (0) | 2021.01.16 |
브라우저에서 Colorbox의 일관성 (0) | 2021.01.16 |
장면 전환 애니메이션의 JNI 오류-레이어가 최대 값을 초과합니다. (0) | 2021.01.16 |
내부 CoordinatorLayout과 함께 BottomSheetBehavior 사용 (0) | 2021.01.16 |