Program
Overview
このセクションでは、さまざまなプログラミング言語とその使用方法について詳しく解説しています。
それぞれの言語の基本構文、特徴、用途、実践的なコーディングテクニックなどを網羅し、開発者が効率的にプログラムを構築できるようサポートします。
また、各言語ごとのベストプラクティスや、他の技術との統合方法についても説明します。
セクション内容
- 言語別ガイド: 各プログラミング言語の基本情報と詳細なガイド。
- コーディングテクニック: 効果的なコーディング手法、デザインパターン、最適化技術。
- 実践的な使用例: 具体的なプロジェクトでの使用例とサンプルコード。
- 比較と選定: 異なる言語の比較、適切な言語選定の基準。
Program 計算量を求める
特に Node.js サーバーをシングルスレッドで運用する場合、 O(n^2) のような計算量を要求するような処理は、 たった1つのリクエストが他のリクエストを阻害してしまうので致命的な不具合となりえます。
フレームワーク ベンチマーク
元のURL Web Framework Benchmarks
言語種類
コンパイルされて実行できる状態になったプログラムのことを実行形式と呼ぶ
スクリプト言語(scripting language):軽量言語 または LL(Lightweight Language)
一般的に軽量言語(LL)ではメモリ管理のコストなどに注意してコードを構成しなければパフォーマンスが極端に悪くなることがある。
※Goは細部を気にせずコードを書いても、比較的パフォーマンスを引き出しやすい傾向がある。
マクロ言語
ソフトウェアの動作の自動化などを行なうプログラムを記述する言語はマクロ言語と呼ばれることがある。
静的型付けのメリット
- 型安全性
- ドキュメント化と入力保管 静的型付けの言語では型の情報がソースコードに書かれる。この情報はDXをかなり助ける。
変数/メソッド名 コメント
原則使わなくて済む方が良い。
- コメントなしで意味が伝わる命名をする
- 関数の引数は命名だけではなく、TypeScriptの情報量を増やす
メソッド名
メソッド名の場合は動詞や助動詞を用いて命名する このパターンで適宜考えないといけない
- 真偽値を返すメソッド
- 必要に応じてしか実行されない処理をするメソッド
- 非同期処理に関連するメソッド
- コールバックメソッド
- コレクションの操作に関するメソッド
- 状態に関するメソッド
- オブジェクトのライフサイクルを扱うメソッド
- データに関するメソッド
クラス名
クラス名は何らかしらの責務を持つモノとして捉えるため名詞用いる
コンストラクター
コンストラクターに値を渡すってことは依存するということと同義
それを解決するのが DI
interface
インターフェースの名前に形容詞を用いることがある。形容詞を用いることでクラスの持つ性質を説明できるようになる。
記号の呼び名
汎用的に呼ばれているものを記載する
[]: ブラケット
プロセスとスレッド
プロセスとスレッドについての勉強会
シングルスレッドとマルチスレッド
プロセス(docker.mdで図がある。)
OSから見える処理の単位。
- 1プロセス1CPUの関係。
- メモリ空間を共有していない
- 他のプロセスのメモリにはアクセスできない
- プロセス間の同期が難しい
- スレッドと比較して1プロセス毎の情報量が多い
- 情報量が多いので切り替えが遅い
- マルチスレッドプログラムと比較してメモリ効率が低い
- 仮想アドレスと物理アドレスの解決が高コストのため切り替えが遅い
- マルチスレッドプログラムと比較して大量のメモリが使用できる
- マルチプロセッサの場合、(一般的に)シングルプロセスマルチスレッドプログラムよりもマルチプロセスプログラムの方が高速
スレッド(糸)
プロセスの中で並列的に処理を行う仕組み
- メモリ空間を共有している
- 他のスレッドのメモリにアクセスできる
- スレッド間の同期が容易
- スレッドセーフな実装にする必要がある
- メモリを共有しているので、他のスレッドに予期せぬ影響を与えてしまうことがある
- プロセスと比較して、1スレッド毎に必要な情報量が少ない
- 情報量が少ないので切り替えが早い
- マルチプロセスプログラミングと比較してメモリ効率が高い
- マルチプロセスプログラミングと比較して大量のメモリ確保が行えない
- 非同期に実行できる処理がある場合は、(一般的に)シングルスレッドプログラムよりもマルチスレッドプログラムの方が高速
実際のプログラムでは、プロセスやスレッドを都度生成する事は稀です。 高コスト、メモリリーク、生成でき ない可能性がある等の問題があるからです。 起動時に必要数を確保しプログラム終了時まで破棄しないスレッドプール等の仕組みが使われます。
式と文
プログラムを組み立てるのに必要な式と演算子
- 式 式とはリテラルや変数、演算子、メソッドなどを組み合わせたもの 式は何らかの値を返す
- 文 文(Statement)とは値を返さないもの(=変数に代入できないもの)
ひとつの文章にまとめない方がいい
以下の書き方は良い習慣ではない。 というのも一般的な開発環境(デバッガー)ではコードの実行を中断しブレークポイントは行単位でしか設定できない そのため短い文であっても複数の文を1行にまとめないが鉄則
name = '山田'; puts(name)
リテラル
リテラルは数値や文字列などのデータをコード中で表現する方法
- リテラル表現
108, 'Hoge', [1,2,3]
のようなリテラルをかくことは、すべて特定の型(クラス)に応じたインスタンスを生成することと同義。 この例だtとInteger, String, Arrayクラスのインスタンスが生成される。 リテラル表現はインスタンスを生成する手軽な手段だが、すべての型(クラス)で用意されているわけではない。 数値、文字列などよく利用するものについていちいち利用するたびにインスタンス化を意識させるのは面倒なためより直接的に表現できるリテラルが用意さ れているだけ。 一般的なクラスはnewというメソッドを利用してインスタンス化する。
第一級オブジェクト(ファーストクラスオブジェクト)
第1級オブジェクトというのは数値や文字列のような、変数に割り当てられたり、なんらかの計算処理ができたりといった、プログラミングの基本機能が使える対象のことを指す。
副作用
副作用とは、関数の外部状態を変更したり、コンソールに出力したり、例外を投げたりすることを指す。
副作用があると同じ引数を渡しても何度実行しても結果が異なることがある。
関数
関数にも種類がある
- 純粋関数
- 副作用を持つ関数
純粋関数(pure function)
純粋関数(pure function)とは、与えられた引数から常に同じ結果を返す関数であり副作用がない関数のことを指す。
純粋関数は、引数に渡された値だけを使って計算を行い、値を返す関数で、外部の状態を変更する副作用を持たない。
副作用を持たないため、純粋関数は安全で予測可能で、テストしやすく、再利用性が高いとされている。
純粋関数には以下のような特徴がある。
- 同じ入力に対しては必ず同じ出力を返す
- 関数外の状態に影響を与えない
- 副作用を起こさない
メリット
- テストのしやすくなる。
- デバッグがしやすくなる
- 再利用性の高くなる。
- また、副作用のない関数は、並列実行に適しているため、分散処理などの分野での利用も期待されている。
関数型プログラミングとの関わり 純粋関数は関数型プログラミングの中心的な考え方であり、関数型プログラミングでは、副作用を最小限に抑え、純粋関数を使ってプログラムを構築することが推奨されている。
副作用のある関数
副作用がある関数は同じ引数に対して異なる結果を返す可能性があるため、テストがしにくかったり、デバッグがしにくかったりする。
また、副作用を伴う関数は、実行順序によって結果が異なる場合があるため、コードの予測性が低下すること があります。
// 例: userオブジェクトの状態で状態で、常に同じ出力を返すわけではないため副作用のある関数になる
const isLatestTerm = async (user: User): boolean => {
user.accept ? true : false
};
純粋関数参考
以下に、引数を直接変更する例と新しい値を返す例を示します。
引数を直接変更する例:
function addToCart(item: Item, cart: Cart): void {
cart.items.push(item);
cart.total += item.price;
}
この関数は、引数の cart
オブジェクトの items
プロパティと total
プロパティを変更しています。これは副作用を持つ関数です。
新しい値を返す例:
function addToCart(item: Item, cart: Cart): Cart {
return {
items: [...cart.items, item],
total: cart.total + item.price,
};
}
この関数は、引数の cart
オブジェクトを変更するのではなく、新しい Cart
オブジェクトを返します。これは副作用を持たない関数であり、純粋関数と呼ばれます。
非同期関数
非同期関数は副作用を持つ可能性がある。
非同期関数は、データベースやAPIサービスなど、外部の状態を変更する可能性があるため。
また、非同期関数は時間がかかる場合があり、呼び出し元の処理が一時停止 することがあるため、副作用を持つ関数と考えることができる。
ただし、非同期関数が副作用を持つとは限らない。
たとえば、配列のソートなど、引数に渡された値自体を変更しない非同期関数もあるため。
これらの関数は副作用を持たず、純粋関数と同様に扱うことが可能。
関数とサブルーチンの違い
関数は値を返すのに対してサブルーチンは値を返さないという違い。 どちらも同じようなものであるものである(実際にほとんどの言語でサブルーチンと関数の区別は存在しない)
サブルーチン
サブルーチンとは**メインの処理(ルーチン)**から呼び出される別の処理という意味合いで、多くの場合関数と同じ意味で使われる。
メソッド
クラスの中に定義された関数のことをメソッドと呼ぶ。