「CPUの創りかた」半田付け終了

10月 27th, 2008 admin

10月26日にCSNagoyaの勉強会のCPUの創りかたを開催しました。
久しぶりに進展を報告ができます。なんと2月から延々とやってきた半田付けが終了したのです!

今回は面倒なので写真で報告してみようと思います
dsc00332.jpg
ワラビモチ愛好会さんからワラビモチの差し入れがありました。緑色のはえんどう豆の粉らしいです。うまかった。

dsc00333.jpg
これがCPUの全貌だ!右上の電源の線がちぎれたのでデバッグは次回に持ち越し

dsc00334.jpg
左の青い部分がメモリです。見てのとおり128bitで全部です。
スイッチの操作=プログラミングということになります。

dsc00335.jpg
この赤いLEDが出力のすべてです。一番派手な部分です。
ここを光らせるためだけに、この半年頑張ってきました。

dsc00339.jpg
勉強会後はJP CAFE &DINERというカフェで懇親会をしました。

まとめ

次回からはデバッグ&動作検証。ソフトウェアと違ってエラーメッセージがでないうえに、取り返しがつかない場合があるので恐ろしい・・・目指せ年内動作で頑張ります。

第3回 コンパイラを作ろう

10月 6th, 2008 admin

10月5日にCSNagoyaで第3回コンパイラを作ろうを開催しました。

第1部 コンパイラを作ろう

今回は「コンパイラ入門」の第7章である「文法定義」を読みました。この章は次から作るパーサ構築のための準備段階で、パーサの役割と、パーサ構築のために必要な文法変換という作業とその方法について学ぶことができました。
うれしいことに僕はここまで読み進めてきて「コンパイラ=無理難題」みたいな先入観がなくなりました。もちろん凄いコンパイラは凄いことをやってるんだろうけど、基本原理としてはソースコードを受け取って、それを一定の規則にしたがって変換するだけのフィルタなんだなと、やるまえに散々M氏に言われていたことがインストールされたようです。

第2部 ライトニングトーク

SATソルバで解く4クイーン問題

SATソルバというものを初めて聞きました、SAT(充足可能性問題)とは、ある命題(乗法標準形)の値を真にできるかどうかという問題のことで、それを解くプログラムをSATソルバというそうです。いかにも数学という感じでSAT自体には興味はわきませんでしたが、それに興味を持っている発表者にすごく興味がわきました。自分が全然知らない話を聞くのは面白いです。

全手動マリオの解説

一部で有名な全手動マリオなどを作っている方本人が技術解説をしてくださいました。この動画を初めて見たときは「面白いことを考える人がいるもんだなー」と感心していたのですが、まさか直接話を聞かせてもらえるなんて思ってもいなかったので感激しました。新作動画の「棒歌ロイドが家の中でゆっくりしていたんだけど・・・」も力作過ぎます。

CSNagoyaの今後について

まず現在は隔週で「コンパイラを作ろう」と「CPUの創りかた」をやっており、「CPUの創りかた」の後半でverilog勉強会をしているという状態です。
all1.gif
んで上記の図が今後の予定です。もうCSNagoyaが会社なら絶対に投資してはいけない感じになってます。
今後SICP読書会とVerilog入門をスタートすることが決まっています。

ただし、あんまり勉強ばっかりしても意味がないし休日が潰れすぎてもいけないので、僕も参加しないセッションを決めたり平日の開催にするなどして上手に調整できたらなと思ってます。

新しく始める予定のSICP読書会とverilog入門については少しあとに正式に参加者の募集を行いたいと思います。

第2回コンパイラを作ろう スキャナ構築編

10月 4th, 2008 admin

9月21日にCSNagoyaで第2回コンパイラを作ろうを開催しました。
ブログでの報告が遅れたのは宿題であるスキャナの作成が遅れたからです・・・

第1部 コンパイラを作ろう

「コンパイラ入門」という本の6章「スキャナの構築」を読みながら実際にスキャナのコードを書きました。
スキャナとはコンパイラの構成要素の一つで、コードを読み込んで、それをプログラムの最小構成であるトークンに分解するものです。echo 'Hello';というコードがあった場合、["echo","Hello",";"]という感じにコードを分解します。

コード

僕はRubyで書きました。

RUBY:
  1. class Token
  2.   attr_accessor :def, :str, :type
  3.  
  4.   def initialize(fp)
  5.     @def = ""
  6.     @str = ""
  7.     @type = ""
  8.  
  9.     @fp = fp
  10.   end
  11.  
  12.   def get_token
  13.     @def = "EOF"
  14.     @str = ""
  15.     @type = "EOF"
  16.     c = get_character
  17.     while(is_white_space(c))
  18.       c = @fp.read(1)
  19.     end
  20.  
  21.     if(c == ";") then @def = "SEMICOLON"; @str = c;end
  22.     if(c == ",") then @def = "COMMA";     @str = c;end
  23.     if(c == "(") then @def = "OPEN";      @str = c;end
  24.     if(c == ")") then @def = "CLOSE";     @str = c;end
  25.     if(c == ".") then @def = "PERIOD";    @str = c;end
  26.     if(c == "+") then @def = "PLUS";      @str = c;end
  27.     if(c == "-") then @def = "MINUS";     @str = c;end
  28.     if(c == "*") then @def = "MULT";      @str = c;end
  29.     if(c == "/") then @def = "DIV";       @str = c;end
  30.     if(c == "=") then @def = "EQ";        @str = c;end
  31.  
  32.     if(c == ":")
  33.       @str = @str + c
  34.       c = get_character
  35.       if(c == "=")
  36.         @def = "ASSIGN"
  37.         @str = @str + c
  38.       else
  39.         @def = "COLON"
  40.         unget_character(c)
  41.       end
  42.     elsif(c == ">")
  43.       @str = @str + c
  44.       c = get_character
  45.       if(c == "=")
  46.         @def = "GE"
  47.         @str = @str + c
  48.       else
  49.         @def = "GT"
  50.       end
  51.     elsif(c == "<")
  52.       @str = @str + c
  53.       c = get_character
  54.       if(c == "=")
  55.         @def = "LE"
  56.         @str = @str + c
  57.       elsif(c == ">")
  58.         @def = "NE"
  59.         @str = @str + c
  60.       else
  61.         @def = "LT"
  62.       end
  63.     elsif(c == '"')
  64.       c = get_character
  65.       until(c == '"')
  66.         @str = @str + c
  67.         c = get_character
  68.       end
  69.       @def = "STR"
  70.     elsif(is_digit(c))
  71.       while(is_digit(c))
  72.         @str = @str + c
  73.         c = get_character
  74.       end
  75.       unget_character(c)
  76.       @def = "NUMBER"
  77.  
  78.     elsif(is_alpha(c))
  79.       while(is_alpha(c) || is_digit(c))
  80.        @str = @str + c
  81.        c = get_character
  82.       end
  83.       unget_character(c)
  84.      
  85.       @def = "IDENT"
  86.       @def = "MODULE"     if @str == "MODULE"
  87.       @def = "BEGIN"      if @str == "BEGIN"
  88.       @def = "END"        if @str == "END"
  89.       @def = "VAR"        if @str == "VAR"
  90.       @def = "INTEGER"    if @str == "INTEGER"
  91.       @def = "STRING"     if @str == "STRING"
  92.       @def = "IF"         if @str == "IF"
  93.       @def = "THEN"       if @str == "THEN"
  94.       @def = "ELSE"       if @str == "ELSE"
  95.       @def = "WHILE"      if @str == "WHILE"
  96.       @def = "DO"         if @str == "DO"
  97.     elsif(is_EOF(c))
  98.       @def = "EOF"
  99.     end
  100.   end
  101.  
  102.   def get_character
  103.     c = @fp.read(1)
  104.     return c
  105.   end
  106.  
  107.   def unget_character(c)
  108.     return @fp.ungetc(c[0]) unless c.nil?
  109.   end
  110.  
  111.  
  112.   def is_EOF(i)
  113.     return true if i.nil?
  114.   end
  115.  
  116.   def is_white_space(i)
  117.     return true if i =~ /\s/
  118.   end
  119.  
  120.   def is_digit(i)
  121.     return true if i =~ /[0-9]/
  122.   end
  123.  
  124.   def is_alpha(i)
  125.     return true if i =~ /[a-zA-Z]/
  126.   end
  127. end
  128.  
  129.  
  130.  
  131.  
  132.  
  133. token = Token.new(open(ARGV[0],"r"))
  134. token.get_token
  135. until token.def == "EOF"
  136.  puts "DEF[" + token.def + "] \t\t STR[" + token.str + "]"
  137.  token.get_token
  138. end

これにたとえばこんなコードを食わせる

RUBY:
  1. MODULE HelloWorld;
  2. BEGIN
  3.   VAR = 1 + 100 * 2
  4.   if (VAR>= 100)
  5.     WriteStr("Hello World!")
  6.   END
  7. END HelloWorld.

と、それぞれがトークンに分解されて出力されます。

RUBY:
  1. DEF[MODULE]              STR[MODULE]
  2. DEF[IDENT]               STR[HelloWorld]
  3. DEF[SEMICOLON]           STR[;]
  4. DEF[BEGIN]               STR[BEGIN]
  5. DEF[VAR]                 STR[VAR]
  6. DEF[EQ]                  STR[=]
  7. DEF[NUMBER]              STR[1]
  8. DEF[PLUS]                STR[+]
  9. DEF[NUMBER]              STR[100]
  10. DEF[MULT]                STR[*]
  11. DEF[NUMBER]              STR[2]
  12. DEF[IDENT]               STR[if]
  13. DEF[OPEN]                STR[(]
  14. DEF[VAR]                 STR[VAR]
  15. DEF[GE]                  STR[>=]
  16. DEF[NUMBER]              STR[100]
  17. DEF[CLOSE]               STR[)]
  18. DEF[IDENT]               STR[WriteStr]
  19. DEF[OPEN]                STR[(]
  20. DEF[STR]                 STR[Hello World!]
  21. DEF[CLOSE]               STR[)]
  22. DEF[END]                 STR[END]
  23. DEF[END]                 STR[END]
  24. DEF[IDENT]               STR[HelloWorld]
  25. DEF[PERIOD]              STR[.]

第2部 サーバ/インフラ構築入門 -冗長化の基本-

id:dominion525氏による講義。前回のWebサーバの冗長化の話の続きでルータやロードバランサの冗長化の話でした。

まとめ

各自が好きな言語で実装しているので人のコードがあまり参考にならないのが辛いなと思いました。まぁその分他の人のコードを見るのが楽しみです。
次回の勉強会は明日!みんな宿題はやってくるでしょうか

CPUの創りかたの開催報告

9月 17th, 2008 admin

9月14日(日)にCSNagoyaの勉強会を開催しました。CPUの創りかた編は現在12回目。完成はいつになるのやら・・・

最近のCPUの創りかた

ずっと3人(+1)で黙々と製作を続けていたのですが、オープンソースカンファレンス名古屋の影響で途中参加の人が増えたため、製作している人+本を読む人という2グループにわかれて勉強会を行うスタイルになっています。

今日はお月見

cpu91.jpg
月見タルトを買ってきてくれた人がいたので参加者でおいしく頂きました。ウサギだからと目に赤色のLEDを埋め込まれたのはさすがハードウェア部門の勉強会といったところでしょうか。(LEDが刺さったところは食べたくないと思ったけど、結局たべちゃったなぁ)

進捗報告

cpu93.jpg
私はプログラムカウンタが動作するところまで進みました。手動でクロックを与えていくと、数字がカウントアップされていくのが確認できました。写真をみてもわかるように、かなり線がギュウギュウになってきているので後戻りができない感じが怖いです。もう一回り細い線にすればよかったと後悔

エクストラセッション

僕は興味がないので参加していないのですが、勉強会の後半の時間を使ってVerilogの勉強を始めている人たちがいます。
興味のある人は連絡をくだされば参加できると思います。
(↑やってるひとたちblogかいて)

まとめ

・僕はあと2回ぐらいで半田付けが終りそう
・後半の時間に半田付けをしているのは僕だけだったのでバツゲームを受けている気分だった
・たのむから1回で動いてほしい

第1回コンパイラを作ろうを開催しました

9月 9th, 2008 admin

9月7日に名古屋市の短歌会館にて、CSNagoyaの勉強会ということで「第一回コンパイラを作ろう」を開催しました。
コンパイラを作ろうなどという地味なテーマにもかかわらず定員の18人超える申し込みがありました。名古屋すごい!
(イントロで使用したCSNagoyaの概要と、これからの予定のスライドはこちら

やったこと

コンパイラ入門 C#で学ぶ理論と実践 (ソフトウェア実践講座)」という本にそって第5章までを音読しながら進めました。
そもそもコンパイラとはなにかという話から、BNF(Backus-Naur Form)という文法を定義するためのメタ言語と、その拡張であるEBNFの話が中心になりました。

ここが日本最強のコンパイラ入門勉強会

参考にしている「コンパイラ入門」という本ではC#でコンパイラを作っているのですが、基本的には何の言語でも問題はないので事前のアナウンスで「使用言語は自由でよい」としていました。そこで、皆さんがどのような言語でやろうとしているのか順番に聞いてみたのが以下のリスト。なんと18人の参加者に13の言語・・・どうやら自由だと言ったのが逆に「他人とは違うのだよ」というギーク心に点火してしまったようです。

  • Haskell
  • Gauche
  • Schema
  • ActionScript
  • C
  • Ruby
  • PHP
  • Java
  • C#
  • C++
  • Python
  • Ocaml
  • Perl(の普通じゃない奴)

お互いに助け合うとか、誰かに教えてもらいたいとかいう気はないのでしょうか。

サーバ/インフラ構築入門 -冗長化の基本-

こちらは新しく始まった講義形式のセッション。「[24時間365日] サーバ/インフラを支える技術」という本をベースにdominion525氏が行います。

僕も読んだことのある本なのですが、実際にやったことのないことなので「へーそうなんだ、でも実際はどこまでやるんだろ」とか「えー本当にこんな面倒なことをやるの?」とかって疑問がわきまくるんですが、やはり仕事で使っているような詳しい人の話というのは妙に説得力があって安心して聞けるというのが面白いなと思いました。

次回は第1章のデモと第2章の解説です。楽しみ

次回について

次回からはいよいよコード書きが始まりまるのでとても楽しみです。まずはスキャナの部分からやっていく予定です。