次世代のインテリジェントdiffを思いついた。実装者求む

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
構文を理解してくれるdiff

どういう事かというと、
改行、空白、関数名、変数名、関数や引数の順番などを変えても
コードの動作の点から違いがなければ、変わってないと
判断してくれるdiff。

簡単なリファクタリング、つまり単純なメソッドの移動や
コードのインライン化、コードの関数化、
様々な、機械的にできてしまうコードの変更をやっても
違いがないと判断してくれるdiff


これ、実現するには静的言語じゃないとまず無理だろうな。

ってことでまた静的言語 vs 動的言語 スレ
2デフォルトの名無しさん:2011/08/14(日) 18:34:35.34
おさーるさーんだよー
3デフォルトの名無しさん:2011/08/14(日) 18:47:58.62
>>1
とりあえずソースコードをASTに落とし込め。
4デフォルトの名無しさん:2011/08/14(日) 18:59:47.76
最近アイちゃん頑張りすぎだろ。
5デフォルトの名無しさん:2011/08/14(日) 19:06:55.05
ようやく分かった
この手のバカに付き合うのは時間の無駄で、
バカはこちらの時間を消耗させようとしてアピールをしてくるのだと
6デフォルトの名無しさん:2011/08/14(日) 19:21:37.88
>>5
お前いいこと言うな
俺は頭がいいからこのスレにはもう触らないようにするよ

以下、馬鹿が1000まで時間を浪費するスレ
7デフォルトの名無しさん:2011/08/14(日) 19:34:04.21
【中国】フカヒレが爆発
http://toki.2ch.net/test/read.cgi/bread/1310871655/
8デフォルトの名無しさん:2011/08/14(日) 22:20:20.33
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所
9デフォルトの名無しさん:2011/08/16(火) 17:12:42.12
ソースでなくオブジェクトファイルや実行ファイルを比較すれば良いのでは?

diffとかではなく、検索エンジンのプリプロセッサとして開発すれば
需要が大きいと思う。

 ConvertSecurityDescriptorToStringSecurityDescriptor
こういう長い関数が入っているテキストと比べると、
 3^3 + 4^3 + 5^3 = 6^3
こういう簡単な関数しか使っていない式は、検索するのが難しい。
10デフォルトの名無しさん:2011/08/17(水) 01:37:24.09
>>9
オブジェクトファイルや実行ファイルってバイナリで比較ってこと?

それよりも構文解析した結果を比較するべきでは?

最適化技術って、ようするには意味は同じでコードを入れ替える技術でしょ?
これを応用すれば、1*2と2*1というコードを同じと見なせるんじゃない?

インライン展開による最適化を応用すれば、関数にしてもしなくても
同じと見なせるかもしれない。
11デフォルトの名無しさん:2011/08/17(水) 08:22:07.89
リファクタリングは、内部で上位互換があるだけで、外から見た意味は変わるだろ。
12デフォルトの名無しさん:2011/08/17(水) 08:50:25.23
>>1にとってはスパゲティコードもそうでないコードも等価なのか?www
こんなdiff本当に欲しいか?
13デフォルトの名無しさん:2011/08/17(水) 21:37:50.69
>>11
リファクタリングの定義で検索したら真っ先に
外部から見たときの振る舞いを保ちつつ、理解や修正が簡単になるように、ソフトウェアの内部構造を変更させること。
って書いてあるのが見つかったよ。


>>12
逆に考えよう。
スパゲティコードをリファクタリングして綺麗になったコードが、
スパゲティコードと動作が変わっていない。
ごちゃごちゃしたコードを壊すことなく修正できたと他人に証明できるとしたらどうだろうか?
14デフォルトの名無しさん:2011/08/18(木) 12:27:48.22
>>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' : ' ');
--
そりゃ大変だな。
15デフォルトの名無しさん:2011/08/18(木) 19:42:08.16
何のために単体テストがあるのやら……
16デフォルトの名無しさん:2011/08/18(木) 22:42:55.74
単体テストの欠点は、テストを書かないといけないことと、
単体としてのインターフェースが変わる場合、
たとえば、メソッドのクラス間の移動で使えなくなること。
つまりテストのメンテナンスコストが必要になることだよ。
17デフォルトの名無しさん:2011/08/18(木) 22:46:56.40
>>14
それはまず無理だよ。

できるとしたら、変数名・関数名の違いと
リファクタリングツールによる半自動的な変換コード。

選択範囲を選ぶだけで、動作が全く同じコードに
自動で変換できるのなら、比較も可能でしょ?

その例では使用している関数が違うから
さすがにリファクタリングツールだけで変換は不可能。
18デフォルトの名無しさん:2011/08/19(金) 07:15:15.69
>>16
え?>>1が言うようなdiffがあればテスト不要だとでも?冗談でしょwww
19デフォルトの名無しさん:2011/08/19(金) 17:37:58.75
同値性を満たすプログラムの変換が計算可能だからと言って
同値性の判定自体が計算可能かというと、そうでもないぞ
20デフォルトの名無しさん:2011/08/19(金) 18:06:16.23
次世代のインテリジェントDOKATAスレ
21デフォルトの名無しさん:2011/08/20(土) 03:02:18.11
>>18
> え?>>1が言うようなdiffがあればテスト不要だとでも?冗談でしょwww

え? 世の中にいろいろテストサポートツールがあるけど、
それがあればテスト不要だとでも?

それともテスト不要にならないから、テストサポートツールは
意味が無いと言いたいの?

自分で意味不明なことを言っていると思わない?
22デフォルトの名無しさん:2011/08/20(土) 06:39:30.98
>>21
意味不明なこと言ってるのはお前だっつーのwww

>>16は「単体テストの欠点は、テストを書かないといけないこと(キリッ」
とか言っちゃってるから、このアホはテストすら書かない土方だろwww
23デフォルトの名無しさん:2011/08/20(土) 06:52:23.31
まあ、単体テストよりもメソッドを移動させることの方が
優先順位が高い土方には、>>1のいうようなdiffが必要なのかもね

普通のプログラマは、そんなdiffは作るのが大変な割に
得られるメリットが殆ど無い(どうせ単体テスト書くし)から興味ないけどね

というわけで、欲しいなら自分で実装すれば?www
24デフォルトの名無しさん:2011/08/20(土) 09:36:45.21
>>22
お前は、手動テストの欠点を言ったら、
手動でテストしないと思っちゃうのか?
25デフォルトの名無しさん:2011/08/20(土) 12:49:21.08
引数の順番を変えるのは辛いと思うけど、空白とか識別子に関しては、いったん正規化してから比較すればいいかもね。
26デフォルトの名無しさん:2011/08/20(土) 13:17:34.85
>>24
例えば自動テストは手動テストの欠点を補ってくれるけど、
>>1のdiffは単体テストの欠点を全く補ってくれないよね?
一体>>16は何の意図で書き込まれたの?
27デフォルトの名無しさん:2011/08/20(土) 13:55:22.44
土方ってリファクタリング大好きなのにテストは嫌いだよねwww
28デフォルトの名無しさん:2011/08/20(土) 16:17:43.38
フロー解析結果が一致したら同値と見なすということだな。
29デフォルトの名無しさん:2011/08/20(土) 19:43:11.04
>>27
だって俺小学校のときに毎朝小テストとかやらされるの嫌いだったし…
俺が書いたプログラムだっていちいちテストされるの嫌いだと思うんだ
30デフォルトの名無しさん:2011/08/21(日) 00:43:34.38
>>26
単体テストの欠点を補ってるよ。

修正前と修正後、それを単体テストなしに
同一であると比較できる。
31デフォルトの名無しさん:2011/08/21(日) 00:46:39.25
>>30
それは単体テストの欠点じゃないだろ。

単体テストの欠点というのは、
単体テスト自体に悪い所があるということだ。

それだと単体テストをしないでも同一であることを
比較できるってだけで、単体テストが不要になっているだけ。

それはとても便利なことだが、
単体テストの欠点に対する反論ではない。
どうだ参ったか。

ということで単体テストの欠点を補うものじゃないだけで、
あったら便利だよね。あれ?そういう結論でいいの?w
32デフォルトの名無しさん:2011/08/21(日) 08:52:11.86
テストしない、つまり正しく動くか分からないプログラムの
同一性が保証されて、何か嬉しい事があるの?
33デフォルトの名無しさん:2011/08/21(日) 08:56:14.30
それに、リファクタリングツールで出来る程度の変換に対応するだけなら、
ツールが変換履歴を保存出来るようになってれば十分だと思う
34デフォルトの名無しさん:2011/08/21(日) 11:42:39.28
>>32
テストって自動テストだけじゃねーぞ
手動でテストしてる場合もある。
35デフォルトの名無しさん:2011/08/21(日) 11:46:38.23
>>33
なぜツールに変換履歴を取る機能があるか、
その理由を考えてみようよ。

動作は変わらないのに、コードの表面をがらっと
変えてしまうから、コードレビューが難しいからだよ。

答えは何も変わってない。が正解なのに、
それを調べるのは大変。
36デフォルトの名無しさん:2011/08/21(日) 11:52:25.77
>>34
ユニットテストは無いけど長く使われてて枯れてるプログラムの
リファクタリングに使えば便利かな?
37デフォルトの名無しさん:2011/08/21(日) 11:52:35.67
リファクタリングは同値のものを作るわけではない。
38デフォルトの名無しさん:2011/08/21(日) 11:58:02.43
コンピュータで機械的にリファクタリングできる内容の
テストを人間が書くのって馬鹿らしいと思うw
39デフォルトの名無しさん:2011/08/21(日) 14:51:06.74
え?
40デフォルトの名無しさん:2011/08/21(日) 15:11:28.58
たぶん機械的なリファクタリングが何かしらないのでしょうね。

もちろん全てのリファクタリングではないが、
リファクタリングの一部は場所を指定するだけで
コンピュータがやってくれる。

リファクタリングはすべて人間が手でやるしかない
言語もあるようですからw
41デフォルトの名無しさん:2011/08/21(日) 15:13:48.27
リファクタリングのため「だけ」にテスト書く馬鹿はいねーよw
42デフォルトの名無しさん:2011/08/21(日) 15:20:39.85
>>41
そうだよ?

例えば、引数順番だけの入れ替えというリファクタリングの
ためだけにテストを書く馬鹿はいない。

だがコードレビューにおいて、引数の順番を変えるという
行為に対して、それが正しく行われているか確認する必要が

「テストを書く馬鹿はいない」という前提のもと、
それをどうやって確認するのか?

たとえテストが書かれていたとしても、それが
完璧なテストであるという根拠はあるのか?
43デフォルトの名無しさん:2011/08/21(日) 15:31:19.70
あー、テストは完璧じゃないから信用ならないってことか。分かるわかる

で、当然コンパイラが正しくコンパイルするか保証無いから
いつも心配でたまらないんだね
実際、最近でもJDK7のループ最適化にバグ在ったしね
44デフォルトの名無しさん:2011/08/21(日) 15:49:52.22
テストは完璧じゃないのでCoqみたいな言語を使っとけってことか
45デフォルトの名無しさん:2011/08/21(日) 16:27:09.05
リファクタリングすると潜在バグが修正されてしまう(しまうって言い方も変だけど)
ことがあるけど、これって同値性が壊れてるよね?
こういうのは考慮しないってこと?
46デフォルトの名無しさん:2011/08/21(日) 17:31:07.91
>>49
ここで言っているのは、機械的なリファクタリングの話。
範囲を選んでコンピュータで自動処理させただけで
バグが治ったりはしない。
47デフォルトの名無しさん:2011/08/24(水) 21:49:41.57
最終的には形式手法に行き着くスレか
48デフォルトの名無しさん
と思いきや何故かIDEに行き着きます