-
法学部出身のITエンジニア
-
イルカ🐬が好き
-
プログラミング、語学、法学、数学が好き
-
共時的(synchronique)/同時代的な「横」の比較
- 英語 vs フランス語
- 日本法 vs アメリカ法
-
通時的(diachronique)/歴史的な「縦」の比較
- 古代の日本語 vs 現代の日本語
- 近世の法令 vs 現代の法令
※ synchronique vs diachronique: 言語学者フェルディナン・ド・ソシュールによる区別
人間が目的のために生み出したツールについて、
共時/通時的な比較から類似点や相違点を探り、
「なぜ」そのように設計されているのか学ぶことで、
効果的な活用/応用や発展の可能性が見えてくる。
-
言語を深く効率的に学ぶには
-
プログラミング言語を俯瞰する
-
文法の誕生
-
処理の流れのコントロール
-
関数
-
エラー処理
-
名前とスコープ
-
型
-
コンテナと文字列
-
並行処理
-
オブジェクトとクラス
-
継承によるコードの再利用
書籍「第3章 文法の誕生」より
例えば、
1 + 2 × 3
※ 中置記法(infix notation)と呼ばれる
これは通常、
1 + (2 × 3)
を意味する。
1 + 2 * 3
と書くと
1 + (2 * 3)
の意味で扱われる。
演算子 + よりも * のほうが優先順位が高い、というルール(文法)が言語処理系に組み込まれているため。
※ 抽象構文木(abstract syntax tree, AST)と呼ばれ、
パーサー(parser, 構文解析器)によりコードから変換して得られる表現
2. FORTHという古い言語(1950年代〜)の場合
1 2 3 * +
※ 後置記法(postfix notation), 逆ポーランド記法(reverse Polish notation)と呼ばれる
-
演算子の優先順位のルールは不要
-
括弧は不要
(演算子ごとに受け付ける被演算子(operand)の個数が決まっていて曖昧さがないため)
FORTH on browserで数式を評価してみると
> 1 2 3 * + . (数式。ここで . は結果を取り出す操作)
7 (評価結果)スタック(stack)というデータ構造を用いて
と計算することができる。
※ スタックマシン(stack machine)と呼ばれ、
現代のプログラミング言語の処理系でも使われることがある仕組み
3. LISPという(同じく)古い言語の場合
(+ 1 (* 2 3))
※ 前置記法(prefix notation), ポーランド記法(Polish notation)と呼ばれる
-
演算子の優先順位のルールは不要
-
括弧は省略できない
(演算子ごとに受け付ける被演算子の個数が不定なため)
LISP on browserで数式を評価してみると
> (+ 1 (* 2 3)) ; 数式
7 ; 評価結果多くのプログラミング言語での関数呼び出しの記法
add(1, multiply(2, 3))
と同等であり、抽象構文木(AST)に素直に対応する。
※ プログラムのコード表現と抽象構文木が近いため、
コードのプログラム的な変換(構文マクロ(syntactic macro))が容易に実現できる
これらの例では、文法を考える際に
-
ルールを設けず機械的に扱いやすくする
-
ルールを加えて人間に分かりやすくする
という設計判断の違いがあることが見えてくる。





