Skip to content
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

GLOBAL_DEFINED_WORDS: 同期に関する操作の2項関係たちを追加 #1360

Open
wants to merge 4 commits into
base: master
Choose a base branch
from

Conversation

akinomyoga
Copy link
Member

@akinomyoga akinomyoga commented Nov 7, 2024

取り敢えず暫定的に作っておきます。実際の変更は、全く違う形もアリだと思っています (例えば無理に日本語にするのはやめて happens before, strongly happens before, synchronizes with, etc. で通すなど)。あと説明はもっとちゃんとしたものがあれば提案していただければ幸いです。


#1359 (comment) by @yohhoy

弱い意見として、「同期」の説明はしなくても良い気がしています。

  • C++標準ライブラリ仕様記述の Synchronization は、マルチスレッドプログラミングの文脈でいう同単語の一般的な用法とニュアンスが異なる。(C++では"happens before"関係を保証する、という意味で使われる)
  • (少なくとも自分の感覚では)「リソースの所有権」はスレッド間同期との直接的な関係を持たない。

...

#1359 (comment) by @akinomyoga

うーん。synchronizes with の訳語として、既に太字 **同期する** というのが使われているみたいですね (でも、単に "同期" だったら cpprefjp 内で雑多な意味で使われている印象)。

この A は B と**同期する** というのは単なる一般の同期の話ではなくて、特に定義された関係 synchronizes with を表すので配慮が必要ですね。"同期する" も GLOBAL_DEFINED_WORDS に登録する? でも "同期する" はストリームが同期するなど別の文脈でも使われている?

Edit: happens before の訳は散らかっています:

この PR で "同期" を入れるか入れないかに関わらず、 synchronizes with および happens before の訳統一と訳語表と GLOBAL_DEFINED_WORDS への登録は独立に実施する必要がある気がします。

@yohhoy
Copy link
Member

yohhoy commented Nov 8, 2024

C++23仕様から、本件Issueで扱うであろう用語群を列挙しておきます。厳密な仕様説明をしない前提であれば "happens before" = "synchronize with" + "sequenced before" とみなせるので、この3語だけでも十分かもしれません。

以下は芋づる式に登場する2項関係:

@akinomyoga
Copy link
Member Author

sequenced before は cpprefjp で既に使われていますね…

他の ~ before と carries a dependency は cpprefjp で使われている (or 将来使われることはある) でしょうか。

GLOBAL_DEFINED_WORDS は (現状) 自動マークアップ用なので cpprefjp で使われないものを頑張って登録する必要もないといえばない (とはいえ、将来的に用語集ページを生成するのに使うのであればユーザー目線で知っておくと良さそうなものについては今から入れておいても良い) ような気がします。

sequenced before 繋がりで他にも色々の sequenced の変種があったような…

  • indeterminately sequenced → Code search results (これで全部かは分からない)
  • sequenced after → cpprefjp では使われていない?
  • unsequenced → cpprefjp では使われていない?

@yohhoy
Copy link
Member

yohhoy commented Nov 8, 2024

参考情報として、他プログラミング言語や他サイトでの "happens before" 訳出例を拾ってみました。

ちなみに、自分が同単語を扱うときは "訳さない" という選択をとっています。どうしても専門用語ぽさのない動詞句になるため、いっそ原単語のままとして目立たせておこう、という心情ですね。

Javaライブラリドキュメント

https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/package-summary.html

Java言語仕様の第17章では、共有変数の読取りや書込みなどのメモリー操作に関する happens-before関係 が定義されています。あるスレッドによる書込みの結果が別のスレッドによる読取りで認識されることが保証されるのは、その書込み操作が読取り操作の 前に発生(happens-before)した 場合だけです。synchronized構文とvolatile構文のほか、Thread.start()メソッドとThread.join()メソッドが happens-before関係 を形成できます。(略)

Java言語規定

https://thinkit.co.jp/cert/article/0711/5/3/2.htm

確かに先ほどの例では、共有している変数(AやB)に対して書き込みをしていました。そして、「17.4.5 Happens-before Order( 先行発生 の順序)」には次のようにあります。

If we have two actions x and y, we write hb(x, y) to indicate that x happens-before y.(訳:二つの動作x、yがある場合、xがyより 先行発生する ことを示すためにhb(x、y)と記述する)。

http://www.y-adagio.com/public/standards/tr_javalang2/memory.doc.html#28920 (相当古い仕様のようで対応原文不明)

(略) 次の規則の大半は,ある特定の動作の実行における順序をさらに制約する。規則は,ある動作が他の動作の前又は後で行われねばならないことを規定している。この関係は,推移的とする。つまり,動作 A が動作 B に 先行 しなければならず,動作 B が動作 C に 先行 しなければならないならば,動作 A は,動作 C に 先行 しなければならない。(略)

Go言語ドキュメント

http://go.shibu.jp/go_mem.html

参照および更新の要求仕様を示すため、Go言語プログラムでのメモリ操作実行に関する部分的な順序関係、happens-before を定義します。イベント e 1がイベント e 2より 前に発生する 場合、 e 2は e 1の後に発生すると言えます。また、 e 1が e 2の前に発生せず、 e 2の後に発生しない場合、 e 1と e 2は同時に発生すると言えます。(略)

https://go-review.googlesource.com/c/go/+/381315/9/doc/go_mem.html Go1.19での改定前バージョン

To specify the requirements of reads and writes, we define happens before, a partial order on the execution of memory operations in a Go program. If event e1 happens before event e2, then we say that e2 happens after e1.
Also, if e1 does not happen before e2 and does not happen after e2, then we say that e1 and e2 happen concurrently. [...]

@@ -114,5 +114,17 @@
},
"オーバーロード解決": {
"desc": "関数呼び出し時に、同名の関数の中から実際に呼び出す関数を決定する処理。このときの候補になることを、オーバーロード解決に参加するという"
},
"と同期する": {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これだと と同期しない という活用のときにマークアップが適用されませんね…

やはり新しく単語を作るか "synchronize with 関係" みたいに英語を保持するか。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

当該関数の仕様は "Synchronization: None" となっており、これを意訳したようです。
上記については書き換えてしまえば「同期しない」という否定系は避けられるとは思います。

Copy link
Member Author

@akinomyoga akinomyoga Nov 8, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

最終的に synchronizes with =「と同期する」で行くのか分かりませんが、取り敢えず f2ae0d6

「処理系(標準ライブラリ)に対する『他の操作と同期しなければならない』という要求はないが、処理系がやりたければ勝手に同期的に動作しても良い」という理解はあっていますか。元の表現だと「処理系は同期してはいけない」というのが規格の要件のようにも読めるので、こういう修正にしました。

Copy link
Member Author

@akinomyoga akinomyoga Nov 8, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"A は B と同期する" という表現だと対称律が成立していそうでよくないなという気がして来ました (「『A は B と同期する』⇔『B は A と同期する』」と勘違いしそう)。例えば "に対して同期する" みたいな方向性のある表現の方が良いのでは。

Edit:

関連する懸念として "synchronizes with 関係" などの語を導入する場合にも、方向性を表現しにくいという問題がある気がします。"A と B は synchronizes with 関係にある" や "A は B と synchronizes with 関係にある" だとよくない。これも "A は B に対して synchronizes with 関係にある" などのようにすれば良いでしょうか。

あと "A は B に対して happens before 関係" や "A は B に対して synchronizes with 関係" などの表現は、"より前に発生する" や "に対して同期する" と比べると余り直感的でなく意味を捉えにくいかも、と思いました。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここで出てきている語の前提知識ほぼない状態で印象論でコメントしておくと、やはり「同期する」とか「関係にある」だと、交換法則が成り立つイメージがどうしてもある気がしています。Golangの訳はそれと比べてわかりやすい気がします。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@akinomyoga

「処理系(標準ライブラリ)に対する『他の操作と同期しなければならない』という要求はないが、処理系がやりたければ勝手に同期的に動作しても良い」という理解はあっていますか。
元の表現だと「処理系は同期してはいけない」というのが規格の要件のようにも読めるので、こういう修正にしました。

うーん... 自信をもった回答ではありませんが、下記ニュアンスなのかなと思います。cpprefjpとしては B の意図が誤解なく伝われば十分ですから、修正後の文面 「特に他操作と同期する規定はない」 には賛同です。

  • A: 標準ライブラリ実装者向け:同期的な動作として実装することは否定されない。ただし、その必要性もないしパフォーマンス低下につながるため推奨しない。
  • B: 利用者(プログラマ)向け:API仕様として同期的な操作を期待してはいけない=スレッド間同期に使うな。

Copy link
Member

@yohhoy yohhoy Nov 14, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@akinomyoga : "A は B と同期する" という表現だと対称律が成立していそうでよくないなという気がして来ました (「『A は B と同期する』⇔『B は A と同期する』」と勘違いしそう)。

@yumetodo : やはり「同期する」とか「関係にある」だと、交換法則が成り立つイメージがどうしてもある気がしています。

お二人ともご指摘されるように、「A は B と同期する」では対称性あり/交換可能と誤解されるリスクはあると思います。ただこれは原語 A synchronizes with B 時点でも同じニュアンスを持つ気がしており、形式的定義の難解さによるものかなと半ばあきらめています...

挙げられている「A は B に対して同期する」は「~と同期する」よりも方向を持つニュアンスがある感じがするので、よい訳語かもしれませんね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants