В вычислительной технике исходный код или просто код или источник — это простая текстовая компьютерная программа, написанная на языке программирования . Программист пишет читаемый человеком исходный код для управления поведением компьютера .
Поскольку компьютер, по сути, понимает только машинный код , исходный код должен быть транслирован , прежде чем компьютер сможет его выполнить . Процесс трансляции может быть реализован тремя способами. Исходный код может быть преобразован в машинный код компилятором или ассемблером . Полученный исполняемый файл представляет собой машинный код, готовый для компьютера. В качестве альтернативы исходный код может быть выполнен без преобразования с помощью интерпретатора . Интерпретатор загружает исходный код в память. Он одновременно транслирует и выполняет каждый оператор . Метод, который объединяет компиляцию и интерпретацию, заключается в том, чтобы сначала создать байт-код . Байт-код — это промежуточное представление исходного кода, которое быстро интерпретируется.
Первые программируемые компьютеры, появившиеся в конце 1940-х годов, [2] были запрограммированы на машинном языке (простые инструкции, которые могли быть напрямую выполнены процессором). Машинный язык было трудно отлаживать, и он не был переносим между различными компьютерными системами. [3] Первоначально аппаратные ресурсы были редкими и дорогими, в то время как человеческие ресурсы были дешевле. [4] По мере того, как программы становились все более сложными, производительность программистов стала узким местом. Это привело к появлению высокоуровневых языков программирования , таких как Fortran, в середине 1950-х годов. Эти языки абстрагировались от деталей оборудования, вместо этого они были разработаны для выражения алгоритмов, которые могли бы быть более понятны людям. [5] [6] Поскольку инструкции отличаются от базового компьютерного оборудования , программное обеспечение, таким образом, является относительно новым, начиная с этих ранних высокоуровневых языков программирования, таких как Fortran , Lisp и Cobol . [6] Изобретение высокоуровневых языков программирования было одновременно с появлением компиляторов, необходимых для автоматического перевода исходного кода в машинный код, который может быть напрямую выполнен на компьютерном оборудовании . [7]
Исходный код — это форма кода, которая изменяется непосредственно людьми, как правило, на языке программирования высокого уровня. Объектный код может быть напрямую выполнен машиной и генерируется автоматически из исходного кода, часто через промежуточный шаг, язык ассемблера . В то время как объектный код будет работать только на определенной платформе, исходный код может быть перенесен на другую машину и перекомпилирован там. Для одного и того же исходного кода объектный код может значительно различаться — не только в зависимости от машины, для которой он скомпилирован, но и в зависимости от оптимизации производительности компилятора. [8] [9]
Большинство программ не содержат всех ресурсов, необходимых для их запуска, и полагаются на внешние библиотеки . Часть функции компилятора заключается в связывании этих файлов таким образом, чтобы программа могла быть выполнена оборудованием. [10]
Разработчики программного обеспечения часто используют управление конфигурацией для отслеживания изменений в файлах исходного кода ( контроль версий ). Система управления конфигурацией также отслеживает, какой файл объектного кода соответствует какой версии файла исходного кода. [11]
Количество строк исходного кода часто используется в качестве метрики при оценке производительности труда программистов, экономической ценности кодовой базы, оценки усилий по проектам в разработке и текущих затрат на обслуживание программного обеспечения после выпуска. [12]
Исходный код также используется для передачи алгоритмов между людьми – например, фрагменты кода в Интернете или в книгах. [13]
Программистам может быть полезно просмотреть существующий исходный код, чтобы узнать о методах программирования. [13] Обмен исходным кодом между разработчиками часто упоминается как фактор, способствующий развитию их навыков программирования. [13] Некоторые люди считают исходный код выразительным художественным средством . [14]
Исходный код часто содержит комментарии — блоки текста, помеченные для игнорирования компилятором. Это содержимое не является частью логики программы, а вместо этого призвано помочь читателям понять программу. [15]
Компании часто сохраняют исходный код конфиденциальным, чтобы скрыть алгоритмы, считающиеся коммерческой тайной . Запатентованный, секретный исходный код и алгоритмы широко используются для чувствительных правительственных приложений, таких как уголовное правосудие , что приводит к поведению черного ящика с отсутствием прозрачности в методологии алгоритма. Результатом является избегание общественного контроля таких вопросов, как предвзятость. [16]
Доступ к исходному коду (не только к объектному коду) необходим для его изменения. [17] Понимание существующего кода необходимо для понимания того, как он работает [17] и перед его изменением. [18] Скорость понимания зависит как от кодовой базы, так и от навыков программиста. [19] Опытным программистам легче понять, что делает код на высоком уровне. [20] Иногда для ускорения этого процесса используется визуализация программного обеспечения . [21]
Многие программисты используют интегрированную среду разработки (IDE) для повышения производительности. IDE обычно имеют несколько встроенных функций, включая редактор исходного кода , который может предупреждать программиста о распространенных ошибках. [22] Модификация часто включает в себя рефакторинг кода (улучшение структуры без изменения функциональности) и реструктуризацию (одновременное улучшение структуры и функциональности). [23] Почти каждое изменение кода приводит к появлению новых ошибок или неожиданных волновых эффектов , которые требуют еще одного раунда исправлений. [18]
Обзоры кода другими разработчиками часто используются для тщательной проверки нового кода, добавленного в проект. [24] Целью этого этапа часто является проверка того, что код соответствует стандартам стиля и поддерживаемости , и что он является правильной реализацией программного обеспечения . [25] По некоторым оценкам, обзор кода значительно сокращает количество ошибок, сохраняющихся после завершения тестирования программного обеспечения . [24] Наряду с тестированием программного обеспечения, которое работает путем выполнения кода, статический анализ программ использует автоматизированные инструменты для обнаружения проблем с исходным кодом. Многие IDE поддерживают инструменты анализа кода, которые могут предоставлять метрики ясности и поддерживаемости кода. [26] Отладчики — это инструменты, которые часто позволяют программистам пошагово выполнять выполнение, отслеживая, какой исходный код соответствует каждому изменению состояния. [27]
Файлы исходного кода на языке программирования высокого уровня должны пройти стадию предварительной обработки в машинный код , прежде чем инструкции могут быть выполнены. [7] После компиляции программа может быть сохранена как объектный файл , а загрузчик (часть операционной системы) может взять этот сохраненный файл и выполнить его как процесс на оборудовании компьютера. [10] Некоторые языки программирования используют интерпретатор вместо компилятора. Интерпретатор преобразует программу в машинный код во время выполнения , что делает их в 10–100 раз медленнее, чем компилируемые языки программирования. [22] [28]
Качество программного обеспечения — это всеобъемлющий термин, который может относиться к правильному и эффективному поведению кода, его возможности повторного использования и переносимости или простоте модификации. [29] Обычно более экономически выгодно встраивать качество в продукт с самого начала, а не пытаться добавить его позже в процессе разработки. [30] Более качественный код снизит стоимость жизненного цикла как для поставщиков, так и для клиентов, поскольку он более надежен и прост в обслуживании . [31] [32]
Поддерживаемость — это качество программного обеспечения, позволяющее легко изменять его, не нарушая существующую функциональность. [33] Соблюдение соглашений о кодировании, таких как использование четких имен функций и переменных, которые соответствуют их назначению, упрощает поддержку. [34] Использование условных операторов цикла только в том случае, если код может выполняться более одного раза, и исключение кода, который никогда не будет выполняться, также может повысить понятность. [35] Многие организации по разработке программного обеспечения пренебрегают поддерживаемостью на этапе разработки, даже если это увеличит долгосрочные затраты. [32] Технический долг возникает, когда программисты, часто из-за лени или срочности, чтобы уложиться в срок, выбирают быстрые и грязные решения вместо того, чтобы встроить поддерживаемость в свой код. [36] Распространенной причиной является недооценка усилий по разработке программного обеспечения , что приводит к недостаточному выделению ресурсов на разработку. [37] Проблема с поддерживаемостью заключается в том, что многие курсы по программной инженерии не делают на ней акцента. [38] Инженеры-разработчики, которые знают, что они не будут нести ответственность за поддержку программного обеспечения, не имеют стимула встраивать поддерживаемость. [18]
Ситуация в мире различается, но в Соединенных Штатах до 1974 года программное обеспечение и его исходный код не были объектом авторского права и, следовательно, всегда были общественным достоянием . [39] В 1974 году Комиссия США по новым технологическим видам использования защищенных авторским правом работ (CONTU) постановила, что «компьютерные программы, в той мере, в которой они воплощают оригинальное творение автора, являются надлежащим объектом авторского права». [40] [41]
Проприетарное программное обеспечение редко распространяется в виде исходного кода. [42] Хотя термин «программное обеспечение с открытым исходным кодом» буквально относится к публичному доступу к исходному коду , [43] к программному обеспечению с открытым исходным кодом предъявляются дополнительные требования: свободное распространение, разрешение на изменение исходного кода и выпуск производных работ под той же лицензией, а также отсутствие дискриминации между различными видами использования, включая коммерческое использование. [44] [45] Возможность бесплатного повторного использования программного обеспечения с открытым исходным кодом может ускорить разработку. [46]