問題タブ [ghc-api]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Haskell を型なしラムダ計算 (または GHC コア) にコンパイルするには?
単純な Haskell プログラム (インポートされたライブラリはなく、データ型と純粋な関数のみ) を型指定されていないラムダ計算の項に変換する方法を探しています。有望なアプローチは、GHC APIを使用してプログラムをGHC coreにコンパイルし、型なしラムダ計算に変換することです。
GHC API を使用して Haskell プログラムをロードし、Core にコンパイルする方法は?
haskell - GHC API を使用して Haskell ソースを CORE にコンパイルし、CORE をバイナリにコンパイルする
アイデア
こんにちは!Haskell Core を生成し、GHC API を使用してさらに実行可能ファイルにコンパイルするプログラムを作成したいと考えています。しかし、その前に、非常に基本的な例を作成して、Haskell ソースを CORE にコンパイルしてからバイナリ ファイルにコンパイルする方法を示したいと思います。
問題
私は多くのドキュメントを読み、GHC Api から多くの方法を試しましたが、今のところ成功していません。公式GHC Apiの紹介から始めて、例をうまくコンパイルしました。例では、関数parseModule
、typecheckModule
、desugarModule
、getNamesInScope
およびの使用法を示していますがgetModuleGraph
、最終的なコンパイル手順については説明していません。一方、API にはHscMain.{hscCompileOneShot, hscCompileBatch}やGHC.{compileToCoreModule, compileCoreToObj } など、問題に関連しているように見える関数がいくつかあります。それらを使用しようとしましたが、次の例のように実行時エラーが発生します。
でコンパイルできghc -package ghc Main.hs
、実行時に次のエラーが発生します。
もちろん、これは間違った API の使用の結果である可能性があります。特に、compileCoreToObj False coreMod "foo" "bar"
ドキュメントではあまり説明されていないため、文字列が単なるランダムなものである line が原因である可能性があります。ソースを調べると、最初のものは出力名で、2番目のものは「extCore_filename」であるように見えます。
もう 1 つの懸念事項は、compileCoreToObj
関数の横にあるドキュメントのコメントです。
[...] これは、これまでのところ、単一の自己完結型モジュールでのみテストされています。
しかし、これ以上問題が発生しないことを願っています。
質問
このソリューションを作成する最善の方法は何ですか? Haskell ソースをロードし、それらを CORE にコンパイルし、コアを最終的な実行可能ファイルにコンパイルする (GHC API を使用)。カスタム CORE でさらに置き換えるには、中間ステップが必要です。
副次的な質問として、GHC に外部コア ファイルを提供することは現在可能ですか、それともこの機能はまだ実装されておらず、GHC.Api を使用してコアを手動で構築する必要があります (関連: GHC コアへのコンパイル)
アップデート
.hi
モジュールをロードして.o
ファイルにコンパイルできる小さな例を最終的に作成することができました。CORE を置き換えることができず、オブジェクト ファイルを実行可能ファイルにまだリンクしていないため、これは問題の解決策ではありません。
haskell - ghc api を使用して名前が変更された (完全修飾インポートで) haskell AST を取得する
ghc api を使用して次の ghc コンパイラを動作させ、単一のファイルをコンパイルできます。haskell ソースの名前が変更された AST (すべての関数呼び出しが完全に修飾された AST) を取得したいと思います。
この簡単なデモから、名前変更プロセスは「ロード」機能で行う必要があります。
ソースはこちら
(file:///usr/local/haskell/ghc-7.10.2-x86_64/share/doc/ghc/html/libraries/ghc-7.10.2/src/GhcMake.html#load)
この関数は、GHC の --make モードのコアを実装します。指定されたモジュールを前処理、コンパイル、およびロードし、可能な限り再コンパイルを回避します。ターゲット (hscTarget を参照) によっては、コンパイルとロードの結果、ディスク上にファイルが作成される場合があります。
上記のコード スニペットは、モジュールの依存関係が問題ないことを確認しますが、その後、リンクに直接ジャンプするように見えますか?? リンク機能の場所がわかりません。
関連する投稿:
haskell - Haskell:関数をコンパイルできますか?
単純な Haskell Brainf*ckインタープリターを考えてみましょう。関数だけ見てくださいinterpret
。
だから私はのように適用された関数を持っていますinterpret "[->+<]"
。これによりIO ()
、指定されたプログラムを実行するモナド アクションが得られます。main
いくつかのプログラムの適切なタイプを持っています。
このアクションを実行可能ファイルにコンパイルしたいとしinterpret ...
ます。つまり、メイン関数になる結果を含む実行可能ファイルを生成したいとします。もちろん、この実行可能ファイルには GHC ランタイム システム (無限リスト、整数演算など) が含まれている必要があります。
質問:
- 私の意見では、モナド アクションを実行して新しいファイルとして保存することはまったく不可能です。これは本当ですか?
- 同等の解決策に到達するにはどうすればよいでしょうか? GHC API とヒントは役に立ちますか?
編集
申し訳ありませんが、元の質問を単純化しすぎました。もちろん、次のようなファイルを書くこともできます。
しかし、これは何かをコンパイルしようとするときに通常行うことではないため、interpretFile :: FilePath -> IO ()
代わりに検討してください。BF プログラムをファイル ( helloworld.bf
) に保存するとします。
helloworld.bf
実際にファイルを必要とせずにコンテンツを実行する実行可能ファイルを作成するにはどうすればよいですか?
haskell - GHC API呼び出し時に「WARNING in hptSomeThingsBelowUs, missing module …」という警告が出てしまう原因と解消方法は?
GHC API を使用.hs
して、その場で複数のファイルをロードしようとしていました。と の 2 つの.hs
ファイルを作成test.hs
し、それらをフォルダーModule.hs
に入れました。/tmp
これら 2 つのファイルは非常に単純です。値を含むModule.hs
と呼ばれるモジュールを定義し、値をインポートしてそれ自体にコピーするモジュールを定義します。その内容を以下に示します。Module
Int
test.hs
Test
Module
Int
Module.hs
:
test.hs
:
次に、別のファイルに、GHC API を呼び出してこれら 2 つのファイルをロードする次のコードを記述しました。
プログラムは実行されますが、次の出力が表示されます。
プログラムは式 を正常に評価しprint value
、 を出力します1234
が、関数core2core
は上記の警告メッセージを出力します。一対のコメントの間の 6 行は、プログラムの残りの部分とは何の関係もないように見えます。これは、私が別のはるかに大きなプロジェクトから抽出した最小限の再現可能な例に過ぎないためです。また、警告メッセージはここでは問題ありませんが、そのプロジェクトではより深刻な問題を引き起こします。GHC API は十分に文書化されていないようで、多くの検索を行っても問題を解決できませんでした。警告メッセージの原因を説明し、GHC API を使用して複数のファイルを処理するのを手伝ってくれる人はいますか? 前もって感謝します。