旨辛チキンおいしい

よくある備忘録みたいな奴です。

どこまで理解すれば「理解した」と言えるか

雑に。

Kotlin のコルーチンについて勉強していてふと思った。 どこまで理解すれば理解したと言えるのか。 何かを理解しているつもりの人でも、どこかで「とりあえずこれはこういうものだということにしよう」として理解せずに存在やその効果を認めているはずだ。

たとえば、みんな掛け算を理解していると思っている。 3x4=12。これは3が4つあると考えることができるので、3x4=3+3+3+3。3+3+3+3=12だと。 けどこれには足し算を理解している必要がある。そして足し算は理解している。 3+3というのは、3つと3つを足したもの。「●●●+●●●=●●●●●●」だから6だと。 たぶんこの足し算が「これはこういうものだということにしよう」としているところである。 考えようと思えば、なぜ●+●が●●になるのかを考えないといけない。 なぜ1+1が2なのかという問いになる。

いや、なんなら掛け算はいちいち足し算に置き換えて理解していないかもしれない。 小学2年生のころに覚えた九九を使って、機械的に答えを出しているかもしれない。 「さんしじゅうに」なので3x4は12。その場合九九が「これはこういうもの」である。

話を戻して、プログラミングに関しても同じことが言える。というか多分どんなことにでも言える。 Kotlin のコルーチンは中断可能な処理を実行する機構だ。 中断点 (suspension point) で処理を中断し、なんらかの処理が終わったらまたそこから再開される。 中断点はほとんどの場合 Kotlin 標準ライブラリの suspendCoroutine 関数を呼び出すことで作られる。 suspendCoroutine 関数は引数に取るブロックの引数に Continuation 型の値を取る。 なんらかの処理を行って、それが終わったら ContinuationresumeWith メソッドを実行することで中断していた処理は中断したところから再開される。

では suspendCorotuine はどのようにしてそれを実現しているのか? たぶん気にしなくていい。「コルーチンの中断は suspendCoroutine で行われ、そのブロックの引数に渡される Continuation の resumeWith を呼び出すことでコルーチンが再開される」というふうに理解しても問題ない。 掛け算の例で言うところの九九を暗記しているのと同じだと思う。 コルーチンがどのように Continuation を作成して、どのように中断したポイントから再開しているのかという具体的な技術的な詳細はとりあえずコルーチンを使ってプログラミングをする上では必須の知識ではない。 suspendCoroutineSafeCoroutine クラスと suspendCoroutineUninterceptOrReturn 関数を使っているということは知らなくてもたぶん問題ない。 suspendCoroutineUninterceptOrReturn 関数がどのように実装されているかも、理解していなくてもコルーチンを使ったプログラミングはできる。

仮にここをさらに掘り下げても、その先には JVM の仕組み、 OS の仕組み、 CPU とメモリの仕組み、論理回路の仕組み、電圧と電流と電子に関する学問が待っている。結局どこで「これはこういうものだということにしよう」と割り切るかが問題になる。

個人的に、 Kotlin のコルーチンでは suspendCoroutine がどういうものなのか(理解していればではなく)知っていればとりあえずはいいのかな、と思った。