Какие Языки Подвержены Ошибкам


Исследование влияния языков программирования на качество программного обеспечения было опубликовано в октябрьских сообщениях ACM. В этой самой читаемой новости 2017 года мы сообщаем о некоторых из ее основных выводов, касающихся распространенности ошибок.

Исследователи Байшахи Рэй, Дэрил Поснетт, Премкумар Деванбу и Владимир Фильков использовали данные с GitHub для крупномасштабного эмпирического исследования вечных дебатов среди программистов о том, какой язык лучше всего подходит для данной задачи. Они объединили множественное регрессионное моделирование с визуализацией и текстовой аналитикой, чтобы изучить влияние языковых функций, таких как статическая и динамическая типизация, а также разрешение или запрещение путаницы типов на качество программного обеспечения.

Краткая версия их выводов приведена в аннотации:

Языковой дизайн действительно оказывает значительное, но скромное влияние на качество программного обеспечения. Наиболее примечательно, что, по-видимому, запрещение путаницы типов несколько лучше, чем ее разрешение, и среди функциональных языков статическая типизация также несколько лучше, чем динамическая. Мы также обнаруживаем, что функциональные языки несколько лучше процедурных языков.

Цель упражнения состояла в том, чтобы пролить свет на идею о том, что выбор языка программирования влияет как на процесс кодирования, так и на результирующее программирование с акцентом на статическую и динамическую типизацию:

Сторонники сильной статической типизации склонны полагать, что статический подход рано выявляет дефекты; для них унция профилактики стоит фунта лечения. Однако сторонники динамической типизации утверждают, что консервативная статическая проверка типов расточительна для ресурсов разработчика и что лучше полагаться на сильную динамическую проверку типов, чтобы перехватывать ошибки типов по мере их возникновения. Эти дебаты, однако, в основном носили кабинетный характер и подкреплялись лишь анекдотическими свидетельствами.

Для этого исследования команда выбрала 19 лучших языков программирования из GitHub, добавив Typescript в качестве 20-го и определила 50 лучших проектов, написанных в основном на каждом языке. Затем они отбросили любой проект с меньшим количеством коммитов, чем 28 (первый квартиль), и любой язык, используемый в многоязычном проекте с менее чем 20 коммитами на этом языке.

Как видно из приведенной выше таблицы, это обеспечило исследование 728 проектами, разработанными на 17 языках. Проекты охватывали 18 — летнюю историю и включали 29 000 различных разработчиков, 1,57 миллиона коммитов и 564 625 исправлений ошибок.

Затем команда определила классы языков, различая три парадигмы программирования: процедурную, скриптовую и функциональную; две категории проверки типов: статическую и динамическую; запрещено или разрешено неявное преобразование типов и управляемую память в отличие от неуправляемой:

Используя поиск по ключевым словам для 10% сообщений об исправлениях ошибок для обучения классификатора ошибок, исследователи определили как причину, так и последствия для каждого фиксации исправления bux.  

Первый вопрос, на который нужно было ответить, звучал так: «Являются ли некоторые языки более подверженными дефектам, чем другие?» и это было сделано с использованием регрессионной модели для сравнения влияния каждого языка на количество дефектов со средним влиянием всех языков на фиксацию дефектов.:

В верхней части этой таблицы находятся переменные, используемые в качестве элементов управления для факторов, которые, вероятно, будут коррелированы. Возраст проекта включен, поскольку более старые проекты, как правило, будут иметь большее количество исправлений дефектов; ожидается, что количество вовлеченных разработчиков и необработанный размер проекта также повлияют на количество ошибок и, наконец, на количество фиксаций. Было обнаружено, что все четыре имеют значительные положительные коэффициенты. Языки с самыми сильными положительными коэффициентами — то есть, связанные с большим количеством исправлений дефектов, — это C++, C и Objective-C, а также PHP и Python.  С другой стороны, Clojure, Haskell, Ruby и Scala имеют значительные отрицательные коэффициенты, подразумевающие, что эти языки с меньшей вероятностью, чем в среднем, приведут к фиксации дефектов.Что касается языков, то функциональные языки связаны с меньшим количеством дефектов, чем процедурные или скриптовые языки.

Затем исследователи обращают свое внимание на склонность к дефектам, соотношение фиксаций исправлений ошибок по сравнению с общим количеством фиксаций на язык в домене и создают тепловую карту, где более темный цвет указывает на более склонность к ошибкам:

Из приведенной выше тепловой карты они делают вывод, что нет общей связи между областью применения и предрасположенностью к языковым дефектам.  Однако рассмотрение связи между классом языка и категорией ошибок указывает на то, что:

Типы дефектов тесно связаны с языками; некоторые типы дефектов, такие как ошибки памяти и ошибки параллелизма, также зависят от примитивов языка. Язык имеет большее значение для конкретных категорий, чем для дефектов в целом. 

Поскольку эта тепловая карта показывает сильную связь между классом Proc-Static-Implicit-Unmanaged и ошибками параллелизма и памяти. это также показывает, что статические языки в целом более подвержены сбоям и ошибкам производительности, за ними следуют Функционально-Динамические явно управляемые языки, такие как Erlang.

Подводя итоги, можно сделать следующие выводы доклада::

 Эти данные указывают на то, что функциональные языки лучше процедурных языков; они предполагают, что запрещение неявного преобразования типов лучше, чем его разрешение; что статическая типизация лучше, чем динамическая; и что управляемое использование памяти лучше, чем неуправляемое. Кроме того, что склонность к дефектам языков в целом не связана с доменами программного обеспечения. Кроме того, языки больше связаны с отдельными категориями ошибок, чем с ошибками в целом.  


Добавить комментарий