-
Notifications
You must be signed in to change notification settings - Fork 121
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
default option系定数をC/C++以外(主にC#)から取得する場合に煩雑になる #549
Comments
わかりやすい説明&提案ありがとうございます! ちょっと調べてみた感じ、PythonのctypesやJavaのJNI?やNode.jsも定数の取得が困難そうでした。定数を返す関数を自分でcppで書いてもらえればいけるかもしれない、くらい。 定数から関数にする場合のメリット・デメリットを列挙してみました。
定数を扱うのが難しい言語には別口でラッパーを提供できると嬉しいけどまだできてないので、まあ関数が良いんだろうなーという気持ちです。 一方で、Rust内で定数として取り回してexternまで持っていくのは結構考えて努力したこともあり、ちょっと名残惜しくもあります。 @qryxip さんや @PickledChair さんの意見も聞いてみたいです。 (もし戻すとなったら僕の知識不足が原因なので、申し訳ないです。。。) |
この辺りあまり詳しくないのですが、このように言語間で FFI 機能の差異がありそうというのは盲点でした……。もしかしたらどの言語でも定数の取得自体は可能なのかもしれませんが、やりやすさに差異があるかもしれません(前に Haskell の FFI を利用した実装を読む機会があったのですが、C 側で定数を返すだけの関数を定義しているのを見たことがありました。実際のところ Haskell で定数の取得が難しいのかどうかはわかっていませんが……)。その点では、関数呼び出しで値を取得する API はどの言語でも簡単に扱えそうだと思いました。 よく使われる言語それぞれのその辺りの事情をなるべく網羅的に調べる、というのはオーバーワークだと思ったので、関数で値を返す実装に戻すのが現実的なのかな、と感じました。 また、 @shigobu さんの指摘に
とあるように、言語だけでなくプラットフォーム間の差異も関わってきそうです。関数で返す実装にすることで簡潔な実装を実現できるのであれば、そうするのが良さそうだと思いました。 |
関数に戻すのに賛成します。 この件については私の経験が不足していたと思っています。Stringと 具体的な方法としては
というよりは、 #503 を丸ごと取り消す勢いでconst-defaultごと剥がすのがいいと思っています(revertはきついと思うので上から剥がす形になると思います)。const-defaultはC APIのためだけに入れていたので、後腐れない方がよいかと。
ちなみに定数に対応している言語についてですが、ctypesからはoptionsもversionも普通に読めました。Haskellも試してはいませんができるように見えました( あと本題からはずれるかもしれませんが、C#のような言語だとラッパーとしては"default option"は使わずにオプショナル引数にするのがすっきりするんじゃないかなと思っています。Python APIは今こうなっています。 voicevox_core/crates/voicevox_core_python_api/python/voicevox_core/_rust.pyi Lines 217 to 222 in cb8e83c
|
個人的には結構手を広げたいんですよね。考えているのは次のものです。
もしこれらが全部できるなら、C APIについてはスキー場にある"EXPERT ONLY"の立て札のような感じで「Cに馴染みが無いならNodeとかPythonから使いなさい」みたいな案内にできるんじゃないかなーと思っています。 |
お二人ともありがとうございます!! 関数に戻すのが丸いのかなと思いました!! 方針としては @qryxip さんの仰るとおり、 #503 をまるごと取り除く勢いで戻していくのがおそらくコードとメンテナンス上一番いいのかなと思います。 各言語へのラッパーは面白いなと思いつつ、やっぱり0.15のアップデートが一区切りしてからかなと思います。 |
Mobile用に作るならJava(Kotlin)とSwiftかなと思います。(構造的に) |
C#ラッパーについては、私が協力できます。 |
内容
Coreの新しいvvm-async-apiでは、voicevox_versionやdefault optionを取得する方法が、関数からDLL埋め込み定数に変更されました。C/C++で取得する場合は、通常の変数と同じように使えます。
しかし、C#で取得する場合、
LoadLibrary
とGetProcAddress
を使用する必要がありコード量が増えます。また、C#の新しいフレームワーク(.NET Core 3.0以降)では、LoadLibrary
とGetProcAddress
はWin32APIであり、クロスプラットフォーム対応する場合にはOSごとに処理を記述する必要があり、さらにコード量が増え複雑になります。LoadLibrary
とGetProcAddress
のクロスプラットフォーム対応版が標準で用意されているようでした。関数として定義されている場合には、簡単なコードで使用できます。
以前のように、関数として定義されていると嬉しいです。
Pros 良くなる点
C#から使う場合に、簡単なコードでdefault optionを取得できる。
Cons 悪くなる点
構造体の初期値を取得するだけなのに、関数を呼ぶ必要がある。
実現方法
#503 で実装されているので、これを無かったことにする??
VOICEVOXのバージョン
2023/07/26現在のmainブランチ
OSの種類/ディストリ/バージョン
その他
#503 (comment)
での発言にあるように、定数のドキュメントがヘッダーファイルに反映されない問題があります。これも、関数に戻すことで解消されるかと思います。
また、Windowsで使用するためのdllinport定義が自動で作成されない問題もあります。
これも、関数に戻すことで解消されると思います。
The text was updated successfully, but these errors were encountered: