2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

コンパイラの静的解析技術を使ったプログラミング技

1 :デフォルトの名無しさん:2012/06/03(日) 20:07:25.21
技とかいてテクニックと読む

コンパイラの静的解析技術を使ったプログラミングテクニック

というのもあると思います。


ようするにコンパイラが表示する各種警告・エラーを利用して
修正箇所の把握を行い、素早い開発を行うテクニックです。
それ以外にも今はまだ有名ではないテクニックもあると思います。

コンパイラが持つ解析能力を生かした、人間がやってたことを
コンピュータにさせようという、人にやさしいプログラミングテクニックスレ


2 :デフォルトの名無しさん:2012/06/03(日) 23:12:43.61
よくわかんねーけどklocworkとかcoverityの話?

3 :デフォルトの名無しさん:2012/06/04(月) 09:07:22.33
ていうか、コンパイラに指摘されるようなことを今まで人力でやってたような >>1 はバカ
で終了。

4 :デフォルトの名無しさん:2012/06/04(月) 14:40:25.04
意味分かんない
エラー文が何を意味しているか読み取れないって話か

5 :デフォルトの名無しさん:2012/06/04(月) 14:47:08.33
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

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

                  京都大学霊長類研究所

6 :デフォルトの名無しさん:2012/06/04(月) 21:25:03.89
>>4
ある有名な本に乗ってる「コンパイラ任せ」ってテクニック知ってる?
そういうもののことだよ。

7 :デフォルトの名無しさん:2012/06/04(月) 21:29:13.81
>>6
本のタイトルを伏せる理由が分らん

8 :デフォルトの名無しさん:2012/06/04(月) 21:32:19.04
>>7
それぐらい調べてねってこと。

9 :デフォルトの名無しさん:2012/06/04(月) 21:33:36.33
訂正。読んでねってこと。

最低限度の基礎知識が足りない人が相手だと疲れるから。

10 :デフォルトの名無しさん:2012/06/04(月) 21:54:05.35
>>8 >>9
いや、Modern C++ Design を指しているのは分るが、
君が求める基礎知識を持っているかを判断するのに、
こいうやり方は非常に効率悪いと思うんだが

普通に、君の言うテクニックを例示して、
その背景にある考え方などを説明し、
それで理解できる人たちで議論しましょう、で済むと思うよ

こんなの疲れるような手間でもないでしょう

11 :デフォルトの名無しさん:2012/06/04(月) 21:58:15.23
いや、単なる丸投げ。
反論は偉い人に直接言ってね。

このスレは反論しない人たちが
「コンパイラ任せ」に類するテクニックを
話すスレだから。

12 :デフォルトの名無しさん:2012/06/04(月) 22:04:23.28
続きはFacebookで!

13 :デフォルトの名無しさん:2012/06/04(月) 22:58:16.92
ジェネリックで型指定してタイプセーフにしましょうとかそういう話?

14 :デフォルトの名無しさん:2012/06/05(火) 02:16:39.10
コンパイラ任せ=実装依存

15 :デフォルトの名無しさん:2012/06/05(火) 04:50:01.43
ものすごく頭の回転が鈍そうな>>1だな

16 :デフォルトの名無しさん:2012/06/05(火) 09:27:51.30
まぁなんだ、ウォーニングオプションの話題すら自分から振れない >>1
圧倒的に脳味噌が足りてない、で終了。

どうせ、動的言語をバカにするネタが欲しいだけだろ。それを他人任せで
集めようとか、どう考えても虫が良すぎる。

17 :デフォルトの名無しさん:2012/06/07(木) 14:10:59.86
なんだ、設計書もコメントもないようなスパゲッティプログラムを解析するのに
少しは役に立つ話かと思って見に来たら、只の間抜けの戯言だったか。

18 :デフォルトの名無しさん:2012/06/07(木) 23:17:13.68
>>17
実際そういうコードでも
どこから呼び出されているか
静的言語なら簡単にわかるよね。

19 :デフォルトの名無しさん:2012/06/07(木) 23:44:59.60
>>18
関数ポインタのテーブルを使ったりすると、
静的言語でもどこから呼び出されているかコンパイラには分らない
あるいは簡単には分らない

20 :デフォルトの名無しさん:2012/06/07(木) 23:50:59.58
>>19
関数テーブルの場所がわかるだろ。

21 :デフォルトの名無しさん:2012/06/07(木) 23:51:50.19
一方ただの関数呼び出しだと動的言語でも分かったりする

22 :デフォルトの名無しさん:2012/06/07(木) 23:53:12.00
>>20
a = 関数テーブルの先頭アドレス;
(a[特定範囲の乱数])();

なんて呼び方されたらどうすんの?

23 :デフォルトの名無しさん:2012/06/07(木) 23:54:25.06
>>22
それは人生で何回やったことがありますか?

24 :デフォルトの名無しさん:2012/06/07(木) 23:54:54.67
>>21
動的言語だと、メソッドの場合は確実にわかんないんだよね。

25 :デフォルトの名無しさん:2012/06/07(木) 23:57:22.57
>>22
関数テーブルを見つけ出している以上、
そこで使っていると明らかになってるw

26 :デフォルトの名無しさん:2012/06/08(金) 00:01:17.62
>>23
結構ある。
ゲームで CPU の戦略を一定時間で変えたりする時とか。
正確には、b = a[特定範囲の乱数] とやって b に保存するやり方だけど。

switch 文でやる人もいるけど、俺は昔から関数ポインタの配列を使ってる。
どのみち呼び出される関数が書かれている場所は近くにはない訳で、
switch 文でダラダラと書くよりも関数ポインタの配列の方がスッキリする。

27 :デフォルトの名無しさん:2012/06/08(金) 00:02:54.72
>>26
いやさ、だからさ、呼び出し元=関数ポインタの配列の場所を
見つけることが目的だろ?
見つけてるじゃん。なにか不服でもあるの?

28 :デフォルトの名無しさん:2012/06/08(金) 00:04:47.73
関数ポインタをライブラリに渡して、ライブラリ側から呼ばれている場合、
呼び出されている関数が書かれているソースをコンパイルしている時に、
その関数がどこから呼び出されているかは、どうやって調べる?



29 :デフォルトの名無しさん:2012/06/08(金) 00:10:25.45
その場合は、ライブラリ側に見るべき所(該当関数)は
含まれてないので見る必要はない。

渡している所(ライブラリの関数を呼び出している所)は
すぐに見つけられる。そこから簡単に知りたい関数は調べられる。


30 :デフォルトの名無しさん:2012/06/08(金) 00:10:31.23
>>27
いや、だからさ、普通にお行儀良く関数を呼び出しているのなら、
構文解析で呼び出し側の位置が分るけど、
関数ポインタにされたら意味解析まで必要でしょ。

意味解釈をしないコンパイラには分らないし、
意味解釈もするコンパイラにとっても簡単には分らないよ。

31 :デフォルトの名無しさん:2012/06/08(金) 00:11:58.14
>>30
いいえ、たとえば関数名を変更してコンパイルしてみてください。
簡単にその関数名を参照しているところが判明しますよ。

そこがその関数の影響範囲です。

32 :デフォルトの名無しさん:2012/06/08(金) 00:15:02.29
動的言語だと、メソッド名変えても
その影響範囲を知ることは不可能だからね。

33 :デフォルトの名無しさん:2012/06/08(金) 00:21:09.07
>>31
ごめん、俺もしかしたら基本を分ってなかったかも知れん。
質問されてくれ。

a = [関数1, 関数2, 関数3]
a[0]();
a[1]();

となってて、関数3は「実質」どこからも呼ばれていない場合があるとする。

この場合、関数の呼び出し側の位置という議論の中では、
関数3はどこから呼ばれているという解釈になるの?

34 :デフォルトの名無しさん:2012/06/08(金) 00:23:45.34
>>33
お前はそれを何のために知りたいんだ?


俺が知りたいのは修正の影響範囲だ。
関数3を修正したい時、プロジェクトがどんなに大きくても
関数3がどこで使われているかすぐに分かるだろう。

そこのコードの関数3って書いてあるところだよ。
動的言語だとそれすらわからない。
話はこれで終わりだ。

35 :デフォルトの名無しさん:2012/06/08(金) 00:31:43.55
>>34
もちろん、>>17 >>18 の流れで、そのようなことが可能なのか、
簡単に可能なのか知りたい。

a = 関数1のポインタ // 1
b = a // 2

x = b(); // 3

この場合、関数1を変更した時の影響範囲は、
構文解析だけでは分らないと思うんだが。

//1 と //2 と //3 が離れていれば、尚更難しくないか?

36 :デフォルトの名無しさん:2012/06/08(金) 00:33:55.81
>>35
だから関数3の影響範囲はaだろ。

そしてaの影響範囲は、aが使われてるところだろ。


37 :デフォルトの名無しさん:2012/06/08(金) 00:35:04.40
>>35
関数1のポインタって書いてあるんだから、
そこが影響範囲だろ。

38 :デフォルトの名無しさん:2012/06/08(金) 00:42:01.52
>>36
その a が使われているところで b に値(アドレス)を代入して、
b が関数として使われている。

代入の部分で意味解析が必要だと思う。
もし「b = a + 何らかの計算」とかだったら、
計算部分の意味解釈も必要でしょ。

39 :デフォルトの名無しさん:2012/06/08(金) 00:45:06.89
>>38
もうお前は見るべきところを見つけて
調べてるだろw

その関数がaに関係していて
bも関係しているとわかってるよね。

40 :デフォルトの名無しさん:2012/06/08(金) 00:46:24.08
すまん、そもそも関数を変更した時の「影響範囲」って何?

その関数の内容を変更した時に、
リコンパイルが必要なファイルの名前か分ればそれでOKということ?

それとも、その関数の内容を変更した時に、
アプリの挙動が変わる部分全てが影響範囲なの?

41 :デフォルトの名無しさん:2012/06/08(金) 00:47:42.49
>>40
> アプリの挙動が変わる部分全てが影響範囲なの?

訂正

アプリの挙動に関わる部分全てが影響範囲なの?

42 :デフォルトの名無しさん:2012/06/08(金) 00:50:57.21
>>40
関数を修正するときに
見るべき場所だよ。

43 :40, 41:2012/06/08(金) 00:51:05.28
ごめん、自分で書いてて意味がよく分らなくなってきた

一度寝てサッパリした頭でもう一度考えてみるわ

44 :デフォルトの名無しさん:2012/06/08(金) 00:52:13.17
アプリの挙動が変わろうが変わるまいが関係ない。
実際は修正するのだから(バグが修正されることになっても)変わる。

だが変わる関わらないかは直接関係ない。
それがどう影響するかみて判断して結論を出せばいいだけ。

その影響範囲だよ。

45 :デフォルトの名無しさん:2012/06/08(金) 06:33:16.66
>>44はぼかした言い方してるけど、
要するに静的型言語の場合、型のシグニチャの変更については
変更の影響範囲がわかる。
つまり変更に因るシグニチャの不一致を網羅的に検出できる。

結局、動的な部分は実際に動かさないと分からないわけよ。
動的型言語の場合、型も実行時に変化するから型に関する事は静的に分からない。
静的型言語の場合、型は実行時に変化しないから型に関する事は静的に分かる。

46 :40, 41:2012/06/08(金) 07:35:31.10
読み返してみて分った。
>>31 でいきなり影響範囲なんて言うから混乱するんだ。

もともと >>18
「どこから呼び出されているか」静的言語なら簡単にわかると言っている。

言い換えれば、ある関数のコールスタックがコンパイラ時に分る、ということだろ。
A.cpp(*行*列目) --> B.cpp(*行*列目) --> C.cpp(*行*列目) --> ・・・ある関数

そのつもりで >>19 から >>30 辺りまで反論してきたんだけど(その直後で混乱した)、
「どこから呼び出されているか」って、こういう意味で合ってる?

47 :デフォルトの名無しさん:2012/06/08(金) 07:57:27.60
18は馬鹿だから無視したほうが良いよ

48 :デフォルトの名無しさん:2012/06/09(土) 18:38:48.40
関数へのポインタすら使ったことがないバカということが判明したわけだが

49 :デフォルトの名無しさん:2012/06/09(土) 18:41:04.01
関数のポインタを使っている所から
すぐに分かるよ?

50 :デフォルトの名無しさん:2012/06/09(土) 19:06:31.00
キャストされたら同寸の

51 :デフォルトの名無しさん:2012/06/09(土) 19:26:05.22
>>50
キャストにも二種類あってね。

よくやるアップキャストのようなものは
互換性がある型へのキャストは何も問題も起きないよ。



52 :デフォルトの名無しさん:2012/06/09(土) 19:33:10.15
キャストするってことは、(MyClass)objとか書くんだから
MyClassで検索書ければキャストしている場所はすぐに見つかると思う。

でキャストした後は、MyClassクラスの変数に入れるわけだから
当然キャストする前と同じだね。

53 :デフォルトの名無しさん:2012/06/09(土) 19:54:01.58
で、結局 >>18 は可能なのか、>>18 はクソなのか、どっちだよ

ハッキリしてくれ

54 :デフォルトの名無しさん:2012/06/09(土) 19:57:04.22
この文脈なら正しい。

17 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/07(木) 14:10:59.86
なんだ、設計書もコメントもないようなスパゲッティプログラムを解析するのに
少しは役に立つ話かと思って見に来たら、只の間抜けの戯言だったか。


18 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/07(木) 23:17:13.68
>>17
実際そういうコードでも
どこから呼び出されているか
静的言語なら簡単にわかるよね。

55 :デフォルトの名無しさん:2012/06/09(土) 19:59:37.53
>>51
話の流れ理解せずにレスしてないか?

56 :デフォルトの名無しさん:2012/06/09(土) 20:11:51.13
そう思うならなんか言ったら?

57 :デフォルトの名無しさん:2012/06/09(土) 20:19:48.24
>>56
関数ポインタの話してるところにアップキャストの話は筋違いってもんだろ

58 :デフォルトの名無しさん:2012/06/09(土) 20:22:34.46
>>54
そうか、わかった
ありがと

59 :デフォルトの名無しさん:2012/06/09(土) 20:45:03.26
>>49 その使ってる所にどんな値が渡されて、何が呼ばれるのか、
静的にわかるんだーすごいね(棒)

60 :デフォルトの名無しさん:2012/06/10(日) 00:32:31.40
>>57
> 関数ポインタの話してるところにアップキャストの話は筋違いってもんだろ

キャストの話でしたよね?これ読めますか?



50 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/09(土) 19:06:31.00
キャストされたら同寸の

51 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/09(土) 19:26:05.22
>>50
キャストにも二種類あってね。

61 :デフォルトの名無しさん:2012/06/10(日) 00:33:13.98
>>59
> >>49 その使ってる所にどんな値が渡されて、何が呼ばれるのか、
> 静的にわかるんだーすごいね(棒)

常識で考えてわかるわけないし、
誰もどんな値が渡されてもわかるとか言ってないだろ。

62 :デフォルトの名無しさん:2012/06/10(日) 00:51:36.15
スレタイかえろよ関数ポインタスレって

63 :デフォルトの名無しさん:2012/06/10(日) 00:54:40.57
なんか俺の的外れな反論(>>19)から変な流れになってしまったな。

すまない、本来の議論に戻ってくれ。

64 :デフォルトの名無しさん:2012/06/10(日) 02:11:28.25
コンパイラを使ったプログラミングテクニックか。

たとえば、関数の引数を変更する時
定義を変えてコンパイルして、
エラーが起きた箇所を変更するってのも
あてはまるのかな?

65 :デフォルトの名無しさん:2012/06/10(日) 10:15:07.95
>>64
よー分らん

意味の無い簡単なのでいいから、なんか具体的な例って出せる?

66 :デフォルトの名無しさん:2012/06/10(日) 10:33:43.78
def foo(x,y): return x + y
def bar(): print(foo(1,2))

ってコードが在ったとして、関数fooを

def foo(x,y,z): return x + y + z

に書き換えたら関数bar内でエラーが見つかるので直す、とか
あとは関数名をfoooに変えたらエラーが見つかるので直す、とか
そういう話かと

67 :デフォルトの名無しさん:2012/06/10(日) 10:38:14.64
>>66
もし >>64 の言いたいことがそうだとしたら、
問題は、どれくらいの人数のプログラマが、
それをコンパイラを使ったプログラミングテクニックだと感じるかだな。

俺は感じない。

68 :デフォルトの名無しさん:2012/06/10(日) 11:48:23.50
>>67
デザインパターンも同じように言われていたよ。

69 :デフォルトの名無しさん:2012/06/10(日) 12:25:45.10
>>68
そこまで話を飛躍させる気なら体系化してから出直せよ

70 :デフォルトの名無しさん:2012/06/10(日) 15:40:19.30
>>69
名前も付いているよ。「コンパイラまかせ」っていうんだ。
リファクタリングパターンの一つだよ。
ちゃんとぐぐってね。


71 :デフォルトの名無しさん:2012/06/10(日) 16:05:24.10
>>70
ちゃんと調べたいんだけど、英語名は何ていうの?

72 :デフォルトの名無しさん:2012/06/10(日) 16:20:03.32
>>71
Lean on the Compiler

73 :デフォルトの名無しさん:2012/06/10(日) 16:21:47.02
ほら持ってきてやったぞ
http://www.fieldnotes.jp/legacy-code/?%C3%B4%C5%F6%B3%E4%C5%F6%C9%BD%2FLean+on+the+Compiler

> コンパイラに頼る
>
> コンパイラの主要な目的は、ソースコードを別の形に翻訳することだが、
> 静的型付け言語では、コンパイラを使ってもっと色々できる。
>
> 型チェックを利用して、やらなきゃいけない変更を特定できる。
> このプラクティスを leaning on the compiler を呼ぶ。やり方の例をここに示す。


コンパイラを使ってもっと色々できる。それが
このスレで言うプログラミング技だろう。

74 :デフォルトの名無しさん:2012/06/10(日) 16:33:38.21
>>72
ありがと

面白そうなんで調べてみるよ

75 :デフォルトの名無しさん:2012/06/10(日) 16:56:50.40
どうやら我々はついにスタート地点に立つことができたようだ
一週間もの時間と70レスを浪費させた >>1 に惜しみない拍手を送りたい

76 :デフォルトの名無しさん:2012/06/10(日) 17:29:54.68
>>70
で、どこがどう体系化されてるというの

77 :デフォルトの名無しさん:2012/06/10(日) 23:36:04.84
>>1だけ見たら良スレの予感なのに
ついたレスがクズすぎて残念だ

78 :デフォルトの名無しさん:2012/06/10(日) 23:49:50.74
>>77
それなら君が良スレにすればいいのだよ。

79 :デフォルトの名無しさん:2012/06/10(日) 23:50:50.88
反論は偉い人に直接言ってね。

このスレは反論しない人たちが
「コンパイラ任せ」に類するテクニックを
話すスレだから。

80 :デフォルトの名無しさん:2012/06/10(日) 23:54:33.49
コンパイラ任せじゃなくても色いろあるだろ。

静的解析ツールとかさ。コードメトリクスツールとかさ。

コード規約なんかも、ルールを決めるのではなく
予めツールと設定を作っておけば、
長ったらしいドキュメントを読まなくてすむよね?

81 :デフォルトの名無しさん:2012/06/10(日) 23:56:29.86
LLを貶めたいだけの>>1が立てたスレなんだから
コンパイラに拘るのは当然だろ

82 :デフォルトの名無しさん:2012/06/10(日) 23:57:15.56
Visual Studio の Team Systemには
色々と静的解析ツールが付いているみたいだけど
なにぶん高いから使ったことがない。

使ってる人いない? どんな感じ?

83 :デフォルトの名無しさん:2012/06/11(月) 05:54:09.10
は?

どう見ても、技術の欠片も持ってない >>1 が立てたからこその、gdgd 展開だろうw

84 :デフォルトの名無しさん:2012/06/11(月) 06:00:09.02
いつまでも>>1にとりつかれてるなよw
いい加減忘れろ。

85 :デフォルトの名無しさん:2012/06/11(月) 06:07:17.64
>>77 に言えよw

86 :デフォルトの名無しさん:2012/06/11(月) 15:30:06.53
>>1が何を言いたいのかわからん

87 :デフォルトの名無しさん:2012/06/11(月) 16:12:09.17
clangはここをこう直せって言ってくるよ
AppleのObjective-CのARCは静的解析を使ったメモリ管理機構だよ

88 :デフォルトの名無しさん:2012/06/11(月) 16:57:23.70
どうやらコンパイラにわざとエラーを出させて
静的解析の手伝いをさせるということらしい

89 :デフォルトの名無しさん:2012/06/12(火) 17:41:30.79
エディタの機能になるけど、
クラスやインターフェースを継承した時に
雛形を作ってくれる機能とか。

90 :デフォルトの名無しさん:2012/06/12(火) 23:24:44.05
そういうのは入力支援
>>1 が言ってるのは リファクタリングとか
テスト、チューニングの方面だな

91 :デフォルトの名無しさん:2012/06/13(水) 00:08:57.19
>>1は良かったがついたレスが糞すぎた

92 :デフォルトの名無しさん:2012/06/13(水) 00:54:22.20
>>1 がやるべきことをスレ住人にさせようという >>1 にやさしいスレ

93 :1:2012/06/13(水) 00:55:37.46
だがこっそり>>1がレスしていることに
誰も気づいていないw

94 :デフォルトの名無しさん:2012/06/13(水) 06:46:26.04
>>1が糞ってことはわかった

95 :デフォルトの名無しさん:2012/06/13(水) 07:09:59.81
どうでもいいから、>>1 はひとつネタを披露しろ

96 :デフォルトの名無しさん:2012/06/13(水) 11:39:53.73
ここで混乱の元になった>17が颯爽と登場。
あー、なんだ、その…

付き合いきれない。ゴメン。

25 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)