tag:crieit.net,2005:https://crieit.net/tags/Compiler/feed 「Compiler」の記事 - Crieit Crieitでタグ「Compiler」に投稿された最近の記事 2021-05-10T04:15:28+09:00 https://crieit.net/tags/Compiler/feed tag:crieit.net,2005:PublicArticle/17077 2021-05-10T04:15:28+09:00 2021-05-10T04:15:28+09:00 https://crieit.net/posts/simple-compiler-julia Juliaでかんたんな自作言語のコンパイラを書いた <p>とりあえず触って慣れようということで、何も分からないところからいきなり作り初めてその都度調べるという感じで雑に書いてみました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-julia">https://github.com/sonota88/vm2gol-v2-julia</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で素朴な自作言語のコンパイラを作った - memo88</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という簡単なコンパイラです。<br /> ベースになっているバージョン: <a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2/tree/57">tag:57</a> のあたり</p> <h1 id="メモ"><a href="#%E3%83%A1%E3%83%A2">メモ</a></h1> <p>できあがりサイズ(行数)は Ruby 版と同じくらい。</p> <pre><code>$ wc -l *.jl lib/*.jl 359 codegen.jl 113 lexer.jl 360 parser.jl 107 lib/json.jl 56 lib/utils.jl 995 合計 </code></pre> <hr /> <p>Ruby のような動的言語で書くのと似たフィーリングで書けました。</p> <p>ただし、こういうのはダメで、</p> <pre><code class="julia">xs = ["a"] push!(xs, 1) # xs に整数を追加 #=> ERROR: LoadError: MethodError: Cannot `convert` an object of type Int64 to an object of type String </code></pre> <p>次のように型について教えてあげないといけない、なんて場面はあったり。</p> <pre><code class="julia">xs = Any["a"] push!(xs, 1) </code></pre> <hr /> <p>今回のおためし。<br /> ブランチ: <a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-julia/tree/trial">trial</a></p> <p>今回は case 文のネストを減らしてみました。<br /> おためしというか <a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/pric">v3</a> ですでに適用済みになっていて、 v2 にも取り込もうかなと考えているもの。</p> <pre><code class="javascript">// before case { (current_val == 0) { case { (count == 3) { set next_val = 1; } } (0 == 0) { case { (count == 2) { set next_val = 1; } (count == 3) { set next_val = 1; } } } } </code></pre> <pre><code class="javascript">// after case when (current_val == 0) { case when (count == 3) { set next_val = 1; } when (0 == 0) { case when (count == 2) { set next_val = 1; } when (count == 3) { set next_val = 1; } } </code></pre> <p><code>{</code> 〜 <code>}</code> が1段なくなるため、ネストが減り、行数も減ってちょっとコンパクトになります。</p> <p>ついでに、when 句の先頭にキーワード <code>when</code> を置くようにしてみました。パーサの都合としてはあってもなくてもほとんど違いはなく、 <code>when</code> を置いた方がなんとなく見た目的に落ち着きがよいかな、という程度の理由です。</p> <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> <p>上から新しい順。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/20210327_vm2gol_v2_crystal">Crystal</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/20210407_vm2gol_v2_rust">Rust</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2021/01/14/032813">Kotlin</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2021/01/07/235019">Zig</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/12/14/042153">LibreOffice Basic</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/25/073200">Go</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/18/193844">PHP</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/13/133735">C♭</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/08/053329">Perl</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/06/043607">C</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/30/121437">Java</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/22/162201">Dart</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/19/065056">Python</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/15/114754">TypeScript (Deno)</a></li> </ul> sonota486 tag:crieit.net,2005:PublicArticle/16562 2021-01-07T23:57:33+09:00 2022-07-17T10:04:04+09:00 https://crieit.net/posts/Zig 素朴な自作言語のコンパイラをZigに移植した <hr /> <p><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/30/132314">移植一覧に戻る</a></p> <hr /> <p><strong>※ 一部内容が古いです。二重管理が煩雑なため<a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2021/01/07/235019">オリジナルのブログ記事</a>の方だけ加筆修正しています。</strong></p> <p>やっつけなので汚いです。ライフゲームのコンパイルが通ったのでヨシ、というレベルのものです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://ziglang.org/">Zig(ziglang)</a>を触り始めて1週間くらいの人が雑に書いたものですので、「お手本にできそうな Zig のコード」「かっこいい Zig のコード」を求めている人には参考にならないと思います。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-zig">https://github.com/sonota88/vm2gol-v2-zig</a></p> <hr /> <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://memo88.hatenablog.com/entry/2019/05/04/232236">RubyでオレオレVMとアセンブラとコード生成器を2週間で作ってライフゲームを動かした話</a></li> </ul> <p>ベースになっているバージョン: <a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2/tree/50">tag:50</a> のあたり</p> <h1 id="メモ"><a href="#%E3%83%A1%E3%83%A2">メモ</a></h1> <ul> <li>C と Go の中間、GC のない Go みたいな印象</li> <li>sentinel-terminated な配列もなるほど便利そうと思って使ってみたが、通常の配列とは別の型になって煩雑なのと、サイズ固定な配列の出番が実はほとんどなかったので、後から普通の配列+スライスで書き直していった</li> <li>例外の扱いも Go とは違ったアプローチでおもしろい。最初は試しに使っていたが、お遊びプログラムなのでまじめにやる必要ないかと思い直し、これも後から使わないように(Java でいえば検査例外をその場で RuntimeException に包んで投げ直す感じに)書き変えた。単に煩雑さを避けるのを優先した形なのでほんとはちゃんとハンドリングすべきと思います。</li> <li>型まわりの理解がまだいまいち(配列や const が絡むあたりとか)</li> <li>あと細かい話がいろいろあった気がするけど、作った後このエントリを書くまで他のことをしていたら忘れてしまった……</li> <li>今回はあんまり余裕なかったので実験的な要素はなし</li> </ul> sonota486