シラバス
科目名 プログラミング言語
英語科目 ナンバリング Isft304
開講期 秋学期 開講学部等 コンピュータ理工学部 配当年次 3年次 単位数 2単位
教員名 青木 淳
 ※履修条件,配当年次等の詳細は履修要項をご確認ください。
授業概要/Course outline  
 コンピュータを実際に動かす言語(たとえば機械語)と私たちがプログラミングに用いる言語(たとえばオブジェクト指向プログラミング言語)の間に大きな溝があることは周知であろう。その溝を埋めるために情報技術(IT)の粋が結集しており、コンピュータの発展の歴史が詰まっていると言っても過言ではない。
 その粋な部分(言語処理系の内部)を学びながら、コマンドインタプリタ(たとえばシェル)やスクリプト言語(たとえばPythonやAppleScript)、そして、仮想化技術(たとえばSmalltalkやJavaの仮想マシン方式)などのモダンな言語処理系(および実行系)の構成方法を知ることが目的である。
 また、1年次と2年次に学んできた手続きプログラミング(C言語)とオブジェクト指向プログラミング(Java言語)に加えて、論理プログラミングと関数プログラミングについても学習する。様々なプログラミングのスタイルを垣間見ることで、新たなプログラミング言語やスタイルに出会ったときの咀嚼力と免疫力を向上させる。
 本科目では、字句解析器(レクサ)や構文解析器(パーザ)の生成系(メタ系)を援用しながら、小さな言語処理系を自作するので、いままで学習してきたことの総決算(パノラマ)ができる。コンピュータに対するビジョン(鳥瞰した地図)とプログラミングの何たるか(メタプログラミングの視座)の会得も可能となる。
授業内容・授業計画/Course description・plan  
 この授業では「まず、やってみる、それから、学ぶ」をライトモチーフにしながら進めてゆく。毎回の授業の終わりに必ず「今日のレポート」を課す。今日のレポートであるから、授業日の23:59:59までに、指定された形式と方法でレポートを提出することを介して、学んだことや習ったことを確固たるものにする。
[第01回]
テーマ:開講にあたって
テーマ:言語処理系の概観
 授業を始めるにあたって、授業目的・授業内容・評価方法・教材などを説明した後、言語処理系を構成している各々のフェーズ、字句解析・構文解析・意味解析・コード生成・最適化、それぞれをざっくりとデモンストレーションによって概観する。
[第02回]
テーマ:言語処理系の概観
テーマ:実行方式は仮想マシンへ
 前回授業の復習から導入し、古典的な言語処理系と現代的な言語処理系の相違を示す。機械語に相当するスタック操作命令やメッセージ送信命令などのバイトコードを解説し、インタプリタの動きをデモンストレーションすることで、仮想マシンの存在を明らかにする。
[第03回]
テーマ:実行方式は仮想マシンへ
テーマ:Object-Oriented Programming
小テスト:オブジェクト指向デザイン&プログラミングの試験(〆切:年末)
 仮想マシンにはメモリ管理が備わっていることを説明する。メモリ管理はオブジェクト指向プログラミングとも密接に関係することを示し、オブジェクトの生死(不要メモリの回収と再利用)を扱うガベージコレクションのストラテジーとアルゴリズムをいくつか紹介する。その後、オブジェクト指向プログラミングのスタイルへと導入する。また、年末(12月末)を〆切とする小テストの問題を開示する。
[第04回]
テーマ:Object-Oriented Programming
テーマ:Python
 オブジェクト指向プログラミングの続きを行いながら、Haskellからの関数プログラミングのスタイルを受け継ぎながら現代的なオブジェクト指向プログラミング言語としての枠組みを備えたPythonを紹介し、そのプログラミングのスタイルを説明する。
[第05回]
テーマ:Logic Programming
小テスト:論理プログラミングの試験(〆切:7日後)
 言語処理系としてPrologを用いて論理プログラミングのスタイルを解題する。事実と規則を書き並べることによって、述語論理に基づいて動作するプログラムである。処理の手順や手続きを書き並べることで動作するプログラムとの相違、すなわち、ユニフィケーションとバックトラックの妙を目の当たりにする。
[第06回]
テーマ:Functional Programming
小テスト:関数プログラミングの試験(〆切:7日後)
 言語処理系としてLispを用いて関数プログラミングのスタイルを解題する。束縛と再帰を母体として数学の定義にように動作するプログラムである。処理の手順や手続きを書き並べることで動作するプログラムとの相違、すなわち、代入と繰り返し(ループ)からの脱却を目の当たりにし、コンカレントにクリーンな並行プログラミングへと誘う。
[第07回]
テーマ:プログラミングスタイル
テーマ:Constraint Programming
小テスト:プログラミングスタイルの試験(〆切:10日後)
 今まで個別に学んできた手続き的・オブジェクト指向的・論理的・関数的なプログラミングのスタイルを一覧し、それらの長短を説明する。また、新たに制約プログラミングのスタイルも示し、プログラミング言語を支えるパラダイムの多様さと多相さを実感してもらう。CやJavaなどの個々のプログラミング言語を操ることも大切だが、プログラミングのスタイルやパラダイムを学ぶことこそ肝要であること、メタプログラミングの礎になることを案内する。
[第08回]
テーマ:プログラミング言語の形式的記述
 プログラミング言語のためのプログラミング言語、すなわち、プログラミング言語自体を記述するための形式的な表現を学ぶ。構文図式・バッカス記法・状態遷移図を解題する。
[第09回]
テーマ:正規表現と自動人形
 字句解析の母体となる正規表現と自動人形(有限オートマトン)を説明する。ワイルドカードと正規表現のちがい、非決定性オートマトンから決定性オートマトンを導いて正規表現になることを図式を援用して示す。
[第10回]
テーマ:字句解析器生成系
小テスト:字句解析の試験(〆切:7日後)
 正規表現→決定性オートマトン→Cプログラムへと変換するlexやflexを紹介し、その用法を詳しく解説する。字句解析器(レクサ)を生成するメタ系であること、すなわち、プログラミング言語のメタプログラミング言語であることを実感する。
[第11回]
テーマ:構文解析の方法
テーマ:木と表
 構文解析の母体となる構文木・解析木・生成規則・LL構文解析・LR構文解析を解題する。続いて、言語処理系の中は木(tree)と表(table)の嵐であること(頻繁に用いられていること)を紹介する。
[第12回]
テーマ:構文解析器生成系(構文規則(BNF)+字句解析→Cプログラム)
小テスト:構文解析の試験(〆切:7日後)
 バッカス記法を用いて構文規則を記述し、字句解析プログラムをインクルードすることで、構文解析器としてのCプログラムを生成するyaccやbisonを紹介し、その用法を詳しく解説する。構文解析器(パーザ)を生成するメタ系であること、すなわち、プログラミング言語のメタプログラミング言語であることを実感する。
[第13回]
テーマ:意味解析の実際(LALR(1)に意味解析を付加して構文木(解析木)を作成)
 LR構文解析(正確にはLALR(1)の構文解析)に意味解析を付加して構文木を生成する過程を利用して解析木を作り上げることを詳細に解説する。解析木には自己参照構造体を用いて、関数プログラミングで紹介したS式として表現する。
[第14回]
テーマ:ちっぽけな言語(tiny language:ちっぽけな言語の構文図式)
小テスト:ちっぽけな言語の処理系を作成する試験(〆切:1月末)
 ちっぽけな言語の構文図式を示す。今まで学んだことをすべて応用する。字句解析の作成、構文解析の作成、意味解析の作成、解析木を食べて、最適化し、コード生成し、実行して結果を出す仮想マシンの製作を掲げる。
[第15回]
テーマ:閉講にあたって
小テスト:プログラミング&リファクタリングの過程と頒布のための試験(〆切:授業日23:59:59)
 この学期を通して学んだことを振り返る。そして、仕上げとしての小テストを行う。この最終回のライトモチーフは「ひとりじゃないって」であり、他の方々と協行することの大切さをもって締めくくる。
準備学習等(事前・事後学習)/Preparation and assignments  
[第01回]〜[第15回]毎回の授業テーマに共通する予習と復習について
[事前学習]配付資料を教員ページまたはmoodleページからダウンロードし、事前に関係するところを調べて授業に臨むこと。
[事後学習]授業で学んだ知識を整理し、さらに理解を深めるため、授業中に指示されるレポートや課題に果敢に取り組むこと。
 授業内容が広範(各論から総論)に及ぶため、進度も速く、難度も高い、まさにスペクタクルである。そのため、予習と復習をしなければ、授業に追随することが難しくなる。また、数々の小テストには複数の配付資料が関連する。したがって、配付資料の整頓も大切である。
授業の到達目標/Expected outcome  
 まず、手続き的なプログラミングのスタイル(まず、それをやって、次に、あれをやり、最後に、これを返す、というプログラムの作り方の一本槍)から脱却(それ以外の多くの槍を持つこと・パラダイムを異にする多種多様なプログラミングの戦略と戦術を体得)することを目標とする。同時にプログラミング言語の背後に横たわっているメタ系(メタ言語:言語を定義する言語:文法を記述する文法)を確かなものにする。
 次に、翻訳系(コンパイラ)や解釈系(インタプリタ)を構成している字句解析・構文解析・意味解析・コード生成・最適化などを現代的に形式的に捕捉できることを到達目標とする。
 プログラミング言語は自分で設計して実装できるのだ、という感覚と自信を身につけることも到達目標である。既存のプログラミング言語を習って使うばかりでなく、自らの思いや考えを的確にコンピュータへと伝える新しいプログラミング言語をデザインできる資質の養成をめざす。
 現代では、プログラミング言語を用いて表現したプログラムの相手がコンピュータばかりではなく、世界中のプログラマを相手にしなければならない。コンピュータを相手にプログラマが指示を伝えた時代から、プログラマたちが意思を伝え合い、協行するためのメディアとしてプログラミング言語の時代が到来していることを実感し、その設(しつら)えを会得する。
身に付く力/Special abilities to be attained  
 論理的思考力(課題発見力、計画力、論理的分析力、総合的判断力)、実践力(働きかけ力、実行力、主体性)、そして、コンピュータ理工学(プログラミング言語を中核とするコンピュータ科学)の知識を身につけることができる。
履修上の注意/Special notes, cautions  
 同時に進行している「言語オートマトン」を合わせて履修することが望ましい。1年次の「基礎プログラミング演習」と2年次の「発展プログラミング演習」、そして、3年次の春学期の「プロジェクト演習」で学んだことが前提となる。
 毎回、各自のコンピュータを持参し、必ずネットワークに接続して、授業が始まる前までに稼働状態にしておくこと。講義中に援用するプログラムはネットワークを介して取得する。リポジトリ(SCM: Software Configuration Management、たとえばsubversionやgitなどのソフトウェア構成管理)もアクセスするので、その作法(マナー)に慣れておくこと。
評価方法/Evaluation  
 定期試験は行わない。授業が手解き(ハンズオン:体験学習)を含む関係上、出席は大変に重要である。毎回のように授業中にレポートやプログラムの提出を課す。これらを平常点(50%)とする。また小テストを複数回行う。それらの出来具合(50%)を加味し、総合的に評価する。
教 材/Text and materials  
 教科書:配付資料
 参考書:青木淳、浅岡浩子、澤本依里『Smalltalkで学ぶオブジェクト指向プログラミングの本質』(日経BP社,2008)
 参考書:山下義行『コンパイラ入門―構文解析の原理とlex/yacc、C言語による実装』(サイエンス社,2008)
 参考書:ラビ・セシィ『プログラミング言語の概念と構造』(ピアソンエデュケーション,2002)
 参考書:ジェラルド・サスマン他『計算機プログラムの構造と解釈』(ピアソンエデュケーション,2000)
 参照URL:http://www.cc.kyoto-su.ac.jp/~atsushi/
その他/Others  
 研究室:第2実験室棟3階73研究室
 オフィスアワー:木曜日2限(10:45-12:15)
 連絡先:配付資料の表紙に記載されているメールアドレス
 授業に関する質問やホウレンソウ(報告・連絡・相談)がある場合には、オフィスアワーの時間に研究室へ訪問するか、メールで問い合わせること。
Copyright (C) 2014 Kyoto Sangyo University. All rights reserved.