基本・応用情報 プログラミング、UML、XML
ソフトウェア(コード)の再利用に関して
再利用の方が、工数がたくさんかかる
1.プログラムがCPUに実行されるまで
①ソースコード(原始プログラム)
人間がプログラミング言語で書くコード
↓
②コンパイラ、インタプリタ
人間がわかるものから、コンピューターがわかる者へと翻訳する
✅コンパイラ(compiler)
ソースコードを一括で変換
※compileとは、「集める」
👍最適化(計算の順序などを改善し、効率的なプログラムに変換すること)ができる
❌すぐ実行できない
✅インタプリタ(interpreter)
一文ずつ変換
※interpretとは、「翻訳する」
👍すぐ実行できる
❌コンパイラのように最適化をしないため、効率悪い
↓
③オブジェクトコード(目的モジュール、目的プログラム)
0,1だけで書かれたコード
↓
④リンカ
コンピュータが実行できる1つのプログラムを作る
↓
⑤ロードモジュール(実行可能プログラム)
コンピュータが実行できるプログラム
↓
⑥ローダ
ロードモジュールを主記憶に格納
↓
CPUが実行
プログラムの4つの性質
再配置可能(リロケータブル)
主記憶上のどこに配置してもOK
再使用可能(リユーザブル)
再び使用、再び用いることができる
再入可能(リエントラント)
別のプログラムから呼び出されても、
正しく動作すること
※複数のタスクがあっても、
互いに干渉することなく並行して動作する
再帰的(リカーシブ)
自分自身を呼び起こせる
プログラムのツール
◯シミュレーター
現実の事象や業務をモデル化して
模擬実験を行うツール
複雑な数式化が必要なシステムも、数値的に再現できる
(解析的な方法ではできない)
◯エミュレーター
所定のコンピュータや機械装置を模倣する
シミュレーターの一種
他のコンピュータ向けの命令プログラムを解読しながら実行するマイクロプログラム
※emulate =模倣する
インスペクター
構造体などのデータを見やすい形で表示し、
カンタンに確認できるようにしたツール
データを詳しく調べて(調査して)
確認できるようにするからインスペクター
トレーサー
命令単位でプログラムを実行し、実行直後のレジスタやメモリの内容などの情報が得られるツール
実行直後の情報を後から追うことができるから
トレーサーという名前
デバッガ
プログラム内のバグや不具合を修正する作業(デバッグ)を支援するソフトウェア
指定した箇所でプログラムを一時停止させて1行ずつ進めたり、その際の変数の内容を確認したりすることができる
プロファイラ
プログラムの動作状況を解析するためのツール
実行フローや関数ごとの実行回数、実行時間などを詳細に確認できる
↓
プログラムのボトルネックを特定するなど性能改善に役立つ
記憶領域
スタック領域
プログラムの実行中に、サブルーチン(プログラミングにおいて意味的または機能的にまとまった処理を行うルーチン)の情報を記憶する領域
※ルーチン
特定の処理を行う一連の命令の集合体
ヒープ領域
2つのリストを持つ双方向リストで構成される
プログラム上から動的に確保できる領域
2.テスト
プログラムが正しく動くかどうか最後にテストする
人間によるテスト→レビュー
コンピュータによるテスト→静的テスト、動的テスト
静的テスト
✅ソースコード解析ツールソースコードを解析して、プログラムの誤りを見つける
オープンソースソフトウェア(OSS)
ソースコードが一般に公開され、誰でも見れたり変更できたりするもの
Eclipse(統合開発環境)
IBMが開発した統合開発環境のこと
主にJavaによるシステム開発で利用される
※統合開発環境
アプリケーションの構築に必要な複数のツールを、1つのGUIで使えるようにした環境のこと
Linux
汎用性高い、オープンソースOS
その他のソフトウェア
✅商用ソフトウェア
企業が有料で販売するソフトウェア
✅パブリックドメインソフトウェア
著作権が放棄されたソフトウェア
コピーライト、パブリックドメイン、コピーレフト
✅コピーライト→著作権
✅パブリックドメイン→著作権が放棄された状態
☑️コピーレフト→著作権は作者が保持するが誰もがプログラムの複製・改変・再配布ができ、二次創作物にも著作権が認められる
↓
改変したものを再配布する場合は、ソースコードも公開しなければならない
3.オブジェクト指向
ソフトウェアを部品化し開発の生産性を上げること
データ中心アプローチ(開発工程で、システム設計のソフトウェア方式設計で行うもの)の概念をさらに進めてできた
クラス・オブジェクト・メソッドの違い
クラス→設計図
オブジェクト→実体
メソッド→手法・レシピ
※これらは「データ」とは全く異なる
オブジェクト指向の特徴
メリット👍
クラスさえ作れば、オブジェクト(実体)をいくつでも作れる
✅カプセル化
外部から、オブジェクトの詳細を隠すこと
※データにアクセスするには、メソッドに依頼しないとダメ
✅継承
親クラス(スーパークラス・基底クラス)のデータやメソッドを、子クラス(サブクラス・派生クラス)が引き継ぐこと
◯親クラスから子クラスを作ることを特化
◯子クラスから親クラスを作ることを汎化
※オーバーライド
親クラスから継承したメソッドを、子クラスが独自に定義し直して、上書きすること
これにより、次に記載の多相性を実現する
✅多相性(ポリモーフィズム)
同じ名前の関数でも、異なる引数や返り値が来たら、それに応じた答えを出せるという性質
✅動的結合
実行時に、
メッセージとメソッドを関連付けること
✅静的結合
コンパイル時に、
実行される手続きが決定される性質
その他の型
関数型
関数の定義によってプログラムを構成する型
手続型
上から順に、手続きを踏んでいく型
論理型
プログラムに「事実」と「規則」を記述し、
プログラミング言語の処理系の導出原理によって
「真」か「偽」かしか結論を出さない型
※エキスパートシステム(専門知識をAIに組み込んで解決するシステム)に有効
UML
オブジェクト指向プログラミングで、設計で用いられる記法
UMLで用いる図
📌クラス図
クラス関の関係を表す。特に良くでる
クラス名、データ、メソッドの3つを記入する
クラス間の関係を表すのに、下の表記が使われる
📌オブジェクト図
オブジェクト間で送受信されるメッセージを表現して、オブジェクト間の関係を表す
📌アクティビティ図
ある振る舞いから、次の振る舞いへの制御の流れを表す
ビジネスプロセスの実行順序や、条件による分岐などのワークフローを示す
📌シーケンス図
オブジェクト間で送受信されるメッセージを表現して、オブジェクト間の相互作用を時系列に表す
📌ユースケース図
システムのアクタの相互作用を表現
利用者(アクター)は何をできるのか
棒人間で表した図
📌ステートチャート図
外部からのトリガーに応じて、
オブジェクトの状態がどのように遷移するか表現
UML+多重度に関する例題
4.プログラミングソフトウェア
種類
・ドキュメンテーションジェネレーター
ソースコード中にある、所定の形式に従って記述したコメント文から、プログラムを作る優れもの
・webブラウザ
HTML,CSS等を読み込んで、画面に表示するソフトウェア
・テンプレートエンジン
以下のように、「name」や「age」に的確な値を入れてプログラムを効率よく作るソフトウェア
・TeX (テフ)
文書をキレイな形で作成するためのシステム
文書構造がマーク付けされたテキストファイルを読み込む
↓
印刷可能なドキュメントへ
5.言語
Java
オブジェクト指向型の言語
Javaの特徴
👍ブラウザで動作するアプレットなどを作成できる
(アプレットは、仮想マシンを実装した環境上であれば、どこでも実行可能)
👍ガーベジコレクション(プログラムが確保したメモリ領域のうち、不要になった部分を自動的に解放して再び使用可能にすること)ができる
✖ 多重継承()はできない
Javaの種類
・Java applet
ブラウザ上で動作する、Javaで作られたアプリ
・Java servlet
サーバー上で 〃
J2EE(Java 2 platform , enterprise edition)の構成技術の一つ
XML
文章の見た目や構造を記述するための言語
XSLT
XML文書の中で、別の文書構造をもつ物や、HTML文書に変える仕様
SMIL
XMLによって作られたマルチメディア記述用の言語
HTML
Webページを作成するために使用される言語
DHTML
静的なHTMLの内容を
CSS(スタイルシート)、JavaScript等のスクリプト、DOMを用いて
動的に変更する技術
※DOM (document object model)
HTML文書やXML文書をオブジェクトの木構造モデルで表現することで、ドキュメントをプログラムから操作・利用することを可能にする仕組み
Ajax(Asynchronous JavaScript+XML)
ウェブブラウザ内で非同期通信とインタフェースの構築などを行う技術の総称
Webブラウザのみで動作する
画面遷移を伴わない動的なWebアプリケーションの制作が可能
Ajaxを使用した有名なサービスには
GoogleMapやGmailがある
6.プログラミングにおける各分野解き方
ビット演算
答え A
3行目 r←00000000
とあるが、Aを参照すると…
↓
rは左にずれ、以下のように動く
00000001
↓
00000011
↓
00000110
↓
00001101
↓
00011010
↓
00110100
↓
01101001
↓
11010010
スタックとキュー
キューのことを、待ち行列ともいう!
配列
✅1次元配列
✅2次元配列
横を行
縦を列という
単方向リスト
✅手続きappend
手続きappendは、引数で与えられた文字を、単方向リストに追加する
↓
単方向リストに追加するというのは
「単方向リストの最後に追加する」という意味
①4行目ListElement(qVal)とあるが、これは以下の一つのリストを示している。このリストを、単方向リストの最後に追加したい
⚠️単方向リスト全体のうちの一つではないので、注意
curr←ListElement(qVal)と来たら、以下のように書く
②5、6行目 上の図と合わせて、if(listHeadが(a))…は、以下のようになる
③7、8行目 は、以下のようになる
✅addFirst, addLast
ポイント
プログラムを上から順に追っていこう
①大域:LinkedList: head ←未定義の値
と来たら、下の図を書く
② addFirst(文字列:qVal)と来たら、文章中で手続addFirst について書かれている説明を読もう。
↓
「手続addFirst は、引数で与えられた文字をリストの先頭に追加する。」と書いてあることがわかる
↓
これはリストが作られた後に、先頭に追加することを表すので、まずはリストを作ろう!!!!
③ head ← LinkedList(qVal, (a))とあるので、まずはリストを作ろう!!!
LinkedList の説明として
「引数 qValでメンバ変数Valを、引数 qNextでメンバ変数nextを初期化(未定義)する」
とあるが、その場合下のような図を即座に書く
④ここで初めて、リストの先頭に新たなリストを作ろう!!!!
head ← LinkedList(qVal, (a) )とあるので、以下のようなリストを、先頭に追加する
ここで(a) に入るものは何か…????
未定義を入れてしまうと、LinkedList の説明としてあった、
「引数 qValでメンバ変数Valを、引数 qNextでメンバ変数nextを初期化(未定義)する」
の
「引数 qNextでメンバ変数nextを初期化(未定義)する」に反する。
なぜなら、引数qNext は、何かしらの文字でなければならないため。
未定義は何の文字でもない、ただの空欄と同じ
⑤
✅手続きadd
append👉単純に、最後に追加するだけ
add👉指定された位置に追加する
①add(整数型: idx, 文字型: qVal)と来たら…
前提として単方向リストを作っておかなければならない
↓
よって、ある程度の長さの単方向リストを以下のように作っておく(リストが空の時にheadは未定義であると文章中にあるので、今回はheadは未定義ではない!!!)
②文章中のadd に関する説明を読む
↓
「手続add は引数で与えられた位置に、引数で与えられた文字を追加する」とある
↓
idx番目の位置に、qVal という文字を追加するという意味である
今回の場合、最初に書いたリストの1番目の次に追加するので、add(idx =2 )である
③ その下の
「整数型: i ←1
LinkedList:curr ← LinkedList(qVal, 未定義の値)」
とあるが、これは
先に書いたリストの間にaddしたい(追加したい)リストを下に書いておけ!
と言っている。こんな感じで
④ 10行目以降
LinkedList: ptr ← head
LinkedList: prev ← ptr
となったら、以下のように書く
⑤12行目以降
while (ptr が未定義でない)
if (i がidx と等しい)
とあるが、i =1で、idx=2なので、関係ない
⑥ ifがendし、18行目以降
prev ← ptr
ptr ← ptr.next
とあるが、「ptr.next」とは、ptrの次のValを表す
そのため、以下のようになる
その後20行目に
i ← i+1
とあるが、これはiを一個増やすだけ。なので、i=2になる
↓
13行目に戻り、i=idx=2なので、14〜16行目の内容に従う
✅双方向リスト
末尾から先頭へ、また先頭から末尾へとデータを辿ることができるリスト
✅線形リスト
✅環状リスト
木構造
葉→一番深いところにあるやつ
根→大元
節点→根も葉も含めて、起点となる数
✅2分探索木(2分探索法)
小さい順にならぶ数の中で、目的の数を見つけるときに使う。
⭐️動的割り当て・静的割り当て
⚪︎整列アルゴリズム
☑️マージソート
とりあえず均等に右と左に分けて、各グループの中で小さい順に合体(マージ)する
これを続ける
☑️クイックソート
配列の中で、だいたい真ん中にある数よりも、
小さいものと大きいものに分ける
↓
大きいものを右に、小さいものを右にやっていけば、小さい順に数が並ぶ
手際よく素早く右と左に分けていくから、
「クイック」
☑️バブルソート
隣り合う数同士で比べて、大きいものを右に寄せていく手法
数が徐々に右に寄っていくことを、泡が徐々に上に上がる様子に例えている
☑️選択ソート
最小値を探し、先頭の数字と入れ替える
↓
その次に小さい数と2番目を入れ替える
↓
…
⚪︎探索アルゴリズム
✅ハッシュ法
何かしらの専用の関数があり、これにより格納先を決定する方法
✅二分探索法
二分木みたいな感じ
この記事が気に入ったらサポートをしてみませんか?