Предыстория: я пишу игрушечный интерпертер/компилятор Lisp на Haskell для собственного развлечения/назидания. Я пытаюсь добавить возможность компиляции в байт-код LLVM.
Контекст: я читал документацию по LLVM.Core и пример кода (здесь), пытаясь понять средства комбинирования и средства абстрагирования (как описано в Абельсон и Сассман Структура и интерпретация компьютерных программ.), используемые в привязках Haskell LLVM. Есть много мелких частей, и мне не ясно, как они предназначены для совместной работы. Похоже, что над базовыми машинными инструкциями LLVM существует уровень абстракции, который очевиден для тех, у кого большой опыт работы с LLVM, но не задокументирован для тех, кто вроде меня только начинает.
Вопрос. Что такое CodeGenModule
и CodeGenFunction
и как они используются для построения Functions
и Modules
?