2007-01-01から1ヶ月間の記事一覧

21世紀の科学は計算不可能性の科学

20世紀はゲーデル数、チューリングマシン、ノイマン型コンピュータから爆発的に発達した計算機による計算の科学の時代でした。 計算機の力で、語りうるものに関してどんどん語った時代です。 残されたのは、量子力学と一般相対性理論の融合とか、意識の問題…

人間が計算不可能なことをしているということは証明不可能?

ぼくは、人間は計算不可能なことをしていると思っているのだけども、そこに至る過程自体が計算不可能なので、論理的で証明可能な説明を与えることはできない気がする。 少なくともぼくは、論理的で証明可能な過程をたどってこういう結論に至っているわけでは…

オブジェクト指向の中の計算不可能性

実際のところ、すでにオブジェクト指向の中には計算不可能なことがあります。 Javaで言えば、受け取ったオブジェクトが実際にどのクラスのオブジェクトになるかを決定する、どんなプログラムにでも使えるアルゴリズムは存在しません。 ただ、オブジェクトが…

「神はサイコロを振らない」を誤解してました。

アインシュタインは量子力学は間違ってると言ったんだと思ってました。 そうじゃなくて「まだ本物ではない」という言葉のあとで「神はサイコロを振らない」と書いてたんですね。 つまり、量子のふるまいは偶然決まるのではなくて、まだわかっていないけど何…

計算不可能だけど決定論的なこと

ペンローズの“量子脳”理論―心と意識の科学的基礎をもとめて (ちくま学芸文庫)での茂木健一郎さんのあげてた例を簡約にすると プログラム1が停止するとき→プログラム2の停止判定へ プログラム1が停止しないとき→プログラム3の停止判定へ のように状態遷移して…

区体論が完成すると、オブジェクト指向でモノを扱えるようになる

区体論ってのは、ここの人が提唱してる数学の理論です。 現代数学における問題と困難(集合論) ようするに、何をしようとしてるかというと、集合論ではモノの集合が扱えないので、モノの集合が扱える集合論を区体論として構築しようとしてるのです。 オブジ…

なんでstaticがついてないとダメなの?

Java講習の季節なわけですが。 class A{ class B{} static class C{} void x(){ new B(); new C(); } static void y(){ new B();// で、x()でのnew B()はいいのにy()でのnew B()がダメなのはどうして?という質問があった。 もちろん「Bにstaticがついてない…

JDBCよりJPAの方が楽

JDBCでConnectionとStatementとResultSet使ってコード書くより、JPAで書いたほうが楽だ。 マッピングクラスはツールが作ってくれる前提で。

プログラムの限界

ダイクストラは、すべての処理は順次実行と繰り返しと条件分岐で表せることを示したけど、それは裏を返せば、プログラムには順次実行と繰り返しと条件分岐しかできないということ。 たとえばゲームのルールを与えられたときに、そのルールで考えられるすべて…

モノをオブジェクト指向で表現しようとすると失敗する理由

モノをうまく表現しようと思ったら、物理学のモデルを使うべきだから。 オブジェクト指向は分類技法でしかなくて、モノは小さな粒の集まりでしかないので、うまくいかない。 オブジェクト指向で扱えるのは、商品だったり会員だったりといった、モノに対応す…

Visual Web Pack5.5日本語版

出ました http://www.netbeans.org/products/visualweb/index_ja.html

JDK6のjava.util.Scanner#findInLineのバグ

http://d.hatena.ne.jp/coolstyle/20070112 ってか、一本釣りされますた

JDK6のsynchronizedの開放順の続き

最初のスレッドが待ち続けるということはなさそう。 適当に開放されるみたい。法則はちゃんとあるけど。 とりあえず試せるソース public class ThreadTest implements Runnable{ private String name; private long speed; ThreadTest(long speed, String na…

JDK6はsynchronizedの開放順が変わってる

JDK5では先に入った順にsynchronizedから抜けるのですが、JDK6では後に入った順にsynchoronizedから抜けます。 ということは、synchoronizedに先に入ったスレッドは、いつまでたってもsynchoronizedから抜けれない可能性があるということです。 これって仕様…

JDK6 b105のバグ、修正済

神谷さんによれば、すでにコードは修正されたとのこと。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6512534

さて、実装はどうしよう?

いろいろJavaの拡張構文を考えてみたわけですが、どうやって実装しようかな。 JavaCCは一番やりたいようにできるんだけど、既存のJavaプログラムを処理する部分が面倒 javac自体をいじくるのは、javacのアーキテクチャに従ってる分には簡単そうだけど、ちょ…

コンパイライニシャライザ

上記のmixinとVariable型使って、実行時にデータベースからスキーマとってきてメソッドを追加してしまえばActiveRecordが実現できるわけですが、それをコンパイル時にやってやると素敵なのかな。 つまり module ActiveRecord{ compile{ List list = database…

Javaでmixinを実現する方法

先日書いた方法と同じアイデアを使うと、RubyのmixinをJavaで実現することが可能になりそうです。 つまり module Eachable for List{ void each(Closure c){ for(Object o : this){ c(o); } } } みたいなことを書いて class EachableList extends ArrayList …

throwの代わりに(ノ∀`)

http://d.hatena.ne.jp/m-hashimoto/20070114/1168756445で盛り上がってみた。 throw new Exception(); の代わりに (ノ∀`) new Exception(); とか書くの。 捕まえる側はこんな感じ。 (屮゚Д゚)屮{ Reader r = new FileReader("aa"); (´-`).。oO(Hello Java); } …

シンタックスシュガーを定義できる構文が欲しい

Javaでは、すでに定着した標準のinterfaceにメソッドを追加することはできません。 Listにメソッドを追加すると、それまでにListを実装していたライブラリは全滅になります。 なので、上記のeachの実装ではコンパイラの段階でスタティックメソッドに変換する…

配列にeachが使えないクロージャーなんて

ステキ度半減 配列とかListとかにeachを使えるようにして欲しい。 まあ、Listにメソッドを付け加えることは無理なので、コンパイル時にstaticメソッドの呼び出しに変換するような実装にすればいい。 new String[]{"a", "b", "c"}.each({print(item);}); を A…

JDKのバグの続きの続き

笑えるくらい簡単になった public class Ploblem { static public void process(){ boolean brk = true;//順番を逆にすると再現しない intでも再現 boolean pre = false; System.out.println("---start---"); for(int i = 0; i 結果 ---start--- if :true en…

動的でもあり静的でもある言語

たとえばJavaのクラスを @Attachable class Hoge{ void foo(){ xxx }; } とかやると Hoge.addFunction({print "きた〜";}); みたいなことが書けるようになったり @Dynamic class Hoge{... とやっておけばJavaスクリプト(!=JavaScript)として実行したり、あと…

JDKのバグっぽい動きの続き

id:masataka_kさんに言われて-serverつけて動かしてみたら、ちゃんと動きました。あと、continueの代わりにラベル付きbreak使ってみたら再現しました。 現象から考えると、continueを抜けたときに値が変わるんじゃなくて、preの値が本当は変わっていないんじ…

ゲーデルからプログラマへのメッセージ

ゲーデルの不完全性定理からわかることは、すべてのプログラムの正しさを判定できるようなプログラムは存在しないということでした。 また、コンピュータが発展したとしても、すべての問題を解決するプログラムを組むことはできないということもわかりました…

プログラム言語の次の5年

スクリプト言語、正確には動的型言語が復権しました。でも、静的型言語も健在です。 そして、これからは、Java6でJavaScriptが標準で動くようになったことからもみんなが感じているように、静的言語と動的言語を組み合わせて使うことが当たり前にになります…

JDKのバグと思われる現象の再現コード

再現できる最低限まで削っていったら、めちゃくちゃシンプルで誰でも書いていそうなコードになりました。 びっくりします。ローカル変数の定義順を変えると挙動が変わるところが一番のみどころです。 こんな感じです。Tomcat5.5.17+Java6 b105で確認してます…

ところでこのJDKのバグ、どうしたらいいんでしょう?

つまりは処理中に変数の値が変わっちゃうというすごく致命的なバグなんですが、報告とかどうすればいいんでしょうか? 数回処理をすると動きが変わるので、HotSpotの最適化に問題があると思うんですけど。 最小限のコードで再現ってのは、なんだか難しそうで…

規約ベースの欠点

「何も起きない」ということが難しい 記述が必要な場合、何も書いてなければ、何も知らない人にでも何も起きないことがわかります。

JDK1.6のバグ?

上の処理。 デバッガで追うと正しい動きするし、変数の初期値変えると挙動が変わるし、Java6のバグに見える。 whileでcontinueしたときに変数がリセットされるような、そんな感じ。 JDK1.5で動かしたときにはちゃんと動くので、コンパイラじゃなくてVMの方が…