概要
情報技術の基礎として理解しておきたい ソフトウェア のうち、ファイルシステム、開発支援ツール、言語処理ツール、最適化、OSS、ライセンスを整理する。
パスの基準、プログラムの翻訳・結合、最適化で保つべき動作を具体例で確認する。OSSについては製品名だけで判断せず、版と配布物のライセンス条件を読み分ける。
この記事の構成
- ファイルシステム
ファイルシステムとは記憶装置に保存されたデータをファイルとしてディレクトリ管理する仕組みのこと。 - プログラミングツール
プログラミングツールの意味と要点を具体例から整理。 - 言語処理ツール
別ファイルの関数を呼ぶ例で翻訳・リンク・ロードの役割を区別。 - コンパイラ最適化
ループ不変式の移動から処理を減らしても意味を変えない条件を確認。 - オープンソースソフトウェア(OSS)
オープンソースソフトウェア(Open Source Software)とはソースコードを入手でき、ライセンス条件に従って利用、改変、再配布できるソフトウェアのこと。 - OSSの信頼性
OSSを利用する場合に重要となる信頼性について次の項目で評価。 - OSSのライセンス
OSSで使われるライセンス上の考え方、提供方法、具体的なライセンスを整理。
ファイルシステム
ファイルシステムとは記憶装置に保存されたデータをファイルとしてディレクトリ管理する仕組みのこと。
最上位ディレクトリをルートディレクトリ、ルートディレクトリからファイルまでのフルパスを絶対パス、任意のディレクトリからファイルまでを相対的に表すパスを相対パスという。
-
相対パスが同じでも開くファイルは変わる
目的のファイルが/srv/app/data/items.csvにあるとする。作業ディレクトリが/srv/appなら、相対パスdata/items.csvで参照できる。しかし、作業ディレクトリが/srv/workerに変わると、同じ文字列は/srv/worker/data/items.csvを指す。対話実行では動くのに定期実行でファイルが見つからない場合、ファイル名だけでなく、パスの基準になる作業ディレクトリを確認する。絶対パスを使うか、基準ディレクトリを明示して組み立てることで、起動場所への依存を減らせる。
プログラミングツール
開発ツールと呼ばれるものに工程の一部を自動化(E-R図からDBを作成するなど)するCASE(Computer Aided Software Engineering)ツールや、開発作業全体的に支援するIDE(Integrated Development Environment:統合開発環境)がある。
- IDEの代表例
Eclipse、Visual Studio、Visual Studio Code、Xcodeなど。
以下、IDEが搭載するプログラミングツールの代表的な機能。
-
トレーサ
プログラムの実行経路(実行履歴)を出力する機能。 -
インスペクタ
プログラム実行時変数やオブジェクトなどが持つデータ内容を表示する機能。 -
エディタ
効率的にコーディングできるようプログラムコードを見やすく、編集しやすくしたエディタ機能。 -
リポジトリ
開発の成果物を一元管理するデータベース。バージョン管理により差分の確認や最新状態の戻しなど容易に操作できる。
リポジトリを管理する代表的なバージョン管理システム:Git、SVN(Subversion)など。 -
アサーションチェッカー
プログラム処理の途中にアサーション(想定通り実行されれば論理的に成立する条件)を登録して、期待通りであるかチェックする機能。 -
エミュレータ
プログラム搭載されるコンピュータやハードウェアの動作を再現する機能。 -
シミュレータ
仮想的な状況を模擬的に再現し、シミュレーションできる機能。 -
スナップショット
任意のストレージ状態をそのまま記録する機能で復元も可能。 -
プロファイラ
プログラム性能の改善を目的とした監視項目(モジュール単位の実行回数や実行時間など)を計測および解析する機能。
言語処理ツール
言語処理ツールとはプログラム言語を実行する際に必要となる機能を指し、次の種類がある。
-
コンパイラ
ソースコード全体を機械語、オブジェクトコード、中間コードなどの別形式へ変換する機能。 -
インタプリタ
ソースコードを命令単位の実行順に解析し、実行可能な状態に変換しながら命令単位でプログラムを実行する機能。 -
クロスコンパイラ
開発環境とは別の環境に向けて実行ファイルを作成する機能。
※ 組込み型システムでは実機環境へ向けてコンパイルし、実行ファイルを組込むことが多い。 -
アセンブラ
アセンブリ言語を機械語による表現へ変換する機能。- アセンブリ言語、機械語について
→ 応用情報技術 - プログラム構造・言語 > プログラム言語の変遷
- アセンブリ言語、機械語について
-
ジェネレータ
指定した条件に基づいてデータやソースコードを自動的生成する機能。
-
コンパイルできても実行形式が完成したとは限らない
Cのソースから別のファイルに定義した関数を呼ぶ場合を考える。関数宣言が正しければ呼出し側だけをオブジェクトファイルへコンパイルできる。しかし、その関数の実体を持つファイルやライブラリを結合しなければ、リンク時に未解決の参照としてエラーになる。コンパイラは翻訳し、リンカーは複数のオブジェクトやライブラリを結合して参照先を解決する。その後、実行時にはローダーなどがプログラムをメモリへ配置する。エラーが翻訳・結合・実行のどこで起きたかを分けると、修正すべき対象を絞れる。
コンパイラ最適化
コンパイル時に実行速度、コードサイズ、メモリ使用量など、指定した目的に応じてプログラムを効率化する機能。複数の目的にはトレードオフがあるため、すべてを同時に最小化できるとは限らない。
次の最適化技法がある。
-
ループ最適化
ループ処理で条件が変化しないなどのループ不変式をループの前に移動するなど、ループ内の処理量を減らす最適化のこと。 -
局所最適化
基本ブロックなど、プログラム内の限られた範囲を対象に不要な計算の除去や式の簡略化を行う最適化のこと。 -
プロシージャ間最適化
プログラム全体を対象とし、プロシージャの境界やファイルの境界を越えた最適化のこと。 代表的な最適化として関数の呼出し元に関数内の処理を展開し、関数への制御転送を無くすインライン展開がある。
-
同じ計算に見えても外へ出せる条件がある
10回のループの中で毎回a * bを計算し、aとbが途中で変わらず、計算の移動が観測可能な動作を変えないなら、ループの前で一度だけ求める最適化が考えられる。これはループ不変式の移動にあたる。しかし、値が変わる関数呼出しや入出力まで同じように一回へまとめると、プログラムの意味が変わる。また、浮動小数点の加算では丸めがあるため、結合法則を無条件に使って計算順序を変えることもできない。最適化を理解するには演算回数だけでなく、変えてよい振る舞いの範囲を見る必要がある。
オープンソースソフトウェア(OSS)
オープンソースソフトウェア(Open Source Software)とはソースコードを入手でき、ライセンス条件に従って利用、改変、再配布できるソフトウェアのこと。無償であること自体は必須条件ではなく、配布条件が次の定義を満たすことが重要となる。
- OSSの定義(オープンソース推進団体OSIのオープンソースライセンス条件)
- 自由に再配布できること。
- ソースコードを公開すること。
- 改変や派生物の作成と頒布を許可すること。
- 基本ソースとパッチ(差分情報)という形で頒布することを義務づけても良い。
- 個人やグループに対する差別をしないこと。
- 利用する分野に対する差別をしないこと。
- ライセンス分配に追加ライセンスを必要としないこと。
- 特定製品でのみ有効なライセンスにしないこと。
- 他のソフトウェアを制限するライセンスにしないこと。
- ライセンスは技術的な中立を保つこと。
※ 詳細:https://opensource.org/osd
以下、代表的なOSS。
-
Webサーバー構築
Nginx、Apache HTTP Server、H2O、OpenLiteSpeed など。
※ LiteSpeed Web Server Enterpriseは商用製品で、OpenLiteSpeedがオープンソース版となる。 -
APサーバー構築
Apache Tomcat、GlassFish、Payara、Jetty など。 -
ログ管理構築
Apache Log4j、Fluentd など。 -
メールサーバー構築
Postfix、qmail、sendmail など。 -
DNSサーバー構築
BIND、PowerDNS、Unbound など。 -
DBサーバー構築
PostgreSQL、MySQL、MariaDB など。 -
ORマッピング構築
MyBatis、Hibernate など。 -
OS構築
CentOS Stream、Ubuntu、Fedora、FreeBSD など。
※ CentOS Linux 7は\(2024\)年\(6\)月\(30\)日にサポートを終了している。 -
プログラム言語
Java、PHP、Ruby、Perl、Go など。 -
Java向けデータ処理ライブラリ
Jackson など。 -
クラウド構築
OpenStack、OKD、Moby、runC など。
※ OpenShiftやDockerには商用製品も含まれるため、ここでは対応するオープンソースプロジェクト名を記載している。 -
機械学習・ディープラーニングライブラリ
TensorFlow、scikit-learn、PyTorch、Keras、PyCaret など。
-
ソースコードを読めることだけではOSSと判定できない
例としてMongoDB Community ServerのSSPL対象版はソースコードを閲覧できるが、SSPLはOSIが認めるオープンソースライセンスではない。このため、本記事のOSSの製品例からは分けて扱う。MongoDBのすべての関連製品・過去の版が同じ条件という意味ではない。製品名だけでなく、 利用する版・配布物に適用されるライセンス を確認する必要がある。この区別は MongoDBの公式FAQ と OSIによるSSPLの説明 で確認できる。
OSSの信頼性
OSSを利用する場合に重要となる信頼性について次の項目で評価する。
- ソフトウェア自体の信頼性
- メンテナンスの容易さ
- 法的問題の有無
- 開発コミュニケーションのサポート体制
特定の時点の知名度だけで判断せず、更新履歴、脆弱性情報、コミュニティの活動状況、ライセンス条件を継続的に確認することが重要となる。
OSSのライセンス
OSSには次のようなライセンス上の考え方、提供方法、具体的なライセンスがある。著作権者は第三者のコードを含む場合の互換性などを確認したうえで、適用するライセンスを選ぶ。
※ 解説は概要レベルに留めているので注意。
-
コピーレフト
著作権を保持したまま利用、改変、再配布を認め、派生物を配布する場合にも同じ自由を保つため、同一または互換性のあるライセンス条件を求める考え方。具体的な義務はライセンスごとに異なる。 -
デュアルライセンス
2種類以上のライセンス形態で配布する形式で利用者の条件に応じて適切なライセンスを選択することができる。
※ 商用ライセンスとオープンソースライセンスの組合わせなど。 -
GPL(GNU General Public License)
GPLで許諾されたプログラムを改変して配布する場合などに、対応するソースコードの提供とGPL条件の維持を求めるコピーレフトライセンス。
他のライセンスのコードと組み合わせて配布できるかは、GPLとのライセンス互換性や結合方法によって異なる。 -
BSD(Berkeley Software Distribution)
著作権表示・ライセンス文・免責条項の保持などを条件に、利用・改変・再配布を認めるライセンス群。2条項、3条項などの種類があり、3条項版には権利者等の名前を無断で宣伝・推奨に使わない条件もあるため、採用する条文を確認する。
まとめ
- ファイルシステムは記憶装置上のデータをファイルとディレクトリの階層で管理。
- コンパイラはソースコードを別形式へ翻訳し、インタプリタはコードを解析しながら実行する。アセンブラやクロスコンパイラは対象とする言語や実行環境が異なる。
- コンパイラ最適化はプログラムの意味を保ちながら実行速度やコードサイズなどを改善する。
- OSSは単なる無料ソフトではなく、ソースコードの公開と利用条件が重要になる。GPLとBSDライセンスでは改変物の配布時などに求められる条件が異なる。
- 実行時の問題は起動場所・翻訳・リンクなど発生段階から切り分ける。ソースコードを閲覧できることだけでは、OSIの定義に沿うOSSとは判定できない。
参考文献
- 瀬戸 美月 (\(2020\)) 『徹底攻略 応用情報技術者教科書』株式会社インプレス
- GNUプロジェクト - GNUライセンスに関してよく聞かれる質問(日本語・GPLの公式解説)
- Open Source Initiative - The Open Source Definition(英語・オープンソースの定義原文)
- GNU Compiler Collection - Optimize Options(英語・コンパイラ最適化の公式仕様)