1 of 15

Kmkm

プログラミング言語処理系が好きな人の集まり

定期ミートアップ 第5回

2021.07.25

岡本和樹

2 of 15

前回までのあらすじ

  • マイコンプログラミング用言語を作りたい
  • 特徴
    • メモリーは、スタックのみ・ヒープなし
    • 代数的データ型とパターンマッチ
    • pure / impure 関数の区別
    • 線形型
    • C を生成

3 of 15

前回からの進捗

  • 副作用のある関数
    • IO モナド
  • 束縛時の型の記載を不要に
    • 代わりに、型注釈を書けるようにした
  • FFI
    • C コードを埋め込む
  • モジュールシステム
  • where をやめ let
  • 名前解決パス
  • 実行ファイルを実行するテスト
  • エラー出力
  • 自前 C レンダラー

4 of 15

コンパイルパス

  1. 構文解析
  2. 名前解決
  3. 型検査
  4. 逆カリー化
  5. 部分適用除去
  6. ラムダ持ち上げ
  7. トップレベルの非コンパイル時式の関数化
  8. C 構文木へ変換
  9. 簡略化
  10. ソースコード化

5 of 15

副作用のある関数

  • IO モナドみたいなもの
  • 副作用のある関数を呼べるのは、副作用のある関数からのみ

6 of 15

束縛時の型の記載を不要に

  • まだ多相がないので値から型が一意に決まる
    • というのは嘘で再帰のときは決まらない
  • 代わりに型注釈を書けるように

; old

(bind

const

(function a int (function b int a))

(function int (function int int))

(list))

; new

(bind

const

(function a int (function b int a)))

7 of 15

FFI

  • C を埋め込む
  • c-value
    • ""
      • …… include するヘッダー
    • (list "v")
      • …… 引数
    • "return v + 1;"
      • …… 関数本体
  • c-type もある

8 of 15

モジュールシステム

  • 今のところ導入した識別子は fully-qualified で記述
  • 今のところトップレベルの識別子はすべて露出
  • 依存の再帰は禁止
  • ファーストクラスモジュールの予定はない

9 of 15

where をやめ let

  • bind-value の直下でのみそのスコープでの変数束縛をできるようにしていたのをやめて、どこでもできるように
  • 自由度が高いのでそっちに

10 of 15

名前解決パス

  • これまでは識別子を扱うたびになんとなく解決していた
  • 最初のパスですべての識別子を fully-qualified にした

11 of 15

実行ファイルを実行するテスト

  • 最初から最後まで突貫して実行
  • ユニットテストもしてるが、そっちは型が変わるとテストの改修も必要なのがじゃまくさい
  • シェルスクリプトで書いたが、出力に色が着くと楽しい

悩み

  • 実行ファイルのビルドが遅い
    • 実装言語(処理系)の問題
    • 動的リンク&最適化オフにしている

12 of 15

エラー出力

  • 分からなかったから親切にした
  • いい感じ

悩み

  • ローカライズする?
    • しなくても識別番号をふるといいかも
    • Microsoft 的

13 of 15

自前 C レンダラー

  • 元々、既存ライブラリーのパーサー・レンダラーを使用していた
  • C の typedef 問題にぶつかって、パーサーを使わなくなった
  • プリプロセッサー込みのコードを生成したかった

14 of 15

今後

  • パラメーター多相・アドホック多相をどう設計・実装するか
  • 今は代数的データ型だが一般化代数的データ型(GADT)に拡張したい

15 of 15

情報