Create a new repository

全力で行くらしい

言語制作の進捗

どもども新名です。
今回は、@KaitoMiyazaki1君に会いに神戸まで行きました。

神戸のRubyコミュニティにも参加しましたが、
先に、@KaitoMiyazaki1君との言語の進捗から。

@KaitoMiyazaki1君との言語制作の近況

Githubのissuesの状態です

f:id:tetsunari_niina:20140406214335p:plain

言語仕様の深堀りが完了し、大まかに以下のようなことが決まりました。

イメージ : Rubyベースのオブジェクト指向を持つ、Pythonに近いDRYな言語。

モットー:最も早く書くことができ、生産性、保守性、可読性を保持する言語

具体的には、

  • 生産性
    • ブロックのインデント化
    • 単語の短縮化
      ex. attr_reader -> reader, initialize -> init, Node.new -> Node()
  • 可視性
    • castの明確化
      ex. str(exp)
  • 可読性
    • unlessなどnot構文の削除
      ex. unless -> if 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()

制作は開始しているのですが、他の言語を少しずつ参考にして、 慎重に設計をしています。

非公開リポジトリではない言語公開用のリポジトリも作りましたー

Github: Rychle

定期的に確認してくださると嬉しいです。 5月の末には公開したいと思っています。

それでは〜〜〜

# 言語制作にまだ若干の不安があるけど、何とかしていきたいと思います。
# アドバイスとかコメントくれるとありがたいです!

ANTLRで言語開発2

この1週間は1日1時間程度ANTLRで言語開発を行っていました。 言語開発の楽しさが少しずつ分かり始めてきました。

予想外に ANTLRC言語ライブラリが使いにくかったり、 C++サポートがひどかったりしてます。

f:id:tetsunari_niina:20140331002538p:plain

こんな感じで少しずつコミットしていましたが、 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");

のようにサイズを合わせて書く必要があります。

コンパイル問題

OSXのclang++でコンパイルする際に、

-lantlr3c -stdlib=libc++

オプションを付けないと落ちました。

これから

ANTLRの厄介な文法に悩まされていますが、
少しずつ理解できるようになりました。
boost::spiritが使える方はそっちを使うのが良いと思われますが、
言語開発をストレスなく行うことでは boost::spirit より良いと思いました。

C++で計算機制作

諸事情によりC++で機能を多く持った計算機を作ることにした。 ダメだったものとかいろいろあったので書いておきます。

候補は、

がありました。

すべて試しましたが、 boost::spirit が安定している感があります。

欠点を挙げると、

  • 自前

複雑な構文解析を行うのに苦労した。
-2-2といった前置の演算子と後置の演算子を混ざると死ぬ
高確率で機能を追加するとめちゃくちゃになる。

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でもキツい

ロベールのC++ レビュー

久しぶりにロベールのC++を読む機会があったので、
レビューします。

分厚く初心者向けには思えない本ですが、
1冊初心者用のC++の本を読めば話についていけるでしょう。

現状コピーコンストラクタまで読みましたが、 とてもわかり易く重宝しています。

後半読み終わったら FIXします。

みんなのPython レビュー

みんなのPythonを買ったのでレビューします。

比較的よくありがちな入門者向けの本です。
通常の入門書にありがちなPythonの構文をまとめてあり、
とても読みやすい印象を受けました。
後半で、標準ライブラリを使用したプログラムや、
GUIを利用したプログラム例も載っていてわかりやすかったです。

Python本はパーフェクトPython以外買ったことはありませんが、
「たのしいRuby」よりもわかりやすい印象を受けました。

入門に適した本だと思います。

### Pythonの文法が幾つか抜けてた。
### Python2の記法と混じってるやばい

どうも新名です。

最近,悲しみが再来し、Twitter,Facebook,LINEを避けて来ました。

プログラミングは仕事以外ではほとんどしなくなり、
@rx_165_cxに誘われたPSO2というオンラインゲームを一日6時間程度やり続けました。
ファルスアームのBGMにハマりました。

Skypeには常駐していました。
スクリーンネームを悲しみの上書きに変えました。
SNSに現れなくなった事を心配してくださる方や、大丈夫ですか?と言ってくださる方もいらっしゃいました。
大丈夫じゃないですが、まあ生きてます。

体調を壊したり、悩みまくったり、プログラム書かなかったり。。。

大丈夫ではないですが、とりあえず数日以内にSNSに復活します。