* セキュリティキャンプ2017用の特設ページ
-(by [[K]], 2017.03.28)

** 基本情報
-タイトル: 言語自作ゼミ
-時間帯: 3日間連続
-概要:
--言語自作ゼミは,川合講師が担当します.
--講師が開発しているプログラミング言語「Essen」を題材として, どんな機能を付け加えたらいいのか考えたり, この言語を改造したり, 別の独自言語を作ってもらったりします. 
--具体的に何をするかは各自の希望をもとに設定します.  
//--より詳しい説明が http://khfdpl.osask.jp/wiki/?seccamp2017 にあります.
-必要機材: PCのみ
-事前学習: あり

-註: twitterではものづくりトラック(集中コース)は他のトラックも受講できると紹介されているようですが、それは関係者の誤解が原因の''誤報''です。このゼミを選択すると他のトラックもゼミも一切受講できません(他のものづくりトラックも同様です)。一つのことを専門的に極める感じになります。
--一日も早い訂正を期待していますが、まだ対応してもらえていません(04/08時点)。


** (1)背景情報
-現在、講師である川合はプログラミング言語を作っています。川合はC言語を入門者に教えた経験があり、その際に「こんな仕様だったらもっと教えやすいのに」と感じたことが多かったので、開発当初は初心者向けの言語を想定していました。
-しかし作っているうちに、初心者だけではなく上級者にとっても十分に役立つ言語にしたいと思うようになり、欲張りな仕様になっています。
-ちなみに作っている言語は「Essen」(えっせん)という名前です。
--応募に際して確認する必要はないですが、もし興味があればEssenのホームページもあります。→ http://khfdpl.osask.jp/wiki/?Essen

-どんな言語にしたいのか?
--COLOR(blue){''全体としてはC言語みたいな言語''}(でもコンパイラではなくインタプリタ)
--変数のCOLOR(blue){''宣言をしなくても代入できる''}
---でもCOLOR(blue){''宣言をすることもできて''}、その場合は、その型に適合しないものを代入しようとするとエラーになる(実行時エラー)
---これは関数の引数とかで引数ミスを検出したいときなどに有用
--COLOR(blue){''セミコロンを付けなくてもOK''}な言語(ちなみにつけてもいい)
 a = 1  b = 2  // こんな感じで書いてOK
--COLOR(blue){''コンマを書かなくてもOK''}な言語(ちなみにつけてもいい)
 a = func(1 2 3)
 b = func(a + b c d)
 c = func(-1, -2 4) // -2の前にコンマがないと引数の数が2個になってしまう
--COLOR(blue){''実行速度は速くない''}
---しかしインラインC言語とか、インラインRubyなどを使うことができて、だから速度が必要なときは、他の言語に逃げればいい。ほとんどの既存の言語に対してインライン記述が使用できる。
---でも実はインラインRubyとかがうまくいくかどうかちょっと自信がない。
---もちろんRubyなどを私が実装するわけではなく、インライン部分を切り出したファイルをその都度自動生成して、system関数などでRubyを実行し、その結果をファイル経由で受け取って、実行を続行するという方法。
--C言語は関数を自由に作ることができる、C++なら型(クラス)だって自由に作れる。これに対し、この言語ではCOLOR(blue){''演算子や制御構文も自由に作れる''}。
--変数についてはCOLOR(blue){''永続変数をサポート''}しているので、ファイルやデータベースの知識がなくても、データを保存することができる。
---永続変数というのは、プログラムを終了しても消えない変数のこと。PCの電源を切っても、また電源を入れて言語を起動すれば、変数の内容は戻る。
--COLOR(blue){''宣言する方法を改良''}できる言語
---たとえばC言語では#defineが使えます。関数も比較的自由に宣言できます。しかし「宣言のやりかた」は変更できません。それはよくないと思うのです。
---宣言する方法も改造できるべきです。そうすれば、今までになかった進歩があるかもしれないと思うのです。
---気が付いたらまったく別の言語になっている可能性はあります。それはEssenにとっては最高の成功といってもいい出来事です。

** (2)キャンプでは何をするのか
-キャンプで学生がやることは以下のことを想定しています。当日でも事前学習でもほぼ同じことをやります。

-[ユーザコース]
--川合が上記の言語を作るので、その言語を使ってみて、使いやすいところ使いにくいところをどんどん指摘してください。
--分からないことはどんどん聞いていいです。そういう情報こそ、改良のための材料になります。
--また「ここはこうできたらいいのに」と思うところがあればそれも是非教えてください。実現可能でいいアイデアだったら採用します。
--バグやセキュリティホールを見つけたら教えてください。講師ががんばって直します。
--このコースの場合、この言語を使って何かプログラムを作って、それを感想と共に発表するのがゴールです。
-[開発者コース]
--川合が作る言語処理系を直接改造して開発を手伝います。これをやりたいのならC言語の知識が必要です。
--このコースの場合、どれだけたくさんの改良提案ができたかがゴールになります。提案はパッチなどの具体的なプログラムを添えて行います。
-[ライバルコース]
--学生は川合のライバルとなり、オリジナルの言語を開発します(もしくは既存言語を改造します)。
--このコースの場合、自分のオリジナル言語をある程度完成させて、川合の言語よりもここがすごいんだぜ!と自慢できるようになるのがゴールになります。

-これらのコースは固定ではなく、学生は自分のスキルや関心に応じて、自由にコースをまたいで学習していきます。

** (3)セキュリティは?
-この講義ではセキュリティは主たる要素ではありません。まずはプログラミングです。
-そして言語にはバグやセキュリティホールがきっと出てくると思います。そうしたらそれを題材にして、これはどうしたらいいのかを考えてもらいます。
-一般にセキュリティホールをつぶすと、不便さが増します。それはいいことなんでしょうか。セキュリティと便利さを両立させる方法はないでしょうか。開発者であれば、是非その視点を持ってほしいです。
--あれも禁止、これも禁止としていけば、それは簡単に安全になるでしょうが、しかし何もできなくなってしまうのです。それは理想じゃないですよね。

** (4)どんな学生に受講してほしいのか
-''プログラミングが大好きな学生''
--そうでなければ始まりません! ちなみにセキュリティに関する知識は応募時点では一切不問です。
--得意な言語はなんであっても構いません。
--プログラミングが大好きで、前からこの言語はここが不便だと感じていたんだよなー、みたいになんとなく思っていたら、きっとこの講義は心底楽しめるでしょう。
-''事前学習に時間が取れる学生''
--試験期間(の前後)や修学旅行などの時期は事前学習を完全にお休みしていただいて構いませんが、それ以外は1週間あたり5時間くらいは事前学習に費やしてほしいです。ですからたくさんの塾を掛け持ちしていて忙しくてたまらない、アルバイトが大変すぎる、部活動が大変すぎて時間がない、という人は、申し訳ありませんが他の講義を選択してください。
--自宅もしくは学校にPCがないと事前学習ができないと思います。持っていなかったらごめんなさい!
-''優秀な学生じゃないとだめですか?''
--もちろん優秀な学生は大歓迎ですが、しかしそれほどには技術力がない学生にも来てほしいと思っています。だってこの言語は初心者向けでもあるんです。上級者ばかり集まってしまったら、意見や感想が偏ってしまうかもしれません。でも「どうせ自分はできないから~」みたいにあきらめてしまう人は楽しくないので、熱意とやる気にあふれる人がいいです。是非どんどん学んで、追い抜いてください!

** (5) [2017.05.11追記] Essenについて
-川合が作っているEssenについて別の角度から説明します。
--これを読めば言語を作ることの可能性を感じてもらえると思います。

~
-[Q] Essenって何がそんなにすごいの?既存の言語にできなくてEssenにできることってあるの?
-[A] そんなものはないです。EssenはC言語で書かれていますが、それゆえにEssenでできることはすべてC言語でできることです。

-[Q] なーんだ、意味ないじゃん。じゃあ既存言語で十分だね。
-[A] 私はそうは思いませんが、あなたの意見は尊重します。あなたは是非既存言語を使い続けてください。

-[Q] え、川合はEssenを作ったら使うつもりなの?
-[A] もちろんです。使わないものを作っても無駄じゃないですか。私はそんなに暇じゃないですよ。

-[Q] Essenにしかできないことはないのに、どうしてわざわざ使うんだ?・・・あ、わかった、めっちゃ高速なんだろ?
-[A] Essenは高速じゃないです。・・・ええとですね、そもそもプログラミング言語は既にたくさんあるわけですが、それらの違いは何だと思いますか?・・・まず土台になっているのは機械語(もしくはアセンブラ)だと私は思います。機械語は最も高速で、また万能です。機械語にできないことは、ほかのいかなる言語でもできません。なぜならすべての言語は機械語で書かれているからです。他の言語がどんなにがんばっても機械語が本気を出したら速度では絶対にかないません。よくて引き分けです。ということで、私はEssenで速度で優位性を出すことは考えていません。

-[Q] じゃあなんだよ。速度のほかに何があるわけ?
-[A] それは記述方法です。構文や文法です。「簡単に書くだけであれこれできる」を目指しているわけです。「いやC言語でもライブラリを使えば同じことできるよ?」そう言い返したくなる場面は何度も出てくるでしょう。それは分かっています。あえて何度も言いますが、「できる・できない」じゃないんです。それを言ったらEssenも既存のプログラミング言語もたいていはほぼ同等なのです(どうせみんなチューリング完全ですよね?)。「速い・遅い」でもないんです。「簡単に書くだけでできる・ごちゃごちゃ書かないとできない」これなんです。ここで勝負するんです。

-[Q] うーん、抽象的過ぎてわかんないな。もっと具体的に説明してみてよ。
-[A] そうですね。・・・Essenでは当然のことながら適当な関数を書いて計算をすることができます。でもインタプリタ実行なのでC言語よりもはるかに遅いと思われます。これはデメリットです。でも関数の引数は構造体としてひとまとめにすることが簡単にできて、これをargとすると、 value = func(arg) で計算した値を、 funcCache[arg] = value とキャッシュに入れておくことができます(Essenでは構造体でも何でも配列のインデックスにできる)。そうなれば、処理速度が重くてでも使用頻度が高い関数はなんでもキャッシュしてしまえばいいことになります。これでどんなに重い関数もキャッシュを引く時間程度までには簡単に高速化されるというわけです。・・・実際にはキャッシュ制御のための記述を書くのも面倒なので、こんな感じにすると思います。
 func = function (a b c)
 {
     funcCache ((a b c) 100) // 何がキーなのかを教える、外部変数にも影響されるならそれも含める、100はキャッシュの件数の上限
     {
         // 上記命令はキャッシュのテストもして、もしヒットしたら以下は実行しない
 
         ここでがんばって重たい計算をする
     }
 }

-[Q] ほほう。ちょっと面白そうだな。
-[A] キャッシュは永続変数に格納されているので、プログラムを中断して、また再開したら、キャッシュはそのまま使われます。だから本当に1度だけ計算すれば以後は高速なのです。これは悪くないと思いませんか?・・・念を押しますが他の言語だってライブラリか何かを作って同じ仕組みを構築することはできます。ただそれをこれほど簡潔には書けないかもしれません。

-[Q] え、プログラムを中断して再開してもキャッシュは残るって、それってちょっと危険じゃない?プログラムを書き換えた場合はどうなるのさ?
-[A] それはもちろん、funcCacheの後ろの { ... } の中も文字列としてキーに加えられているので、そこを書き換えればキャッシュはヒットしなくなり、大丈夫です。逆に言えばそこが書き換わらなければキャッシュは維持されるので、他の部分を改変してもキャッシュは生きたままになります。

-[Q] そんなにキーが大きくなってもいいのか?
-[A] はい、いいです。というかキーを大きくしてもいいように、そこは気合を入れて作っています。それが肝だと思っています。

-[Q] それはすごい。なんか興味出てきたぞ。・・・なるほどね、基本的に遅いは遅いけど、でも重い処理は簡単に速くできるから、実はトータルではそんなに遅くない感じなのか。
-[A] そうです。何でもかんでもキャッシュするわけじゃないですが(さすがにそれはメモリがなくなる)、要所でキャッシュを活用すれば、かなり簡単に「それなりには速い」プログラムが作れるでしょう。これって大事なことだと私は思うのです。現状では「それなりには速い」を実現するのは、ここまで簡単ではないと思うのです。

-[Q] さっきの funcCache だけど、多分よく使うからもっと簡潔にしたほうがいいんじゃないかな?
-[A] なるほど。じゃあこういうユーザ関数を作ったらどうですか?・・・こんなふうに関数を定義するための方法を後からいくらでも作れるので、どんどん使いやすくできます。
 defFuncCache100 = function ()
 {
     dumpArg = dump(subarray(arg  0  size(arg) - 1)
     eval(
         format {
             function %
             {
                 funcCache (% 100)
                 {
                     %
                 }
             }
         } ("%" dumpArg  dumpArg  dump(arg[size(arg) - 1]) )
     )
 }
 
 // 上記があればこう書ける
 func = defFuncCache100 (a b c)
 {
     重たい計算
 }
 
 // 注釈
 // dump : 引数の内容を文字列に変換する、その文字列の前に a = を書き足せば、aにその内容が完全に復元されるような、完全な形式で文字列化する
 // arg : 関数が受け取った引数全体
 // subarray : 配列の一部を取得
 // eval : 引数文字列を実行して結果を返す
 // format : sprintf みたいなもの、文字列内の任意のキーワードを置換していく

-[Q] 本当にどのくらい速くなるのか楽しみだな。
-[A] そうですね。ある程度動くようになったら、いろんな言語とベンチマークして比較してみたいです。

* こめんと欄
#comment


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS