コンパイラの静的解析技術を使ったプログラミング技
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2012/06/03(日) 20:07:25.21コンパイラの静的解析技術を使ったプログラミングテクニック
というのもあると思います。
ようするにコンパイラが表示する各種警告・エラーを利用して
修正箇所の把握を行い、素早い開発を行うテクニックです。
それ以外にも今はまだ有名ではないテクニックもあると思います。
コンパイラが持つ解析能力を生かした、人間がやってたことを
コンピュータにさせようという、人にやさしいプログラミングテクニックスレ
0002デフォルトの名無しさん
2012/06/03(日) 23:12:43.610003デフォルトの名無しさん
2012/06/04(月) 09:07:22.33で終了。
0004デフォルトの名無しさん
2012/06/04(月) 14:40:25.04エラー文が何を意味しているか読み取れないって話か
0005デフォルトの名無しさん
2012/06/04(月) 14:47:08.33言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
0006デフォルトの名無しさん
2012/06/04(月) 21:25:03.89ある有名な本に乗ってる「コンパイラ任せ」ってテクニック知ってる?
そういうもののことだよ。
0007デフォルトの名無しさん
2012/06/04(月) 21:29:13.81本のタイトルを伏せる理由が分らん
0008デフォルトの名無しさん
2012/06/04(月) 21:32:19.04それぐらい調べてねってこと。
0009デフォルトの名無しさん
2012/06/04(月) 21:33:36.33最低限度の基礎知識が足りない人が相手だと疲れるから。
0010デフォルトの名無しさん
2012/06/04(月) 21:54:05.35いや、Modern C++ Design を指しているのは分るが、
君が求める基礎知識を持っているかを判断するのに、
こいうやり方は非常に効率悪いと思うんだが
普通に、君の言うテクニックを例示して、
その背景にある考え方などを説明し、
それで理解できる人たちで議論しましょう、で済むと思うよ
こんなの疲れるような手間でもないでしょう
0011デフォルトの名無しさん
2012/06/04(月) 21:58:15.23反論は偉い人に直接言ってね。
このスレは反論しない人たちが
「コンパイラ任せ」に類するテクニックを
話すスレだから。
0012デフォルトの名無しさん
2012/06/04(月) 22:04:23.280013デフォルトの名無しさん
2012/06/04(月) 22:58:16.920014デフォルトの名無しさん
2012/06/05(火) 02:16:39.100015デフォルトの名無しさん
2012/06/05(火) 04:50:01.430016デフォルトの名無しさん
2012/06/05(火) 09:27:51.30圧倒的に脳味噌が足りてない、で終了。
どうせ、動的言語をバカにするネタが欲しいだけだろ。それを他人任せで
集めようとか、どう考えても虫が良すぎる。
0017デフォルトの名無しさん
2012/06/07(木) 14:10:59.86少しは役に立つ話かと思って見に来たら、只の間抜けの戯言だったか。
0018デフォルトの名無しさん
2012/06/07(木) 23:17:13.68実際そういうコードでも
どこから呼び出されているか
静的言語なら簡単にわかるよね。
0019デフォルトの名無しさん
2012/06/07(木) 23:44:59.60関数ポインタのテーブルを使ったりすると、
静的言語でもどこから呼び出されているかコンパイラには分らない
あるいは簡単には分らない
0020デフォルトの名無しさん
2012/06/07(木) 23:50:59.58関数テーブルの場所がわかるだろ。
0021デフォルトの名無しさん
2012/06/07(木) 23:51:50.190022デフォルトの名無しさん
2012/06/07(木) 23:53:12.00a = 関数テーブルの先頭アドレス;
(a[特定範囲の乱数])();
なんて呼び方されたらどうすんの?
0023デフォルトの名無しさん
2012/06/07(木) 23:54:25.06それは人生で何回やったことがありますか?
0024デフォルトの名無しさん
2012/06/07(木) 23:54:54.67動的言語だと、メソッドの場合は確実にわかんないんだよね。
0025デフォルトの名無しさん
2012/06/07(木) 23:57:22.57関数テーブルを見つけ出している以上、
そこで使っていると明らかになってるw
0026デフォルトの名無しさん
2012/06/08(金) 00:01:17.62結構ある。
ゲームで CPU の戦略を一定時間で変えたりする時とか。
正確には、b = a[特定範囲の乱数] とやって b に保存するやり方だけど。
switch 文でやる人もいるけど、俺は昔から関数ポインタの配列を使ってる。
どのみち呼び出される関数が書かれている場所は近くにはない訳で、
switch 文でダラダラと書くよりも関数ポインタの配列の方がスッキリする。
0027デフォルトの名無しさん
2012/06/08(金) 00:02:54.72いやさ、だからさ、呼び出し元=関数ポインタの配列の場所を
見つけることが目的だろ?
見つけてるじゃん。なにか不服でもあるの?
0028デフォルトの名無しさん
2012/06/08(金) 00:04:47.73呼び出されている関数が書かれているソースをコンパイルしている時に、
その関数がどこから呼び出されているかは、どうやって調べる?
0029デフォルトの名無しさん
2012/06/08(金) 00:10:25.45含まれてないので見る必要はない。
渡している所(ライブラリの関数を呼び出している所)は
すぐに見つけられる。そこから簡単に知りたい関数は調べられる。
0030デフォルトの名無しさん
2012/06/08(金) 00:10:31.23いや、だからさ、普通にお行儀良く関数を呼び出しているのなら、
構文解析で呼び出し側の位置が分るけど、
関数ポインタにされたら意味解析まで必要でしょ。
意味解釈をしないコンパイラには分らないし、
意味解釈もするコンパイラにとっても簡単には分らないよ。
0031デフォルトの名無しさん
2012/06/08(金) 00:11:58.14いいえ、たとえば関数名を変更してコンパイルしてみてください。
簡単にその関数名を参照しているところが判明しますよ。
そこがその関数の影響範囲です。
0032デフォルトの名無しさん
2012/06/08(金) 00:15:02.29その影響範囲を知ることは不可能だからね。
0033デフォルトの名無しさん
2012/06/08(金) 00:21:09.07ごめん、俺もしかしたら基本を分ってなかったかも知れん。
質問されてくれ。
a = [関数1, 関数2, 関数3]
a[0]();
a[1]();
となってて、関数3は「実質」どこからも呼ばれていない場合があるとする。
この場合、関数の呼び出し側の位置という議論の中では、
関数3はどこから呼ばれているという解釈になるの?
0034デフォルトの名無しさん
2012/06/08(金) 00:23:45.34お前はそれを何のために知りたいんだ?
俺が知りたいのは修正の影響範囲だ。
関数3を修正したい時、プロジェクトがどんなに大きくても
関数3がどこで使われているかすぐに分かるだろう。
そこのコードの関数3って書いてあるところだよ。
動的言語だとそれすらわからない。
話はこれで終わりだ。
0035デフォルトの名無しさん
2012/06/08(金) 00:31:43.55もちろん、>>17 >>18 の流れで、そのようなことが可能なのか、
簡単に可能なのか知りたい。
a = 関数1のポインタ // 1
b = a // 2
x = b(); // 3
この場合、関数1を変更した時の影響範囲は、
構文解析だけでは分らないと思うんだが。
//1 と //2 と //3 が離れていれば、尚更難しくないか?
0036デフォルトの名無しさん
2012/06/08(金) 00:33:55.81だから関数3の影響範囲はaだろ。
そしてaの影響範囲は、aが使われてるところだろ。
0037デフォルトの名無しさん
2012/06/08(金) 00:35:04.40関数1のポインタって書いてあるんだから、
そこが影響範囲だろ。
0038デフォルトの名無しさん
2012/06/08(金) 00:42:01.52その a が使われているところで b に値(アドレス)を代入して、
b が関数として使われている。
代入の部分で意味解析が必要だと思う。
もし「b = a + 何らかの計算」とかだったら、
計算部分の意味解釈も必要でしょ。
0039デフォルトの名無しさん
2012/06/08(金) 00:45:06.89もうお前は見るべきところを見つけて
調べてるだろw
その関数がaに関係していて
bも関係しているとわかってるよね。
0040デフォルトの名無しさん
2012/06/08(金) 00:46:24.08その関数の内容を変更した時に、
リコンパイルが必要なファイルの名前か分ればそれでOKということ?
それとも、その関数の内容を変更した時に、
アプリの挙動が変わる部分全てが影響範囲なの?
0041デフォルトの名無しさん
2012/06/08(金) 00:47:42.49> アプリの挙動が変わる部分全てが影響範囲なの?
訂正
アプリの挙動に関わる部分全てが影響範囲なの?
0042デフォルトの名無しさん
2012/06/08(金) 00:50:57.21関数を修正するときに
見るべき場所だよ。
004340, 41
2012/06/08(金) 00:51:05.28一度寝てサッパリした頭でもう一度考えてみるわ
0044デフォルトの名無しさん
2012/06/08(金) 00:52:13.17実際は修正するのだから(バグが修正されることになっても)変わる。
だが変わる関わらないかは直接関係ない。
それがどう影響するかみて判断して結論を出せばいいだけ。
その影響範囲だよ。
0045デフォルトの名無しさん
2012/06/08(金) 06:33:16.66要するに静的型言語の場合、型のシグニチャの変更については
変更の影響範囲がわかる。
つまり変更に因るシグニチャの不一致を網羅的に検出できる。
結局、動的な部分は実際に動かさないと分からないわけよ。
動的型言語の場合、型も実行時に変化するから型に関する事は静的に分からない。
静的型言語の場合、型は実行時に変化しないから型に関する事は静的に分かる。
004640, 41
2012/06/08(金) 07:35:31.10>>31 でいきなり影響範囲なんて言うから混乱するんだ。
もともと >>18 は
「どこから呼び出されているか」静的言語なら簡単にわかると言っている。
言い換えれば、ある関数のコールスタックがコンパイラ時に分る、ということだろ。
A.cpp(*行*列目) --> B.cpp(*行*列目) --> C.cpp(*行*列目) --> ・・・ある関数
そのつもりで >>19 から >>30 辺りまで反論してきたんだけど(その直後で混乱した)、
「どこから呼び出されているか」って、こういう意味で合ってる?
0047デフォルトの名無しさん
2012/06/08(金) 07:57:27.600048デフォルトの名無しさん
2012/06/09(土) 18:38:48.400049デフォルトの名無しさん
2012/06/09(土) 18:41:04.01すぐに分かるよ?
0050デフォルトの名無しさん
2012/06/09(土) 19:06:31.000051デフォルトの名無しさん
2012/06/09(土) 19:26:05.22キャストにも二種類あってね。
よくやるアップキャストのようなものは
互換性がある型へのキャストは何も問題も起きないよ。
0052デフォルトの名無しさん
2012/06/09(土) 19:33:10.15MyClassで検索書ければキャストしている場所はすぐに見つかると思う。
でキャストした後は、MyClassクラスの変数に入れるわけだから
当然キャストする前と同じだね。
0053デフォルトの名無しさん
2012/06/09(土) 19:54:01.58ハッキリしてくれ
0054デフォルトの名無しさん
2012/06/09(土) 19:57:04.2217 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/07(木) 14:10:59.86
なんだ、設計書もコメントもないようなスパゲッティプログラムを解析するのに
少しは役に立つ話かと思って見に来たら、只の間抜けの戯言だったか。
18 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/07(木) 23:17:13.68
>>17
実際そういうコードでも
どこから呼び出されているか
静的言語なら簡単にわかるよね。
0055デフォルトの名無しさん
2012/06/09(土) 19:59:37.53話の流れ理解せずにレスしてないか?
0056デフォルトの名無しさん
2012/06/09(土) 20:11:51.130057デフォルトの名無しさん
2012/06/09(土) 20:19:48.24関数ポインタの話してるところにアップキャストの話は筋違いってもんだろ
0058デフォルトの名無しさん
2012/06/09(土) 20:22:34.46そうか、わかった
ありがと
0059デフォルトの名無しさん
2012/06/09(土) 20:45:03.26静的にわかるんだーすごいね(棒)
0060デフォルトの名無しさん
2012/06/10(日) 00:32:31.40> 関数ポインタの話してるところにアップキャストの話は筋違いってもんだろ
キャストの話でしたよね?これ読めますか?
50 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/09(土) 19:06:31.00
キャストされたら同寸の
51 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/09(土) 19:26:05.22
>>50
キャストにも二種類あってね。
0061デフォルトの名無しさん
2012/06/10(日) 00:33:13.98> >>49 その使ってる所にどんな値が渡されて、何が呼ばれるのか、
> 静的にわかるんだーすごいね(棒)
常識で考えてわかるわけないし、
誰もどんな値が渡されてもわかるとか言ってないだろ。
0062デフォルトの名無しさん
2012/06/10(日) 00:51:36.150063デフォルトの名無しさん
2012/06/10(日) 00:54:40.57すまない、本来の議論に戻ってくれ。
0064デフォルトの名無しさん
2012/06/10(日) 02:11:28.25たとえば、関数の引数を変更する時
定義を変えてコンパイルして、
エラーが起きた箇所を変更するってのも
あてはまるのかな?
0065デフォルトの名無しさん
2012/06/10(日) 10:15:07.95よー分らん
意味の無い簡単なのでいいから、なんか具体的な例って出せる?
0066デフォルトの名無しさん
2012/06/10(日) 10:33:43.78def bar(): print(foo(1,2))
ってコードが在ったとして、関数fooを
def foo(x,y,z): return x + y + z
に書き換えたら関数bar内でエラーが見つかるので直す、とか
あとは関数名をfoooに変えたらエラーが見つかるので直す、とか
そういう話かと
0067デフォルトの名無しさん
2012/06/10(日) 10:38:14.64もし >>64 の言いたいことがそうだとしたら、
問題は、どれくらいの人数のプログラマが、
それをコンパイラを使ったプログラミングテクニックだと感じるかだな。
俺は感じない。
0068デフォルトの名無しさん
2012/06/10(日) 11:48:23.50デザインパターンも同じように言われていたよ。
0069デフォルトの名無しさん
2012/06/10(日) 12:25:45.10そこまで話を飛躍させる気なら体系化してから出直せよ
0070デフォルトの名無しさん
2012/06/10(日) 15:40:19.30名前も付いているよ。「コンパイラまかせ」っていうんだ。
リファクタリングパターンの一つだよ。
ちゃんとぐぐってね。
0071デフォルトの名無しさん
2012/06/10(日) 16:05:24.10ちゃんと調べたいんだけど、英語名は何ていうの?
0072デフォルトの名無しさん
2012/06/10(日) 16:20:03.32Lean on the Compiler
0073デフォルトの名無しさん
2012/06/10(日) 16:21:47.02http://www.fieldnotes.jp/legacy-code/?%C3%B4%C5%F6%B3%E4%C5%F6%C9%BD%2FLean+on+the+Compiler
> コンパイラに頼る
>
> コンパイラの主要な目的は、ソースコードを別の形に翻訳することだが、
> 静的型付け言語では、コンパイラを使ってもっと色々できる。
>
> 型チェックを利用して、やらなきゃいけない変更を特定できる。
> このプラクティスを leaning on the compiler を呼ぶ。やり方の例をここに示す。
コンパイラを使ってもっと色々できる。それが
このスレで言うプログラミング技だろう。
0074デフォルトの名無しさん
2012/06/10(日) 16:33:38.21ありがと
面白そうなんで調べてみるよ
0075デフォルトの名無しさん
2012/06/10(日) 16:56:50.40一週間もの時間と70レスを浪費させた >>1 に惜しみない拍手を送りたい
0076デフォルトの名無しさん
2012/06/10(日) 17:29:54.68で、どこがどう体系化されてるというの
0077デフォルトの名無しさん
2012/06/10(日) 23:36:04.84ついたレスがクズすぎて残念だ
0078デフォルトの名無しさん
2012/06/10(日) 23:49:50.74それなら君が良スレにすればいいのだよ。
0079デフォルトの名無しさん
2012/06/10(日) 23:50:50.88このスレは反論しない人たちが
「コンパイラ任せ」に類するテクニックを
話すスレだから。
0080デフォルトの名無しさん
2012/06/10(日) 23:54:33.49静的解析ツールとかさ。コードメトリクスツールとかさ。
コード規約なんかも、ルールを決めるのではなく
予めツールと設定を作っておけば、
長ったらしいドキュメントを読まなくてすむよね?
0081デフォルトの名無しさん
2012/06/10(日) 23:56:29.86コンパイラに拘るのは当然だろ
0082デフォルトの名無しさん
2012/06/10(日) 23:57:15.56色々と静的解析ツールが付いているみたいだけど
なにぶん高いから使ったことがない。
使ってる人いない? どんな感じ?
0083デフォルトの名無しさん
2012/06/11(月) 05:54:09.10どう見ても、技術の欠片も持ってない >>1 が立てたからこその、gdgd 展開だろうw
0084デフォルトの名無しさん
2012/06/11(月) 06:00:09.02いい加減忘れろ。
0085デフォルトの名無しさん
2012/06/11(月) 06:07:17.640086デフォルトの名無しさん
2012/06/11(月) 15:30:06.530087デフォルトの名無しさん
2012/06/11(月) 16:12:09.17AppleのObjective-CのARCは静的解析を使ったメモリ管理機構だよ
0088デフォルトの名無しさん
2012/06/11(月) 16:57:23.70静的解析の手伝いをさせるということらしい
0089デフォルトの名無しさん
2012/06/12(火) 17:41:30.79クラスやインターフェースを継承した時に
雛形を作ってくれる機能とか。
0090デフォルトの名無しさん
2012/06/12(火) 23:24:44.05>>1 が言ってるのは リファクタリングとか
テスト、チューニングの方面だな
0091デフォルトの名無しさん
2012/06/13(水) 00:08:57.190092デフォルトの名無しさん
2012/06/13(水) 00:54:22.200094デフォルトの名無しさん
2012/06/13(水) 06:46:26.040095デフォルトの名無しさん
2012/06/13(水) 07:09:59.810096デフォルトの名無しさん
2012/06/13(水) 11:39:53.73あー、なんだ、その…
付き合いきれない。ゴメン。
■ このスレッドは過去ログ倉庫に格納されています