次世代のインテリジェントdiffを思いついた。実装者求む
1 :
デフォルトの名無しさん :
2011/08/14(日) 18:29:38.58 構文を理解してくれるdiff どういう事かというと、 改行、空白、関数名、変数名、関数や引数の順番などを変えても コードの動作の点から違いがなければ、変わってないと 判断してくれるdiff。 簡単なリファクタリング、つまり単純なメソッドの移動や コードのインライン化、コードの関数化、 様々な、機械的にできてしまうコードの変更をやっても 違いがないと判断してくれるdiff これ、実現するには静的言語じゃないとまず無理だろうな。 ってことでまた静的言語 vs 動的言語 スレ
おさーるさーんだよー
3 :
デフォルトの名無しさん :2011/08/14(日) 18:47:58.62
>>1 とりあえずソースコードをASTに落とし込め。
最近アイちゃん頑張りすぎだろ。
ようやく分かった この手のバカに付き合うのは時間の無駄で、 バカはこちらの時間を消耗させようとしてアピールをしてくるのだと
>>5 お前いいこと言うな
俺は頭がいいからこのスレにはもう触らないようにするよ
以下、馬鹿が1000まで時間を浪費するスレ
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
ソースでなくオブジェクトファイルや実行ファイルを比較すれば良いのでは? diffとかではなく、検索エンジンのプリプロセッサとして開発すれば 需要が大きいと思う。 ConvertSecurityDescriptorToStringSecurityDescriptor こういう長い関数が入っているテキストと比べると、 3^3 + 4^3 + 5^3 = 6^3 こういう簡単な関数しか使っていない式は、検索するのが難しい。
>>9 オブジェクトファイルや実行ファイルってバイナリで比較ってこと?
それよりも構文解析した結果を比較するべきでは?
最適化技術って、ようするには意味は同じでコードを入れ替える技術でしょ?
これを応用すれば、1*2と2*1というコードを同じと見なせるんじゃない?
インライン展開による最適化を応用すれば、関数にしてもしなくても
同じと見なせるかもしれない。
リファクタリングは、内部で上位互換があるだけで、外から見た意味は変わるだろ。
>>1 にとってはスパゲティコードもそうでないコードも等価なのか?www
こんなdiff本当に欲しいか?
>>11 リファクタリングの定義で検索したら真っ先に
外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変更させること。
って書いてあるのが見つかったよ。
>>12 逆に考えよう。
スパゲティコードをリファクタリングして綺麗になったコードが、
スパゲティコードと動作が変わっていない。
ごちゃごちゃしたコードを壊すことなく修正できたと他人に証明できるとしたらどうだろうか?
>>13 例えばこれらの同一性を保証するのか?
--
puts("0 1 2");
--
int a;
a = 0;
loop:
if (a == 3) goto end;
printf("%d", a);
if (a == 2) putchar('\n'); else putchar(' ');
a = a + 1;
goto loop;
end:
--
for (int i = 0; i < 3; ++i) printf("%d%c", i, i == 2 ? '\n' : ' ');
--
そりゃ大変だな。
何のために単体テストがあるのやら……
単体テストの欠点は、テストを書かないといけないことと、 単体としてのインターフェースが変わる場合、 たとえば、メソッドのクラス間の移動で使えなくなること。 つまりテストのメンテナンスコストが必要になることだよ。
>>14 それはまず無理だよ。
できるとしたら、変数名・関数名の違いと
リファクタリングツールによる半自動的な変換コード。
選択範囲を選ぶだけで、動作が全く同じコードに
自動で変換できるのなら、比較も可能でしょ?
その例では使用している関数が違うから
さすがにリファクタリングツールだけで変換は不可能。
>>16 え?
>>1 が言うようなdiffがあればテスト不要だとでも?冗談でしょwww
同値性を満たすプログラムの変換が計算可能だからと言って 同値性の判定自体が計算可能かというと、そうでもないぞ
次世代のインテリジェントDOKATAスレ
>>18 > え?
>>1 が言うようなdiffがあればテスト不要だとでも?冗談でしょwww
え? 世の中にいろいろテストサポートツールがあるけど、
それがあればテスト不要だとでも?
それともテスト不要にならないから、テストサポートツールは
意味が無いと言いたいの?
自分で意味不明なことを言っていると思わない?
>>21 意味不明なこと言ってるのはお前だっつーのwww
>>16 は「単体テストの欠点は、テストを書かないといけないこと(キリッ」
とか言っちゃってるから、このアホはテストすら書かない土方だろwww
まあ、単体テストよりもメソッドを移動させることの方が
優先順位が高い土方には、
>>1 のいうようなdiffが必要なのかもね
普通のプログラマは、そんなdiffは作るのが大変な割に
得られるメリットが殆ど無い(どうせ単体テスト書くし)から興味ないけどね
というわけで、欲しいなら自分で実装すれば?www
>>22 お前は、手動テストの欠点を言ったら、
手動でテストしないと思っちゃうのか?
引数の順番を変えるのは辛いと思うけど、空白とか識別子に関しては、いったん正規化してから比較すればいいかもね。
>>24 例えば自動テストは手動テストの欠点を補ってくれるけど、
>>1 のdiffは単体テストの欠点を全く補ってくれないよね?
一体
>>16 は何の意図で書き込まれたの?
土方ってリファクタリング大好きなのにテストは嫌いだよねwww
フロー解析結果が一致したら同値と見なすということだな。
>>27 だって俺小学校のときに毎朝小テストとかやらされるの嫌いだったし…
俺が書いたプログラムだっていちいちテストされるの嫌いだと思うんだ
>>26 単体テストの欠点を補ってるよ。
修正前と修正後、それを単体テストなしに
同一であると比較できる。
>>30 それは単体テストの欠点じゃないだろ。
単体テストの欠点というのは、
単体テスト自体に悪い所があるということだ。
それだと単体テストをしないでも同一であることを
比較できるってだけで、単体テストが不要になっているだけ。
それはとても便利なことだが、
単体テストの欠点に対する反論ではない。
どうだ参ったか。
ということで単体テストの欠点を補うものじゃないだけで、
あったら便利だよね。あれ?そういう結論でいいの?w
テストしない、つまり正しく動くか分からないプログラムの 同一性が保証されて、何か嬉しい事があるの?
それに、リファクタリングツールで出来る程度の変換に対応するだけなら、 ツールが変換履歴を保存出来るようになってれば十分だと思う
>>32 テストって自動テストだけじゃねーぞ
手動でテストしてる場合もある。
>>33 なぜツールに変換履歴を取る機能があるか、
その理由を考えてみようよ。
動作は変わらないのに、コードの表面をがらっと
変えてしまうから、コードレビューが難しいからだよ。
答えは何も変わってない。が正解なのに、
それを調べるのは大変。
>>34 ユニットテストは無いけど長く使われてて枯れてるプログラムの
リファクタリングに使えば便利かな?
リファクタリングは同値のものを作るわけではない。
コンピュータで機械的にリファクタリングできる内容の テストを人間が書くのって馬鹿らしいと思うw
え?
たぶん機械的なリファクタリングが何かしらないのでしょうね。 もちろん全てのリファクタリングではないが、 リファクタリングの一部は場所を指定するだけで コンピュータがやってくれる。 リファクタリングはすべて人間が手でやるしかない 言語もあるようですからw
リファクタリングのため「だけ」にテスト書く馬鹿はいねーよw
>>41 そうだよ?
例えば、引数順番だけの入れ替えというリファクタリングの
ためだけにテストを書く馬鹿はいない。
だがコードレビューにおいて、引数の順番を変えるという
行為に対して、それが正しく行われているか確認する必要が
「テストを書く馬鹿はいない」という前提のもと、
それをどうやって確認するのか?
たとえテストが書かれていたとしても、それが
完璧なテストであるという根拠はあるのか?
あー、テストは完璧じゃないから信用ならないってことか。分かるわかる で、当然コンパイラが正しくコンパイルするか保証無いから いつも心配でたまらないんだね 実際、最近でもJDK7のループ最適化にバグ在ったしね
テストは完璧じゃないのでCoqみたいな言語を使っとけってことか
リファクタリングすると潜在バグが修正されてしまう(しまうって言い方も変だけど) ことがあるけど、これって同値性が壊れてるよね? こういうのは考慮しないってこと?
>>49 ここで言っているのは、機械的なリファクタリングの話。
範囲を選んでコンピュータで自動処理させただけで
バグが治ったりはしない。
47 :
デフォルトの名無しさん :2011/08/24(水) 21:49:41.57
最終的には形式手法に行き着くスレか
と思いきや何故かIDEに行き着きます