📚

Nand2Tetris読書会(9章)

2022/02/27に公開

概要

Nand2Tetris読書会 を開催しています。
今回取り上げるのは、9章『高水準言語』です。

前の記事は こちら

内容

  • 低水準(低レイヤ): 人が直接読み書きすることを想定していない
  • 高水準: 人が直接読み書きすることを想定している

Jackの標準ライブラリは、以下のような抽象化されたサービスを扱える。

  • 配列: Array
  • 文字列: String
  • 数学ファンクション: Math
  • メモリ管理: Memory
  • 入出力ファンクション
    • スクリーンへのテキスト出力: Output
    • スクリーンのグラフィック出力: Screen
    • キーボードからのユーザー入力: Keyboard
  • プログラム実行: Sys

アプリケーションの設計と実装の手順は以下のようになる。

  1. ハードウェアの物理的な制約を考慮して、計画を立てる
    • コンピュータのスクリーンサイズによって、グラフィックのサイズに課される制限を考える
    • I/0コマンドの種類やプラットフォームの実行速度を元に、「何ができる/できない」を検討する
    • etc.
  2. 「どのようなアプリケーションか?」を決める
    • どのようにグラフィックを表現する?
    • etc.
  3. プログラムを設計する
    • オブジェクトベースで設計するとよい
    • どのクラスにどのようなフィールド、サブルーチンを持たせるかを明確にする
  4. 設計を実装する
  5. クラスファイルをコンパイルする

Jack言語は他の高級言語と以下のような違いがある。

  • 演算子の優先順位を定義しない
    • () 付きの式は先に評価される
    • それ以外の演算子の評価順は保証されない
  • 弱い型付けの言語である
    • 代入や演算操作で型の一致は厳密に要求されない
  • パースを簡略化するためのルールがいくつかある
    • dolet のようなキーワードを付けなければならない
      → 文の最初のトークンを見ればその文が何をするか分かる

ディスカッションメモ

Jackは弱い型付けによってコンパイラを簡素化しているとあるが、型付けをきちんとやろうとするとどんな苦労がある?

まず、強い型付け/弱い型付けとは何かを考える。
型付けが強いと型安全性が保証され、型付けが弱いと型安全性が保証されない。
型付けが弱いと、プログラムのコンパイル時にエラーが出なくても、実行してみると予期せぬエラーが発生する可能性がある。

https://sumii.hatenablog.com/entry/20051018/1129631080

強い型付けを実現しようとすると、次に挙げるような部分の実装が大変になりそう…

  • 継承、ジェネリクス
  • 型推論

文の最初のトークンだけで何をする文なのか判断できることの弊害は?

コンパイラの実装が簡単になる分、その言語で実装をするのは大変になる。
一般的な高級言語で {} の省略などが許されるのは、コンパイラが複雑な構文解析を担ってくれているおかげである。

感想

Jack言語の仕様を紹介する章だったので、書籍に書いてある内容自体に関するディスカッションは少なめでした。
ただ、普段開発で書いているJavaやTypeScriptなどよりもかなり割り切った仕様になっているので、その仕様についての話が盛り上がりました。
私たちが実行時エラーに悩まされずにプログラムを書けているのは、裏側で動いている言語処理系のおかげなんですね。

最後に

Nand2Tetris読書会始めました』の記事でも紹介していますが、読み進めているのはこちらの本です。
https://www.oreilly.co.jp/books/9784873117126/

初学者なりに書籍やその他に調べた内容をまとめていますが、理解が足りておらず間違ったことを書いているかもしれません。
そのような箇所を見つけた場合はコメントなどで指摘していただけると助かります。

次の記事は こちら

GitHubで編集を提案

Discussion