Skip to content

Instantly share code, notes, and snippets.

@sergeant-wizard
Last active August 29, 2015 14:11
Show Gist options
  • Save sergeant-wizard/d3b0b834f371039b2d43 to your computer and use it in GitHub Desktop.
Save sergeant-wizard/d3b0b834f371039b2d43 to your computer and use it in GitHub Desktop.
understanding computation 勉強会 2014/12/17

復習

statements change the environment, expressions do not

Statement

do-nothing statement を定義

Assignment statement

右辺が簡約できる場合

  • 簡約した結果を再び代入
  • Environmentは変化しない

右辺が簡約できない場合

  • do-nothing statementを返す
  • 右辺のValueをEnvironmentの指定されたKeyに対応させる

If statement

  • condition is an expression
  • consequence is a statement
  • alternative is a statement

if (condition) { consequence } else { alternative }

条件式が簡約できる場合

簡約した条件式を用いたIf statementを返す

条件式が簡約できない場合

True、Falseそれぞれに該当するStatementを簡約する

Sequence

Statementを連結させたもの

Sequence : first statement + second statementとして定義

first statementがdo nothingの場合

  • environmentはそのまま
  • second statementのみに簡約

first statementがdo nothingでない場合

  • (簡約したfirst statement) + second statementのSequenceを返す
  • 簡約によってEnvironmentを変える

While statement

while (condition) {body}を次のように簡約する

if (condition)
  body; # changes evironment
  while (condition) do
    body;
  end
else
  do-nothing
end

Correctness

ここまででの仕様では bool + int が「未定義」 そのような場合簡約しないという例外が定義できるが、 実行時に例外が起きないことをチェックしたい:9章

applications

small-step semantics を標準として採用している言語の紹介

Big step semantics

small step をプログラムを小さく分解して少しずつ簡約していって振る舞いを定義する。 big stepでは直接的にプログラムがどのような振る舞いをするのかを定義する。

expressions

以下のようにEvaluateを定義

  • Number, Boolean : そのまま値を返す
  • Add, Multiply, LessThan : 引数を評価してOperationを実行

statements

以下のようにEvaluateを定義

  • Assignmentは、右辺値をevaluateしてenivronmentを更新
  • DoNothingはEnvironmentをそのまま返すのみ
  • If はconditionをevaluateし、該当するconsequenceをevaluateする
  • Sequence ではまずfirst statementを評価し、それによって変更された環境を用いてsecond statementを評価する
  • While ではcondition を evaluate し、true なら body を evaluate してenvironmentを更新する

Application

small-stepと違い、big-step では Ruby の call stack を活用して 抽象構文木内の走査をする。 small-stepでは実行途中でどのように簡約が行われているのかが明示的にわかる。 big-stepでは抽象構文木の構築自体を実行者に任せる。 (small-step semantics を標準として採用している言語の紹介)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment