Nuitka でコンパイルしたプログラムから、元の Python ソースコードをどこまで復元できるかを毎日 1 回評価しています。
復元したソースコードが元のテストに通るか、元と比べて長さや認知的複雑度がどれだけ違うかを測ります。あわせて、本ツールと angr 単体の擬似 C の出力を比べます。
元のプログラムの関数を、復元した関数に差し替え、データセットのテスト入力に対して元と同じ結果を返すかを確かめます。テストの実行時間の上限は関数ごとに 30 秒です。データセットの名前のリンクからは、そのデータセットの関数の一覧に飛べます。
| データセット | 合格 | 不合格 | エラー | 合計 |
|---|---|---|---|---|
| dev/cruxeval | 725 | 0 | 63 | 788 |
| dev/humaneval_plus | 158 | 0 | 8 | 166 |
| dev/thealgorithms | 1697 | 0 | 398 | 2095 |
| dev 合計 | 2580 | 0 | 469 | 3049 |
| holdout/mbpp_plus | 166 | 0 | 37 | 203 |
| holdout 合計 | 166 | 0 | 37 | 203 |
行数と認知的複雑度は、値が小さいほどソースコードが読みやすいことを意味します。平均は関数 1 つあたり、合計はデータセット全体の値です。認知的複雑度は、分岐やループを入れ子の深さで重み付けして数えた指標です。
元のソースコードと復元したソースコードを比較します。対象は合格した関数だけです。
| データセット | 合格 | 行数の平均 (original → ours) | 認知的複雑度の平均 (original → ours) |
|---|---|---|---|
| dev/cruxeval | 725 | 5.3 -> 6.2 | 1.8 -> 1.9 |
| dev/humaneval_plus | 158 | 17.1 -> 18.9 | 3.1 -> 3.9 |
| dev/thealgorithms | 1697 | 20.1 -> 21.9 | 3.3 -> 4.4 |
| dev 合計 | 2580 | 15.8 -> 17.3 | 2.9 -> 3.7 |
| holdout/mbpp_plus | 166 | 3.5 -> 4.9 | 1.3 -> 1.5 |
| holdout 合計 | 166 | 3.5 -> 4.9 | 1.3 -> 1.5 |
本ツールが内部で使用する中間表現から擬似 C のソースコードを作成し、angr の出力と比較します。対象は両方がそろう関数すべてで、合格したかどうかは問いません。angr は Nuitka 向けの処理を持たないので、本ツールの追加した処理で定型処理をどれだけ取り除けたのか、また Python の演算にどれだけ戻せたのかを計算できます。
| データセット | 関数の数 | angr の定型処理の割合 | 定型処理の合計 (angr → ours) | Python 演算の合計 (angr → ours) | 行数の平均 (angr → ours) | 認知的複雑度の平均 (angr → ours) |
|---|---|---|---|---|---|---|
| dev/cruxeval | 787 | 85.4% | 45705 -> 236 | 7843 -> 63 | 269.4 -> 28.2 | 179.6 -> 3.8 |
| dev/humaneval_plus | 166 | 83.4% | 10802 -> 5 | 2157 -> 11 | 305.3 -> 32.4 | 232.9 -> 5.3 |
| dev/thealgorithms | 2085 | 80.4% | 168099 -> 1395 | 40856 -> 625 | 421.4 -> 44.7 | 446.6 -> 8.4 |
| dev 合計 | 3038 | 81.5% | 224606 -> 1636 | 50856 -> 699 | 375.7 -> 39.7 | 365.8 -> 7.0 |
| holdout/mbpp_plus | 203 | 86.2% | 9289 -> 2 | 1484 -> 32 | 202.2 -> 22.0 | 145.0 -> 2.3 |
| holdout 合計 | 203 | 86.2% | 9289 -> 2 | 1484 -> 32 | 202.2 -> 22.0 | 145.0 -> 2.3 |
各点は合格した 1 つの関数を表しています。横軸は元の関数の値、縦軸は復元した関数の値です。目盛りは等間隔ではなく、平方根スケールで小さい値の変化が見やすくなるよう調整されています。例えば、「same」の線上の点は復元値が元と同じであること、「2x」の線上の点は 2 倍になったことを示します。点をクリックすると関数の詳細を表示できます。
元の Python ソースコードの著作権は各データセットの作者にあり、ソースコードはそれぞれのデータセットのライセンスに従います。