ilya42
Группа греческих учёных под руководством Диомидиса Спинеллиса провела интересное исследование чувствительности десяти популярных языков программирования к ошибкам и опечаткам при наборе текста программы. Ущерб от таких ошибок иногда может составлять многие миллионы, и способность языка обнаруживать их как можно раньше очень важна для разработки надёжных программ. Для тестирования использовались несколько примеров из проекта Rosetta Code - вики, на которой собраны реализации множества задач и алгоритмов на разных языках. На основании статистических данных о популярности языков, а так же некоторых практических соображений (наличие свободного компилятора и примеров на Rosetta Code) были выбраны следующие языки и компиляторы:
Язык |
компилятор/среда |
C |
gcc 4.4.5 |
C++ |
g++ 4.4.5 |
C# |
mono 2.6.7, CLI v2.0 |
Haskell |
ghc 6.12.1 |
Java |
OpenJDK 1.6.0_18 |
JavaScript |
spidermonkey 1.8.0 |
PHP |
PHP 5.3.3-7 |
Perl |
perl 5.10.1 |
Python |
python 2.6.6 |
Ruby |
ruby 1.8.7 |
Скрипт на Perl вносил в исходный код тестовых задач ошибки, имитирующие естественные ошибки при наборе программ - случайную замену одних символов, ключевых слов и идентификаторов на другие, увеличение или уменьшение числовых литералов на единицу. Всего было протестировано 136 реализаций тестовых задач, на основе которых было сгенерировано 280 000 программ, содержащих ошибки. 32% из них прошли компиляцию или проверку синтаксиса без ошибок и предупреждений. 23% успешно завершились, при этом 6,5% выдали корректный результат, а 16% - некорректный.
Таким образом, можно сказать, что каждая шестая бессмысленная ошибка или опечатка в коде программы может быть обнаружена только при должном покрытии тестами и инспекции кода - компилятор и среда исполнения не смогут её отловить. Естественно, разные языки проявили себя по-разному.
Языки со статической и/или строгой типизацией, что вполне ожидаемо, проявили себя наилучшим образом - C#, Java, С и C++ показали очень похожие результаты - около 10% не замеченных компилятором, лучший результат (8%) у C++. Немного хуже проявил себя Haskell - около 15%. У динамических языков разброс гораздо больше. Абсолютным антилидером стал PHP - в 36% случаев интерпретатор без возражений запустил некорректную программу. За ним с заметным отрывом идёт Perl с 22%, а строже всех ведут себя Ruby (16%) и Python (15%).
Ссылки по теме