96. プログラミング - YukaKoshiba/MyknowledgeDocs GitHub Wiki
Programming @Japanese Version
Create Date:2025/01/10
Last Update Date:2025/04/15
コンパイラとインタプリタ: コンパイラ(コンパイル) インタプリタ
実行ファイルの拡張子
プログラミング言語別ファイル拡張子
ソフトウェアの基本的なファイル構成
命名方法
Makefile ヘッダーファイル 構造体 インクルードガード JSON ajax
プログラミング手法:
MVCモデル
オブジェクト指向プログラミング(OOP:Object Oriented Programming)
構造体とオブジェクト指向プログラミングの違い
メソッドチェーン
フレームワーク:
microframework
ライブラリ:
オブジェクト指向プログラミングにおけるライブラリの取り扱い
処理のコツ/よくあるエラー:
例外処理
小数計算
変数のスコープ
データ探索
関数のプロトタイプ宣言
システムの強制終了
終了ステータス
特定の問題を解決する or 特定のタスクを実装するため、コードを書くプロセスのこと
プログラミングに関するよくある勘違い
プログラミング⊃プログラム言語でコードを書くではあるが、
プログラミング≠プログラム言語でコードを書くでは無い事に注意
プログラム言語でコードを書く=ただのコーディング
プログラミングの始め方は、ただプログラミング言語でコードを書く事ではなく、
何を作りたいのか→どのような手順で解決するのか→その上で学ぶ必要があるプログラム言語が決定でき、コーディングが出来る
プログラミングには、コーディングに加え、アルゴリズムと問題解決が含まれる
1度プログラミングをマスターすれば、プログラム言語が変わっても、コーディングは容易に出来る様になる
聞きなれない言葉が多いかもしれないが、プログラミングで出て来るキーワードは全て英単語
プログラミングをする上で理解しておくべき大前提
コンピュータは0と1のバイナリコード(2進数)しか処理することが出来ない
その為、コンピュータには人がコーディングした単語、記号、または値を直接理解することはできない
プログラムを実行すると、人間が理解できる高水準プログラミング言語で記述したコードをコンピューターが理解しているのではなく、
一度コンピュータが理解できるバイナリコードに自動的に変換されてから、デバイスで命令が実行されてる
- コード
プログラマーがデバイス(コンピューターなど)に何を実行するかを指示するために記述する一連の命令 - バグ
予期しない出力や誤った出力を引き起こすプログラムのロジックまたは実装のエラー(システム設計上のミス) - エラー
間違った結果を生み出す人間の行為、開発者や設計者の判断やシステム仕様の誤解などが原因 - デバッグ
プログラム内のバグを見つけて修正するプロセス - 統合開発環境(IDE: Integrated Development Environment)
ファイルエディター、エクスプローラー、ターミナル、便利なメニューオプションなど、 コンピュータープログラムの作成に必要な便利ツールを備えたソフトウェア開発環境のこと
有名なIDE
Visual Studio Code: Microsoftが作成した無料のIDE
Eclipse: JAvaの開発時によく利用される無料のオープンソースIDE、元々はIBMによって開発された
Visual Studio: Microsoftが作成した
Visual StudioとVisual Studio Codeの違い
人がコンピュータとコミュニケーションを取ることを助ける言語
完全ガイドプログラミング記述のお作法として、main関数はを記述するプログラミング言語がある
main関数は、コンパイル言語におけるプログラムの開始地点として重要な役割を果たし、特別な関数である
スクリプト言語では必須ではないが、コードの構造化のためにmain関数相当の処理の記述が推奨される場合がある
main関数を持つ言語:コンパイル言語(C,C++,Java,C#,Goなど)
プログラムを実行する前にコンパイラによって機械語に変換される言語
コンパイラは、プログラムの開始地点を特定するためにmain関数を必要とする
main関数を持たない言語:スクリプト言語(Python,JavaScript,Ruby,PHP,Perlなど)
インタプリタによって実行時に解釈されながら実行される言語
明示的なmain関数がなくても、上から順にコードが実行されます
関数が呼び出されると、プログラムは以下の手順でメモリを確保し、実行する
- フレームの生成
関数が呼び出されると、コールスタック上に新しい「フレーム」が生成される フレームは、関数の実行に必要な情報を格納するメモリ領域 フレームには、以下の情報が含まれる: 関数の引数、関数のローカル変数、関数の戻りアドレス(関数終了後にどこに戻るか)、その他関数実行に必要な情報 - メモリの確保
フレームが生成されると、フレーム内にローカル変数などのメモリ領域が確保される
これらのメモリは、関数の実行中のみ有効 - 関数の実行
フレームがコールスタックの最上位に置かれ、関数が実行される
関数内で変数の読み書きなどが行われる - 関数の終了
関数が終了すると、フレームはコールスタックから「ポップ」される
フレーム内のメモリ領域は解放され、利用できなくなる
プログラムは、フレームに格納されていた戻りアドレスに従って、呼び出し元の関数に戻る
プログラムの実行中に呼び出された関数の情報を順番に記録するメモリ領域
関数が呼び出されるたびにフレームがプッシュされ、関数が終了するたびにフレームがポップされるコールスタックは、関数の呼び出し順序を管理し、再帰処理などを実現するために使用される
コールスタックは、メモリの「スタック領域」に確保される
スタック領域は、メモリの限られた領域であるため、再帰呼び出しが深くなりすぎると「スタックオーバーフロー」が発生する可能性がある
コールスタックとフレームの概念は、多くのプログラミング言語に共通している
C,C++,Java,Python,JavaScriptなど、ほとんどのプログラミング言語で、関数呼び出し時にコールスタックが使用されている
ただし、言語や実装によって、コールスタックの構造や動作は異なる場合がある
例えば、一部の言語では、最適化のために末尾再帰の最適化が行われることがある
コンパイラとは、デジタルコンピュータのCPUが理解できる一連の機械語命令に変換(コンパイル)するコンピュータソフトウェアのこと
ソースコード全体を一度に機械語などの実行可能な形式に変換する
変換されたコードは、後で直接実行でき、一般的に実行速度が速い
一方で、ソースコードを変換する毎に、実行前に再コンパイルが必要になり、開発とデバックに関して、インタプリタと比較すると多少の手間を要する
C,C++,Java,C#,Goなど
コンパイル
水準プログラミング言語(人間が理解できる)で記載されたソースコードをコンピュータが理解できるバイナリコードに変換すること
ソースコードを一行ずつ読み込み、即座に実行する
コードを実行するたびに解釈と実行が行われ、一般的に実行速度はコンパイラに比べると遅い
ただし、以下のような理由から開発とデバッグが容易
・1行ずつ読み込み実行するため、コード変更後すぐに実行結果を即座に確認できる
・エラーが発生時の範囲が絞られ、デバックしやすい
・多くのインタプリタ言語は動的型付けを採用しており、変数の型を明示的に宣言する必要がない
→コードの記述量が減り、開発速度が向上する
→柔軟なコード記述が可能
・インタプリタがインストールされていれば、異なるプラットフォームでも同じコードを実行できる
→クロスプラットフォーム開発が容易になる
・多くのインタプリタ言語は、デバッガなどの強力なデバッグツールを提供しており、デバック作業を効率化できる
→コードの実行をステップごとに追跡したり、変数の値を監視できる
Python,JavaScript,Ruby,PHP,Perl
インタプリタには、Web系開発言語が多いが、コンパイルとインタプリタの違いは、Webアプリケーションかスタンドアロンアプリケーションかという区別だけに依存するわけではない
両者にはいくつかの関連性があるものの、より複雑な関係性がある
・休みながらでも絶えず練習する(必ず手を動かす)
・チュートリアルや模写だけでなく、自分でアルゴリズムを考えて、プログラムを作る練習をする
・オープンソースなどのプロジェクトに参加する
・学習している内容に関してメモを取る
・わからない時は、オンラインフォーラムで質問することを躊躇しないこと
Stack Overflow
radit
[質問のポイント]
- Webサイトにあるよくある質問集FAQにまずは目を通す
- 利用している言語とバージョン、OSの種類、ビット数を記載する
- 何がしたいのかを記載する
- どういう動作をしたらエラーが発生するかを記載する
- エラーメッセージ文を全て記載する
- 問題を自力で解決を顧みたことを記載する
バイナリファイル(人間が読める形式で書いたソースコードをCPUが処理できるようにコンパイル(変換)した機械語にしたファイ)の拡張子は以下の通り
拡張子を持たない事もある
基本的にバイナリファイルに該当する者は、1と0のみで記載されており、ファイルを開いて中を見る事は出来ない
(=見ても人間はわからない)
| 拡張子 | 説明 |
|---|---|
| .exe | Windows OSの実行ファイル |
| .out | Linux OSの実行ファイル |
| .bin | Linux OSの実行ファイル |
| .app | macOS OSの実行ファイル |
バッチファイル
| 拡張子 | 説明 |
|---|---|
| .bat | Windowsのコマンドプロンプトで実行できるバッチファイル |
| .sh | のUNIX系OS(Linuxや,acOSなど)で実行できるシェルスクリプト = .batの他のOS版 |
ファイルの拡張子をを見れは、ソースコードがどの様なプログラミング言語で記述されているかがわかり、コードリーディングに役立つ
| 拡張子 | プログラミング言語 |
|---|---|
| .py | Python 実行時にターミナルに表示される |
| .pyw | Python 実行時にターミナルに表示されない |
| .js | JavaScript |
| .html | HTML |
| .css | CSS |
| .java | JAVA |
| .c/.cpp | C/C++ |
| .rb | Ruby |
| .php | PHP |
| .json | JSON |
| .xml | XML |
| .md | Markdown |
| Dockerfile | Dockerのイメージを作成するための設定ファイル |
| .h | C/C++のヘッダーファイル |
一般的なソフトウェアのファイル構成から、ファイルの所在地の予測ができ、コードリーディングに役立つ
| ディレクトリ名 | 説明 | 保有ファイル例 |
|---|---|---|
| bin | バイナリファイルを格納 (実行可能ファイル) =コンピュータが実行可能な0と1の機械語に変換したもの |
.exeなど |
| lib | ライブラリファイルを格納 =プログラムの部品 |
動的ライブラリ(.dll,.so,.dylibなど) 静的ライブラリ(.a,.libなど) |
| src | ソースコードファイルを格納 =PG(人)が記述したもの プログラムの主要構成ファイル群 |
|
| include | ヘッダーファイルを格納 =C/C++等の言語で、関数宣言や定数など記述したファイル |
|
| doc | ドキュメントファイルを格納 =ソフトウェア利用法や仕様などを記述したファイル |
README,マニュアルなど |
| config | 設定ファイルを格納 =ソフトウェア動作設定や環境設定など記述したファイル |
|
| data | データファイルを格納 =ソフトウェア実行に必要なデータ |
画像,音声,テキストなど |
| test | テストコードを格納 =プログラムの動作確認をするためのファイル |
変数名の前提条件
・大文字と小文字は、別の変数として扱われることがほとんど
・予約語(関数名など)は利用できない
・特殊文字('や$など)を含めることはできない
・数字から始めることはできない
・間違いではないが、慣習として、変数名は小文字から始める
・最低限同じプログラムの中では、表記の方法を統一すること
・別のクラスや関数内のグローバル変数やローカル変数は、仮に同じ変数名であっても、プログラム上別物とみなされる為、
同じ変数の名前を使いまわしすることはなるべく避けた方が良い
金言:「愚かな一貫性は心の狭い小鬼である」 ラルフ・エマーソンの言葉
| 命名法 | 用途/よく見かける言語 | 例 |
|---|---|---|
| アッパーキャメルケース パスカルケース |
クラス名 Reactのコンポーネント名 PHP,JavaScript |
MyClass HttpServer |
| ローワーキャメルケース | 変数名,関数名 | myVariable getUserName |
| スネークケース | 変数名,関数名 ファイル名 DB,Python |
snake_case file_name |
| ケバブケース | CSSクラス名 HTML属性名 |
my-class http-server |
| スクリーミングスネークケース | 定数名 | MAX_VALUE PI |
その変数がブール値を表すことを示すための一般的な慣習
let isRunning = true;
let hasCompleted = false;
文字列の集合(パターン)を表す汎用的な記法のこと
正規表現を利用したパターンマッチングを行う事で、様々な検索文字パターンに適応した柔軟な検索が出来る様になる
プログラミングをする上で、正規表現を使えるかどうかはソフトウェアのレスポンスを高める上で非常に重要
正規表現を使わない場合、全てのパターンを網羅した何千といった条件分岐を記載する必要があるが、
正規表現を使用するとわずか一行でパターンを網羅することができる
Java,Perl,Ruby,JavaScript,Pythonなど様々な言語で利用できる
利用の場面は、プログラミング以外にも、Microsoft WordやOpenOfficeの様な最新のワープロソフトでも利用できる
COBOLやC言語など、古いプログラミング言語では利用できない
- メールアドレスの抽出: Webページやテキストからメールアドレスの効率的な抽出
- ログファイルの分析: ログファイルからエラーメッセージや警告メッセージを簡単に抽出
- テキスト処理: 特定の文字列を置換したり、不要な文字列を削除
-
Ctrl+Fなど: テキスト以外に、正規表現を利用したパターンマッチング方法がある
利用の注意点
- エスケープシーケンスに注意する
- -(ダッシュ)の扱いに注意
Pythonなどで[]内に-を利用すると、範囲指定と認識されてしまいエラーが発生する
1番最後に記述するか、エスケープして対応をする
用語
- 貪欲マッチ
正規表現エンジンのデフォルト動作
可能な限り最長の文字列にマッチしようとする性質 - 非貪欲マッチ
可能な限り最短の文字列にマッチしようとする性質
量指定子(*,+,?,{m,n})の後に?を追加すると、正規表現エンジンは非貪欲な動作になる
大文字は”~以外”になる
| 正規表現 | 意味 | 例 |
|---|---|---|
\d\D
|
0~9の数字1文字 0~9の数字以外 |
電話番号:\d\d\d - \d\d\d - \d\d\d\d(数字3桁-数字3桁-数字4桁) |
\w\W
|
文字,数字,_ 文字,数字,_以外 |
|
\s\S
|
スペース,タブ,改行 スペース,タブ,改行以外 |
|
[...] |
文字クラス 角括弧内のいずれかの文字 |
[0-5] → (0|1|2|3|4|5)[0-9a-z] or [a-z0-9] → 全数字と小文字 |
[^...] |
文字クラス内のキャレット 文字クラスの否定 |
[^abc] → a,b,c以外の文字 |
^(キャレット)$(ドル記号) |
文字列の先頭にマッチ 文字列の末尾にマッチ |
^abc → abcで始まる文字列$abc → abcで終わる文字列 |
|(パイプ) |
複数パターンの内、1つとマッチ |
hero_regex = re.complex(r'Batman | Tina Fey')※複数マッチした際は、最初に出現した方がMatchオブジェクトとして返却される |
..*
|
任意の1文字 任意の0文字以上 ※改行は含まない |
a.b → a(任意の1文字)ba.*b → a(任意の0文字以上)b |
? |
任意のパターン 非貪欲マッチ 直前の文字はなくても良い |
abc? → abまたはbcbat_regex = re.complex(r'Bat(wo)?man')※ (wo)?の部分は、マッチしてもしなくても良い |
*+
|
0回以上マッチ 1回以上マッチ |
a.b → a(任意の1文字)a.*b → a(任意の0文字以上) |
( ) |
グループ化 グループ番号の指定も可能 group(0):全体 group(1):1つ目のグループ group(2):2つ目のグループ など |
refix = (\d\d\d) - (\d\d\d-\d\d\d\d)
text = "123-456-7890"
match = re.search(pattern, text)
if match:
print(match.group(0)) # 123-456-7890
print(match.group(1)) # 123
print(match.group(2)) # 456-7890
|
{ } |
>繰返し回数の指定 |
(H){3} → HHH(H){3,5} → HHH|HHHH|HHHHHデフォルトは貪欲マッチのため、HHHHHがマッチする (H){3,5}? → HHH|HHHH|HHHHH非貪欲マッチになり、HHHがマッチする |
r'...' |
>raw文字列リテラル \をエスケープシーケンスとして解釈しない Python特有の機能 |
r'C:\Users\user\Documents' |
プログラミング言語やコンパイラの種類によって正確な数字は異なるが、一般的なサイズは以下の通り
| データ型 | byte数 |
|---|---|
| int | 4 |
| float | 4 |
| double | 8 |
| char | 1 |
| string/char* | 4 or 8 |
| long long | 8 |
char配列
- 文字の集合を連続したメモリ領域に格納する
- 文字列の終端には必ず'\0'(NULL)をつける必要がある
- 文字列の長さを自分で管理する必要がある
- 文字列操作の関数は自分で実装するか、標準ライブラリの関数(strcpy, strcatなど)を使う
- より低レベルな操作が可能だが、エラーが起こりやすい
string型
- 文字列をオブジェクトとして扱い、文字列の長さや操作を自動的に管理してくれる
- '\0'(NULL)を意識する必要がない
- 文字列操作のための豊富なメソッドが用意されている
- より高レベルで安全な文字列操作が可能
複数のデータを一つの名前でまとめて扱うことができる、プログラムの記述を簡潔にすることができる
変数を1つ1つ宣言するのと違って、配列の要素はメモリ上でになる
配列のサイズは通常固定である為、配列のサイズを一度決めると変更できない
また、配列内には同じデータ型の要素しか格納できない
各プログラミング言語ごとに配列の特徴がある
詳細は、各それぞれのプログラミング言語のページを参照のこと
コードに文字列として記入するのが、困難もしくは不可能な文字
基本的に\(バックスラッシュ)にエスケープしたい元の記号を付与することが多い
参考
| 記号 | エスケープシーケンス表記 | 記号 | エスケープシーケンス表記 |
|---|---|---|---|
| +(加算)および*(乗算) |
\+, \*
|
(スペース) | \s |
| (任意の空白文字) ※スペース, タブ, 改行など |
\s |
$(ドル) | \$ |
| ( )(括弧) |
\(, \)
|
'(シングルクォート) "(ダブルクォート) `(バッククォート) |
\', \",
|
| \(バックスラッシュ) | \\ |
ASCII バックスペース(BS) | \b |
| ASCII フォームフィード(FF) | \f |
ASCII 改行(LF) ※非推奨 | \n |
| ASCII キャリッジリターン(CR) | \r |
ASCII 水平タブ(TAB) | \t |
| ASCII 垂直タブ(VT) | \v |
Unicode データベース中の文字名 | \N{name} |
| 8進数で表されたASCII文字 | \ooo |
16進数で表されたASCII文字 | \xhh |
| 16ビットのUnicode文字 | \uxxxx |
32ビットのUnicode文字 | \Uxxxxxxxx |
基本的なエスケープシーケンスは、言語や環境に依らず共通していることが多いが、
サポートされていなかったり、構文が異なることがあるため、注意が必要
・8進数や16進数での文字表現(\ooo,\xhh)
C言語やC++などの言語でよく使用され、Pythonでも使用できるが、他の言語ではサポートされていない場合がある
・Unicode文字のエスケープシーケンス(\N{name},\uxxxx,\Uxxxxxxxx)
PythonなどのUnicodeをサポートする言語や環境では使用できるが、
JavaScriptやJavaなどの言語では、Unicodeエスケープシーケンスがサポートしているものの、構文が異なる場合がある
Magic Numberは、コード中に直接記述された意味が明確でない数値のこと
uint8_t buffer[512];
上記のC言語のコードで、512という文字は何を表すか全くわからない
この数字がMagic Numberに該当する
Magic Numberは、コードの可読性や保守性を著しく低下させるため、避けるべきとされている
・可読性の低下 :コードの意図を把握するのが困難になる
・保守性の低下 :数可動性の低下により、修正漏れや意図しない箇所の修正が発生するリスクがある
・再利用性の低下:数値が特定の文脈に依存している場合、他の箇所で再利用することが困難になる
マジックナンバーの回避方法
・定数を使用する
・列挙型(関連する複数の数値をグループ化し、列挙型として定義する)を使用する
・コメントを記述する
例えば、上記のコードを例に取ると、Msgic Numberを避けるために、以下の様に記述できる
int byte_num = 512:
uint8_t buffer[byte_num];
プログラムのコンパイルやビルド(実行可能なプログラムを作成する作業)を自動化するための設定ファイル
特にCやC++などのコンパイルが必要なプログラミング言語でよく使用される
他のプログラミング言語でも同様の機能を持つファイルやモジュールが存在する
例えば、Pythonの.pyファイルやJavaの.javaファイルも、ある意味でヘッダーファイルと同様の役割を果たす
Makefileの役割
- コンパイルの自動化
プログラムを構成する複数のソースファイル(.cや.cppなど)を、どのようにコンパイルし、リンク(複数のファイルを結合して実行ファイルにする作業)するかを記述する
これにより、コマンドを一つずつ入力する手間を省き、効率的にビルドできる - 依存関係の管理
どのファイルがどのファイルに依存しているかを記述する
これにより、一部のファイルを修正した場合、依存関係に基づいて必要なファイルのみを再コンパイルでできる - 作業の効率化
コンパイルだけでなく、プログラムの実行、テスト、クリーン(不要なファイルを削除する作業)など、さまざまな作業を自動化できる - targetターゲット)
作成したいファイルや実行したい処理の名前
例えば、実行ファイル名やオブジェクトファイル名などがターゲットになる - dependency(依存関係)
ターゲットを作成するために必要なファイルの一覧
依存関係が更新されると、ターゲットが再作成される - command(コマンド)
ターゲットを作成または実行するために実行するコマンド
コンパイラやリンカのコマンドなどが記述される - 関数のプロトタイプ宣言
他のソースファイルで定義された関数を呼び出すために、その関数の名前、引数、戻り値の型を記述する - マクロ定義
#defineプリプロセッサ指令を使って、定数や短いコード片を定義する - 構造体や共用体の定義
複数のデータ型をまとめた複合データ型を定義する - 型の定義
typedefを使用し、新しいデータ型を定義する - 外部変数の宣言
他のソースファイルで定義されたグローバル変数を参照するために、その変数を宣言する
Makefileの基本的な構造
Makefileは、主に以下の要素で構成されるMakefileの利点
Makefileは、大規模なプロジェクトや複雑なビルドプロセスを扱う場合に特に役立つツール
・ビルド時間の短縮:変更されたファイルのみを再コンパイルするため、ビルド時間を短縮できる
・作業の効率化:複雑なビルドプロセスを自動化し、作業効率を向上させる
・移植性の向上:Makefileを使用することで、異なる環境でも同じようにビルドできる
CおよびC++で利用され、宣言や定義を記述したファイル
一般的に、ファイル名の拡張子は".h"
主な役割
ヘッダーファイルを使うことで、コードの再利用性や可読性が向上し、大規模なプログラムの開発が容易になる
数の異なるデータ型の変数を一つにまとめた複合データ型
構造体を使うことで、関連するデータをまとめて扱うことができる
リストやツリーなどの複雑なデータ構造を表現できる
CやC++で広く使われる概念
他のプログラミング言語でも同様の機能を持つデータ型が存在する
例えば、PythonのクラスやJavaScriptのオブジェクトも、構造体と同様に複数のデータをまとめて扱うことができる
ヘッダーファイルの多重読み込みを防ぎ、コンパイルエラーを回避するための重要な仕組み
=1つのコンパイル単位でヘッダーファイルが複数回インクルードされるのを防ぎ、潜在的な再定義エラーを回避する
適切に使用することで、安全で信頼性の高いプログラムを作成できる
C言語やC++,Objective-Cなどの言語など、ヘッダーファイルを読み込むような言語では、インクルードガードを使用する
キーと値を持つテキストファイル(軽量なデータ交換フォーマット)
プレーンテキストで記述され、異なるプログラミング言語やシステム間でのデータ交換が容易
人間が読み書きしやすく、機械も容易に解析/生成できるため、Webアプリケーションを中心に広く利用されている
JavaScript, Python, JAVA, PHP, C#など、様々な言語で利用されている
Pythonの辞書型と基本は同じ
JavaScriptではオブジェクトの一種として扱うが、Pythonの辞書型と簡単に変換して使うことが出来る(逆もまた然り)
Webアプリケーションでデータベースなどから大量にデータを取得する際、一部だけ取得するHTTPスニピットという方法もあるが、
単なるテキストの羅列であり、必要な情報を抽出するには、文字列処理や正規表現などの複雑な処理が必要になる場合がある
一方で、JSONを利用したデータ取得取得は、サーバから大量ののrawデータを構造化して取得でき、コンピューターに優しい方法
基本的に、JSONを利用し、HTTPスニピットは利用しないこと
既存のインターネット通信の仕組みであるHTTP(Hypertext Transfer Protocol)を利用して、
WebブラウザとWebサーバーの間で非同期にデータ通信を行うためのプログラミング技術または手法
Webページ全体をリロードすることなく、サーバーと非同期的に通信してデータをやり取りし、ページの一部を更新する技術の総称
=ページ全体をリロードすることなく、サーバーと通信してWebサイトの一部を更新したり、何らかの処理を行ったりすることができ、より快適なユーザー体験を提供できる
例えば、スポーツの試合速報サイトで、ページ全体はリロードされずにスコアだけがリアルタイムに更新されるなど
JavScriptなどのクライアントサイドのスクリプト言語を使って実現される
プログラミングの手法とは、効率的かつ効果的にコンピュータプログラムを作成するための、体系化された方法や考え方のこと
単にコードを書くことだけでなく、プログラムの設計、開発、テスト、保守といったソフトウェア開発の全般にわたるアプローチを含む
プログラミングの手法は多岐にわたり、抽象度の高い概念から具体的なコーディング規則まで、様々なレベルで存在する
プログラミングの手法の内、ソフトウェアのデザインパターンの1つ
MVCは、アプリケーションのロジックを以下の3つの要素に分割することで、開発を効率化し、保守性を高めることを目的としている
・モデル(Model):
アプリケーションのデータとビジネスロジックを管理する
データの保存、取得、更新、削除など、データに関するすべての処理を担当する
・ビュー(View):
ユーザーインターフェースを担当する
モデルから受け取ったデータをユーザーが見やすい形式で表示する
・コントローラー(Controller):
ユーザーからの入力を受け取り、モデルを更新したり、ビューに表示するデータを変更したりするなど、アプリケーションの制御を担当する
モデルとビューの間を取り持つ役割を果たす
オブジェクトとクラスを使ってコードを構成する
オブジェクト指向では、データ(属性)とデータに対する操作(メソッド)をまとめて"オブジェクト2として扱う
オブジェクトの設計図となるのが"クラス"で、
クラスから実際に生成された実態が"オブジェクト(インスタンス)"
継承、ポリモーフィズム(多態性)、カプセル化などの概念を持ち、より複雑なプログラムを効率的に開発できる
構造体とオブジェクト指向似た概念としてしばしば混同しがちであるが、以下のような違いがある
基本的にオブジェクト指向は、構造体の改良版
1.扱うもの
構造体:データのみ
オブジェクト指向:データと操作(メソッド)の組み合わせ
2.プログラミングパラダイム
構造体:手続き型プログラミング
オブジェクト指向:オブジェクト指向プログラミング
3.概念
構造体:複数のデータ型をまとめたもの
オブジェクト指向:クラスから生成されたインスタンス(オブジェクト)で、クラスはデータとメソッドをカプセル化する設計図
オブジェクト指向プログラミングにおける便利なテクニックの1つ
オブジェクトのメソッドを連続して呼び出すことでき、コードの可読性向上させる
=関数を連続して連鎖的に使うことができる方法
Python,Java,JavaScript,C#など、オブジェクト指向プログラミング言語で利用できる
# The example in Python
result = " hello world ".strip().capitalize().replace("World", "Python") # メソッドチェーン箇所
print(result) #出力: Hello Python
メソッドチェーンが長すぎると、かえってコードが読みにくくなる場合があり、使用は程々にすること
特定の種類の問題を解決するために設計された、再利用可能な基盤となる構造や骨組みのこと
フレームワークは、一般的な機能や設計パターンをあらかじめ提供しており、開発者はこれらの基盤の上に、自身のアプリケーション固有のロジックを肉付けしていくことで効率的に開発を進めることができる
広範囲な様々なアプリケーション機能を提供する
フレームワークの主な利点:
・開発効率の向上:共通的な処理や構造が用意されているため、ゼロから全てを記述する必要がなくなり、開発時間を短縮できる
・コードの品質向上:確立された設計パターンやベストプラクティスが組み込まれていることが多く、保守性や拡張性の高いコードを書きやすくなる
・チーム開発の容易化:共通のルールや構造に従って開発を進めるため、チーム内での認識のずれを防ぎ、連携を取りやすくなる
・セキュリティの向上:多くのフレームワークは、一般的なセキュリティ上の脆弱性に対処する機能を提供している
・学習コストの削減:特定の種類の開発に特化した知識やスキルを習得しやすくなる
フレームワークの中でも特に軽量で、提供する機能が限定的なものを指す
大規模なフレームワークが多くの機能(ルーティング、ORM、テンプレートエンジンなど)を内包しているのに対し、
マイクロフレームワークは、必要最小限の機能のみを提供し、開発者に自由な選択肢を与える
プログラミングにおけるライブラリは、特定の機能を実現するために再利用可能なコードの集まりを指す
ライブラリは、開発者が効率的にプログラムを作成できるようにするためのツールで
他の人が書いたソースコードでライブラリ化されているものを自分のソースコードへインポートすれば、
自分で0から書き上げなくても、簡単に目的の機能を実装することができる
画像処理、データ分析、ネットワーク通信など、さまざまな分野のライブラリが存在する
オブジェクト指向プログラミング(Java, Python, JavaScriptなど)では、ライブラリをオブジェクトとして扱う
そのため、ライブラリを使用するためには、オブジェクトのインポートに加え、
ライブラリ名と同じ変数にライブラリのオブジェクトを代入が必要になる(=インスタンスを作成する)
こうすることで、ライブラリ名と同じ変数.メソッド()で、
ライブラリのメソッド(関数)を呼び出して、やりたい処理をおこなうことが出来る
一方で、オブジェクト指向プログラミングではないC言語などは、
ライブラリを使用する際は、ただライブラリをインポートするだけで、ライブラリ内の関数を使用することが出来る
オブジェクトという概念が無く、ライブラリの機能は主に独立した関数として提供されている
メモリ管理の方法は、各プログラミング言語によって異なる
C.C++ではプログラマが好きなタイミングでメモリ解放を行うことができる
=メモリ管理が必要
JavaやPyton、C#はガベージコレクションというメモリ解放を自動で行う機能があるが、どのタイミングで行うかは人間が指定することはできない
Pythonはメモリ管理など、非常にシンプルになっている一方で、遅い
プログラミングは常に何かとのトレードオフ
CやC++といったプログラミング言語で作られたプログラムのメモリをチェックして、問題がないか診断するツール
=プログラミングで作ったプログラムの健康診断ツール
プログラムが動くとき、一時的に情報を覚えておくためにメモリを使用する
例えば、計算結果を一時的に覚えておいたり、読み込んだファイルを覚えておくなど
プログラムがメモリを使用する際、適切に管理/整理をしていないと、以下のような問題が起こることがある
・メモリリーク:プログラムが使い終わったメモリをきちんと返さずに、そのまま放置してしまうこと
これは、部屋の片付けをせずに、ゴミをどんどん溜めていくようなもので、
メモリリークが起こると、プログラムがどんどん重くなったり、最悪の場合、止まってしまう
・不正なメモリアクセス:プログラムが、使ってはいけないメモリの場所にアクセスしてしまうこと
これは、他人の家の鍵を開けて、勝手に中に入ってしまうようなもので、
不正なメモリアクセスが起こると、プログラムが予期せぬ動きをしたり、クラッシュしする
Valgrindを使用すると、プログラムの実行中のメモリの使われ方を監視して、上記のような問題を見つけ出すことができる
・メモリリークがどこで起こっているか
・不正なメモリアクセスがどこで起こっているか
・その他、メモリに関する様々な問題
使い方は非常にシンプルで、通常の実行時にvalgrindを追加するだけ
valgrind ./MyProgramNameエラーが発生した場合に、プログラムが異常終了するのを防ぎ、安定性を向上させることができる
エラー処理のコードを、通常の処理のコードから分離できるため、コードの可読性と保守性が向上する
=不正な条件で埋め尽くさないで済み、スマートなコードにできる
多くのプログラミング言語で例外処理の考え方は共通していますが、例外の種類や構文は言語によって多少異なる
| 例外の処理 | 説明 |
|---|---|
ZeroDivisionError |
ゼロ除算エラー 数値をゼロで割ろうとした場合に発生する |
TypeError |
型エラー 異なるデータ型同士で演算を行おうとした場合や、関数に不適切な型の引数を渡した場合に発生すする |
ValueError |
値エラー 関数に適切な型の引数を渡したが、値が不適切な場合に発生する |
IndexError |
インデックスエラー リストやタプルなどのシーケンスにおいて、存在しないインデックスにアクセスしようとした場合に発生する |
KeyError |
キーエラー 辞書において、存在しないキーにアクセスしようとした場合に発生する |
FileNotFoundError |
ファイルが見つからないエラー 存在しないファイルを開こうとした場合に発生する |
NameError |
名前エラー 未定義の変数を使用しようとした場合に発生する |
SyntaxError |
構文エラー コードの文法が間違っている場合に発生する |
IOError |
入出力エラー ファイルの読み書きなどでエラーが発生した場合に発生する |
MemoryError |
メモリ不足エラー プログラムが使用できるメモリを超えてメモリを確保しようとした場合に発生する |
AttributeError |
属性エラー 存在しない属性にアクセスしようとした場合に発生する |
小数の計算はパソコンの仕組み上、2進数の計算で誤差が生じる
必ず整数にしてから計
算を行い、最後に小数に戻す
変数には以下2種類の変数がある
変数の種類によって、スコープが異なり、関数がアクセスできる範囲が異なる
(1)グローバル変数
関数の外で変数宣言された変数で、どこの関数からでもアクセスできる
一方でどこからでもアクセス出来てしまうが故に、アクセスのタイミングによっては、予想とは異なる挙動を示したり、エラーになる事がある為、使用には注意が必要
不必要なグローバル変数の宣言は避ける
(2)ローカル変数
関数内でのみアクセスが出来る変数で、変数宣言した関数以外からはアクセスできない
システムのレスポンスを向上させるために、アルゴリズムの処理時間を考慮すること
例えば、データの探索方法(アルゴリズム)として代表的な、線形探索法(Linear Search)と二分木探索法(Binary Search)の各処理時間は、
Linear Search(線形探索法):O(n)
Binary Search(二分木探索法):O(log2n)
Binary Search(二分木探索法)の方が、探索するデータセットをあらかじめ昇順/降順に整列させておく必要があり、
ソートされていないデータを扱う際には一見手間であるが、
このグラフに示す通り、探索データ量が大きければ大きいほど、Binary Search(二分木探索法)で実行した方が良い事がわかる
主にCやC++などのコンパイラで駆動する言語で行うもので、Pythonなどのインタプリタ型言語では不要プロトタイプ宣言は、関数の「型」をコンパイラに知らせるための宣言で、
関数名、引数の型、戻り値の型を記述し、関数の具体的な処理内容(定義)は含まない
コンパイラ駆動型言語では、コンパイラがソースコードを上から順に処理するため、
関数が呼び出される前にその情報(プロトタイプ)をコンパイラに知らせる必要がある
→コンパイラは関数の呼び出しが正しいか(引数の型や数、戻り値の型が合っているか)をチェックできる
特に、複数のソースファイルにまたがる大規模なプログラムでは、プロトタイプ宣言が重要
無限ループなどで、プログラムを停止したい時、Ctrl + Cで止めることができる
多くのオペレーティングシステムとプログラミング言語で提供されている
Ctrl + Cの仕組み
Ctrl + Cは、オペレーティングシステムに対して"割り込みシグナル"(通常はSIGINT)を送信するキーボードショートカット
このシグナルを受け取ったプログラムは、実行を中断し、終了処理を行うことができる
プログラミング言語によって、シグナル処理の仕組みや実装方法が異なる
・C/C++: signal関数を使用してSIGINTシグナルを捕捉し、独自の終了処理を実装できる
・Java:Thread.interrupt()メソッドを使用してスレッドを中断できる
また、Runtime.getRuntime().addShutdownHook()を使用して、プログラム終了時に実行される処理を登録できる
・JavaScript(Node.js):process.on('SIGINT', ...)を使用して、SIGINTシグナルを捕捉し、終了処理を記述できる
・Python:KeyboardInterruptという例外が発生し、、適切な終了処理を記述することで、プログラムを安全に停止させることができる
終了ステータスとは、プログラムやコマンドが終了した際に、その結果をOS(オペレーティングシステム)に伝えるための数値のこと
終了ステータスを使うことで、正常に終了したか、エラーが発生したかなどをOSや他のプログラムに知らせることができる
また、エラーが発生した場合、終了ステータスの値によって、エラーの発生原因を特定しやすくなる
一般的に、終了ステータスが0は、プログラムは正常に終了したことを意味する
0以外の値は、何らかのエラーが発生したことを示し、エラーの種類によって、異なる値が返される
終了ステータスの値の範囲は、システムによって異なりますが、多くのUNIX系システムでは0から255までの整数値が使用される
終了ステータスの取得
主にUnix系オペレーティングシステム(Linux、macOSなど)のシェルスクリプトで使われる以下のコマンドを利用すると、
直前に実行されたコマンドの終了ステータス(終了コード)を取得できる
シェルスクリプトでは、この終了ステータスを使って条件分岐などを行うことができる
eco $?
$?変数:シェルが直前に実行されたコマンドの終了ステータスを格納する特殊な変数
#100DaysOfCode
毎日参加して練習することができる
Stack Overflow
般的なプログラミングの質問に対する回答が掲載されているオンライン百科事典のようなもの