プログラミング言語入門 プログラミング言語入門 • • • • • • • 機械語 アセンブリ言語 高級言語 仮想機械 手続き型 関数型 オブジェクト指向 機械語(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では変数 名の語頭に$をおく規約
© Copyright 2024 ExpyDoc