Recommended
PDF
PDF
PPTX
PDF
PDF
PDF
PPTX
C# 7.2 with .NET Core 2.1
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
PDF
Reactive Extensionsで非同期処理を簡単に
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PDF
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PPTX
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
PDF
PDF
C++でCプリプロセッサを作ったり速くしたりしたお話
PDF
PPTX
PPTX
PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PDF
PDF
Unity2015_No10_~UGUI&Audio~
PPTX
PDF
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
PPTX
PDF
PDF
PDF
The Importance of Good Posture To Health
PPTX
8 barriers to realizing mindfulness
More Related Content
PDF
PDF
PPTX
PDF
PDF
PDF
PPTX
C# 7.2 with .NET Core 2.1
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
What's hot
PDF
Reactive Extensionsで非同期処理を簡単に
PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
PDF
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PPTX
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
PDF
PDF
C++でCプリプロセッサを作ったり速くしたりしたお話
PDF
PPTX
PPTX
PPTX
C# 8.0 Preview in Visual Studio 2019 (16.0)
PDF
PDF
Unity2015_No10_~UGUI&Audio~
PPTX
PDF
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
PPTX
PDF
PDF
Viewers also liked
PDF
The Importance of Good Posture To Health
PPTX
8 barriers to realizing mindfulness
PDF
Els beneficis de l'activitat física enfront els perjudicis de l'esport obsessiu
PDF
PPT
Como Planejar sua Campanha Promocional com Brindes | Apresentação 3 de 3
PDF
The path to self disruption: Nine steps of a digital transformation journey
PDF
Robots II. ¿Pagarán los robots nuestras pensiones?
PDF
Beyond Hacktivism - why #policymatters - Zan Markan - Codemotion Milan 2016
PDF
دليل الخير لمشاريع النجاة الخيرية في جمهورية باكستان
PDF
Oportunidades en Finlandia para la oferta colombiana
PDF
SC recomendó a FESFUT licitar transmisión de partidos
PPTX
Invisible Aerosols : Dentists beware of them
PDF
How to Ensure that Sales Training Sticks
PDF
Resumen: Propuesta: Ministerio de M.A.R. para Chile.
Similar to 2008.10.18 L4u Tech Talk
PDF
Javaで1から10まで書いた話(sanitized)
PDF
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
PDF
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
PDF
PDF
PDF
大規模なギョームシステムにHaxeを採用してみた話
PPTX
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
PDF
PDF
ODP
PDF
Lisp Tutorial for Pythonista : Day 3
PPT
PPTX
PDF
新しくプログラミング言語・・・Rubyでやってみた
PPT
PDF
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
KEY
関ジャバ JavaOne Tokyo 2012報告会
KEY
KEY
サイボウズ・ラボユース 最終成果報告会プレゼンテーション
PDF
2008.10.18 L4u Tech Talk 1. 2. 3. プロフィール mitamex こと日向野保夫と申します。 10年前にゼンリン電子地図帳 Zi を開発 Zi8 まで Web 系 GIS とか地図系のプログラムを多く作る。 株式会社匠技研所属 http://www.takugi.com ドコモ標準バンドルのゼンリン地図+ナビの開発に携わる。 4. 5. 6. 7. 10 年の月日が流れ 個人 ターゲット上で開発 C++/ アセンブラ 仮想メモリ チーム エミュレーターで開発 Java/ スクリプト /CGI 厳しいメモリー制限 8. 9. 10. 11. 12. L4u Lisp for you! Lisp 大好きっ子が進めたプロジェクトではない 必要の中から生まれた チームによる大規模開発に使える Lisp 携帯からサーバーまでカバーするスケーラビリティ 携帯上でデバッグ、リモートデバッグ可能 超並列型 プロトタイプ -> 最適化 13. L4u 誕生の経緯 905 で使っていたスクリプトの問題点を解決したかった。 携帯で Erlang を動かしたかった。 Wikipedia に載っている全言語+いっぱい調査。先祖帰りして Lisp にたどりつく。 その結果、 Lisp でいいじゃん、という結論に至る。 学術的興味ではなく、プロジェクトを進めるための必要性の中から生まれた実用的な言語。 14. L4u の特徴 携帯からサーバーまでカバーしうる スケーラビリティ 。 S 式のパワーそのままに、人間にやさしい構文 Ruby みたいな 普通の言語っぽい見た目 の Lisp Erlang みたいな 超並列型 Erlang より並列化しやすいよ ホスト言語との連携を前提 とした自己主張しない言語。 glue 言語 15. 16. 17. 実行速度、メモリーや コードサイズは? L4u は圧縮して 100KiB ぐらい DoJa では 1MiB までしかコードを入れられない S 式に統一することで、 XML デコーダー等が不要になり、 全体ではコードサイズが減少 継続・超並列型により、苦労して作っていた部分が平易なコードで作れてサイズ減少 905 のスクリプトより2ケタ高速。メモリー使用量も大幅に減少。 18. 現在動作しているプラットフォーム DoJa MIDP などの携帯電話プラットフォーム 3 つのプロジェクトに L4u を使っています Linux,Windows の Java 環境 サーバーサイドを L4u で書いています ツールを書いて使ってます Windows の .NET framework Managed C++,C# と連携して、 OpenGL や DirectX も使用可能。 AR とかやってます 19. 20. 21. 22. tuple を導入 タプルは評価してもそれ自体を返す List みたいなもの {a b} (tuple a b) '{a b} (tuple 'a 'b) タプルですか? (tuple? {1 2}) SXML より直観的にわかりやすくなる。 SXML 版 (html (body ( @ (bgcolor 0xff0000)) " はろー " L4u SXML 版 (html (body { bgcolor 0xff0000 } " はろー " 23. XHTML <body bgcolor="#ffff00" text="#000000" link="#ff0000"> 「タイトル :1 」 「タイトル : <b>b ボールド 2</b> 」 「タイトル :<strong>strong ボールド 3</strong> 」 <hr size=5 noshade /> 「タイトル :<i>i イタリック 1</i> 」 「タイトル :<em>em イタリック 2</em> 」 <br /> 「タイトル :<b><i>b+i ボールド + イタリック </i></b> 」 <br /> <img src="p32.gif" id="p320" /> <dl> <dt>HTML <dd>HyperText Markup Language の略で・・・ </dd> </dt> <dt>WWW <dd>World Wide Web の略で・・・ </dd> </dt> </dl> </body> 24. tuple を使うと・・ L4u SXML (body {bgcolor "#ffff00" } {text "#000000" } {link "#ff0000"} " 「タイトル :1 」 " " 「タイトル :" (b "b ボールド 2") " 」 " " 「タイトル :" (strong "strong ボールド 3") " 」 " (hr {size "5"} {noshade}) " 「タイトル :" (i "i イタリック 1") " 」 " " 「タイトル :" (em "em イタリック 2") " 」 " (br) " 「タイトル :" (b (i "b+i ボールド + イタリック ")) " 」 " (br) (img {src "p32.gif"} {id "p320"}) (dl (dt "HTML" (dd "HyperText Markup Language の略で・・・ ") ) (dt "WWW" (dd "World Wide Web の略で・・・ ") ) ) ) 25. まずは JSON で開発してもらって・・ JSON は標準でライブラリーも用意されているようなフォーマット。導入に障壁が少ない。 配列にデータを用意し、関数で JSON に変換するだけ。お手軽に扱える。 S 式で出力してください。 ( ゚ Д ゚ ) ハァ ? JSON で出力してください。 (・∀・)イイ !! 26. まずは JSON で開発してもらって・・ 後で S 式に置き換える。 JSON で完璧に動くものを作り、 JSON への変換部分を S 式に変換する関数に置き換える 。 JSON で出力できるように作ってくれ、とお願いするだけでいつの間にか S 式を出力してくれるサーバーの出来上がり。 27. JSON で作っていたつもりが・・・ { "Person" : { "name" : "Yasuo Higano", "nickname" : "mitamex", "interest" : [ { "title" : "SETI@home", "url" : "http://setiathome.ssl.berkeley.edu/" }, { "title" : "Flickr", "url" : "http://www.flickr.com/" } ] } } 28. JSON で作っていたつもりが・・・ いつの間にか S 式でやり取りされてる! ( { Person ( { name "Yasuo Higano" } { interest "mitamex" } { interest ( ( { title "SETI@home" } { url "http://setiathome.ssl.berkeley.edu/" } ) ( { title "Flickr" } { url "http://www.flickr.com/" } ) ) } ) } ) 29. 30. 31. 32. 33. 34. 35. smarty もどき 正規表現を使用せず、約 60 行のソースで、次のような L4u のコードが混在した html を処理可能 <html> <head> <title><%= title %></title> </head> <body> test of foreach<br> <% foreach data (x) do %> データは <%= x %><br> <% end %> test of repeat<br> <% repeat 10 (x) do %> カウント <%= x %> 番目でーす <br> <% end %> </body> </html> 36. 変換された l4u のコードを eval するだけ (println "<html><head><title>") (println title ) (println "</title></head><body>test of foreach<br>") foreach data (x) do (println " データは ") (println x ) (println "<br>") end (println "test of repeat<br>") repeat 10 (x) do (println " カウント ") (println x ) (println " 番目でーす <br>") end (println "</body></html>") 37. 38. ホスト言語との連携を前提にする L4u は自己主張しません。 L4u で全部書けとか言いません。 L4u が苦手な部分はホスト言語に任せてしまえば良い。 実行するだけでプロファイリング完了。 これで遅い部分をホスト言語に置き換えればよい。 極限までスピードに最適化した L4u のプログラムはメッセージキューとタスクマネージャ以外すべてホスト言語に置き換わる。 39. reflection が使えれば var obj = (create "System.Windows.Forms.MessageBox) ( obj.Show "Hello World!") CLOS のように (Show obj “Hello World!”) と書いてもよい。 Objective-C のように [obj Show “Hello World”] とも書けます。 40. Integer クラスの実装 その1 public class L4uObjInteger extends L4uObj implements IL4uEmbdFunc { public int _val; static L4uEnvironment _exe; public final L4uEnvironment GetExecUnit() { return _exe; } // 実行ユニットが対象としているクラスの実装クラス public final Object GetClassObj() { return _exe._funenv._cls; } 41. Integer クラスの実装 その2 public static final void InitImplementation() { L4uObjInteger obj = new L4uObjInteger(0); _exe = InitEmbd("L4uObjInteger",obj); RegFunc(_exe, new L4uVMFuncEmbd("inc!", 1) { public L4uObj exec(L4uVMExecFun exe, int num_params) { _Stack s = exe._vmthread._stack; L4uObjInteger obj = ((L4uObjInteger) s.at(0)); obj._val++; return obj; } }); 無名インナークラスを使って楽チンに実装 42. 43. delegate/cc の例 doja で IME を使って文字を入力 ; L4u var result = (delegate/cc (lambda (cont) (IMEGetText cont " はろー "))) (println result) // Java static L4uContinuation _ime_cont; RegFunc( new L4uVMFuncEmbd("IMEGetText",2){ public Object Exec(L4uVMExecFun exe,int num_params){ _ime_cont = (L4uContinuation )exe._vmthread._stack.at(0) ); imeOn(""+ exe._vmthread._stack.at(1), TextBox.DISPLAY_ANY, TextBox.ALPHA) } } ) void processIMEEvent(int type, String text) { _ime_cont.do_continue(text); } 44. 45. 46. 47. 48. もはや S 式じゃない? マクロより凶悪な S 式いじり マクロよりもプログラマブルな L4u で記述されたマクロ(のようなもの) シンボル化されたソースを直接いじくって、かっこの外に飛び出せ! ; かっこの外にある class というシンボルの処理 switch sym case 'class var a = (read) var b = (read) var c = (readListUntil 'end) var lb = (new ListBuilder) (lb.add! 'class) (lb.add! a) (lb.add! b) (lb.addList! c) (lb.toList) 49. もはや S 式じゃない? マクロより凶悪な S 式いじり class クラス名 ( 継承するクラス ) 定義 end ↓ (class クラス名 継承するクラス 定義 ) に変換される。 50. Dylan みたいだけど S 式を捨てたわけじゃない どんな構文でも、 最終的に S 式に変換 される。 だから糖衣構文なしで直接 S 式で書いてもよい。 マクロは、変換後の S 式に対して適用される。 51. 52. L4u の超並列指向 Erlang と同じものを目指している もともと Erlang を携帯で動かしたかった。 Erlang と同じメッセージパッシング。 同一プロセスはもちろん、他プロセス、ネットワーク越しの PC とも通信可能。 共有メモリは一切使えない。メモリーの排他機能は持たない。 Erlang と同じく、言語が処理するライトウェイトスレッドと、 OS がサポートするスレッドのハイブリッド構成。 53. 54. 55. 56. 他のプロセスにメッセージを送る defun remoteRPL(name url port) var target = (new RemotePID name url port) loop (print "remoteL4u>") var str = (readln) ( target.send {‘print str}) (println "") end end (remoteRPL “mymsgloop” “localhost” 8080) 57. 他のプロセスからの メッセージを受ける defun messageLoop(s) (println s) loop switch (receive) match {'print msg} (println “ メッセージは” msg) match msg (println “ なんかわかんないけど” msg) end end end home>l4u port:8080 l4u>(spawn “mymsgloop” messageLoop “hello”) 58. 59. 60. 人にやさしい構文とは Lisp は人間にやさしくない コンピューターにやさしい言語。 Algol 系言語から入った人は、カッコだらけで生理的な嫌悪感を抱く! 特殊形式も関数も同じ書き方だから知識なしには理解できない。 Lisp の特徴を生かしつつ人にやさしい構文にしたい。 61. 62. 右脳で直感的に理解できる構文 例えば if (if a b c) って Lisp の知識がない人には何をやるのかさっぱりわからん。 コンピューターにとっては冗長で無駄な情報。でも、人間には理解を助けるためのアンカーが必要。 if a then b else c end then,else はコンピューターにとっては邪魔な記号だが、人間はこれを見たらどの部分が何を意味しているかすぐわかる。 これだったらプログラミングをかじった人間のほとんどが理解できるはず。 63. やりたいことを明示する continue,break,return を持つ ありがちな会話 初心者「 scheme で break ってどうやるんですか?」 プロ「継続でできるよ」 初心者「で、どうやってやるんじゃい!」 実際にやりたいことは継続ではない continue したい。 break したい。 return したいだけなのに、なんで継続使わなくちゃいけないの? 64. 65. loop の例 let c = 0 in loop when(>= c 10) do break (* c 2) end set! c = (+ c 1) end end 66. repeat の例 repeat 10 from 5 (x) do (println x) when (== x 10) do break 'ok end end 67. 見た目は Algol 系でも 最終的には S 式で処理される repeat 10 from 0 (x) do (println x) end ↓ ( let ( ( x 0 ) ) ( while-f ( < x ( + 10 0 ) ) ( println x ) ( objpath:x.inc! ) ) ) マクロは変換後の S 式に対して適用される。 68. かっこを減らせ! その 1 ひとつ前の処理の戻り値を指す it を追加。 (print (fizzbuzz (seq 1 100))) ↓ (seq 1 100) (fizzbuzz it) (print it) 69. かっこを減らせ! その 2 -> 演算子を追加。 戻り値を次の関数の第一引数に放り込める。 処理の流れが左から右になる。 処理のパイプラインを簡単に作れる。 (print (fizzbuzz (seq 1 100))) ↓ (seq 1 100) -> (fizzbuzz) -> (print) 70. 第一引数を特別扱い L4u ではすべてがオブジェクト (+ 1 2 3) は整数の加算が呼ばれるべき (+ “abc” “def”) は文字列の結合が呼ばれるべき どのクラスのメソッドを呼び出すか識別するために、第一引数を使う クラスごとにメソッドを定義するだけで、第一引数で識別する多重ディスパッチになる 71. 72. 73. 非 CLOS なオブジェクトシステム Java ・ Ruby のようなクラス class Animal() def 鳴く () end end class 犬 (Animal) def 鳴く () (println “ わんわんお!” ) end def お手 () (println “ あいよ“ ) end end var dog = ( 犬 .new) ; var dog = (new 犬 ) どっちでもいいよ (dog. 鳴く ) ; ( 鳴く dog) どっちでもいいよ [dog お手 ] ; Objective-C のメッセージ式と同じ 74. 非 CLOS なオブジェクトシステム class 住所録 () var 名前 = “” var 住所 = “” var 電話番号 = “” def construct( 名前 住所 電話番号 ) set! self. 名前 = 名前 set! self. 住所 = 住所 set! self. 電話番号 = 電話番号 end def dump() (println 名前 “ : “ 住所 “ : “ 電話番号 ) end end var obj = (new 住所録 “ mitamex” “ 千葉県” “ 090-xxxx-xxxx”) 75. SLOT じゃなければ、コピペで抜き出して簡単にテストできるよ var 名前 = “” var 住所 = “” var 電話番号 = “” def construct( 名前 住所 電話番号 ) set! self. 名前 = 名前 set! self. 住所 = 住所 set! self. 電話番号 = 電話番号 end def dump() (println 名前 “ : “ 住所 “ : “ 電話番号 ) end L4u>set! 名前 = “ 阿部高和” L4u>(dump) 76. なぜ CLOS があるのに Java っぽいクラスを使うか ホスト言語が Java だから。 L4u の遅い部分はホスト言語で書きなおすので、同じ様な形が好ましい。 ホスト言語のオブジェクトを簡単に呼び出せるので、ホスト言語と同じ形のオブジェクトにしたかった。 var msgbox = (create "System.windows.forms.MessageBox”) (msgbox.show "Hello world") 77. まとめ 楽するために L4u を使おう! どこでも REPL プロトタイプ作成ー>ボトルネックをホスト言語で最適化 超並列型 Algol 系プログラマでもとっつきやすい構文 携帯電話でも動く小さなコア 携帯電話からサーバーまでカバーするスケーラビリティ 78.