瀬尾佳隆 (y.seo@seosoft.jp)
 Microsoft MVP for Visual C#


            技術ひろば.net 2010年7月
                               1
   瀬尾 佳隆 (せお よしたか)
    ◦ MVP for Visual C# (Jan 2009 – Dec 2010)

    ◦ 実は   Forth 系の言語が大好き!
    ◦ メールは y.seo@seosoft.jp / Twitterは @seosoft
    ◦ 個人事業主です(屋号は瀬尾ソフト)
    ◦ 根っからの開発屋
      インフラ苦手です
    ◦ どうでもいい情報としては、ミュージカルが大好きです




                                                  2
   真面目に聞いていただくセッションではありません
    ◦ 「何か身につく」とか「仕事に役に立つ」とか期待しては
      いけません
     でも、普段とは違う「物の見方」を通して視野を広げる参考になれば
   多分途中で時間切れになります
    ◦ (意図的に)ページ数多すぎ
     そもそも30分でやるようなネタじゃないし w
    ◦ ついうっかり興味を持ってしまった方は資料をダウンロード
      して読んでください




                                        3
   明日の仕事に全く役立たない技術でも
    「楽しければいいじゃん!」ということを理解
    (または同情)していただくこと
   普段とは違う考え方を通して脳のストレッチをして
    いただくこと
   ついうっかり興味を持つ人が一人でも二人でも
    出てくることを密かに期待すること




                              4
   RPN
    ◦   RPNとは
    ◦   RPNの具体例
    ◦   計算機内部の動き
    ◦   RPNの言語的特徴
   Forth
    ◦ Forthとは
    ◦ Forthの基本的な文法
    ◦ (デモ)




                     5
逆ポーランド記法




           6
   RPN = Reverse Polish Notation
    ◦ 逆ポーランド記法
   演算子をオペランドの後ろに記述する方法
    ◦ 後置記法とも言う
    ◦ 皆さんお馴染みなのは中間記法
   HP電卓ではRPNで計算します
    ◦ HP-15Cなんて名機も




                                    7
中置記法                              RPN
1+2                            1 2 +
(1 + 2) * (3 + 4)              1 2 + 3 4 + *
                                    8.33 4 5.2 - * 8.33 7.46 -
8.33 ∗ 4 − 5.2 ÷ 8.33 − 7.46 ∗ 0.32
                                    / 0.32 * 4.3 3.15 2.75 -
  4.3 ∗ 3.15 − 2.75 − (1.71 ∗ 2.01) * 1.71 2.01 * - /




 • 頭から順番に計算できる
 • 括弧がいらない
 • 複雑な式でも1行で表現できる


                                                                 8
   20 4 / の場合・・・20 / 4




       Starting Forth
       http://www.forth.com/starting-forth/sf2/sf2.html
                                                          9
   20 4 / の場合・・・20 / 4




       Starting Forth
       http://www.forth.com/starting-forth/sf2/sf2.html
                                                          10
   3 9 + 4 6 + * の場合・・・(3 + 9) * (4 + 6)




         Starting Forth
         http://www.forth.com/starting-forth/sf2/sf2.html




                                                            11
   3 9 + 4 6 + * の場合・・・(3 + 9) * (4 + 6)




         Starting Forth
         http://www.forth.com/starting-forth/sf2/sf2.html




                                                            12
問題:
太郎君は鉛筆を1本、花子さんは鉛筆を2本持っています。
あわせて何本でしょうか。

    中間記法   1+2       順番が・・・

 鉛筆1本      鉛筆2本    あわせて何本



     RPN   1 2 +    あら、キレイ
                              13
問題:
太郎君は鉛筆を1本、花子さんは鉛筆を2本持っています。
あわせて何本でしょうか。


中間記法           RPN

  1+2           1 2 +
 1 足す 2        1と2を足す
               日本語に似ている!

                              14
RPNに基づくプログラミング言語




                   15
   RPNとデータスタック使用の考え方に基づいた
    プログラミング言語
   言語仕様が非常に簡単
    ◦ ワード(トークン)を辞書中で検索
    ◦ 辞書中に見つかったら関連づけられたコードを実行
    ◦ 見つからなかったら “数” と見なしてスタックに積む
   Forth プログラムは「ワードの並び」
    ◦ Forth ではすべてがワードであり、演算子、制御構造、
      組み込みの手続き、ユーザー定義の手続きの区別がない
    ◦ ワードが順番に並んでいるだけで、構文解析が不要



                                     16
スタック操作       処理
.            スタックの1番目を取り出してコンソール出力
.s           スタックの内容表示(値を取り出さない)
clearstack   スタックのクリア
drop         スタックの1番目を捨てる
dup          スタックの1番目を複製して上に積む
over         スタックの2番目を複製して上に積む
swap         スタックの1番目と2番目とを交換する
rot          スタックの3番目を取り出して上に積む
nip          swap drop と同じ
tuck         swap over と同じ
2drop        drop drop と同じ
2swap        1番目/2番目の組と3番目/4番目の組とを交換する

                                         17
   四則演算
    ◦ + - * / mod ・・・想像通り
   文字列
    ◦ .s” 文字列” ・・・ .s” のあとに半角スペースが必要
   ワード定義
    ◦ : <ワード名> <コード> ;
      コロンで始まりセミコロンで終わる
   制御構造
    ◦ <条件> if <処理> else <処理> then ・・・if文
    ◦ <終値> <初期値> ?do <処理> loop ・・・for文
    ◦ begin <処理> <終了条件> until ・・・while文


                                           18
   変数
    ◦ variable <変数名> ・・・定義
    ◦ <変数名> ! ・・・代入
    ◦ <変数名> @ ・・・参照
   浮動小数
    ◦ f+, f-, f*, f/ など ・・・頭に f を付ける必要がある
    ◦ d>f, f>d ・・・小数化、整数化




                                            19
   時間があれば・・・




                20
今日のまとめと参考情報




              21
   RPN
    ◦ 演算子をオペランドの後ろに記述する
    ◦ 頭から順番に計算していくことができる
    ◦ 日本語の文法に近いので日本人には実は案外理解しやすい
      言語(かも?)
   Forth
    ◦ RPNとデータスタックを使ったプログラミング言語
    ◦ 言語仕様が非常に簡単
    ◦ Forth プログラムは「ワードの並び」




                                   22
   HP-35s が今なら5000円くらいで買えるかも
    ◦ Amazonあたりで検索してください
   Windows上で動作する HP-15Cのエミュレータが
    あります
    ◦ http://www.thgsoft.ch/ThGHome_EN.html#HP15c




                                                    23
   Gforth
    ◦ ANS Forthの実装
    ◦ http://sourceforge.jp/projects/freshmeat_gforth/
   Starting FORTH
    ◦ http://www.forth.com/starting-forth/
   Thinking FORTH
    ◦ http://thinking-forth.sourceforge.net/
   日本語プログラミング言語Mind
    ◦ http://www.scripts-lab.co.jp/mind/whatsmind.html
    ◦ 実は私にとっての Forth とは Mind のこと
   .NET用のForthコンパイラもあります
    ◦ DeltaForth / Forth in the .Net 3.5 Framework (ForthAPI)


                                                                24
25

Rpn and forth 超入門

  • 1.
    瀬尾佳隆 (y.seo@seosoft.jp) MicrosoftMVP for Visual C# 技術ひろば.net 2010年7月 1
  • 2.
    瀬尾 佳隆 (せお よしたか) ◦ MVP for Visual C# (Jan 2009 – Dec 2010) ◦ 実は Forth 系の言語が大好き! ◦ メールは y.seo@seosoft.jp / Twitterは @seosoft ◦ 個人事業主です(屋号は瀬尾ソフト) ◦ 根っからの開発屋  インフラ苦手です ◦ どうでもいい情報としては、ミュージカルが大好きです 2
  • 3.
    真面目に聞いていただくセッションではありません ◦ 「何か身につく」とか「仕事に役に立つ」とか期待しては いけません  でも、普段とは違う「物の見方」を通して視野を広げる参考になれば  多分途中で時間切れになります ◦ (意図的に)ページ数多すぎ  そもそも30分でやるようなネタじゃないし w ◦ ついうっかり興味を持ってしまった方は資料をダウンロード して読んでください 3
  • 4.
    明日の仕事に全く役立たない技術でも 「楽しければいいじゃん!」ということを理解 (または同情)していただくこと  普段とは違う考え方を通して脳のストレッチをして いただくこと  ついうっかり興味を持つ人が一人でも二人でも 出てくることを密かに期待すること 4
  • 5.
    RPN ◦ RPNとは ◦ RPNの具体例 ◦ 計算機内部の動き ◦ RPNの言語的特徴  Forth ◦ Forthとは ◦ Forthの基本的な文法 ◦ (デモ) 5
  • 6.
  • 7.
    RPN = Reverse Polish Notation ◦ 逆ポーランド記法  演算子をオペランドの後ろに記述する方法 ◦ 後置記法とも言う ◦ 皆さんお馴染みなのは中間記法  HP電卓ではRPNで計算します ◦ HP-15Cなんて名機も 7
  • 8.
    中置記法 RPN 1+2 1 2 + (1 + 2) * (3 + 4) 1 2 + 3 4 + * 8.33 4 5.2 - * 8.33 7.46 - 8.33 ∗ 4 − 5.2 ÷ 8.33 − 7.46 ∗ 0.32 / 0.32 * 4.3 3.15 2.75 - 4.3 ∗ 3.15 − 2.75 − (1.71 ∗ 2.01) * 1.71 2.01 * - / • 頭から順番に計算できる • 括弧がいらない • 複雑な式でも1行で表現できる 8
  • 9.
    20 4 / の場合・・・20 / 4 Starting Forth http://www.forth.com/starting-forth/sf2/sf2.html 9
  • 10.
    20 4 / の場合・・・20 / 4 Starting Forth http://www.forth.com/starting-forth/sf2/sf2.html 10
  • 11.
    3 9 + 4 6 + * の場合・・・(3 + 9) * (4 + 6) Starting Forth http://www.forth.com/starting-forth/sf2/sf2.html 11
  • 12.
    3 9 + 4 6 + * の場合・・・(3 + 9) * (4 + 6) Starting Forth http://www.forth.com/starting-forth/sf2/sf2.html 12
  • 13.
    問題: 太郎君は鉛筆を1本、花子さんは鉛筆を2本持っています。 あわせて何本でしょうか。 中間記法 1+2 順番が・・・ 鉛筆1本 鉛筆2本 あわせて何本 RPN 1 2 + あら、キレイ 13
  • 14.
  • 15.
  • 16.
    RPNとデータスタック使用の考え方に基づいた プログラミング言語  言語仕様が非常に簡単 ◦ ワード(トークン)を辞書中で検索 ◦ 辞書中に見つかったら関連づけられたコードを実行 ◦ 見つからなかったら “数” と見なしてスタックに積む  Forth プログラムは「ワードの並び」 ◦ Forth ではすべてがワードであり、演算子、制御構造、 組み込みの手続き、ユーザー定義の手続きの区別がない ◦ ワードが順番に並んでいるだけで、構文解析が不要 16
  • 17.
    スタック操作 処理 . スタックの1番目を取り出してコンソール出力 .s スタックの内容表示(値を取り出さない) clearstack スタックのクリア drop スタックの1番目を捨てる dup スタックの1番目を複製して上に積む over スタックの2番目を複製して上に積む swap スタックの1番目と2番目とを交換する rot スタックの3番目を取り出して上に積む nip swap drop と同じ tuck swap over と同じ 2drop drop drop と同じ 2swap 1番目/2番目の組と3番目/4番目の組とを交換する 17
  • 18.
    四則演算 ◦ + - * / mod ・・・想像通り  文字列 ◦ .s” 文字列” ・・・ .s” のあとに半角スペースが必要  ワード定義 ◦ : <ワード名> <コード> ;  コロンで始まりセミコロンで終わる  制御構造 ◦ <条件> if <処理> else <処理> then ・・・if文 ◦ <終値> <初期値> ?do <処理> loop ・・・for文 ◦ begin <処理> <終了条件> until ・・・while文 18
  • 19.
    変数 ◦ variable <変数名> ・・・定義 ◦ <変数名> ! ・・・代入 ◦ <変数名> @ ・・・参照  浮動小数 ◦ f+, f-, f*, f/ など ・・・頭に f を付ける必要がある ◦ d>f, f>d ・・・小数化、整数化 19
  • 20.
    時間があれば・・・ 20
  • 21.
  • 22.
    RPN ◦ 演算子をオペランドの後ろに記述する ◦ 頭から順番に計算していくことができる ◦ 日本語の文法に近いので日本人には実は案外理解しやすい 言語(かも?)  Forth ◦ RPNとデータスタックを使ったプログラミング言語 ◦ 言語仕様が非常に簡単 ◦ Forth プログラムは「ワードの並び」 22
  • 23.
    HP-35s が今なら5000円くらいで買えるかも ◦ Amazonあたりで検索してください  Windows上で動作する HP-15Cのエミュレータが あります ◦ http://www.thgsoft.ch/ThGHome_EN.html#HP15c 23
  • 24.
    Gforth ◦ ANS Forthの実装 ◦ http://sourceforge.jp/projects/freshmeat_gforth/  Starting FORTH ◦ http://www.forth.com/starting-forth/  Thinking FORTH ◦ http://thinking-forth.sourceforge.net/  日本語プログラミング言語Mind ◦ http://www.scripts-lab.co.jp/mind/whatsmind.html ◦ 実は私にとっての Forth とは Mind のこと  .NET用のForthコンパイラもあります ◦ DeltaForth / Forth in the .Net 3.5 Framework (ForthAPI) 24
  • 25.