4-3-応 c++に関する知識 - ipa.go.jp ·...

23
OSS モデルカリキュラムの学習ガイダンス 4-3-C++に関する知識 1. 科目の概要 C++での OSS 開発において、セキュリティを強化し、並列処理による効率を考慮した技 術、様々なライブラリを通じて可搬性や使用性を向上させる技術などを解説する。更に OSS のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント 本科目の学習により習得することが期待されるポイントは以下の通り。 習得ポイント シラバスの対応コマ 4-3-応-1. メモリアロケートの詳細 プログラムの実行単位であるプロセスと、プロセスが利用する仮想アドレス空間の概念 について解説する。更に、仮想アドレス空間を構成する5つの領域の特徴を説明し、 変数の領域確保の方法や生存期間といったメモリアロケートの詳細内容を解説する。 1 4-3-応-2. アーキテクチャとセキュリティ C++のプログラミングにおいて、CPUのアーキテクチャが異なることを考慮しなければ ならない項目について解説する。また、バッファオーバーランやメモリリークといった、 メモリを管理する上でセキュリティに注意しなければならない事項を解説する。 2 4-3-応-3. テストとデバッグ OSSの品質保証活動を支援する、テストとデバッグの手順を解説する。また、OSSの単 体テストを自動化するフレームワーク、カバレジ測定ツール、デバッグツールなどを紹 介し、その使用方法を説明する。 3 4-3-応-4. ライブラリの構築と利用 汎用性と再利用性といったライブラリの概念と、静的ライブラリや共有ライブラリの特徴 を解説する。また、それぞれのライブラリによって異なる利用方法や、OSSのコミッタとし て必要知識となるライブラリの構築方法を説明する。 4 4-3-応-5. 並列処理 並列処理と並行処理についての概念を解説し、逐次処理と並列処理の違いを説明す る。更に、Cにおける、複数のプロセスを並列実行するマルチプロセスの手法と、同一 プロセス内での並列処理技法であるマルチスレッドを解説する。 5,9 4-3-応-6. ネットワーク TCP/IPでのクライアントプロセス・サーバプロセスといった、ネットワークプログラミング の概要を説明し、ネットワーク通信のAPIとしてソケットを紹介する。更に、APIを使用し たセッション管理のCによる実装方法を解説する。 6,9 4-3-応-7. データベース データベースシステムの構成要素として、アプリケーションとDBMSの関連性などにつ いて解説する。また、C++によるデータベースプログラミングの実装として、単純なテー ブルの作成や照会などを行うクエリを埋め込んだソースコードを例にあげ、DBMSライ ブラリの使用方法を解説する。 7,10 4-3-応-8. GUI GUIアプリケーションを開発するために用意された著名なウィジェットライブラリである Qtを紹介する。Qtの導入方法、基本的な構造、特徴について述べ、Qtで使われるシ グナルとスロットの概念を説明する。また簡単なサンプルプログラムによりQtの使い方 を示す。 8,10 4-3-応-9. ポータビリティと国際化 オープンソースソフトウェアのポータビリティとしてLSB(Linux Standard Base)の概要を 解説し、国際化としてOpenI18N(Open Internationalization)の概要を説明する。更に、 C++における国際化の手法として、ロケールの設定にあわせた変換方法を解説する。 11 4-3-応-10. コードリーディング オープンソースソフトウェアを読み解くことの意義を説明し、コードリーディングに有効 な手法として、関連するドキュメント類の参照方法や、データ構造と処理の流れを読み 解く方法を説明する。更に解析に有用な統合開発環境やツール類の紹介を行う。 12 【学習ガイダンスの使い方】 1. 「習得ポイント」により、当該科目で習得することが期待される概念・知識の全体像を把握する。 2. 「シラバス」、「IT 知識体系との対応関係」、「OSS モデルカリキュラム固有知識」をもとに、必要に応じて、 従来の IT 教育プログラム等との相違を把握した上で、具体的な講義計画を考案する。 3. 習得ポイント毎の「学習の要点」と「解説」を参考にして、講義で使用する教材等を準備する。 独立行政法人 情報処理推進機構

Upload: others

Post on 29-Aug-2019

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

OSS モデルカリキュラムの学習ガイダンス

4-3-応 C++に関する知識 ※ 1. 科目の概要

C++での OSS 開発において、セキュリティを強化し、並列処理による効率を考慮した技

術、様々なライブラリを通じて可搬性や使用性を向上させる技術などを解説する。更に OSSのソースコードリーディングによる技能向上方法を説明する。

2. 習得ポイント 本科目の学習により習得することが期待されるポイントは以下の通り。

習得ポイント 説 明 シラバスの対応コマ

4-3-応-1. メモリアロケートの詳細プログラムの実行単位であるプロセスと、プロセスが利用する仮想アドレス空間の概念について解説する。更に、仮想アドレス空間を構成する5つの領域の特徴を説明し、変数の領域確保の方法や生存期間といったメモリアロケートの詳細内容を解説する。

1

4-3-応-2. アーキテクチャとセキュリティC++のプログラミングにおいて、CPUのアーキテクチャが異なることを考慮しなければならない項目について解説する。また、バッファオーバーランやメモリリークといった、メモリを管理する上でセキュリティに注意しなければならない事項を解説する。

2

4-3-応-3. テストとデバッグOSSの品質保証活動を支援する、テストとデバッグの手順を解説する。また、OSSの単体テストを自動化するフレームワーク、カバレジ測定ツール、デバッグツールなどを紹介し、その使用方法を説明する。

3

4-3-応-4. ライブラリの構築と利用汎用性と再利用性といったライブラリの概念と、静的ライブラリや共有ライブラリの特徴を解説する。また、それぞれのライブラリによって異なる利用方法や、OSSのコミッタとして必要知識となるライブラリの構築方法を説明する。

4

4-3-応-5. 並列処理並列処理と並行処理についての概念を解説し、逐次処理と並列処理の違いを説明する。更に、Cにおける、複数のプロセスを並列実行するマルチプロセスの手法と、同一プロセス内での並列処理技法であるマルチスレッドを解説する。

5,9

4-3-応-6. ネットワークTCP/IPでのクライアントプロセス・サーバプロセスといった、ネットワークプログラミングの概要を説明し、ネットワーク通信のAPIとしてソケットを紹介する。更に、APIを使用したセッション管理のCによる実装方法を解説する。

6,9

4-3-応-7. データベース

データベースシステムの構成要素として、アプリケーションとDBMSの関連性などについて解説する。また、C++によるデータベースプログラミングの実装として、単純なテーブルの作成や照会などを行うクエリを埋め込んだソースコードを例にあげ、DBMSライブラリの使用方法を解説する。

7,10

4-3-応-8. GUI

GUIアプリケーションを開発するために用意された著名なウィジェットライブラリであるQtを紹介する。Qtの導入方法、基本的な構造、特徴について述べ、Qtで使われるシグナルとスロットの概念を説明する。また簡単なサンプルプログラムによりQtの使い方を示す。

8,10

4-3-応-9. ポータビリティと国際化オープンソースソフトウェアのポータビリティとしてLSB(Linux Standard Base)の概要を解説し、国際化としてOpenI18N(Open Internationalization)の概要を説明する。更に、C++における国際化の手法として、ロケールの設定にあわせた変換方法を解説する。

11

4-3-応-10. コードリーディングオープンソースソフトウェアを読み解くことの意義を説明し、コードリーディングに有効な手法として、関連するドキュメント類の参照方法や、データ構造と処理の流れを読み解く方法を説明する。更に解析に有用な統合開発環境やツール類の紹介を行う。

12

※ 【学習ガイダンスの使い方】

1. 「習得ポイント」により、当該科目で習得することが期待される概念・知識の全体像を把握する。 2. 「シラバス」、「IT 知識体系との対応関係」、「OSS モデルカリキュラム固有知識」をもとに、必要に応じて、

従来の IT 教育プログラム等との相違を把握した上で、具体的な講義計画を考案する。 3. 習得ポイント毎の「学習の要点」と「解説」を参考にして、講義で使用する教材等を準備する。

独立行政法人 情報処理推進機構

Page 2: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

OSS モデルカリキュラムの学習ガイダンス

3. IT 知識体系との対応関係 「4-3-応 C++に関する知識」と IT 知識体系との対応関係は以下の通り。

1 2 3 4 5 6 7 8 9 10 11 12

4-3-応 C++に関する知識

メモリアロケートの詳細

アーキテクチャとセキュリティ

テストとデバッグ

ライブラリの構築と利用

並列処理 ネットワーク データベース GUI演習Ⅰ(ネットワーク・マルチスレッド)

演習Ⅱ(GUI・データベース)

ポータビリティと国際化

コードリーディング

科目名応用レベル

<IT 知識体系上の関連部分> 科目名 1 2 3 4 5 6 7 8 9 10 11 12 13

1IT-IAS 情報保証と情報セキュリティ

IT-IAS1.基礎的な問題

IT-IAS2.情報セキュリティの仕組み(対策)

IT-IAS3.運用上の問題

IT-IAS4.ポリシー

IT-IAS5.攻撃IT-IAS6.情報セキュリティ分野

IT-IAS7.フォレンジック(情報証拠)

IT-IAS8.情報の状態

IT-IAS9.情報セキュリティサービス

IT-IAS10.脅威分析モデル

IT-IAS11.脆弱性

2

IT-SP 社会的な観点とプロフェッショナルとしての課題

IT-SP1.プロフェッショナルとしてのコミュニケーション

IT-SP2.コンピュータの歴史

IT-SP3.コンピュータを取り巻く社会環境

IT-SP4.チームワーク

IT-SP5.知的財産権

IT-SP6.コンピュータの法的問題

IT-SP7.組織の中のIT

IT-SP8.プロフェッショナルとしての倫理的な問題と責任

IT-SP9.プライバシーと個人の自由

3 IT-IM 情報管理IT-IM1.情報管理の概念と基礎

IT-IM2.データベース問合わせ言語

IT-IM3.データアーキテクチャ

IT-IM4.データモデリングとデータベース設計

IT-IM5.データと情報の管理

IT-IM6.データベースの応用分野

4IT-WS Webシステムとその技術

IT-WS1.Web技術 [1-Ⅰ-7]

IT-WS2.情報アーキテクチャ [1-Ⅰ-7]

IT-WS3.デジタルメディア

IT-WS4.Web開発 IT-WS5.脆弱性IT-WS6.ソーシャルソフトウェア

5IT-PF プログラミング基礎

IT-PF1.基本データ構造

IT-PF2.プログラミングの基本的構成要素

IT-PF3.オブジェクト指向プログラミング

IT-PF4.アルゴリズムと問題解決

IT-PF5.イベント駆動プログラミング

IT-PF6.再帰

6IT-IPT 技術を統合するためのプログラミング

IT-IPT1.システム間通信 [1-Ⅰ-3]

IT-IPT2.データ割り当てと交換

IT-IPT3.統合的コーディング

IT-IPT4.スクリプティング手法

IT-IPT5.ソフトウェアセキュリティの実現

IT-IPT6.種々の問題

IT-IPT7.プログラミング言語の概要

7CE-SWE ソフトウェア工学

CE-SWE0.歴史と概要

CE-SWE1.ソフトウェアプロセス

CE-SWE2.ソフトウェアの要求と仕様

CE-SWE3.ソフトウェアの設計

CE-SWE4.ソフトウェアのテストと検証

CE-SWE5.ソフトウェアの保守

CE-SWE6.ソフトウェア開発・保守ツールと環境 [1-Ⅰ-4]

CE-SWE7.ソフトウェアプロジェクト管理

CE-SWE8.言語翻訳

CE-SWE9.ソフトウェアのフォールトトレランス

CE-SWE10.ソフトウェアの構成管理

CE-SWE11.ソフトェアの標準化 [1-Ⅰ-6]

8

IT-SIA システムインテグレーションとアーキテクチャ

IT-SIA1.要求仕様

IT-SIA2.調達/手配

IT-SIA3.インテグレーション [1-Ⅰ-4]

IT-SIA4.プロジェクト管理

IT-SIA5.テストと品質保証

IT-SIA6.組織の特性

IT-SIA7.アーキテクチャ

9IT-NET ネットワーク

IT-NET1.ネットワークの基礎

IT-NET2.ルーティングとスイッチング

IT-NET3.物理層IT-NET4.セキュリティ

IT-NET5.アプリケーション分野 [1-Ⅰ-5]

IT-NET6.ネットワーク管理

CE-NWK0.歴史と概要

CE-NWK1. 通信ネットワークのアーキテクチャ

CE-NWK2.通信ネットワークのプロトコル

CE-NWK3.LANとWAN

CE-NWK4.クライアントサーバコンピューティング [1-Ⅰ-3]

CE-NWK5.データのセキュリティと整合性

CE-NWK6.ワイヤレスコンピューティングとモバイルコンピューティング

CE-NWK7.データ通信

CE-NWK8.組込み機器向けネットワーク

CE-NWK9.通信技術とネットワーク概要

CE-NWK10.性能評価

CE-NWK11.ネットワーク管理

CE-NWK12.圧縮と伸張

CE-NWK13.クラスタシステム

CE-NWK14.インターネットアプリケーション [1-Ⅰ-5,7]

CE-NWK15.次世代インターネット

CE-NWK16.放送

11IT-PT プラットフォーム技術

IT-PT1.オペレーティングシステム [1-Ⅰ-3]

IT-PT2.アーキテクチャと機構

IT-PT3.コンピュータインフラストラクチャ

IT-PT4.デプロイメントソフトウェア [1-Ⅰ-4]

IT-PT5.ファームウェア

IT-PT6.ハードウェア

12CE-OPS オペレーティングシステム

CE-OPS0.歴史と概要

CE-OPS1.並行性CE-OPS2.スケジューリングとディスパッチ

CE-OPS3.メモリ管理

CE-OPS4.セキュリティと保護

CE-OPS5.ファイル管理

CE-OPS6.リアルタイムOS

CE-OPS7.OSの概要

CE-OPS8.設計の原則

CE-OPS9.デバイス管理

CE-OPS10.システム性能評価

コンピュー

ハー

ドウェアと

アー

キテクチャ

13

CE-CAO コンピュータのアーキテクチャと構成

CE-CAO0.歴史と概要

CE-CAO1.コンピュータアーキテクチャの基礎

CE-CAO2.メモリシステムの構成とアーキテクチャ

CE-CAO3.インタフェースと通信

CE-CAO4.デバイスサブシステム

CE-CAO5.CPUアーキテクチャ

CE-CAO6.性能・コスト評価

CE-CAO7.分散・並列処理

CE-CAO8.コンピュータによる計算

CE-CAO9.性能向上

14 IT-ITF IT基礎IT-ITF1.ITの一般的なテーマ [1-Ⅰ-4]

IT-ITF2.組織の問題

IT-ITF3.ITの歴史

IT-ITF4.IT分野(学科)とそれに関連のある分野(学科)

IT-ITF5.応用領域

IT-ITF6.IT分野における数学と統計学の活用

CE-ESY0.歴史と概要

CE-ESY1.低電力コンピューティング

CE-ESY2.高信頼性システムの設計

CE-ESY3.組込み用アーキテクチャ

CE-ESY4.開発環境

CE-ESY5.ライフサイクル

CE-ESY6.要件分析

CE-ESY7.仕様定義

CE-ESY8.構造設計

CE-ESY9.テストCE-ESY10.プロジェクト管理

CE-ESY11.並行設計(ハードウェア、ソフトウェア

CE-ESY12.実装

CE-ESY13.リアルタイムシステム設計

CE-ESY14.組込みマイクロコントローラ

CE-ESY15.組込みプログラム

CE-ESY16.設計手法

CE-ESY17.ツールによるサポート

CE-ESY18.ネットワーク型組込みシステム

CE-ESY19.インタフェースシステムと混合信号システム

CE-ESY20.センサ技術

CE-ESY21.デバイスドライバ

CE-ESY22.メンテナンス

CE-ESY23.専門システム

CE-ESY24.信頼性とフォールトトレランス

分野

組織関連事項と情報システム

応用技術

ソフトウェアの方法と技術

システム基盤

10CE-NWK テレコミュニケーション

複数領域にまたがるもの

15CE-ESY 組込みシステム

独立行政法人 情報処理推進機構

Page 3: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

OSS モデルカリキュラムの学習ガイダンス

独立行政法人 情報処理推進機構

4. OSS モデルカリキュラム固有の知識 OSS モデルカリキュラム固有の知識として、Linux の仮想アドレス空間に関する知識が

ある。これを土台として、テスト、データベース、ネットワーク、GUI といった、OSS の

各種ライブラリやツールを用いたプログラミングを通して、実践的な知識を習得する。 科目名 第1回 第2回 第3回 第4回 第5回 第6回 第7回

(1) メモリアロケートの概要

(1) アーキテクチャ (1) テスト (1) ライブラリ (1) 並列処理 (1) ネットワークプログラミング

(1) データベースプログラミング

(2) 仮想アドレス空間の構成

(2) セキュリティ (2) デバッグ (2) 静的ライブラリの構築と利用

(2) マルチプロセスの実装

(2) ソケット (2) DBMSライブラリの使用

(3) 共有ライブラリの構築と利用

(3) マルチスレッドの実装

第8回 第9回 第10回 第11回 第12回(1) Qt (1) 演習の要件 (1) 演習の要件 (1) ポータビリティ (1) ソースコード

リーディング

(2) 代表的なウィジェット

(2) 国際化 (2) コード解析手法

(3) 解析手順

(4) 読みやすいコード

4-3-応 C++に関する知識

(網掛け部分は IT 知識体系で学習できる知識を示し、それ以外は OSS モデルカリキュラム固有の知識を示している)

Page 4: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 1

スキル区分 科目 レベル

プログラミング分野 4-3-応 C++に関する知識 応用

習得ポイント 4-3-応-1. メモリアロケートの詳細

対応する

コースウェア

第 1 回 メモリアロケートの詳細

4-3-応-1. メモリアロケートの詳細

プログラムの実行単位であるプロセスと、プロセスが利用する仮想アドレス空間の概念について解

説する。更に、仮想アドレス空間を構成する5つの領域の特徴を説明し、変数の領域確保の方法や

生存期間といったメモリアロケートの詳細内容を解説する。

【学習の要点】

* プログラムの実行単位であるプロセスは、仮想アドレス空間が主記憶装置の物理メモリに対応

付けられ実行される。

* 仮想アドレス空間は、5つの領域で構成され、それぞれの特性に合わせたプログラミングが処理

効率の向上につながる。

* プロセスごとに独自の仮想アドレス空間が割り当てられることで、他のプログラムが使用する変

数の値を書き換えてしまうことや、プログラム自体を書き換えてしまうことがないように、他のプロ

セスへの干渉を防止している。

図 4-3-応-1 メモリアロケートの詳細

Page 5: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 2

【解説】

1) メモリアロケートの概要

Linux は、複数のプログラムを同時に実行可能なマルチタスク OS である。アプリケーションなどのプ

ログラムが実行されると、プログラムの実行単位ごとに、仮想アドレス空間を主記憶装置の物理メモ

リに対応付けて生成し、プロセス ID としてユニークな番号を割り振り、それぞれ独自のプロセスとい

う実行単位で管理する。プロセスごとに独自の仮想アドレス空間が割り当てられることで、他のプロ

グラムが使用する変数の値を書き換えてしまうことや、プログラム自体を書き換えてしまうことがない

ように、他のプロセスへの干渉を防止している。また、同一のプログラムを複数実行しても、それぞ

れを区別することが可能になる。

2) 仮想アドレス空間の構成

仮想アドレス空間を構成する5つの領域は次の通りである。

* テキスト領域

- プログラムの機械語命令が格納される読み取り専用の領域。

* データ領域

- 初期化の指定をした静的変数やグローバル変数が格納される領域。

static int num = 18;

この例では、num の初期値として指定した 18 が、コンパイル結果としてプログラムに int 型

のビットパターンで組み込まれ、プログラムの実行開始時にデータ領域へ割り当てられ、プ

ログラムが終了するまで存続する。

* BSS 領域

- 初期化指定のない静的変数やグローバル変数が格納される領域。

static int num = 18;

この例では、プログラムの実行開始時に、BSS 領域に割り当てられ、0 で初期化され、プロ

グラムが終了するまで存続する。

* ヒープ領域

- new 演算子などで動的に確保される領域。

sampleclass *obj = new sampleclass;

この例では、new 演算子の実行により、sampleclass のインスタンスが、ヒープ領域に割り当

てられる。delete 演算子を使用すれば、ヒープ領域に割り当てられた領域は解放される。

* スタック領域

- 自動変数などが格納される領域。

auto int num;

この例では、自動変数が宣言されているブロックの実行により、int 型のデータサイズ分、ス

タック領域に割り当てられる。ブロックの実行が終了すると確保されていた領域が解放され

る。

Page 6: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 3

スキル区分 OSS モデルカリキュラムの科目 レベル

プログラミング分野 4-3-応 C++に関する知識 応用

習得ポイント 4-3-応-2. アーキテクチャとセキュリティ

対応する

コースウェア

第 2 回 アーキテクチャとセキュリティ

4-3-応-2. アーキテクチャとセキュリティ

C++のプログラミングにおいて、CPU のアーキテクチャが異なることを考慮しなければならない項目

について解説する。また、バッファオーバーランやメモリリークといった、メモリを管理する上でセキュ

リティに注意しなければならない事項を解説する。

【学習の要点】

* 様々なプラットフォームに対応する OSS は、ハードウェアのアーキテクチャによる差異を吸収し

たプログラミングを行い、汎用性と堅牢性を向上しなければならない。

* セキュリティを強化するために、変数の生存期間や値のバインドを考慮したプログラミングを行う

必要がある。

図 4-3-応-2 アーキテクチャとセキュリティ

Page 7: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 4

【解説】

1) アーキテクチャ

オープンソースソフトウェアが対象とするプラットフォームには様々ある。特にプロセッサの違いによ

り、扱うビット幅が異なったり、int 型などの複数バイトで構成する変数をメモリに格納する際、バイト

単位の格納順を規定するエンディアン(バイトオーダ)が異なったりという制約がある。これは往々に

してソフトウェアの不具合を発生させる元となるので、アーキテクチャの差異を吸収したプログラミン

グを行い、汎用性と堅牢性を向上しなければならない。

* データのサイズ

- Linux は、32 ビット CPU や 64 ビット CPU を対象としたクロスプラットフォーム OS であり、デ

ータのサイズを規定するデータモデルについては、32 ビット CPU は ILP32 を標準とし、64

ビット CPU は LP64 を標準としている。

- long 型のデータサイズは、ILP32 は 32 ビット、LP64 は 64 ビットになるので、型変換による

ビットの欠落や、マイナス値の 16 進定数表現で起こる桁不足などを防止する必要がある。

* エンディアン

- エンディアンには、メモリの低位アドレスから順番に格納する方法として、最下位ビットが属

するバイトから格納するリトルエンディアンと、最上位ビットが属するバイトから格納するビッ

グエンディアンの2種類ある。

- 小さいデータサイズへの型変換や、マスキングによる特定バイトの抽出などは、エンディア

ンを考慮する必要がある。

2) セキュリティ

変数のバインドには、変数に値を代入することや、変数を動的に生成することなどがあり、バッファ

オーバーランやメモリリークといったセキュリティ上考慮しなければならない事項と直結している。

* バッファオーバーラン

- 確保した変数領域の最終位置を超えた領域で、バインドされることをバッファオーバーラン

という。値がバインドされれば、別のデータ領域を侵し内容を不正に書き換えてしまう。

* バッファアンダーラン

- 確保した変数領域の開始位置より前の領域で、バインドされることをバッファアンダーランと

いう。値がバインドされれば、別のデータ領域を侵し内容を不正に書き換えてしまう。

* メモリリーク

- new 演算子などで確保した領域で、正しく解放できていない状態をメモリリークという。長時

間作動するアプリケーションでメモリリークを放置した場合は、メモリリークが累積され、パフ

ォーマンスが低下するだけでなく、他のプログラムにも影響を及ぼすことになりかねない。

* 二重解放

- delete 演算子などで解放した領域に対して、同じポインタを使用して再度解放してしまうこ

とを二重解放という。一度解放した領域が再利用されていた場合は、不正に解放してしまう

ことになる。

Page 8: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 5

スキル区分 OSS モデルカリキュラムの科目 レベル

プログラミング分野 4-3-応 C++に関する知識 応用

習得ポイント 4-3-応-3. テストとデバッグ

対応する

コースウェア

第 3 回 テストとデバッグ

4-3-応-3. テストとデバッグ

OSS の品質保証活動を支援する、テストとデバッグの手順を解説する。また、OSS の単体テストを自

動化するフレームワーク、カバレジ測定ツール、デバッグツールなどを紹介し、その使用方法を説

明する。

【学習の要点】

* プログラムやモジュールの仕様に基づいたテストケースを作成し、テストプログラムに実装して動

作を確認することで、正しいプログラムを作成する。

* カバレジ測定ツールでの計測値が要求仕様に満たなければ、品質の向上と保証のためにテス

トケースを改修する。

* デバッグでの原因特定でテストケースの不備が表出すれば、テストケースを改修する。

図 4-3-応-3 テストとデバッグ

Page 9: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 6

【解説】

1) テスト

品質保証活動のひとつにユニットテストがあり、コーディングの後には必ず行う工程である。

* C++において、ユニットテストはクラスや関数をテスト対象の単位とする。ユニットテストを行うため

には、テストケースを作成する必要がある。引数に与える値と、その値で関数を実行したときに

期待される処理結果の期待値について、プログラムやモジュールの仕様に基づきテストケース

を作成する。これをもとに、実行結果と期待値を比較するコードをテストプログラムに実装し、そ

の他スタブやカバレジ測定などのテスト環境を整備する。こうして整った環境下で、テストプログ

ラムを実行し、期待通りの結果となるかどうかをテストするのがユニットテストである。結果が期待

値と異なればデバッグを行い、再度ユニットテストを行うために、テストプログラムを実行する。ま

たカバレジの計測値が要求仕様に満たなければ、テストケースを改修してテストプログラムに実

装し、再度ユニットテストを行う。後にソースコードが改修されれば、それによって既存の機能に

不具合を及ぼしていないか検査するために、再びユニットテストを実行する。このように、一度使

用されたテストプログラムは、後にユニットテストを繰り返す回帰テスト用のテストプログラムとして

再利用される。

* 近年、オープンソースソフトウェアのテストツールが高く評価され、様々なテストツールが普及し

利用されている。そのなかには、ユニットテスト自動化ツールや、カバレジ測定ツールも含まれ

ている。これらのツールを取りそろえたサイトには「Open Source Testing」などがある。C++に関

する代表的なテストツールには下記のものがある。

- ユニットテスト自動化ツールとして、「CppUnit」や「Cutter」などがある。

- カバレジ測定ツールとして、「gcov」や「lcov」などがある

2) デバッグ

テストで不具合を検出した場合、デバッグを実施する。

* デバッグは下記の手順で行われる。

- エラー内容認識

- 再現手順明確化

- 発生箇所特定

- 原因特定

- 修正方法考察

- 修正実施

* デバッグでの原因特定でテストケースの不備が表出すれば、テストケースを改修する。

* オープンソースソフトウェアにはデバッグを支援する様々なツールがあり、用途に合わせて利用

されている。C++に関する代表的なツールには下記のものがある。

- シンボリックデバッガとして、「gdb」や「xxgdb」などがある。

- メモリエラー検出ツールとして、「Electric Fence」や「MEMWATCH」などがある。

Page 10: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 7

スキル区分 OSS モデルカリキュラムの科目 レベル

プログラミング分野 4-3-応 C++に関する知識 応用

習得ポイント 4-3-応-4. ライブラリの構築と利用

対応する

コースウェア

第 4 回 ライブラリの構築と利用

4-3-応-4. ライブラリの構築と利用

汎用性と再利用性といったライブラリの概念と、静的ライブラリや共有ライブラリの特徴を解説する。

また、それぞれのライブラリによって異なる利用方法や、OSS のコミッタとして必要知識となるライブラ

リの構築方法を説明する。

【学習の要点】

* 特定の機能を持ったプログラムを他のプログラムから利用できるようにひとつのファイルにまとめ

たものがライブラリである。

* ライブラリの構築や利用は、C++における汎用性と再利用性を実現する手法である。

* 共有ライブラリは、実行するプログラム内に組み込まれるのではなく、プログラムの実行時にメモ

リへロードされるため、リソースを有効に活用できる。

図 4-3-応-4 ライブラリの構築と利用

Page 11: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 8

【解説】

1) ライブラリの概念

開発者がプログラムを構築する際に、必要とする機能が、過去に別のプログラムで作成した関数に

実装されていれば、その関数を再利用することで、何度も同じ関数を初めからコーディングする無

駄な工数を省くことができる。このように、多くのプログラムが再利用できるように、汎用的な関数群

をコンパイルし、ひとつのファイルにまとめたものがライブラリである。それゆえに、ライブラリ単独で

実行できる形式にはなっていない。また、その性質から、静的ライブラリと共有ライブラリに分けられ

る。静的ライブラリは、プログラムのコンパイル時にリンクされ、プログラムに組み込まれる。共有ライ

ブラリは、プログラムとは別に存在し、プログラムの実行時にリンクされ、ロードされる。静的ライブラ

リは単純なオブジェクトファイルの集まりなので、共有ライブラリに比べて容易に構築や利用ができ

る。但し、共有ライブラリを利用した場合と比べると、プログラムの容量は大きくなる。また、ライブラリ

の機能を更新した場合は、プログラムを再コンパイルしなければ更新した機能を使用することはで

きない。これに対し、共有ライブラリを使用するプログラムは、共有ライブラリさえ更新されていれば、

自動的に更新された機能を使用することができる。その他、共有ライブラリは、プログラムの実行中

に関数を使用してロードする、動的ロードという方法でも利用可能である。

2) ライブラリの構築

* 静的ライブラリ

- 静的ライブラリの拡張子は「.a」を使用する。構築するには、ar を使用し、オブジェクトファイ

ルをまとめる。

ar rcs libexample.a example1.o example2.o example3.o

- 静的ライブラリをプログラムに取り込むには、g++(gcc)でコンパイルする際に指定する。

g++ -o sample main.cpp libexample.a

* 共有ライブラリ

- 共有ライブラリに組み込むオブジェクトファイルを作成するためには、g++(gcc)でコンパイル

する際に「-fPIC」オプションを指定する。

g++ -fPIC -c example.cpp

- 共有ライブラリは、soname という名前を使用する。soname は一般的な約束事として、「lib

ライブラリ名.so.バージョン番号」で構成され、g++(gcc)で「-Wl,-soname,」オプション

にて指定する。下記の例では、example というライブラリ名で soname を指定し、

libexample.co.1.0 という共有ライブラリに example.o を取り込んでいる。

g++ -shared -Wl,-soname,libexample.so.1 -o libexample.so.1.0 example.o

- 共有ライブラリを使用するには、配置場所の指定やシンボリックリンクの作成といった、約束

事に従って適切にインストールする必要がある。共有ライブラリを使用するプログラムは、

g++(gcc)でコンパイルする際に「-l」オプションにてライブラリ名を指定する。

g++ -o sample main.cpp -lexample

Page 12: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 9

スキル区分 OSS モデルカリキュラムの科目 レベル

プログラミング分野 4-3-応 C++に関する知識 応用

習得ポイント 4-3-応-5. 並列処理

対応する

コースウェア

第 5 回 並列処理

第 9 回 演習Ⅰ(ネットワーク・マルチスレッド)

4-3-応-5. 並列処理

並列処理と並行処理についての概念を解説し、逐次処理と並列処理の違いを説明する。更に、

C++における、複数のプロセスを並列実行するマルチプロセスの手法と、同一プロセス内での並列

処理技法であるマルチスレッドを解説する。

【学習の要点】

* 同時に複数の処理を行う並列処理は、デュアルコアプロセッサやマルチプロセッサなどの複数

のプロセッサで、処理効率を向上させる技法であり、マルチプロセスやマルチスレッドといった

手法が使用されている。

* プロセスを複数発生させる手法がマルチプロセスであり、それぞれ個別の仮想アドレス空間が、

プロセスごとに割り当てられて処理される。

* スレッドはプロセス内部の実行単位であり、同じ仮想アドレス空間内で、複数のスレッドを発生さ

せる手法がマルチスレッドである。

* シングルコアプロセッサで行うマルチプロセスやマルチスレッドは、擬似的に並列処理を行う技

法であり、総じて並行処理ともいう。

図 4-3-応-5 マルチプロセスとマルチスレッド

Page 13: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 10

【解説】

1) 並列処理

並列処理とは、デュアルコアプロセッサやマルチプロセッサなどの複数のプロセッサで、同時に処

理を行い、処理効率を向上させる手法である。Linux は、対等に処理を分担する SMP(対照型マル

チプロセッサシステム)というメモリ共有型の並列処理をサポートしており、プロセッサの負荷を最適

化する役割を担っている。並列処理のプログラミング手法には、マルチプロセスやマルチスレッドな

どがある。マルチプロセスは、プロセスを複数発生させる並列処理の手法であり、それぞれ個別の

仮想アドレス空間が、プロセスごとに割り当てられて処理される。そのため、複数のプロセス間でデ

ータのやり取りを行いたい場合は、何らかの通信をプロセス間で行わなければならず、オーバーヘ

ッドとして現れる。これに対し、プロセス内部の実行単位であるスレッドを複数発生させる手法がマ

ルチスレッドである。複数のスレッドは、同一プロセス内で実行されるため、全てのスレッドが使用す

るデータは同じ仮想アドレス空間となる。そのため、マルチプロセスに比べて、リソースの使用量や

通信でのオーバーヘッドなどを軽減することができる。但し、スレッド間で共通して使用するデータ

は、スレッド間で同時にバインドする危険性を含むため、安全性を考慮したスレッドセーフなプログ

ラミングが必要になる。

2) マルチプロセスの実装

自プロセスから新たにプロセスを生成するには、fork()を使用する方法がある。生成されたプロセ

スは、生成元と親子関係が結ばれる。生成元のプロセスは親プロセスとなり、自プロセスを子プロセ

スとして複製し、子プロセスの生成が成功すれば、子プロセスにプロセス ID が割り当てられ、

fork()の戻り値として受け取る。子プロセスは、fork()の戻り値として 0 を受け取るところから、親プ

ロセスと同時に実行される。そのため、fork()を使用したマルチプロセスの実装では、fork()以降

の制御形態が特長的であり、戻り値を判断として、親プロセスの制御と子プロセスの制御を分岐す

る形態となる。子プロセスを終了するには、_exit()を使用する。親プロセスは、wait()で子プロセ

スが終了するまで待機し、終了した子プロセスのプロセス ID と終了状態を回収する。終了した子プ

ロセスは、親プロセスにより回収されるまで、ゾンビプロセスとして存在し続ける。

3) マルチスレッドの実装

自スレッドから新たにスレッドを生成するには、pthread_create()を使用する方法がある。

pthread_create()には、新たなスレッドとして実行する関数を指定する。マルチスレッドでは、プロ

グラムを実行して最初に生成する main()の制御を持つメインスレッドを親とし、pthread_create()

で生成したスレッドが子の関係になる。メインスレッドが終了すれば、子スレッドは処理の途中でも

強制的に終了する。子スレッドを終了するには、子スレッドを開始した関数で、return もしくは

phtread_exit()を使用する。pthread_join()は、他のスレッドが終了するまで待機し、終了したス

レッドが使用したリソースを解放する。

4) 並行処理

マルチプロセスやマルチスレッドは、シングルコアプロセッサでも実装可能なプログラミング手法で

ある。但し、これは擬似的に並列処理を行う技法であり、同時に処理が行われるわけではない。こ

の疑似並列処理と並列処理を総じて並行処理という。

Page 14: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 11

スキル区分 OSS モデルカリキュラムの科目 レベル

プログラミング分野 4-3-応 C++に関する知識 応用

習得ポイント 4-3-応-6. ネットワーク

対応する

コースウェア

第 6 回 ネットワーク

第 9 回 演習Ⅰ(ネットワーク・マルチスレッド)

4-3-応-6. ネットワーク

TCP/IP でのクライアントプロセス・サーバプロセスといった、ネットワークプログラミングの概要を説明

し、ネットワーク通信の API としてソケットを紹介する。更に、API を使用したセッション管理の C++に

よる実装方法を解説する。

【学習の要点】

* ネットワークプログラミングとは、複数のサーバやクライアント間で情報をやり取りする働きを持つ

アプリケーションを作ることである。

* ソケットを用いたセッション管理とは、クライアントとサーバの間の接続を開始から終了まで確立

するものである。

図 4-3-応-6 ソケットによるネットワークプログラミング

Page 15: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 12

【解説】

1) ネットワークプログラミング

ネットワークには、様々なものが存在するが、TCP/IP のネットワークプロトコルを使用したものが主

流であり、インターネットなどの多くのネットワークで利用されている。TCP/IP では、ネットワークで

つながれている各端末に、ユニークな IP アドレスを割り当て、それぞれを識別する。接続されてい

る相手のコンピュータに、なんらかの機能を提供してもらう側のコンピュータをクライアントといい、提

供する側のコンピュータをサーバと呼ぶ。TCP/IP のネットワークプログラミングでは、サーバやクラ

イアント間で情報をやり取りする働きを持つアプリケーションを作成する。

2) ソケット

TCP/IP を利用したネットワークアプリケーションの多くが、開発手段としてソケット API を使用してい

る。ソケット API はネットワークに関する様々な関数を提供してくれる。それを利用することにより、ク

ライアントとサーバの間の接続を開始から終了まで確立するセッション管理は、ソケットと呼ばれるス

トリームを相手として行えばよいので、TCP/IP の規定に則した細部にわたる実装を省略し、効率的

にネットワークプログラミングを行うことができる。

* ソケットの生成と解放

- socket()を使用し、ストリームを開くことで、ソケットが生成される。

- サーバ側では、ソケットを生成した後、ポート番号を bind()でソケットに設定する。これによ

り、並列処理などで、複数のプロセスで複数のソケットが生成されていても、どのソケットに

対し接続したらよいか、クライアント側が識別できるようになる。尚、クライアント側は bind()

を省略することができ、その場合は、OS がポート番号を自動的に割り振ってくれる。

- close()を使用し、ストリームを閉じることでソケットが解放される。

* 同期の確立

- サーバ側では listen()で同時接続可能なクライアントの数を設定し、クライアント側からの

接続要求の受付を開始する。その後、クライアント側との同期を確立するために、

accept()を使用し、接続要求を待つ。

- クライアント側では、ソケットを生成した後、connect()でサーバ側の IP アドレスとポート番

号を指定し、接続要求を行う。

- accept()は、接続要求を受け付けると、新たにソケットを生成してクライアント側に返すこと

で、同期を確立する。この後、元のソケットは、別のクライアント側からの接続を待つために

使用される。このように、サーバ側では、listen()と accept()を分けて同期を確立するた

め、複数のクライアントから、同時に接続要求が出されても、並列処理で受け付けることが

可能になっている。

* データの送受信

- 同期が確立すれば、クライアントとサーバ間でデータのやり取りが可能となる。

- データの送信は、write()などを使用して、ストリームにデータを書き出す。

- データの受信は、read()などを使用して、ストリームからデータを読み込む。

Page 16: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 13

スキル区分 OSS モデルカリキュラムの科目 レベル

プログラミング分野 4-3-応 C++に関する知識 応用

習得ポイント 4-3-応-7. データベース

対応する

コースウェア

第 7 回 データベース

第 10 回 演習Ⅱ(GUI・データベース)

4-3-応-7. データベース

データベースシステムの構成要素として、アプリケーションと DBMS の関連性などについて解説す

る。また、C++によるデータベースプログラミングの実装として、単純なテーブルの作成や照会などを

行うクエリを埋め込んだソースコードを例にあげ、DBMS ライブラリの使用方法を解説する。

【学習の要点】

* アプリケーションは、DBMS の適切なライブラリを使用することで、データベースを直接操作する

ときの複雑な管理手続きを意識することなく、SQL 文(クエリ)を発行して、安全に効率よく、正確

なデータが利用可能である。

* C++によるデータベースプログラミングは、エンベデッド系のシステムで利用されているが、エン

タプライズ系でも、処理速度を生かし、スクリプト言語と組み合わせて使用されている。

図 4-3-応-7 データベースのアプリケーション

Page 17: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 14

【解説】

1) データベースプログラミング

複数の大量なデータを使用する複雑なデータ処理には、エンタプライズ系だけでなく、エンベデッ

ド系を含む様々なシステムで、DBMS が使用されている。DBMS は、データベースを適切に扱うた

めの管理をしてくれるソフトウェアである。DBMS の適切なライブラリを使用することで、データの機

密性や安全性の確保、複数アプリケーションでの共有や同時実行制御といった、複雑な管理手続

きを意識することなく、安全に効率よく、正確なデータが利用可能である。

データベースプログラミングでは、DBMS が提供する SQL を発行するライブラリに、SQL 文(クエリ)

を渡してデータを読み書きする。DBMS には、PostgreSQL、MySQL、SQLite、その他多くの種類が

存在するが、SQLは基本的に同じ構文が利用されるため、DBMSの違いによる煩わしさは軽減され

ている。

C++によるデータベースプログラミングは、エンベデッド系のシステムで利用されている。エンタプラ

イズ系のシステムでは、データベースプログラミングに、スクリプト言語を使用したものの占める割合

が多い。ただ C++によるデータベースプログラミングは、スクリプト言語に比べて処理速度が速いた

め、スクリプト言語と C/C++を組み合わせて構築されたエンタプライズ系のシステムも存在する。

2) DBMS ライブラリの使用

SQLite は、エンタプライズ系でもエンベデッド系でも利用されている、オープンソースの DBMS であ

る。PostgreSQL や MySQL などのクライアントサーバ型の DBMS とは異なり、ひとつのデータベース

をひとつのファイルとして扱い、軽量でメモリ消費量が少ない。ここでは、SQLite を例に、DBMS ライ

ブラリの利用方法を解説する。

* データベースハンドルの取得

- ファイル処理と同じように、データベースを使用するには、sqlite3_open()にデータベー

ス名を指定してデータベースを開き、データベースハンドルを取得する。

* データベースの CRUD 操作

- DBMS では、「Create」「Read」「Update」「Delete」の4つが代表的なデータ操作であり、これ

を CRUD 操作という。これを行うには、sqlite3_exec()に SQL 文を指定する。「Create」に

はテーブル生成 SQL 文の CREATE やデータ追加 SQL 文の INSERT を指定し、「Read」

にはデータ抽出 SQL 文の SELECT を指定し、「Update」にはデータ更新 SQL 文の

UPDATE を指定し、「Delete」にはデータ削除 SQL 文の DELETE を指定する。

- データ抽出 SQL 文を発行した場合は、DBMS によってデータベースから抽出したデータを

受け取らなければならない。これを行うには、コールバック関数を利用する。コールバック

関数では、受け取ったデータを1行ごとに処理することができ、並列処理も可能である。

* データベースハンドルの解放

- sqlite3_close()にデータベースハンドルを指定してデータベースを閉じ、ハンドルを解

放する。

Page 18: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 15

スキル区分 OSS モデルカリキュラムの科目 レベル

プログラミング分野 4-3-応 C++に関する知識 応用

習得ポイント 4-3-応-8. GUI

対応する

コースウェア

第 8 回 GUI

第 10 回 演習Ⅱ(GUI・データベース)

4-3-応-8. GUI

GUI アプリケーションを開発するために用意された著名なウィジェットライブラリである Qt を紹介す

る。Qt の導入方法、基本的な構造、特徴について述べ、Qt で使われるシグナルとスロットの概念を

説明する。また簡単なサンプルプログラムにより Qt の使い方を示す。

【学習の要点】

* Qt は GUI アプリケーションをマルチプラットフォームで開発するためのさまざまなツールを備え

たツールキットである。

* Qt のウィジェットライブラリとしては、QButton,QComboBox QDialog QFrame などがある。

* Qt ではオブジェクトが変化した時に発生する「シグナル」と「シグナル」を受け取るための「スロッ

ト」によりオブジェクト間の通信を行う。

図 4-3-応-8 Qt の構成と動作

Page 19: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 16

【解説】

1) Qt 概要

Qt は1つのソースプログラムで Linux や Windows、MacOS といった複数のプラットフォームで動作

する GUI アプリケーションを開発するための C++用の GUI ツールキットである。

各プラットフォーム上で提供される低レベルの描画 API で実装されているため高速に動作するアプ

リケーションの開発を行うことが可能となる。

GPL に準拠したオープンソース版と商用版のデュアルライセンスを取っている。

開発するプラットフォームに Qt のインストールを行い、ソースプログラムにて Qt のヘッダファイルを

インクルードし、Qt のライブラリを利用してコンパイルリンクを行うことにより GUI アプリケーションの

開発を行う。

2) 代用的なウィジェット

Qt のウィジェットは抽象クラスとして定義されており、これらのクラスを継承することで使用することが

できる。主なウィジェットとしては以下のようなものがある。

* QButton

ボタン・ウィジェットの基礎クラスで、ボタンに共通な機能を提供する。

ユーザの操作に対する反応の仕方とボタンの描画方法はサブクラスで指定する。

* QDialog

ダイアログウインドウの基礎クラスで、モーダル/モードレス、デフォルトボタン、拡張性、戻り値な

どの仕組みを提供する。

* QFrame

フレームを持つことができるウィジェットの基礎クラスで、フレームを描画し、フレームの内容を描

画する仮想関数の呼出しを行う。

* QComboBox

ボタンとポップアップリストを組み合わせたウィジェットのクラスで、選択されているアイテムを表

示し、可能な選択肢のリストをポップアップすることができる。

3) Qt の動作

Qt では「シグナル」「スロット」を利用してオブジェクト間の通信を行うことにより GUI の処理を実現し

ている。シグナルとスロットは共にクラスのメソッドとして定義する。クラスの定義にて「Q_OBJECT」を

記述することによりこれらを使用するクラスとして認識する。

* シグナル

シグナルは他のオブジェクトへの通知を行うもので、クラスにてシグナルを発生させるメソッドを

定義することにより使用できる。オブジェクトの状態が変化した時にシグナルを発生させるメソッ

ドを呼び出すと、接続されたスロットが通常の関数の呼出と同様に実行される。

シグナルとなるメソッドは、アクセス識別子に「signal」を指定する。

* スロット

スロットはシグナルの処理を行うための C++の関数で、接続されたシグナルが発生した時に呼

び出される。

シグナルとなるメソッドは、アクセス識別子に「slot」を指定する。

Page 20: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 17

スキル区分 OSS モデルカリキュラムの科目 レベル

プログラミング分野 4-3-応 C++に関する知識 応用

習得ポイント 4-3-応-9. ポータビリティと国際化

対応する

コースウェア

第 11 回 ポータビリティと国際化

4-3-応-9. ポータビリティと国際化

オープンソースソフトウェアのポータビリティとして LSB(Linux Standard Base)の概要を解説し、国際

化として OpenI18N(Open Internationalization)の概要を説明する。更に、C++における国際化の手

法として、ロケールの設定にあわせた変換方法を解説する。

【学習の要点】

* LSB は、アプリケーションが複数の Linux ディストリビューションで動作することを目的として規格

を策定している標準仕様である。

* さまざまな言語や地域にソフトウェアを適合させるため、LSB の一部である OpenI18N には、オー

プンソースソフトウェアの国際化対応に関する標準仕様が策定されている。

* 言語、国 (地域)、オプションのコードセットから構成されるロケールの設定にあわせて、国際化

のプログラミングが可能である。

図 4-3-応-9 ポータビリティと国際化

Page 21: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 18

【解説】

1) ポータビリティ

Linux でポータビリティの高いアプリケーションを作成するために、LSB は、アプリケーションが複数

の Linux ディストリビューションで動作することを目的として標準規格を策定している。現在、主要な

ディストリビューションは全て LSB 認証を取得しており、LSB の拡充には、多くのディストリビューショ

ンベンダー、コミュニティ開発者、アプリケーション開発者が協力している。

LSB は、アプリケーションが LSB3.0 以降を照準として開発された場合、ソースコードレベルとバイナ

リレベルで後方互換性維持の方針を原則としている。これは、照準とした版数以降の版数で認証ま

たは準拠したディストリビューションであれば動作することを意味している。

LSB には、ポータビリティを実現するために、バイナリインターフェース仕様書、テストツール一式、

およびテスト目的のサンプル実装が含まれている。最終的にサンプル実装上で動作が確認できれ

ば、LSB アプリケーション認証に提出することができる。

2) 国際化

国際化とは、国や地域によって異なる言語や通貨といったものに、ソフトウェアを対応付けることで

ある。LSBの一部であるOpenI18Nには、オープンソースソフトウェアの国際化対応に関する標準仕

様が策定されている。

* GNU gettext

国際化を手助けしてくれるライブラリに、GNU gettext がある。このライブラリは、言語、国(地域)、

オプションのコードセットから構成されるロケールの設定にあわせて、対応付けた文字列を切り

換える機能を提供する。

- ソースコードの準備

ソースコードを国際化に対応させるため、ロケールに合わせて切り換えたい文字列が

gettext()に渡されるようにマクロを定義し、そのマクロを使用して、ソースコードに文字列

を埋め込む。次に、ロケール名を環境変数から取得するように setlocale()で指定し、

textdomain()でドメイン名を指定し、そのドメイン名のメッセージカタログを設置するディレ

クトリを bindtextdomain()で設定する。

- po ファイルの作成

ソースコードから gettext()で抽出する文字列は、xgettext を使用して pot ファイル(po フ

ァイルのテンプレート)に書き出す。次に、cp を使用して、pot ファイルを po ファイルにコピ

ーする。コピーした po ファイルをテキストエディタなどで編集し、msgid に対応した msgstr

に、ロケールに合わせて切り換えたい文字列を埋め込む。

- mo ファイルの作成と設置

po ファイルの編集が終了したら、msgfmt を使用して po ファイルをコンパイルし、mo ファイ

ルを作成する。このとき、mo ファイルのファイル名は、ソースコード内で textdomain()にて

指定したドメイン名を指定する。最後に、出来上がった mo ファイルをソースコード内で

bindtextdomain()にて指定したディレクトリに設置することで、ロケールの切り換えに応じ

て文字列が切り換わるようになる。

Page 22: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 19

スキル区分 OSS モデルカリキュラムの科目 レベル

プログラミング分野 4-3-応 C++に関する知識 応用

習得ポイント 4-3-応-10. コードリーディング

対応する

コースウェア

第 12 回 コードリーディング

4-3-応-10. コードリーディング

オープンソースソフトウェアを読み解くことの意義を説明し、コードリーディングに有効な手法として、

関連するドキュメント類の参照方法や、データ構造と処理の流れを読み解く方法を説明する。更に

解析に有用な統合開発環境やツール類の紹介を行う。

【学習の要点】

* OSS 開発コミュニティの様々な資料を参考に、データ構造と処理の流れをソースコードから

解析することで、開発者の意図する動作を理解し、改善策を講じられるようになる。

* OSS 市場で実際に使用されている多数のソースコードが入手可能であり、個人の目的に合

わせてリーディングすることで実践的な技能を修得できる。

* OSS の統合開発環境が充実し、その豊富な機能を利用することにより、効率的にコードを読

むことができる。

* コーディング規約とは、ソースコードを記述する際の決め事であり、可読性や保守性などが

向上する。

図 4-3-応-10 コードリーディング

Page 23: 4-3-応 C++に関する知識 - ipa.go.jp · のソースコードリーディングによる技能向上方法を説明する。 2. 習得ポイント. 本科目の学習により習得することが期待されるポイントは以下の通り。

独立行政法人 情報処理推進機構

4-3-応 - 20

【解説】

1) ソースコードリーディング

オープンソースソフトウェアの市場が拡大した現在、SourceForge を代表とするホスティングサイトか

ら、実際に市場で使用されている、あらゆる種類のソースコードを入手することができる。ソースコー

ドリーディングの目的は様々あるが、個人の目的に合わせて、ソースコードが示す内容を理解する

ことで、実践的な技能を修得することができる。更に、解析したソースコードをもとに、改善策を講じ

られるようになる。

2) コード解析手法

ソースコードを解析するには、ただ漠然とコードを目で追うだけでなく、解析ポイントにあわせた的

確な手法を用いる必要がある。

* ツールの活用

コード解析の手法には、動的解析と静的解析がある。動的解析は、実際にプログラムを動かし

て解析する手法であり、デバッガやプロファイラなどを利用して解析を行う。シンボリックデバッガ

は、デバッグの作業に限らず、コードリーディングの動的解析でも効力を発揮する。プロファイラ

は、プログラムの実行結果として、関数ごとの実行回数や実行時間などを分析するツールであり、

代表的なものに gprofがある。静的解析は、ソースコードそのものを読んで解析する手法であり、

テキストエディタやクロスリファレンサなどを利用して解析を行う。クロスリファレンサは、ソースコ

ードに記述されている関数を洗い出し、関数の呼び出し元を検索するツールであり、代表的な

ものとして GNU GLOBAL がある。また、Eclipse などの統合開発環境(IDE)を使用すれば、動的

解析と静的解析の両方を行うことができる。

* 解析手順

初めに全体像をつかむために、入手したソースコードをコンパイルし、実際にプログラムを実行

してみて、プログラム全体の動作を概観することは有効な方法である。また、ソースファイルがど

のような意味合いで分割され、フォルダに配置されているか、フォルダ構成の概要を把握してお

くことも有効な手段である。更に、オープンソース開発コミュニティにある開発者ドキュメント、変

更履歴、バージョン管理システム、バグトラッキングシステムなどを参考にして、開発者の意図を

理解することはとても重要である。

詳細分析では、実際にソースコードを読み、クラスの継承階層やメンバ関数の呼び出し関係を

明らかにし、検索やトレースを行いながら、データ構造の変化と処理の流れを解析する。このと

き、動作を予測し、問題点の仮説を立てて解析することが有効な手法である。

3) 読みやすいコード

読み手が理解しやすいソースコードを記述するには、命名規則やコメントのルールといった、ソース

コードを記述する際の決め事を定めた、コーディング規約に則って記述する必要がある。ソースコ

ードリーディングを行った結果、問題があるソースにパッチ(修正プログラム)を当てる場合は、コー

ディング規約に則って記述すれば、可読性や保守性といったソースコードの品質を向上することが

できる。