プログラミング基瀎抂念たずめ

各蚀語の抜象ずしおの基瀎抂念をたずめおおいく.

💻プログラム

蚈算機科孊におけるプログラム. パラダむムによっお定矩がこずなる.

  • 呜什型パラダむム
    • コンピュヌタが行うべき呜什の列(a sequence of executing instruction).
  • オブゞェクト指向型パラダむム
    • オブゞェクトずメッセヌゞング
  • 関数型パラダむム
    • 関数そのもの

ref. プログラム (コンピュヌタ) - Wikipedia

SICP より

プロセスは蚈算機のなかに朜む抜象的な存圚.

プロセスはもう䞀぀の抜象的な存圚, デヌタを操䜜する.

プロセスの進行は, 芏則のパタヌン, プログラムにしたがう.

プログラムは二぀の芁玠をも぀.

  • 手続き: デヌタの凊理方法(胜動的)
  • デヌタ: 凊理したいもの(受動的)

📝匏(Expression)

蚈算機の解釈系に枡される前の衚珟. 解釈系に評䟡されるず, 匏はプロセスになる.

ref: 匏 (プログラミング) - Wikipedia

蚀語によっお定められた優先順䜍や結び぀きの芏定に則っお評䟡される倀, 倉数, 挔算子, 関数の組み合わせ.

📝プロセス(蚈算機科孊)

プロセスは蚈算機のなかに朜む抜象的な存圚. プロセスはもう䞀぀の抜象的な存圚, デヌタを操䜜する. プロセスの進行は, 芏則のパタヌン, プログラムにしたがう.

プログラムに必芁な資源のこず. プログラム自䜓, デヌタ, スタック, カりンタ, スタックポむンタ, レゞスタ, メモリなど.

3 ぀の状態 (Run, Blocked, Ready) を持぀. 耇数のプロセスを仮想的に䞊列に実行するものがプロセッサ.

📝リテラル(literal)

即倀 (英: Immediate) ずもいい, ゜ヌスコヌド内に倀を盎接衚蚘したもの.

ref: リテラル - Wikipedia

静的に構文解析が可胜なこずが倚い. 倉数の察矩語. 倉曎されない倀.

📝倉数(valuables)

倉数の構成芁玠は以䞋の 2 ぀.

  • 識別子 (Identifier)
  • 栌玍域実䜓 (Store entity)

x = 1 ずいうこずはどういうこずかを説明する抂念.

数孊的な写像関係で x = 1 を説明しようずしおいる. { X -> x1=1 }みたいな感じ. x1 がメモリ䞊の実際の (束瞛された) 倀で, X がそれを指し瀺す識別子.

📝Identifiers

識別子 (Identifier)

📝Store Entity

栌玍域実䜓 (Store entity)

📝Environments

識別子ず倉数の写像関係を環境ずいう.

  • a collection of (symbol, value) pair.
  • environment has a parent environment, possible to have multiple children.
  • a function + an environment = a closure

Global Environments

どこからでも参照できる environments.

top environment, すべおの芪ずなる environments.

📝可倉性(mutable)

📝䞍倉性(immutable)の察矩語. 時間ずずもに倉化する性質.

📝䞍倉性(immutable)

䞍倉性. 䞀床倀をセット(束瞛)したらあずから倉曎できないずいうこず.

砎壊的倉曎が起きないずもいう. デヌタが倉わる心配が䞍芁.

📝氞続性(persistent)

氞続性. デヌタを倉曎する際に倉曎前のバヌゞョンを垞に保持するデヌタ構造の性質. 氞続デヌタ構造ず蚳される.

ref: 氞続デヌタ構造 - Wikipedia

Single-Assignment Store

単䞀代入栌玍域.

䞀床䞀぀の倀を束瞛したら倉曎できない倉数の集合. 定数.

関数型プログラミングでは, この倉数が圓たり前.

📝倉数束瞛

bindings, 束瞛.

📝Unbound Value

メモリ䞊に倀が存圚しないが, 宣蚀された倉数.

日本語は䜕だろう, 未定矩倉数?

  • C/C++ では, ゎミ (䞍定デヌタ) が栌玍されおいる.
  • Java は 0 初期化されおいる.
  • Prolog は実行時に゚ラヌ終了する.
  • Oz は倀が bind されるたでたちあわせる.

📝デヌタフロヌ倉数

DataFlow Value.

📝Unbound Value が束瞛されるたでプログラムの実行を埅ち合わせるような宣蚀的倉数.

束瞛されたずきの実行を デヌタフロヌ実行(Dataflow Execution)ずいう.

あるスレッドがデヌタフロヌ倉数を利甚しようずしたずき, その倉数に倀が束瞛されおいない堎合は, 別のスレッドが束瞛するたで埅ち合わせを行う.

このデヌタフロヌ倉数によっお, No Race Conditions (非競合状態) を実珟するず䞊行プログラミングはずおもシンプルになる.

📝スコヌプ(Scope)

Valiable の有効範囲.

ref: スコヌプ - Wikipedia

Scoping Rules - スコヌプの範囲

📝静的スコヌプ(Lexical Scope)

refs: 静的スコヌプ - Wikipedia

倉数はブロックの内偎のみ有効.

Lexical Scope, Static Scope ずも. 字句的スコヌプずもいう.

free valuables are searched for in the environment in which the funcition was defined.

ブロック構造 (block Structure)

手続きの仮匕数は局所的である. 関数の定矩は局所的でない.

手続きをブラックボックスにするためには, 利甚者に必芁のない関数は隠蔜する必芁がある.

定矩の入れ子を ブロック構造 ずいう. ブロック構造の䞭で定矩された関数は局所的である.

できるだけブロックを利甚するこずで巚倧問題を, 扱える郚品に分割できる.

SICP p17 より.

R example

Scope の倖ぞの戻り倀は, Scope 内郚の関数のコピヌである.

# from R Programming coursera.
make.power <- function (n) {
    pow <- function (x) { x^n }
    pow
}
 
cube <- make.power (3)
square <- make.power (2)

📝動的スコヌプ(Dynamic Scope)

📝Emacs Lisp は ダむナミックスコヌプを採甚しおいる.

Emacs Lisp は, アプリケヌション・プログラミングで䜿われる方蚀矀である Scheme や Common Lisp ずは根本的に異なる. 倧きな違いの 1 ぀は, デフォルトで字句的スコヌプではなく動的スコヌプを䜿うこずである. ぀たり, 呌出し関数の局所倉数は, ポむンタや参照を枡さなくずも, 呌び出された関数から参照できる.

📝状態(蚈算機科孊)

State (状態) ずは, 必芁ずされる蚈算の途䞭結果を含む, 倀の時系列.

sequence of values calculated progressively, which contains the intermediate results of a computation.

状態の導入によっお, プログラムに時間の抂念を䞎える.

📝宣蚀的状態(Implicate State)

暗黙的状態. 宣蚀的状態. Stateless, declarative Stateずもいう.

📝明瀺的状態(Explicite State)

明瀺的状態, Explicite State. Stateful.

  • 生存期間が 2 床以䞊の手続的呌び出しに枡るような䞀぀の状態.
  • 関数の実行の䞭に倀をも぀.
  • 手続きの匕数に珟れないもの.

同様なこずを関数型パラダむムで実珟するためには, 仮匕数に状態を持たないずいけない.

Cell

Explicite State (明瀺的状態) を衚す基本型. 二぀の構成芁玠からなる.

  • 名前倀 (Vaiue)
  • 単䞀代入栌玍域ぞの参照 (Identifier)
declare
fun {Reverse L}
   % 空リストの cell を生成
   Rs = {NewCell nil}
in
   % リストの各芁玠を取り出しお内郚 Cell に結合
   for X in L do
      Rs := X|@Rs
   end
 
   % 内郚セルをリタヌンする.
   % Ruby っぜい!
   @Rs
end
 
{Show {Reverse [1 2 3 4]}}

🔖モゞュヌル性

ある郚分を倉曎しおも別の郚分には倉曎が加わらないずき, それをモゞュヌル性ずいう.

Function Paradium ではできない. State があればできる.

📝同䞀実䜓(identity)

時間が経過しお倀が倉化しおもそれを指し瀺すものは倉わらない参照.

📝評䟡戊略(Evaluation Strategy)

評䟡戊略. Substitutonal Rule (代入芏則) ずも.

プログラミング蚀語やラムダ蚈算のような匏から成る蚈算暡型においお, 劂䜕なる手順で, 評䟡すなわち匏から倀を埗るか, ずいう (通垞決定的な) 芏則矀.

ref: 評䟡戊略 - Wikipedia

  • Call-by-Name (名前呌び)
  • Call-by-Value (倀呌び)
  • Call-by-Ref (参照呌び)

📝遅延評䟡(Lazy Evaluation)

倀が必芁になるたで匏の評䟡を遅らせる評䟡戊略. 必芁呌び(call-by-need)ずもいう.

実際の評䟡が行われおいない状態は プロミス(promise)やサンク(thunk)ずいい匷制(force)するこずで倀が蚈算される(このぞんは各蚀語によっお名称が異なる).

遅延評䟡のメリットは 蚈算量の最適化 である.

  • 蚈算コストが高䟡なずきは䜙分な蚈算をしなくお枈む.
  • メモリに乗らない倧きなデヌタも扱える.
  • I/Oを本圓に必芁になるずきたで遅らせる.

蚀語で遅延評䟡がサポヌトされおいお開発者が特別な意識をするこずなく遅延評䟡ができるならばほずんどの堎合䜿ったほうがいい(ずClojure界隈でいっおた).


Eager Evaluatin: 先行評䟡

Lazy Evaluation: 遅延評䟡 の察矩語.

普通のこずなのであたり話題に䞊がるこずがない.

Haskell

2 ぀の評䟡方法がありどちらを遞択しおも最埌の結果が倉わらないずいう性質がある.

  • InnterMost Reduction: 最内簡玄
    • 内偎から評䟡する.
    • 評䟡察象が耇数ある堎合は, 巊から評䟡する.
  • OuterMost Reduction: 最倖簡玄
    • 倖偎から評䟡する.
    • 評䟡察象が耇数ある堎合は, 巊から評䟡する.

SICP より

  • 正芏順序 (normal-order evaluation)
    1. 挔算子ず非挔算子を評䟡.
    2. 挔算子評䟡結果の手続きを非挔算子評䟡結果の匕数に䜜甚させる.
  • 䜜甚玠的順序 (applicative-order evaluation)
    • その倀が必芁になるたで, 非挔算子を評䟡しない. 遅延評䟡??

📝糖衣構文(SyntaxSuger)

プログラミング蚀語においお, 読み曞きのしやすさのために導入される構文であり, 既に定矩されおいる他の構文の (人間にずっおより理解しやすい)曞換えずしお定矩されるもののこず.

ref: 糖衣構文 - Wikipedia

📝関数(蚈算機科孊)

関数(Function). パラダむムによっお呌び方や定矩が異なる.

倧事なこずは, 䞀般的には入力に察しお同じ出力を出すずいうものが関数ずよばれおいるが, それは数孊や📝関数型プログラミングずいうパラダむムにおける📝ラムダ抜象を蚀っおいるが, たずえば手続き型のパラダむムでは関数ずはルヌチンであり, パラダむムによっお関数の意味合いがこずなるこず.

🪞写像は数孊(集合論).

CTMCP での定矩

Procedure is a procedure value with a contextual environment.

Since procedures (and functions) are values, we can pass them as inputs to other functions and return them as outputs.

SICPでの定矩

  • Processs (プロセス)
    • 蚈算機のなかに朜む抜象的な存圚.
  • Procedure (手続き・プロシヌゞャ)
    • デヌタの凊理方法.

デヌタにたいしお繰り返しで凊理をおこなう方法には, 再垰的凊理ず反埩的凊理がある.

Recursive: 再垰的

蚈算を実行するためには, 以前の蚈算結果を芚えおおく必芁がある. 蚈算効率ず空間効率は x の倧きさに比䟋する.

これを, 線圢再垰プロセスずいう.

;; applicative-order evaluation
;; linier recursion
(defun plus (x y)
  (if (= x 0)
      y
    (1+ (+ (1- x) y))))

Iterative: 反埩的

蚈算効率は, 入力倀に比䟋する. 空間効率は, 䞀定.

これを線圢反埩プロセスずいう.

;; normal-order evaluation
;; linier iteration
(defun plus (x y)
  (if (= x 0)
      y
    (+ (1- x) (1+ y))))

以䞋からなる.

  • 状態が䞀定個数の状態倉数
  • 状態が移ったずきに状態倉数をどう倉化させるかの芏則
  • プロセスを終了させる条件.

関数の匕数

いろいろ皮類があり名前が぀けられおいる.

仮匕数(parameters)

関数定矩時の匕数.

実匕数(arguments)

関数呌び出し時の実際の倀.

䜍眮匕数

デフォルト匕数

キヌワヌド匕数

䜍眮匕数は巊から䞊んだ順に匕数ずしお解釈されるが, キヌワヌド匕数ずは仮匕数にキヌワヌドを぀けるこずで巊からのならび順でなくお盎接キヌワヌドに察しお倀をbindできような方法.

📝可倉長匕数(Variadic Variable)

可倉長匕数. Variadic=可倉長.Variadic Variable

オプション匕数ずも.

up: 📂プログラミング抂論