最も todo と fix meが多いプログラミング言語は Python かもしれない

プログラムを書いていると todo としてコメントを入れることがあります。

  • 現時点ではこのコードは書けない
  • 余裕のある時にやろう
  • 汚いコードを書いていることに対する言い訳

など理由は様々。


todo コメントの例としては

// todo check hogehoge
hoge();

のようなものが挙げられます。


ふと思いついて「最も多くソースコードのコメント中に todo と書かれている言語は何か?」をGoogle Code Searchを利用して調べてみました。


行コメント限定ですが結果は以下の通りです。

lang todo % todo/all
scheme 1.4% 1000/71000
c++ 0.2% 12300/6280000
c# 0.2% 13600/6280000
fortran 0.0% 100/233000
perl 2.1% 28600/1370000
php 1.7% 29300/1740000
python 5.8% 39200/671000
javascript 3.4% 7000/203000
haskell 0.9% 500/53300
java 5.1% 197000/3850000
actionscript 0.8% 300/37700
ruby 4.5% 6000/134000


ということで Python, Java, Ruby あたりが多いですかね。
PHP, Fortran は行コメントの定義間違えたかな?異常に todo が少ない。(PHPの間違いを修正しました。)


自分の好きな言語が結果に含まれていないよという方は Gauche で動く書き捨てのソースコード貼っておきますのでご自由に(無保証ですが)お使いください。

おまけ

todo じゃなくて bug だったらどうだろう?

lang bug % bug/all
scheme 0.3% 200/71000
c++ 0.0% 50/6280000
c# 0.0% 50/6280000
fortran 0.2% 500/233000
perl 0.4% 6000/1370000
php 0.0% 400/1740000
python 1.0% 7000/671000
javascript 0.2% 500/203000
haskell 0.2% 100/53300
java 0.2% 9000/3850000
ruby 0.3% 400/134000


fix\s*meではどうだろう?

scheme 4.2% 3000/71000
c++ 0.3% 17200/6280000
c# 0.3% 17200/6280000
fortran 0.0% 50/233000
perl 1.0% 13200/1370000
php 0.5% 9000/1740000
python 4.7% 31600/671000
javascript 1.5% 3000/203000
haskell 0.8% 400/53300
java 1.7% 69200/4090000
ruby 3.0% 4000/134000

コード

行コメントを正規表現で指定してください。

#!/usr/bin/env gosh
(use rfc.http)
(use rfc.uri)
(use gauche.charconv)
(use srfi-1)

(define search-set '(
                     (scheme       . #/;/)
                     (c++          . #/\/\//)
                     (c#           . #/\/\//)
                     (fortran      . #/^[C\*]/)
                     (perl         . #/#/)
                     (php          . #/#/)
                     (python       . #/#/)
                     (javascript   . #/\/\//)
                     (haskell      . #/\-\-/)
                     (java         . #/\/\//)
                     (actionscript . #/\/\//)
                     (ruby         . #/#/)))

(define (search-gsc lang line-comment-reg)
  (string->number
   (regexp-replace-all
    #/,/
    (rxmatch-substring
     (#/約<b>([\d,\s]+)<\/b>件中/
             (ces-convert
              (call-with-output-string
                (cut
                 http-get
                 "www.google.co.jp"
                 #`"/codesearch?as_q=,(uri-encode-string line-comment-reg)&hl=ja&as_lang=,lang" :sink <>))
              "*jp" "utf-8")) 1) "")))

(define (flonum num n)
  (quotient&remainder (inexact->exact (round (* num (expt 10 n))))
                      (expt 10 n)))

(print "|*lang|todo %|todo/all|")
(for-each
 (lambda (r)
   (receive (m n) (flonum (* (/. (second r) (third r)) 100) 1)
     (format #t "|*~a|~d.~d%|~d/~d|\n" (first r) m n (second r) (third r))))
 (map
  (lambda (s)
    `(,(car s)
      ,(search-gsc (car s) (string-append (regexp->string (cdr s)) "\\s+todo"))
      ,(search-gsc (car s) ".")))
  search-set))