サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ドラクエ3
sumim.hatenablog.com
2022-09-09改訂: gcc バージョンが古すぎたのと、C が内部計測でなかった点を改め計測しなおしました。結果、Rust は C より速くはなくなりました。紛らわしいことで、ごめんなさい。また、gcc のバージョンアップに伴い、Python および Ruby についてはビルドと計測をしなおしたので、これらも少し速い値に変わっています。この点もどうぞあしからず。 2022-09-10追記:ご要望のあった Python numba.njit 使用時と Go の結果を追加しました。PHP は JIT 有効化が面倒だったので断念しました^^; 2022-09-10追記2:C の計測で clock() を使うのはフェアではないという指摘がありましたので、念のため clock_gettime() を使用したコードに差し替えました。結果に大きな差はありません。 2022-09-10追記3:PHP
(サンプルコード「じゃんけんゲーム」(@nrslibさんのSIMULA版を移植)の続き) アドカレのかたちを借りて、アラン・ケイの“オブジェクト指向”というアイデアをもとに(非同期処理などいろいろ足りていないながらも──)比較的忠実に実装された1970年代の非常に古いSmalltalk-72でいろいろ遊んでみたわけですが、お楽しみ頂けましたでしょうか。 絵文字などが多用されているコードの見た目の時点でもうすでにかなりユニークなSmalltalk-72ですが、純粋に言語として見ても、今でも十分異端とされる我々の知るSmalltalk-80以降の現在に至る実装(例えばPharo)のそのまたさらに遥か斜め上を行く“メッセージング”の徹底具合とその実現方法に度肝を抜かれたかと思います。 今のSmalltalkを含めて、Smalltalk-76以降のSmalltalkがパフォーマンスを優先してそれを
前回のエントリー『「使わないと損をする Model-View-Controller」のサンプルコードを SqueakJS のデモ画面(Mini Squeak 2.2)で動かす 』では個人的にも実に久しぶりに古典的MVC に触れて楽しかったので、今回は引き続き Mini Sqeauk 2.2 環境を使って @miwa719 さんにご提案いただいたお題にチャレンジしてみました。 Smalltalk知らなすぎるのでSqueakでタイマー作ってみようかな 欲しい機能はこの画像みたいなやつなんだけど、まずは空っぽのウィンドウを開くところからかな(超初心者!) pic.twitter.com/HDkntO1Tfh— miwa (@miwa719) 2019年4月16日 容量を小さくすることを優先して、必要最低限を超えてクラスやメソッドがそぎ落とされてしまった Mini Squeak 2.2.の環境では
なぜか Ruby インタプリタ開発者が翻訳をしたことで話題の『プログラミング Elixir』 p.167 にある「14.2 プロセスのオーバヘッド」のサンプルコード https://media.pragprog.com/titles/elixir12/code/spawn/chain.ex これと似たようなことを Ruby の軽量スレッド(Fiber)と Squeak Smalltalk のプロセスでチャレンジしてみようという試みです。もちろん、Elixir や Erlang のプロセスとはいろいろ違うので、かなり大雑把に似たような処理…ということでご勘弁ください。^^; ちなみに手元の Elixir では spawn/chain.ex の結果はこのようになりました。 $ elixir -v Erlang/OTP 19 [erts-8.0] [64-bit] [smp:4:4] [asyn
件のネタについては Ruby ではすでに言及済みですが、その後 えせはらさんが Smalltalk に書き直すかたちで イケてないRubyのコードのリファクタリングって奴をSmallTalkでやってみる - Line 1: Error: Invalid Blog('by Esehara' ) というすばらしいエントリーを公開してくださいましたので、触発されて私も二番煎じではありますが、同じ Smalltalk 処理系の Pharo を使ってやってみました。ただバージョンは、先頃リリースされたばかりの 5.0 を使用しました。あとで出てきますが、新機能のサジェスチョンも初めて体験できて面白かったです。 正直このネタに関しては、肝心のリファクタリング自体は冗長な記述をまとめるだけであっさりと終わってしまいそうなので、このエントリーでは本論から少し離れて、その前段階の Ruby のリファクタリン
元の話の発端が何かは分からなかったのですが、最近 Ruby の true, false の属するクラスについての言及 TrueClass / FalseClass が分かれてるのはSmalltalkもそうだからまあある程度理由はあったと思うんだけど。でもSmalltalkはちゃんと共通祖先のBooleanを作ってあるのにRubyにない理由はよくわからん。— Urabe, Shyouhei (@shyouhei) 2016年6月23日 や、関連する過去のこんな記事 RubyでBoolClassではなくTrueClass/FalseClassな理由を理解する を見かけたので、今の Smalltalk と、その元になっている Smalltalk-80 より前に作られた Smalltalk-76、Smalltalk-72 ではどんなふうになっていたか調べてまとめてみました。 ▼ 現在の Small
当初、誰向けかわからないCommon Lispでの関数型プログラミング入門とその未来 - 八発白中 に例にあがっているコードを Squeak Smalltalk ならどう書けるかというような、少しは有益なことを書こうかと思っていたら、のっけからネタに走ってしまって失敗しました。ごめんなさい。 ▼関数の定義とコール(ネタ) Smalltalk ではまずクラスを作り(その際、インスタンス変数などを宣言し)メソッドを登録することで、そのクラスのインスタンスであるオブジェクトの振る舞いを決める、というやりかたをします。しかし「メソッド」などといったところで、クラスに属しているだけでただの関数です。 通常であればこの“関数”は、オブジェクトに「メッセージ」と称される「関数名(セレクターとも言う)と引数」を組にした情報*1を送ることで動的にコールされますが、もし静的コール*2もできればもっと普通に関数
話題の 『スティーブ・ジョブズ1995 〜失われたインタビュー〜』 を iTunesストアで借りて観たのですが、インタビュワーがなんとなくいちいち煽り気味でむかつくのと、ゼロックスでの GUI との出会いのくだりがあっさりしているのが気にくわないので、同じ 1995年のロングインタビューなら個人的にはこちらのほうをお薦めしたいです。関係者の不注意でロストしてもないし、なによりロハだし。w Steve Jobs 1995 Interview NeXT Computer from Steve Next on Vimeo. 内容も(英語ですが)読めます。 Smithsonian Oral and Video Histories: Steve Jobs 同じ時期だからかもしれないけれど、内容もかなり似通っています。し、前述のとおりアラン・ケイたちの暫定ダイナブック(AltoでSmalltalkをG
▼Reenskaug (XEROX PARC) 「MVC」/ Things - Model - View - Editor MVC / XEROX PARC 1978-79 変化しにくいインフォメーションと変化しがちなプレゼンテーションとの分離。メンタルモデルの記述としてのMVCは失敗(続きは DCI, Data - Context - Interaction で)。Smalltalk-76, 1978。 ▼Reenskaug (XEROX PARC) 「MVC」/ Model - View - Controller(Editor) MODELS - VIEWS - CONTROLLERS Controller を追加。Editor は特殊な Controller として位置付け。Smalltalk-80, 1979-。 ▼VisualWorks (ParcPlace Systems) 「
タイトルは釣りです。 まずおおざっぱに用語の整理をさせていただくと、ここで「トレイト」は、シェルリ(Nathanael Schärli)らが2002年頃に発表したTraitsやそれ用のエンティティ(trait)を指し、「ミクスイン(Mixin, mixin)」は従来からある実装の多重継承方法のひとつ、具体的には継承機構を使ってメソッドを定義したクラス様エンティティ(クラスでも構わない)を継承パスに差し込むことで対象となるクラスにメソッドを追加する機構(特別な機構を要しないときは単なるクラスの運用方法)、そのときに用いるクラスあるいはクラス様エンティティ(例えばRubyならモジュールとか)を指すことにします。 トレイトやその機構について説明すべきことはいろいろありそうですが、詳しくはシェルリらの論文(Traits: Composable Units of Behaviour など)を読んでい
BabyIDE については元エントリーのこちらの長い前振りを参照してください。 DCI パラダイムの提唱者、レインスカウ氏の BabyIDE で遊ぶ - Smalltalkのtは小文字です さらに比較的新しいバージョンの BabyIDE を念頭に、インストールの仕方からコードや操作の記述などを修正した改訂版がありますので こちら もご参照ください。 BabyIDE のバージョンがいまひとつはっきりしていなくて、まじめにチェックしていなかったのですが、久しぶりに遊んでみたら、どうやら現在配布されている BabyIDE ではくだんのエントリーの通りにしてもうまく組めないことも判明したので、現在配布されているバージョン向けに操作を(ほとんどは同じで、ほんの一部ですが)書き直してみました。 [追記 2013-01-23] この改訂版を書いたすぐあとに BabyIDE を含む DCI の新しいポータ
Squeak Smalltalk の #largePrimesUpTo:do: をほぼそのまま Scala に書き換えてみました。手元の環境では残念ながら 1<<30 ですと OutOfMemoryError になるので少し減らして 1<<29 に収まる全素数(28192750個。最大は 536870909)の生成を試したところ、おおよそ Squeak4.2 CogVM の倍速といった感じでした(1.8GHz Core i7 で Squeak の 27秒に対し Scala は 14秒)。限られた Scala の知識で機械的に変換したものなので Scala をよく知っている人に手を入れてもらえれば軽く10倍くらいには高速化できるとおもいますので後はよろしくお願いします。w 他の言語への移植もチャレンジしてみたいですね。 object PrimesUpTo extends App { def
あるいは、いかにしてここ数年来の懸案だった n fizz buzz 形式のメソッドコールによる FizzBuzz をいわゆる“黒魔術”(―を通り越してもはや禁じ手の類)を用いて実現したか。 オーソドックスに―ということであれば n fizz, n buzz ifEmpty: [n] が Smalltalk での FizzBuzz のベストアンサーだと思っている私ではありますが、それとは別に、考え得るもっともシンプルな式である n fizz buzz と書くだけで同様のことを実現できないものかということも定期的に巡ってくるブームのたびに模索し続けていて、なんとか n fizz buzz value という似た形まではもってこれてはいたものの、最後の余計なメソッドコールをどうにも無くすことができなくて行き詰まっていた、というのがこれまでの流れです。で、今回はその最後のコールをかなり無理矢理では
関数合成のススメ 〜 オブジェクト指向プログラマへ捧げる関数型言語への導入その1 - ( ꒪⌓꒪) ゆるよろ日記 メソッドを合成して新しいメソッドを生成するのはちょっと手ごわそうなのであとまわしにして、まずは簡単な無名関数を使ったバージョンから試します。 Smalltalk では無名関数はブロックと呼ばれ、式を [ ] で括ることで定義できます。 f := [3 + 4] これを評価する際には value というメッセージを送ります。 f value "=> 7 " 引数をとるブロックの場合は、次のようにコロンに続けて仮引数(変数名)を列挙し、| で手続き本体と区切ります。 add := [:x :y | x + y] 引数をとるブロックの評価には value ではなく、引数の数だけ value: を重ねたメッセージを送ります。 add value: 3 value: 4 "=> 7 "
KentのSmalltalkでの記事。何年ぶりなんだか。http://t.co/EN0kCYAE @umejava 1月19日 経由で、 Rolling and Flipping: Vose' Alias Algorithm in Smalltalk Darts, Dice, and Coins 面白そうなのでちょっと趣向を変えて Squeak Smalltalk のジェネレーターを使って書いて動きを見てみようと思います。 サイコロより目の数がひとつ余計ですが、二番目のリンクの最後にあるのと同じ7つの目がそれぞれ 1/8, 1/5, 1/10, 1/4, 1/10, 1/10, 1/8 というふうに偏った確率で出る場合を考えます。 まず、ケント・ベックも冒頭で触れているエイリアス法を使わないナイーブな実装。各目の閾値(境界)を前述確率から算出しておき、0から1未満の乱数がそのどの範囲に収ま
2011-10-08 に触発されて、いつもどおり何周目かの FizzBuzz に今回は Traits というのを使って乗っかってみます。 追記:前置きがやたら長くなってしまったのでまずコードをここで示します。下のほうに載せてあるワークスペース(Squeak4.2などの―)で直接実行できるコードと実質同じ内容ですが、いくらか読み下しやすくする目的で簡略書式に整形してあります。何となく内容を把握するにはこちらが断然読みやすいですが、実際に動かすとなると逆で、省略情報を適宜補ったり、メソッドごとにクラスブラウザにコピペ&コンパイルするといった Smalltalk環境の知識がある程度必要になりますのでご注意ください。 Trait named: #TFizzBuzz TFizzBuzz >> fizz (self asInteger isDivisibleBy: 3) ifTrue: [^self
Objective-Cの『遅さ』を計測したら、JavaやC++の5倍も遅かった: ニュースの社会科学的な裏側 476 :デフォルトの名無しさん:2011/02/25(金) 16:29:14.06 >>226 MatzRubyが堂々の3時間01分をたたき出したのには吹いた。 (趣味だけど)Ruby使いなんで、ちょっと擁護します RubyのC実装(MatzRubyあるいはMRI)では速度とメモリ節約のために 31bitまでの整数を特別扱い(埋め込みオブジェクト)のFixnumとして それを超えると多倍長整数のBignum(普通のオブジェクト)として扱ってます よって2^31回ループさせるとFixnumの範囲を超えてしまうので遅くなります ループ回数を半分に減らして 2^30回にするとFixnumの範囲内に収まるので速くなり 今回のベンチの実行時間では1/4ほどになります 64bit版MatzR
Objective-Cの『遅さ』を計測したら、JavaやC++の5倍も遅かった: ニュースの社会科学的な裏側 ただし手元の環境(MacBook Air 11", 1.6GHz Core 2 Duo, Win 7)は非力なので、ループ回数は 268435455回に減らしました。Cygwin環境であるせいか、Objective-C は元記事でとりざたされている結果と違い、C++ の5倍までは遅くなっていませんでした。かたや Java は C++ の2倍程度に遅くなっていて、Objective-C とはほとんど差がありませんでした。 Smalltalk はまずまずの結果といった感じでしょうか。正直、爆速を誇る商用処理系であるところの VisualWorks には、C++ とまではいかずとも Objective-C には肉薄して欲しかったところですが、前述の通り Objective-C に逃げ切ら
1日目は @mrknさんとペアプロで、2日目はソロでしたが、例題のレガシーコードを昼休みに Squeak Smalltalk に書き直してから、仕様化テスト書きとリファクタリングまでやってみました。両日ともとても充実していました。振り返りでも言いましたが、テストのある生活の安心感と、TDD の躍動感・ライブ感と Smalltalk との相性の良さをあらためて実感できました。 元になったレガシーコードの公開は避けて欲しいということでしたので、書き足したテストとリファクタリング後のコードだけ載せておきます。もっとも当日ご参加のみなさんに感じ取っていただけたであろう Smalltalk のパワーについては、この拙いコードだけからはまったく伝えられないので、それがちょっと残念です。^^; 風邪で不調をおしての来札、熱いご講演とご指導をいただいた輝きの @t_wadaさん、運営の @shuji_w6
やりたいのは単純で、一〜五十くらいまでで、十一とか三十一とかの表記となる。これを1〜50、11とか31とかに直す。 L'eclat des jours(2010-12-09) | kjToArabic | kjToArabic := [:inString | | inStream outStream | inStream := inString readStream. outStream := String new writeStream. [inStream atEnd] whileFalse: [ | next | next := ('十一二三四五六七八九' indexOf: inStream next) - 1. (outStream isEmpty and: [next isZero]) ifTrue: [outStream nextPut: $1]. (next > 0 or:
いや、既にincludeしてるモジュールに追加でincludeすると、追加が反映されず継承木の構造が期待と違う、という意味です。 Twitter / Yukihiro Matsumoto いぜん次のような記述を見かけたので、てっきり Ruby のモジュールはどこまでもシンボリックなのかと思っていましたが、 ただ、traitは「a first-class collection of named methods」であり、 そのinclude(論文中ではuses:)は、そのtraitが(現時点で)持つメソッド集合を使うイメージのようだ。 Rubyのincludeはinheritと同様、 シンボリックな関係*2を維持している。 いっそmoduleもtraitのようにしてしまうとラクなんだが、多分許されないだろうなあ。 *2 includeしたmoduleにメソッドが追加されると追随すること Mat
SpiderMonkey がタコなのか、はたまた私の JavaScript力がたんに足りないだけなのか、いずれにしてもかなりひどいことになってしまっていますが、JavaScript で許されている範囲で件の Squeak Smalltalk ならではの「斜め」を実現しようとすると、こんなふうになります。まあ、Smalltalk は読めない…という方に、雰囲気だけでもお伝えできればと。 function fib(n) { function fib1(n, a, b) { if(n>1) fib2(n-1, a, b); var my = arguments.callee; var mine = a+b; var caller = my.caller; var k = 3; while (caller && --k) { caller.arguments[k] = mine; caller =
id:sumim:20100829:p1 の続き。 classbox.diff を当てた trunk のビルドができたので、本家の Classbox のテストコードの振る舞いを、Ruby版に書き直した結果と比べてみました。両者の挙動の違いには、おそらく、発表に対する質問にも出ていた local rebindings という機構の有無が効いてきているのだと思います。 ▶ Ruby版 Classbox module CB1 class A def foo; 10 end def bar; foo end end class B def foo; A.new.foo end end class C def foo; B.new.foo end end class D def foo; C.new.foo end end end module CB2 def foo; 20 end end mod
Ruby会議で飛び出た Ruby 2.0 の予定。目玉に Smalltalk の特に Squeak で初めて実装が試されたゆかりの機能が2つもあって、Squeakファンとしては実にwktkでした。個人的にも、札幌Ruby会議02での こちら も口から出任せにならずに済みそうでよかったなーとひと安心。w で、関連してこんなつぶやきを見かけたので、Squeak の Classbox の実装を久しぶりに引っ張り出して調べてみました。 あれ? 本家のclassboxのメソッド探索ルールがいまいちわからない。静的スコープでの解消じゃないんだね。じゃ、動的スコープってこと? Twitter / yukihiro_matz 論文はいくつかありますが、こちらが比較的くわしいかと。 Scoped and Dynamic Aspects with Classboxes [PDF] Classbox(個人的には
Ruby|Pythonでバイトコードをディスアセンブル - 西尾泰和のはてなダイアリー Smalltalk(Squeak と VisualWorks)の場合、メソッドオブジェクトに symbolic というメッセージを送ることで得られます。 (Integer compiledMethodAt: #factorial) symbolic 25 <70> self 26 <75> pushConstant: 0 27 <B6> send: = 28 <99> jumpFalse: 31 29 <76> pushConstant: 1 30 <7C> returnTop 31 <70> self 32 <75> pushConstant: 0 33 <B3> send: > 34 <9E> jumpFalse: 42 35 <70> self 36 <70> self 37 <76> pushC
Big Scripting Languages: PHP, Perl, Python, Ruby, Smalltalk Smalltalk が普通に入っているのがすばらしいので、すこしだけ目立ち気味の空欄を GNU Smalltalk、Squeak、VisualWorks で項目を分けてからざっと調べて分かる範囲で埋めてみた―の巻の後半部分です。GSTer、VWer は、訂正・補足をお願いします。もちろん Squeak使いからのツッコミも歓迎です。 前半:basal, arithmetic and logic, containers, functions, execution control, environment and i/o libraries and modules > ruby GNU Smalltalk Squeak VisualWorks import library re
Big Scripting Languages: PHP, Perl, Python, Ruby, Smalltalk Smalltalk が普通に入っているのがすばらしいですね。せっかくなので、すこしだけ目立ち気味の空欄を GNU Smalltalk、Squeak、VisualWorks で項目を分けてからざっと調べて分かる範囲で埋めてみました。スペースの都合と比較のしやすさから、他の言語は Ruby だけ残してありますので、あしからず。GSTer、VWer は、訂正・補足をお願いします。もちろん Squeak使いからのツッコミも歓迎です。 後半:libraries and modules, objects, reflection and hooks, java interoperation, > ruby (1995) GNU Smalltalk (1990) Squeak (1996
BabyIDE は、古くは MVC(Model-View-Controller)、近年では DCI(Data-Context-Interaction)というパラダイムの提唱者として知られるトリグヴ・レインスカウ(Trygve Reenskaug)氏自らが手がける Squeak Smalltalk ベースの DCI 向けプログラミング&モデリングのためのツールで、彼の考える BabyUML(UML や他の言語の構成概念を基に作られたプログラミング規律)のための実験の場でもあります。 BabyIDE is an interactive development environment that supports the DCI paradigm with specialized browsers for each perspective. These browsers are placed in
個人的には実験的新機能導入に振り回されるのを嫌って Squeak の最新版を追わなくなって久しいですのですが、その“新機能”のひとつが待望のクロージャーサポートとなれば話は別。RC1 なるベータ版が公開されたようなので、さっそく試してみました。 Squeak4.1-9850-beta-win32.zip 見た目が Pharo テイストですね。新たにウィジェットの配置やアイコンなどにも手が入れられ、さらに小ぎれいになってきました。 リリースノート(What's New)によると、UI のみならず内部的にもいろいろと整理が進んだようです。ただ、そこは悪名高き(…は言い過ぎか?)“Squeakクオリティ”。手が入ったってことは、それだけ壊された場所も多いってことを意味するので、なじみの機能の何がどこまで壊されているのか、こまかく調べてゆくのが今から恐ろしいです。^^; とりあえず、#duplic
次のページ
このページを最初にブックマークしてみませんか?
『Smalltalkのtは小文字です』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く