コンテンツにスキップ

講義の概要#

講義の目的#

本講義の目的はプログラミング言語の本質の理解にある.特定のプログラミング言語を用いたプログラミングスキルの習得が目的ではない.実践ではなく理論の講義であることを認識しておくこと.

例えば次のC言語のソースプログラムが与えられたときに,

適当なC言語プログラム
int isEven(int n) {
    if (n % 2 == 0) {
        return 1;
    }
    return 0;
}

以下のような問いに答えられるようになることが目的である.

  • なぜC言語はこのような構文となっているのか?
    ≒C言語はどのような考えに基づいてこの構文を採用しているのか?
  • この構文でなぜコンピュータが動作するのか?
    ≒この構文がコンピュータにどのような指示を与えているのか?
  • これ以外の言語・構文は存在するのか?本質的に何が違うのか?

Note

プログラミング言語と計算機言語は完全に同じ意味である.

プログラミング言語を理解するとは,プログラミング言語とその計算モデル(仮想計算機)を理解することである.言い換えると,プログラミング言語の理解とは,ソースプログラムをそれと等価な機械語に翻訳する過程(コンパイル)の理解である.

C言語やJavaなどの命令型プログラミング言語を中心に説明する.関数型言語や論理型言語についてもその特性を説明する.

Note

プログラミングと本講義の関係は,球技と筋トレの関係に近い.

  • ボールを触る時間は楽しいが,より高いレベルを目指すには筋トレも必要である
  • プログラミングは楽しいが,より高いレベルを目指すには基礎理論の理解も必要である

理論的な側面のみでは理解が難しいことも多々ある.可能な限り具体的なソースコードを併記するので,ブラウザで動作するオンラインコンパイラ等を使って実際に動かしてみることを強く推奨する.理論の授業ではあるが実践も大切にすること.

オンラインコンパイラの一例を示す.

可能な限り分かりやすい説明を試みるが,理論の講義であるため抽象的で捉えにくい部分もある.自発的な学習が必須である点を認識しておくこと.

講義の進め方#

教科書の内容を噛み砕いた本Webサイトに従って講義を進める.

教科書:
プログラミング言語論」,コロナ社,ISBN978-4-339-02704-4
教科書表紙

講義全体の流れは教科書に準拠するが,各回の流れや用語,例題などに大幅に変更を加えている.厳密な定義よりも分かりやすさを,トピックの網羅よりも理解の深化を優先するためである.教科書を使って勉強する際はその点に注意すること.

なお教科書の購入は必須ではない.より深く理解したい場合は教科書を活用すること.

宿題#

毎回30~60分程度の宿題を課す.回答締切は次回講義の前日23:59とする.回答フォームとしてはGoogle Formを利用する.提出ミスに気をつけること.必ず回答を手元にコピーしておくこと.

講義1回目の宿題(参考)

Homework 約30分 答え

次のC言語プログラムを等価なRAMプログラムにコンパイルせよ.各変数とRAM上のメモリセルの対応は自由に決めて良い.

void main() {
    int ans = 0;
    int x = 7;
    if (x > 5)
        ans = 10;
    else
        ans = 20;
    printf("%d", ans);
}

以下の書式をコピーして回答せよ.

  load   #0
  store  2
labelx:
  load   ???
  ???

回答フォーム

試験#

中間試験と期末試験をペーパー試験の形式で実施する.試験範囲は教科書ではなく本Webサイトである.試験時間は中間・期末共に60分とし,残り30分で答えの解説をする.解説の出席は任意とする.試験会場はG516である.

成績評価#

宿題を含む講義への参加姿勢,および中間試験と期末試験の合計点により成績を決める.

備考#

本Webサイトは2024年に作成したものであり,タイポやエラーなどの間違いが含まれている可能性が高い.間違いや改善点を発見した際は宿題のフォームを使って連絡せよ.講義への参加姿勢として加点の対象とする.