tag:crieit.net,2005:https://crieit.net/tags/Pascal/feed 「Pascal」の記事 - Crieit Crieitでタグ「Pascal」に投稿された最近の記事 2021-05-23T06:37:49+09:00 https://crieit.net/tags/Pascal/feed tag:crieit.net,2005:PublicArticle/17234 2021-05-23T06:37:49+09:00 2021-05-23T06:37:49+09:00 https://crieit.net/posts/simple-compiler-pascal Pascalでかんたんな自作言語のコンパイラを書いた <p>Pascal 初めて書きました。処理系は Free Pascal です。<br /> いつもの通りでライフゲームのコンパイルが通ったのでヨシ、という程度の雑なものです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-pascal">https://github.com/sonota88/vm2gol-v2-pascal</a></p> <h1 id="移植元"><a href="#%E7%A7%BB%E6%A4%8D%E5%85%83">移植元</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/05/04/155425">Rubyで素朴な自作言語のコンパイラを作った</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2">https://github.com/sonota88/vm2gol-v2</a></li> </ul> <p>ライフゲームのプログラムだけコンパイルできればOKという簡単なコンパイラです。Ruby 版だとコンパイラ部分だけで 1000行くらい。<br /> ベースになっているバージョンは <a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2/tree/58">ステップ 58</a> のあたり</p> <h1 id="メモ"><a href="#%E3%83%A1%E3%83%A2">メモ</a></h1> <p>主な部分のサイズ(行数)はこんな感じ。</p> <pre><code>$ wc -l *.pas lib/*.pas 491 codegen.pas 153 lexer.pas 533 parser.pas 184 lib/json.pas 222 lib/types.pas 195 lib/utils.pas 1778 合計 </code></pre> <hr /> <p>※ VB はほとんど書いたことがなく、一方 LibreOffice Basic の方は多少書いたことあるので、以下では LibreOffice Basic を挙げていますが、たぶん VB でも大体似た感じだと思います。</p> <p>ちなみに少し前に LibreOffice Basic で書いたもの:</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/31c127c42a9722892aa8">素朴な自作言語のコンパイラをLibreOffice Basicに移植した</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/501f0efa437bc4d53cc7">LibreOffice BasicでLispインタプリタ(mal)を書いた</a></li> </ul> <hr /> <ul> <li>自分が知っているものの中では C と LibreOffice Basic の中間みたいな印象 <ul> <li>Pascal + 動的型 → (VB) → LibreOffice Basic という流れ?</li> </ul></li> <li>string 型があって文字列の扱いは C より楽</li> <li>Emacs に pascal-mode をインストール……しなくてもすでに入っていた(インストールした記憶がないので最初から入ってた?) <ul> <li>デフォルト設定だとインデントがスペース3つ</li> </ul></li> <li>今回は fpc をインストールした Docker イメージを使うようにしてみた</li> <li>処理系に配慮された整理された文法になっていて、たとえば C コンパイラを作るより Pascal コンパイラを作る方がハードルが低そう(コンパイラというか主に構文解析部分?) <ul> <li>教育的、というか元々教育目的として生まれた言語だそう</li> <li>言語処理系自作に興味がある人は触れておいて損はなさそう</li> <li>書籍『<a target="_blank" rel="nofollow noopener" href="https://www.ohmsha.co.jp/book/9784274221163/">コンパイラ 作りながら学ぶ</a>』の PL/0' も Pascal 系の言語</li> </ul></li> </ul> <hr /> <p>Pascal は今まで触れる機会がなくて全然知らない文化圏という意識でいたのですが、実際触ってみると完全に異文化ということもなくて、自分が書いたことのある言語でいえば LibreOffice Basic が近いです(とりあえず見た目は)。</p> <p>たとえば整数を2つ受け取って足した結果を返す関数は次のようになります。</p> <pre><code class="pascal">// Pascal function add(a : integer; b : integer) : integer; begin add := a + b; end; </code></pre> <pre><code class="vb">' LibreOffice Basic function add(a, b) add = a + b end function </code></pre> <ul> <li><code>return 返り値</code> ではなく <code>関数名 = 返り値</code> と書く</li> <li>返り値の有無で <code>sub</code>(Pascal では <code>procedure</code>) と <code>function</code> を使い分ける</li> <li>関数・プロシージャ呼び出し時に引数がない場合は括弧を省略可</li> </ul> <p>といったあたりが Pascal 由来と思われます。構造体の扱いも似ているような?</p> <p>書いているときの感触としては「LibreOffice Basic の変数に型が付いて、文法はなんとなく似ていて、低水準の操作ができる」みたいな感じでした。</p> <hr /> <p>LibreOffice Basic 以外でも、JavaScript の <code>with</code> も Pascal 由来かな? とか、Go の <code>:=</code> も Pascal 由来かな? とか、 Scala や Rust、Zig など、コロンで区切って型を後置するのも Pascal 由来かな? といった感じで、他の言語への影響と思われる(※確認はしていなくて、あくまで「思われる」という程度)要素がいろいろあって面白かったです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://kuina.ch/kuin">Kuin</a> の言語仕様の解説にも Pascal への言及がちらほら出てきますね。たとえば「<a target="_blank" rel="nofollow noopener" href="https://kuina.ch/kuin/spec3">Kuin言語仕様3 演算子</a>」など。</p> <h1 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://dotinstall.com/lessons/basic_pascal">Pascal入門 (全18回) - プログラミングならドットインストール</a> <ul> <li>とりあえず最初にこれを見るのがおすすめ</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yaju/items/16d91d58ae65af1ecab9">変数の代入演算子と等価演算子について - Qiita</a></li> <li>(2019) <a target="_blank" rel="nofollow noopener" href="https://news.mynavi.jp/article/programinglanguageoftheworld-22/">世界のプログラミング言語(22) 今も改良が続くPascal/Delphi言語の栄枯盛衰 | TECH+</a></li> <li>(2015) <a target="_blank" rel="nofollow noopener" href="https://developers.srad.jp/story/15/01/27/0543208/">Pascalは過小評価されている | スラド デベロッパー</a></li> </ul> <h1 id="他の言語への移植"><a href="#%E4%BB%96%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%B8%E3%81%AE%E7%A7%BB%E6%A4%8D">他の言語への移植</a></h1> <div class="table-responsive"><table> <thead> <tr> <th>記事</th> <th>リポジトリ</th> <th>日付</th> </tr> </thead> <tbody> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/b80696f23a08c3c2fc5d">Julia</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-julia">github</a></td> <td>2021-05-03</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/20210407_vm2gol_v2_rust">Rust</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-rust">github</a></td> <td>2021-04-07</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/275c2b5407986b100cc8">Crystal</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-crystal">github</a></td> <td>2021-03-27</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2021/01/14/032813">Kotlin</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-kotlin">github</a></td> <td>2021-01-14</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2021/01/07/235019">Zig</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-zig">github</a></td> <td>2021-01-07</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/31c127c42a9722892aa8">LibreOffice Basic</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-libreoffice-basic">github</a></td> <td>2020-12-14</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/25/073200">Go</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-go">github</a></td> <td>2020-09-25</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/18/193844">PHP</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-php">github</a></td> <td>2020-09-18</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/13/133735">C♭</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-cflat">github</a></td> <td>2020-09-13</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/08/053329">Perl</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-perl">github</a></td> <td>2020-09-08</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/06/043607">C</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-c">github</a></td> <td>2020-09-06</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/30/121437">Java</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-java">github</a></td> <td>2020-08-30</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/22/162201">Dart</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-dart">github</a></td> <td>2020-08-22</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/19/065056">Python</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-python">github</a></td> <td>2020-08-19</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/15/114754">TypeScript (Deno)</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-typescript/tree/20200815">github</a></td> <td>2020-08-15</td> </tr> </tbody> </table></div> sonota486