プログラミング技術

 プログラミング技術
山崎利治
プログラミング技術
プログラミング技術について元プログラマの体
験から個人的な意見を申し 上げる.内容は
「プログラマとして体得していて欲しい技術」
についてである.ここで念頭にあるのは公共の
安寧に影響するソフト ウエア開発に従事してい
る職業プログラマである.
話の予定
プログラミング技術とは?
局所プログラミング
大域プログラミング
プログラム分析
プログラム言語をよく理解するために
算法とデータ構造
まとめ
プログラミング技術とは?
プログラムとは
計算機を動かす処方箋である.
数学的な定理である.
という主張がある.後者のそれでは
プログラムが仕様の模型であることを厳密に証明しなけ
ればならない プログラムは後者だという意見は希少である?
それがプログラム問題の大きな要因である
プログラミングの見方
! "#
#
$ %&
'(
#
$ %
) *
#
$ +
,
* $
$ -
#
プログラミング技術とは?
ここでは「プログラム技術」をプログラム作成・分
析技術とする
プログラムは仕様の実現として正し くなければなら
ない.故に,正当性を主張できるプログラムを書く必
要がある.また プログラムを分析して正しいと判断
できなければならない.その行為は科学 論理・数学
に基づくもので まさに「技術」といえる.
この技術性がプログラミング教育を可能にする.
一方,手紙を書く,調理するなどのように体験に依
存する「技能」でもあるが.
プログラム作成論
構造的プログラミングはプログラミング作成論となりソ
フト ウエア工学になった.そこで生まれた重要な概念は
なしプログラミング
分割統治
段階的洗練
情報隠蔽
検証
形式的ソフト ウエア開発方法
局所プログラミング
巨大なプログラムも関数 手続き 抽象データ型 クラス
モジュール 成分 などと呼ぶ高々数百行程
度の部分をもつ その小規模プログラムの書き方を問題に
する ダイクスト ラ計算,洗練計算,あるいは,数学的プ
ログラム構成法などと呼ばれていた方法に着目したい.
最近の による「契約による設計」 !"#$
#% もこの線に沿った方法である.これらの方法
の系統的な学習を薦めたい.
実務で採用するには 先端的 妥協的さまざまな手段があ
りうる.
局所プログラミング
多くの実務の場面では命令型プログラムを書いている そ
れは記憶域 プログラムの全変数 状態 に貯えた値を命令
によって変更し その蓄積効果が計算であるとする.この
方式は直観的である反面 参照が不透明でプログラムは難
解になる そこで注釈が不可欠になり その最も重要なも
のは プログラムの実行中に不変な性質とプログラム文の
実行前条件と実行後条件 反復中の不変条件 限度関数 反
復の終了を保障するために使う などである このような
注釈を表明という それはプログラム仕様である
局所プログラミング
参照透明性 式の一部をそれと等価なもので置き換えて
も式の値が変わらない性質.プログラムの場合 同一式が
文脈によって値を異にする状況を惹き起す &
'( )*
局所プログラミング
表明を加えた小さな例を示す:
二正整数
の最大公約数 を求めるプログラム
任意の2整数 に対して を満たす整数 が一意に存
このような を の最大公
在する .
/
約数という.つまり 両者を整除する最大の整数である
つぎが成立つのでプログラムは直ちに書ける.
局所プログラミング
00 00 01 10
00 00 00 # 局所プログラミング
先の表明付プログラムにおいて
前件 事前条件 とプログラム文と後件の3つ組に
よってプログラムの意味を表す これがプログラムの
性質を推論する形式的体系 ホーア論理 になる
その証明体系によってプログラムの正しさが証明で
きる これを正当性検証という
局所プログラミング
%!%+ や ,%-% の一部に対する証明体系が作られた
人は誤り易く自動検証が望まれる
検証系も作成された
その利用が難しい 完全自動にならない
はじめから正しいプログラムを書こう!
ダイクスト ラ計算
蓋付命令
'(
による単純な非決定性プログラム言語蓋付命令を紹介する
この言語によって論理的なプログラミング方法ダイクスト ラ計算を開
発した
はそれぞれ基本命令 論理式 文 蓋付命令を表す
¾
としては多重代入命令 などがある
例 ¾ 蓋付命令
蓋付命令の意味は状態上の述語「最弱前件」による これは正し くプ
ログラムをつくるための核心でもある
「状態」「変数」「値」
「述語」! 「状態」の部分集合の全体
「命令」「状態」 「
状態」
「状態」
を真にする状態集合
「 命令」「述語」「述語」
「状態」 最弱前件
は非停止
は から を実行したあとの状態集合
蓋付命令
述語 は から を実行すると 必ず停止してその状
態は に含まれている つまり,前件 で を実行すると有限時間
のうちに をみたす状態になる そのような一番弱い条件が であ
る . が よりも弱い /
¾ 蓋付命令
はつぎを満たす
ならば 蓋付命令
¾ ¾ ¾ ¾ 蓋付命令
について!
命令の反復が終了するかどうかは一般に明らかではない を反
復する毎に少なくとも1は減少する整数値関数 .限度関数/ を考え
そうなる最弱前件 を導入する そこで つぎが成立する
ならば ならば ならば 蓋付命令
最大公約数を求めるプログラムをダイクスト ラ流で書こう!
「反復本体のなかで不変に保つ を成立させる」
「 を不変に保ちながら をできるだけ減少させる」
となる は
反復本体で を不変にしながらの最も一般的な形は
そこで つぎのような蓋 を考える
となる を求める たとえば をとって 蓋付命令
以上から に対する蓋 を得る
つぎに停止性 限度関数として をとる
故に 以上から !
しかし は導けない 同様に考えて と蓋 を得る 最終的に !
¾ 大域プログラミング
巨大プログラムをどう作成するか &
基本は構造化と分割 分割部分間の協調である
つぎを話題にする
オブジェクト 指向プログラミング
並行化
成分中心 #
ある構造化機構
オブジェクト 指向プログラミング
の基本はオブジェクト の利用である オブジェクト
はつぎに他ならない 代数 抽象データ型
余代数 プロセス
2 3
45'
#4
,6
#.7
/
#
$ %
代数 抽象データ型
代数 .抽象データ型/ はつぎのデータを与え仕様とする!
関係するデータ型 .種/
演算とその型 .標/
演算間に成立する等式
実現は仕様を満たせばよい 意味は種 .定数と変数/ と演算によって自
由生成された項全体 ただし 2項は等式によって等し くならない限
り異なるとする
結果としてつぎの利点が得られる
計算対象の具体的表現を隠蔽し
対象は演算によってのみ生成・変更・参照され
実現を変更しても利用プログラムには響かない
代数 抽象データ型
!
" " # !
" " !
" $
" " !
代数 抽象データ型
%
" 8 $
5
( ) 9
6 5# ,
#:# ,6
,
余代数
オブジェクト はつぎのようにも見做せる
);
のクラス宣言
&
' !
&
!( ' ! ) ! 余代数
! は非公開
仕様としてはつぎをいいたい !
*
!*
*
*
!)*
つぎはいいたくない !
*
!*
*
!)
形式的に纏めると
! ! "
この形を余代数という
余代数
代数の双対である余代数 .#
5/ は現在まだよく普及していない
が重要である ここでは暗箱としての台集合 .状態/ の上に演算を定義
し 演算によって不変な性質と 演算によって識別できないという双
模倣が仕様になる この仕様は 44 のオブジェクト として実現でき
る 例示する
釦と表示灯をもつ簡単な装置がある ここで釦を2回
押すと表示灯は反転 明から暗へ 暗から明へ する
. 2 )#5
2 )#5 "# 5
# ,
45
;
の講演より/
6 3
未刊
余代数
灯の観察可能状態を
界面は
で表す
# $
操作押すは次状態をつくるだけ
$
この # に対する余代数 $ # $ はつぎの2つの関数で構成される
$
$
灯
押す
$
余代数
形式的に書けば
!# # % # &
灯 ' &# 押す !&# (
灯 押す 押す 灯 )( # % )# " )&!# (
灯 " 灯 押す " 余代数
);
による実現
+,
' '
推移系 プロセス 無限の要素をもつデータ型などは余代数として扱
え 普及したい
並行化
逐次プログラムとして実現して問題ないプログラムでも並行プロセス
として実現すると各プロセスが小さく簡単なものになることがある
事務計算でも実世界を忠実に模型化しようとするとプロセスがみえて
くる .# 3 )#(,
;
/
本の掛売りをする本屋がある 販売係は本とともに納品伝票を客に渡
し 直ちにその写し .売上伝票/ を会計係に送る 会計係は月末になる
とその月の売上を集計し 売掛残高報告を作成 同時に客に請求書を
送る 客は何らかの手段で支払うが 一度に請求額を支払うとは限ら
ない 入金額は財務係から随時会計係に通知する この本屋の仕事を
プログラムせよ
並行化
先の課題を で各登場人物の挙動を記述し % で実
現したことがある いまなら と ,%-% が使える
並行プロセスによるプログラムの作成は難しい一面があ
る しかし 規範あるプログラミングによって克服できる
とくに 応答型 実時間型 分散型 組込型などのプログラ
ムでは並行化は必須である.つぎは参考になる:
,% %
+! %
,.% /0
,%-% %!1
3" / %
2"+ %+#" !#
!0 3 %3 2"+ 4555
%
成分中心 用語成分 部品
の意味は不分明である 方式記述言語
.#
#
# / や協調言語 .#
/ などの用語も聞く 巨大ソフト ウエアに対しては「全体構
造」を考えなければならない
#
ソフト ウエア方式=成分+成分間の相互作用
方式を明確に意識する利点は大きい
成分 モジュール プロセス 部分系など機能の担い手
相互作用 手続呼出 同期 共有データ 通信配信 事象一斉
同報 手続間接呼出などの協調機構
成分中心 方式を定義することによって 方式の記述ができ,それに準拠して開発できる
系の変遷発展を扱う基盤ができる
交信と計算が分離できる
方式と実現が分離できる
「成分中心」の考えが実現できる
成分中心 方式を定義し その記述言語 .9/ が試作されている
方式についての共通認識はまだできていない <
しかし ,つぎが基本概念のようである 成分 .部品/
#
ß データとその変換子 状態と計算の場所
繋
#
#
ß 成分間相互作用と作用を司る規則を担う
構成
#:
ß 成分を点 繋を有向辺とするグラフ
成分中心 %+% たちの 2"3
の目的 系を成分と繋によって合成する
それをソフト ウエア方式と考える
その記述方法と厳密な意味を与える
方式理論展開のための基盤整備 系全体の挙動推論の
基礎
成分中心 2"3
の方式記述 成分型=端子 +成分仕様 !
繋型=役割 + +糊 +/
成分と繋の具体化
端子と役割の結合
これらをすべて交信逐次プロセス とみなす 客・接客方式 .#
;
#
#
/ の繋では 客と接客のそれ
ぞれの役割を果たすプロセスがあり その挙動を協調する働きをする
プロセス .たとえば 非同期通信/ が必要で それを糊プロセスという
繋はそれらプロセスの並行合成で具体化する
)*+*
+*
" % ,- ,
#
* . * #
#
"#
/+* +* % +- ,- 01 ' 1
*
#
/+*% . *
" /+*,- . *
+-" )*+*
+* " " ¾ - +-/ 2
% * % +-/ 2
,- * ,- +-/ 2
#
,&# )+-/ "+-/ % +-/ ,-+-/ 2
( )+-/ ¾ " % * )+-/ ¾ " ,-* #
* . * * . * ¾ +-/ 2
¾ - &*"+ ¾ +-/ 2
= ,&# "+ "+
¾ - +-/ 2
¾ +-/ 2 . *"+ . ** . *13"+ ¾ . *+-/ 2
( . ** ¾ ¾ . *+-/ "+
¾ +-/ . *"+
#
,&# * . * ( * * * - 4 +-/ 4 *
# =
/ $ * / / * $ #
/ $ * / * / *# $
ある構造化機構
単子 ./ は単位半群や半順序集合上の閉包演算を抽象した単純
な数学上の概念である.その単子は構造化機構としてつぎのように利
用された!
単純型付ラムダ計算に「計算型」を導入した形式体系の模型
プログラム言語の表示意味記述の構造化
$(
); プログラムの検証
の状態 副作用 例外 入出力などの構造化
アスペクト 指向プログラミングの理論的研究
ソフト ウエア開発の現場で積極的な利用が望まれる
プログラム分析
プログラムの理解を助けるさまざまな工夫がある.それらがプログラ
ムの検査 .虫取り/ 保守・改良 統合 コード 最適化などに役立つ
データ流れ解析
制約中心解析
抽象解釈
型・効果系
>
#
,
下村隆夫 プログラムスライシング技術と応用 共立
?
プログラム言語をよく理解するために
プログラミング言語をよく理解するために
一つの言語仕様の精読
多くの言語を知ること 「プログラム言語論」という解説を読む
米田信夫 野下浩平 @ 講義 共立 %
島内剛一 プログラム言語論 共立 %7
武市正人 プログラミング言語 岩波 2 #
9
7@@7
3"
プログラム言語をよく理解するために
プログラミング言語も一般の言語と同様 語彙論 構文論 意味論 語
用論およびそれらを支える各種の理論がある.たとえば 語彙論・構文論
ß 文脈自由文法
意味論
ß 操作的 公理的 表示的意味論
型理論
ß 単純型付ラムダ計算 多様型理論 高階型理論
語用論
ß イディオム,パターンなど
これらは自習 輪講などで習得したい
プログラム言語をよく理解するために
) $# ) A
ト マトン サイエンス社
9
野崎 他訳 言語理論とオー
%
## "# ,
#
A 横内寛文 プログラム意味論 共立
-
算法とデータ構造
典型的なプログラム課題に対して そのお手本を承知していることは
大切である.必要に応じて あるいは 時間をかけて つぎを読んで欲
しい
石畑 清 アルゴリズムとデータ構造 岩波
$ /
"# .7
3" 7@@
ここでは省略したが関係データベースについての理論・実際に通暁し
ていなければならない .特定の管理系についてではなく/
まとめ
よいプログラムを書くために 0
仲間との読み合わせ
その利用分野の既存プログラムの批判的精読
異種言語 関数型 論理型 軽言語 への変換
異なるプラット ホームへの移植