tag:crieit.net,2005:https://crieit.net/tags/Julia/feed
「Julia」の記事 - Crieit
Crieitでタグ「Julia」に投稿された最近の記事
2021-05-10T04:15:28+09:00
https://crieit.net/tags/Julia/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