作成日: 2023/05/31 更新日: 2023/06/02 サイトの紹介と使い方
概要
- CENTOS7 の依存性とは何かについて記述します。
- そして、依存性の問題の解決方法について記述します。
依存性とは
- 依存性を一言で言うと、パッケージとパッケージの関係性のことになります(なんのことやら、よくわかりませんね)。
- 具体的に言うと、『あるパッケージの関数があるパッケージの関数を呼び出すときにルールを破っているパッケージ(の1つのバージョン)が存在しているので、ルールを守ったパッケージを使いましょう(依存しましょう)。』と言うことです。
- ルール違反には、次ようなことが存在します。
パッケージの親子関係
- 関数を呼び出す側と呼び出される側で、パッケージの親子関係が決定されます。
- 仮にパッケージ間で、関数を呼び出す側と呼び出される側の親子関係が統一されていないと、高確率で無限ループを起こします。
- 例えば、再帰関数を例にとると、エンドレスな再帰が行なわれることと似ています。
- 最悪なのは、2つのパッケージ間ではなく、複数のパッケージ間で親子関係が崩れることです。
パッケージを使う側にとって、問題の解決方法を見つけることは不可能になります。 - 親子関係の崩れが、絶対にダメかと言われると、そうではありません。
パッケージを作った人など、そのパッケージを熟知している人はトラップを上手く回避できるはずです。 - よって、汎用的なパッケージは親子関係の木構造を持っていると、信じていますが、yum コマンドで、この親子関係をチェックしているか不明です。
- 尚、現代の技術では、『意図しない無限ループの原因は、ソフトウエアの構造にありますが、起こる確率は、データに依存する』ため、実際にコマンドを動かしてみなければ無限ループが起こるか起こらないか分かりません(木構造の場合、ソフトウェア的に無限ループは起こりません。ハードウエアやOSが原因で起こることはあります)。
関数の存在と重複
- 呼び出される側の関数が存在していなければ、確実に依存性は保持されません。
- また、呼び出される側の関数が複数存在(パッケージの複数バージョンが存在するときなど)する時、依存性が解決されたとしても、意図した関数を呼び出しているかユーザには分かりません。
異なるインターフェイス
- 呼び出される側の関数が存在していても、引数の数とその引数の型が違えば、厳密な高級言語であれば、コンパイラエラーが出ます。
この事は、依存性の解決の時に不具合が分かることを意味します。 - 因みに、インターフェイスとは、関数名、引数の数、その引数の型やサイズのことで、これらのどれか1つでも違う状態で関数を呼び出せば、ほぼ100%の確率で実行コマンドは、暴走するか、OSによって強制停止させられます。(余談ですが、スタックサイズがずれる事が原因です。)
- そして、マシン語やアセンブリ言語では、上記のことが出来てしまいます。
Linux Unix系のOSは、厳密な高級言語であるC言語がベースになっているので、この異なるインターフェイスは、検出できるはずですし、依存性のチェックで行われていると信じています。
依存性の問題の解決方法
力づくで解決する方法
- 多くケースで、依存性に問題があるとき、いくつかのパッケージのバージョンの組合せから最適なものを見つけ出すことで解決できます。
- しかし、この組み合わせの場合数は、膨大な数になるので現実的ではありません。
検索で解決方法を見つける
- 例えば、Google 検索で同じ問題を扱っているサイトに跳んで、情報を集めるのが最も簡単な方法です。
最後に
- 目的が、Linux Unix系OS そのものを知ることだった場合、自分が開発者となる方法もあります。
- そうでない人(筆者を含めて)は、ググってなんとかしましょうね。