言語制作の進捗
どもども新名です。
今回は、@KaitoMiyazaki1君に会いに神戸まで行きました。
神戸のRubyコミュニティにも参加しましたが、
先に、@KaitoMiyazaki1君との言語の進捗から。
@KaitoMiyazaki1君との言語制作の近況
Githubのissuesの状態です
言語仕様の深堀りが完了し、大まかに以下のようなことが決まりました。
イメージ : Rubyベースのオブジェクト指向を持つ、Pythonに近いDRYな言語。
モットー:最も早く書くことができ、生産性、保守性、可読性を保持する言語
具体的には、
- 生産性
- ブロックのインデント化
- 単語の短縮化
ex. attr_reader -> reader, initialize -> init, Node.new -> Node()
- 可視性
- castの明確化
ex. str(exp)
- castの明確化
- 可読性
- unlessなどnot構文の削除
ex. unless -> if not
- unlessなどnot構文の削除
- 保守性
- 最低限の構文 - 保守の大変な多種多様なメソッドはいらない
- 構文
- Pythonのように押し付けすぎないかつDRY
な感じです。
こんな感じの構文になるイメージです。
import sys class Node include Module def __init__ # init @str = "abc" # instance variable def self.class_method # Class Method def instance_method(argument) if @str == "abc" print str # global variable node = Node()
制作は開始しているのですが、他の言語を少しずつ参考にして、 慎重に設計をしています。
非公開リポジトリではない言語公開用のリポジトリも作りましたー
定期的に確認してくださると嬉しいです。 5月の末には公開したいと思っています。
それでは〜〜〜
# 言語制作にまだ若干の不安があるけど、何とかしていきたいと思います。
# アドバイスとかコメントくれるとありがたいです!
ANTLRで言語開発2
この1週間は1日1時間程度ANTLRで言語開発を行っていました。 言語開発の楽しさが少しずつ分かり始めてきました。
予想外に ANTLRのC言語ライブラリが使いにくかったり、 C++サポートがひどかったりしてます。
こんな感じで少しずつコミットしていましたが、 1時間のほとんどをANTLRのマニュアルとにらめっこすることに割いてしまっています。
この1週間のこと
少しずつANTLRの仕組みや、言語開発がわかってきた。 先週はわからなかったことが多かったけど、CommonTreeなど大体の仕組みが理解できた。
// プロジェクトにコミットしてくれてる、@KaitoMiyazaki1くんは自分より優秀かもしれない。
今後のこと
ANTLRから乗り換えるか、それともANTLRv4対応のC++ライブラリを自前するかで、
悩んでいます。
// 多分ANTLRv4のを自前で作ると思う。
Bison+Flex以外かつ、Boost::spiritを使わない良い手段を探しています。
// とかいうとHaskellとか言われそう。
ANTLRで言語開発
前回、計算機作った時にゴミと言ってた ANTLRが、
普通に利用できたので、利用して言語を作る事になりました。
幾つか、注意しざるを得ないことがあったので、
それをまとめて書いておきます。
_empty問題
@lexer::header{ #define _empty NULL }
を書かないと高確率で落ちます。
文字コード問題
文字コードと確保するサイズを合わせないと、
lang(1) : lexer error 3 : 1:1: Tokens : ( LIST | ARG | ARGS ); at offset 11, near char(00) :
のようなエラーをはきます。 回避するには、
ANTLR3_UINT32 size = static_cast<ANTLR3_UINT32>(inputStr.size()); // UTF16なら inputStr.size() * 2 pANTLR3_INPUT_STREAM stream = antlr3StringStreamNew( input_string, ANTLR3_ENC_UTF8, // UTF16なら変更 size, (pANTLR3_UINT8)"hoge");
のようにサイズを合わせて書く必要があります。
コンパイル問題
-lantlr3c -stdlib=libc++
オプションを付けないと落ちました。
これから
ANTLRの厄介な文法に悩まされていますが、
少しずつ理解できるようになりました。
boost::spiritが使える方はそっちを使うのが良いと思われますが、
言語開発をストレスなく行うことでは boost::spirit より良いと思いました。
C++で計算機制作
諸事情によりC++で機能を多く持った計算機を作ることにした。 ダメだったものとかいろいろあったので書いておきます。
候補は、
がありました。
すべて試しましたが、 boost::spirit が安定している感があります。
欠点を挙げると、
- 自前
複雑な構文解析を行うのに苦労した。
-2-2といった前置の演算子と後置の演算子を混ざると死ぬ
高確率で機能を追加するとめちゃくちゃになる。
- bison + flex
bisonにC++モードがあるとのことで利用。
マニュアルが全て英語でクソ。
bisonをC++で利用しているサンプルソースだけ見ても
.ll や.y なので完全には理解できず意味不明でした。
独自表現多すぎぃ
ANTLRWorksはJavaしか吐き出せないので使えないゴミ。確認ツールにしかならない
.g ファイルをSyntaxしてくれる奴が sublimeにあったけどクソ。
C++(C言語)がANTLR4に対応してない。参考になる文献が少ない
悪いところしか思いつかないや・・・
- boost::spirit
エラーが意味不明になる。
という感じです
結論
boost::spirit が良い。
//プロトタイプは自前で作れましたが、現在制作中のVerでは boost::spirit で制作してます。
//Objective-C++という黒魔術をしなければならなさそうですが頑張ります。
//てか boost::spiritでもキツい
■
どうも新名です。
最近,悲しみが再来し、Twitter,Facebook,LINEを避けて来ました。
プログラミングは仕事以外ではほとんどしなくなり、
@rx_165_cxに誘われたPSO2というオンラインゲームを一日6時間程度やり続けました。
ファルスアームのBGMにハマりました。
Skypeには常駐していました。
スクリーンネームを悲しみの上書きに変えました。
SNSに現れなくなった事を心配してくださる方や、大丈夫ですか?と言ってくださる方もいらっしゃいました。
大丈夫じゃないですが、まあ生きてます。
体調を壊したり、悩みまくったり、プログラム書かなかったり。。。
大丈夫ではないですが、とりあえず数日以内にSNSに復活します。