diff --git a/app/routes/posts/compiler-book-memo.mdx b/app/routes/posts/compiler-book-memo.mdx index 4dfdb0f..802e4e3 100644 --- a/app/routes/posts/compiler-book-memo.mdx +++ b/app/routes/posts/compiler-book-memo.mdx @@ -1,7 +1,7 @@ --- title: "読書メモ: コンパイラ" description: "コンパイラという本を読んだのでこれはその読書メモです。手を動かしながら読めたので大変勉強になりました。" -date: "2024/07/31" +date: "2024/08/05" published: true --- @@ -200,10 +200,55 @@ Program ## 意味解析 -## コード生成 +次に意味解析についてです。 +ここでは**字句解析時に生成したトークンが文法的に正しいかどうかをチェック**します。 + +例えば以下のようなケースです。 + +- 宣言されてない変数は使うことはできない +- 宣言されていても誤った使い方をしているものをコンパイラは発見しなければならない + +具体的に、TypeScriptを例にみて行きたいと思います。 + +```ts +const PI = 3.14159; +PI = 3.14; +``` + +この例ではconstという定数を制御する文法に対して再代入を行おうとしているのでエラーになります。これは言語の仕様的にコンパイルエラーになるようにコンパイラは実装する必要があります。 + +そして意味解析では型チェックも行います。 + +```ts +let name: string = "Alice"; +name = 42; +``` + +string型に対して、number型の値を再代入しようとしているので、これも仕様的にコンパイルエラーにならなければなりません。 + +今回も意味解析のコードを[こちら](https://github.com/yossydev/try-compiler/commit/1301749e4db5d81862e4d418ee168f9b28ed55d8)で実装しています。 +以下のようなコードはエラーになります。 + +``` +int main() { + b = 10; + return 0; +} +``` + +`b`という変数は宣言されていないので、`Undeclared variable`というエラーになります。 + +## 🚧 コード生成 + +書くのにカロリーかなり使ったのでまた暇な時に書きます🙏 ## まとめ +アプリを開発するだけではあまりコンパイラの挙動など理解しなくても開発はできると思いますが、筆者としてはフレームワークやライブラリの挙動を理解するためにもこういった普遍的な部分の勉強が遠回りでも大事だと思っています。 +今後はOSSのコードを読んで実際のコードと比較しながらより理解度を深めて行きたいです。 + +フロントエンドは好きですが、これからは異なる分野の技術にも触れて行きます💪 + ## 関連/参考リンク - [コンパイラ [コンピュータサイエンス教科書シリーズ] (コンピュータサイエンス教科書シリーズ 8)](https://www.amazon.co.jp/dp/4339027081?psc=1&ref=ppx_yo2ov_dt_b_product_details)