VOL. J99-D NO. 4
APRIL 2016
本PDFの扱いは、電子情報通信学会著作権規定に従うこと。
なお、本PDFは研究教育目的（非営利）に限り、著者が第三者に直接配布することができる。著者以外からの配布は禁じられている。

間でどれほど重複しているかを測ることで，言語間でC と Java におけるライブラリ API の識別子名定義の頻度比較
神田 哲也† a)
石尾

ダニエル隆†（正員）

井上

モラレス

ゲルマン††,†

克郎†（正員：フェロー）Comparing Frequency of Identifier Definition in C and Java APIs
Tetsuya KANDA† a) , Daniel M. GERMAN††,† , Nonmembers,

Takashi ISHIO† , Member, and Katsuro INOUE† , Fellow†

本調査では，C で書かれたライブラリを Linux ディ
ストリビューションである Debian 7.5.0 のパッケージから収集した．また，Java で書かれたライブラリをライブラリ管理ツールである Maven のセントラルリポジトリから収集した．
識別子の一覧は，以下の手順に基づいて得る．

大阪大学，吹田市

Osaka University, Suita-shi, 565–0871 Japan††の識別子命名の傾向の違いを明らかにする．

2. 1 ライブラリファイルの収集
Debian の バ イ ナ リ パッケ ー ジ を 解 凍 し ，/lib，ヴィクトリア大学，カナダ

University of Victoria, Victoria, BC, Canadaa) E-mail: t-kanda@ist.osaka-u.ac.jp
DOI:10.14923/transinfj.2015JDL8026/usr/lib，/usr/lib64 以下に配置される拡張子が.o，.so，.a のバイナリファイルを取得する．Maven
リポジトリからは，全ての jar ファイルを収集する．

あらまし

本論文では，C 言語と Java のライブラリを解析し，API の識別子名について定義頻度に傾向の違いがあることを明らかにした．
キーワード API，識別子

2. 2 識別子定義の抽出
Debian か ら 抽 出 し た バ イ ナ リ ファイ ル か ら は
readelf コマンドを用いて，Maven に含まれる Jarファイルからは，javap コマンドを用いて識別子定義

1. ま え が きを抽出する．この際，Jar ファイルから取り出した識

ソースコード中の識別子名はプログラム解析におい別子からはパッケージ名を取り除く．Jar ファイルのて重要な要素の一つである．例えばライブラリの APIについて，利用関係などを特定するために識別子名などを用いた解析が行われている．

中に含まれる Jar ファイルに関しては除外する．

2. 3 無関係な識別子の除去抽出した識別子定義から他言語で書かれたものやコ

Subramanian らは，技術フォーラム StackOverflow

ンパイル時に埋め込まれたものを除去する．Debianの投稿から抽出した Java と JavaScript のコード片にの識別子定義から，対応するソースパッケージに含ま対して解析を行い，使用されているライブラリを特定れる C 言語で書かれたファイルに含まれない識別子した [1]．彼らはコード片に対して抽象構文木を構築定義を取り除く．Maven のライブラリについては，クし変数の型を特定した．Java においては，パッケージラスファイルのコンパイル元ファイルの情報をもとに名で名前空間を分割することができるため，同一のクJava 以外で書かれたものを拡張子で判断し取り除く．

ラス名・メソッド名が複数存在する．この性質のため，

2. 4 計

コード片中の識別子がどの型であるかを特定するため

C に関しては，ある識別子名がいくつのソースパッには，字句ベースの解析だけではなく構文木ベースのケージに定義されているかを数えた．Java に関して解析が必要であるとしている．

は，ある識別子名がいくつの Jar ファイルに定義され測

一方，C 言語における名前空間は単一である．そのているかを数えた．Maven リポジトリには同一ライため，特に他のプログラムから呼び出されることを前

ブラリの異なるバージョンが複数収録されているため，提としたライブラリにおいては，識別子名が重複しなバージョン番号のみが違う Jar ファイルをまとめて一いよう命名されていると予想できる．

つのライブラリとして集計した．

本研究では，Java と C で書かれたライブラリを解析し，重複する識別子名の出現数を調査した．調査の3. 解 析 結 果
表 1，表 2 に C 言語の関数名と変数名，表 3 から結果，C で書かれたライブラリの識別子名は Java と表 5 に Java のクラス名，メソッド名，フィールド名比べ重複しない割合が高いことが判明した．

について調査結果をまとめた．表中「識別子数」は，2. 調 査 手 順

識別子名の種類に対して数えた場合を，「識別子定義

本研究では，C と Java で記述されたライブラリに数」は全識別子定義に対して数えた場合を示している．

含まれる識別子名を解析する．他のプログラムから呼例えば表 1 の「定義されているライブラリ数」が 2 のび出されることを想定された識別子名が，ライブラリ行は，全識別子名のうち 60,574 個が二つのライブラ

電子情報通信学会論文誌

c 一般社団法人電子情報通信学会 2016
D Vol. J99–D No. 4 pp. 461–462 461電子情報通信学会論文誌 2016/4 Vol. J99–D No. 4
表1 C関数名
Table 1 C function names.
定義されているライブラリ数
識別子数
1 886,134 91.80%
260,574
6.28%
313,483
1.40%
42,571
0.27%
5 以上
2,477
0.26%
総数 965,239

識別子定義数
886,134 82.29%
121,148 11.25%
40,4493.76%
10,2840.96%
18,8241.75%
1,076,839

表2 C変数名
Table 2 C variable names.
定義されているライブラリ数
識別子数
識別子定義数
1 206,111 92.62% 206,111 82.14%
210,646
4.78%
21,292
8.49%
33,974
1.79%
11,922
4.75%
4926
0.42%
3,704
1.48%
5 以上
875
0.39%
7,904
3.14%
計 222,532
250,933
表 3 Java クラス名
Table 3 Java class names.
定義されているライブラリ数
識別子数
1 445,353 75.85%
287,538 14.75%
327,2174.59%
411,240
1.89%
5 以上
22,0673.72%
計 593,415

識別子定義数
564,463 43.44%
228,600 17.59%
107,338
8.26%
59,901
4.61%
338,991 26.09%
1,299,293

表 4 Java メソッド名
Table 4 Java method names.
定義されているライブラリ数
識別子数
1 1,010,135 66.03%
2260,930 17.06%
392,6226.05%
448,160
3.15%
5 以上
117,860
7.70%計 1,529,707

識別子定義数
2,240,606 15.75%
1,269,538
8.93%
978,365
6.88%
536,9443.78%
9,196,312 64.66%
14,221,765

表 5 Java フィールド名
Table 5 Java field names.
定義されているライブラリ数
識別子数
1 387,149 70.28%
283,367 15.13%
333,335
6.05%
416,059
2.92%
5 以上
30,9515.62%
計 550,861

名は少ないことがこの結果から読み取れる．
一方，全識別子定義に対しての割合を数えると，言語間で大きな差が見られた．C では 8 割の識別子定義が一つのライブラリにのみ定義されていたのに対し，Java ではその割合は低く，特にメソッド名では 2 割を切った．このことから，Java のメソッド名では一部の識別子名が多くのライブラリにおいて宣言されているという偏りがあることがわかった．
複数のライブラリに定義される識別子を調べたところ，ツールによるソースコードの自動生成，外部のライブラリの取り込み，共通のフレームワークの利用，といった理由によるものが見られた．C 言語のライブラリから多く見つかった文字列 “yy” から始まる識別子は，Yacc パーサジェネレータによって自動的に生成されたソースコードに含まれる関数群である．また，strlcpyや strlcat といった関数は Linux に含まれない BSD

libc において定義されている関数を幾つかのライブラリが独自に取り込んだと予想される．共通のフレームワークを拡張して利用している場合，例えば Java において多く定義されていた Activator クラスは，ほとんどが org.osgi.framework.BundleActiovator インタフェースを実装したものであった．このインタフェースには必須のメソッド start や stop を実装する必要があるため，これらのメソッド名も複数のライブラリで定義されていた．

4. 応用への展望
ソースコードから識別子定義のみを抽出することは，型や依存関係を含めたソースコード解析に比べ非常に軽量な処理である．特定のライブラリにのみ宣言さる識別子が多かったことから，偏りの少ない C 言語においては識別子名のみでソースコードから利用しているライブラリを特定することができると期待できる．ま

識別子定義数
565,455 29.21%
272,301 14.07%
179,9629.30%
118,384
6.11%
799,915 41.32%
1,936,017

リにおいて定義されており，識別子定義の数としてはた，重複して宣言されていた識別子名も含め，どのような識別子名が定義されているかを列挙することで，ライブラリのコピーを検出することなどが可能になると考えられる．
謝辞 本研究は科研費（25220003）及び大阪大学国際共同研究促進プログラムの助成を得た．

121,148 個がここに分類される．
一つのライブラリにのみ定義されている識別子名は，

C の関数名と変数名で約 9 割，Java のクラス名とメソッド名，フィールド名で約 7 割であった．C と Java双方で特定のライブラリにしか存在しない識別子名が多く，複数のライブラリに重複して宣言される識別子
462

文
[1]

献

S. Subramanian, L. Inozemtseva, and R. Holmes,“Live API documentation,” Proc. ICSE2014, pp.643–652, 2014.

（平成 27 年 10 月 15 日受付，12 月 2 日再受付，12 月 29 日早期公開）