プログラミング言語入門 - lecture.ecc.u

プログラミング言語入門
プログラミング言語入門
•
•
•
•
•
•
•
機械語
アセンブリ言語
高級言語
仮想機械
手続き型
関数型
オブジェクト指向
機械語(machine language)
• 計算機のCPU(central processing unit、中
央処理装置)によって直接的に実行。
• 機械語プログラムはメモリ上ではビット列に
よって表現され、CPUはビット列を機械語命
令(通常はワード)に区切って実行する。
• 機械語命令
– 命令の種類を表すopcode(operation code)
– 命令の引数を表すoperand
– 次に実行する命令に関する情報
アセンブリ言語(assembly language)
• 機械語命令におけるopcodeやoperandを人
間に理解しやすい記号で表現。
• 人間が機械語プログラムを書く場合は、アセ
ンブリ言語(assembly language)を用いて行
うのが一般的。
• アセンブラ(assembler)と呼ばれる処理系が、
アセンブリ・プログラムを機械語のプログラム
に変換。
高級言語(high-level language)
• 直接的にCPUで実行することはできない。
• 実行形態によって、大きく二つに分かれる。
• コンパイラ(compiler)
– 高級言語のプログラムを機械語に翻訳。
– プログラムの実行効率は高い。
• インタープリタ (interpreter)
– プログラムを機械語に翻訳せずに解釈実行。
– 即時にプログラムを実行することができるので、小規模な
プログラムの実行やプログラムを頻繁に改変して実行す
る状況には適している。
– スクリプト言語
• 文字列の簡単な操作とコマンドの起動などを組み合わせた処理
仮想機械(Virtual Machine)
• 実際のCPUを真似た仮想的かつ理想的な計算機
• コンパイラによっては、高級言語を仮想機械の機械
語に翻訳。
– Javaのコンパイラは、Java言語のプログラムを
JVM(Java Virtual machine)と呼ばれる仮想機械の機械
語に翻訳。
• 仮想機械の機械語プログラムは、さらに本当の機械
語に翻訳されて実行されるか、仮想機械のインター
プリタによって解釈実行される。
– Java
– 前者の場合、JVMの機械語から本当の機械語への翻訳
は、仮想機械のプログラムをJVMの処理系に読み込んだ
時点で行われる。(just-in-time compilation)
手続き型(procedural)
• 命令型(imperative)ともいう。
• 基本的な操作を組み合わせて、メモリ上に表
現されたデータを変更することにより計算が
行われる。
• ひとまとまりの処理を行うための一連の操作
をまとめたものを手続き(procedure)という。
• 手続きは、別の手続きから呼び出すことがで
きる。自分自身を呼び出すことも可能。
• プログラムは手続きの集まりとして作られる。
関数型(functional)
• 関数をプログラムの基本単位とする。
• 関数とは、与えられた入力に対して出力を返
すもので、手続き型言語の手続きのようにメモ
リ上にあるデータを変更するものではない。
• 手続き型言語においても関数という言葉は使
うが、値を返す手続きという意味であり、関数
型言語における純粋な関数とは異なる。
オブジェクト指向(object-oriented)
• 手続き型の言語を発展させ、オブジェクト(object)の概
念を取り入れたもの。
• オブジェクトとは一連の関連するデータを集めたもの。
– 例えば、学生を表すオブジェクトは、名前、所属学部、学生
証番号、学年、履修科目などからなる。
– オブジェクトに属するデータをフィールド(field)という。
• クラス(class)によってオブジェクトの形式を定義。
– 学生オブジェクトのクラス
• クラスには、フィールドだけではなく、そのクラスに属
するオブジェクトを操作するための手続きを定義。
– メソッド(method)という。
• 継承(inheritance)の機能により、既存のクラスをもと
にして新しいクラスを定義することができる。
オブジェクト
• オブジェクト: 意味的なまとまりのあるデータ
の単位.
– 単純なもの: 整数,文字列など
– 複雑なもの: 有理数,スタック,リストなど
• メソッド: オブジェクトに対して可能な操作
– 整数に対する加算,文字列に対する置換
– スタックに対するpush, pop
• クラス: 同じ種類のオブジェクトを定義する単
位.適用可能なメソッドはクラスで定まる.
Ruby
クラス定義
class BaseballPlayer
attr_accessor :team, :position, :bat_order
def initialize(t,p,bo)
@team = t
@position = p
@bat_order = bo
end
end
ichiro = BaseballPlayer.new("Mariners", "right field", 1)
スタックの定義
Ruby
class Stack
def initialize(size) # newのときの初期化
@data = Array.new(size)
@pos = -1
# @posがスタックのトップを表す.最初はボトムを指す -1.
end
def push(obj)
# objがプッシュされるデータ
@pos += 1
# @pos = @pos + 1 と同じ意味
@data[@pos] = obj # 前頁の図では上のほうが番地が大きい
end
def pop
@pos -= 1
@data[@pos + 1]
end
# 先にトップへのポインタを減らす
# ∵ 最後の式が値となるため
def empty?() @pos == -1 end
end
この定義の後に
試してみよう
s = Stack.new(100)
s.push :abc
s.push :def
p s.pop
p s.pop
スタックの定義
Ruby
class Stack
attr_accessor :pos
def initialize(size) # newのときの初期化
@data = Array.new(size)
@pos = -1
# @posがスタックのトップを表す.最初はボトムを指す -1.
end
def push(obj)
# objがプッシュされるデータ
@pos += 1
# @pos = @pos + 1 と同じ意味
@data[@pos] = obj # 前頁の図では上のほうが番地が大きい
end
def pop
@pos -= 1
@data[@pos + 1]
end
# 先にトップへのポインタを減らす
# ∵ 最後の式が値となるため
def empty?() @pos == -1 end
end
Ruby
色々な変数
BaseballPlayer
はクラス
class BaseballPlayer
attr_accessor :team, :position, :bat_order
def initialize(t,p,bo)
@team = t
これ
これも
@position = p
変数
も変
数
@bat_order = bo
end
end
ichiro = BaseballPlayer.new("Mariners", "right field", 1)
ichiro
は変数
変数の有効範囲
• 局所変数: 宣言された場所の含まれる範囲内での
み有効.
– 範囲:
• 通常はメソッド定義の初めから終わり
• より小さい単位はブロック
• より大きい単位はクラス/モジュール定義の初めから終わり
• インスタンス変数: 1つのオブジェクト内で有効.
Rubyでは変数名の語頭に@をおく規約
• クラス変数:1つのクラス内で有効.Rubyでは変数
名の語頭に@@をおく規約
• 大域変数: プログラム全体で有効.Rubyでは変数
名の語頭に$をおく規約