Жесткое кодирование (также хард-кодирование или хардкодирование ) — это практика разработки программного обеспечения, заключающаяся в внедрении данных непосредственно в исходный код программы или другого исполняемого объекта , в отличие от получения данных из внешних источников или их генерации во время выполнения .
Жестко закодированные данные обычно можно изменить только путем редактирования исходного кода и перекомпиляции исполняемого файла, хотя их можно изменить в памяти или на диске с помощью отладчика или шестнадцатеричного редактора .
Жестко закодированные данные лучше всего подходят для неизменных фрагментов информации, таких как физические константы , номера версий и статические текстовые элементы.
С другой стороны, программно-кодированные данные кодируют произвольную информацию через пользовательский ввод , текстовые файлы , INI-файлы , ответы HTTP-сервера, файлы конфигурации, макросы препроцессора, внешние константы, базы данных, аргументы командной строки и определяются во время выполнения.
Жесткое кодирование требует изменения исходного кода программы каждый раз, когда изменяются входные данные или желаемый формат, в то время как конечному пользователю может быть удобнее изменить детали каким-либо образом вне программы. [1]
Часто требуется жесткое кодирование, но его также можно считать анти-шаблоном . [2] Программисты могут не иметь разработанного динамического решения пользовательского интерфейса для конечного пользователя, но все равно должны предоставить функцию или выпустить программу. Обычно это временно, но в краткосрочном смысле решает проблему предоставления кода. Позже выполняется мягкое кодирование, чтобы позволить пользователю передавать параметры, которые дают конечному пользователю возможность изменять результаты или результат.
Термин «жестко закодированный» изначально использовался как аналог жесткого монтажа схем и предназначался для передачи негибкости, которая является результатом его использования в разработке и внедрении программного обеспечения. В контексте расширяемых во время выполнения сред совместной разработки, таких как MUD , жесткое кодирование также относится к разработке ядра системы, отвечающего за низкоуровневые задачи и выполнение скриптов , в отличие от мягкого кодирования , которое разрабатывает высокоуровневые скрипты, которые интерпретируются системой во время выполнения , со значениями из внешних источников, таких как текстовые файлы , файлы INI , макросы препроцессора , внешние константы, базы данных , аргументы командной строки , ответы HTTP- сервера , файлы конфигурации и пользовательский ввод . В этом случае термин не является уничижительным и относится к общей разработке, а не конкретно к внедрению выходных данных.
Жесткое кодирование учетных данных является популярным способом создания бэкдора . Жестко закодированные учетные данные обычно не видны в файлах конфигурации или выводе команд перечисления учетных записей и не могут быть легко изменены или обойдены пользователями. В случае обнаружения пользователь может отключить такой бэкдор, изменив и пересобрав программу из ее исходного кода ( если исходный код общедоступный ), декомпилировав или выполнив обратную разработку программного обеспечения , напрямую отредактировав двоичный код программы или установив проверку целостности (такую как цифровые подписи, защита от несанкционированного доступа и защита от мошенничества ) для предотвращения непредвиденного доступа, но такие действия часто запрещены лицензионным соглашением конечного пользователя .
В качестве меры управления цифровыми правами разработчики программного обеспечения могут жестко кодировать уникальный серийный номер непосредственно в программе. Или распространено жестко кодировать открытый ключ , создавая DRM, для которого невозможно создать кейген.
В противном случае взломщик программного обеспечения может жестко запрограммировать действительный серийный номер в программе или даже запретить исполняемому файлу запрашивать его у пользователя, что позволит распространять несанкционированные копии без необходимости ввода действительного номера, тем самым используя один и тот же ключ для каждой копии, если она была жестко запрограммирована.
Если программа Windows запрограммирована так, чтобы предполагать, что она всегда устанавливается в C:\Program Files\Appname, и кто-то пытается установить ее на другой диск из-за нехватки места или организационных причин, она может не установиться или не запуститься после установки. Эта проблема может быть не выявлена в процессе тестирования, поскольку среднестатистический пользователь устанавливает на диск и каталог по умолчанию, а тестирование может не включать возможность изменения каталога установки. Однако программистам и разработчикам рекомендуется не исправлять путь установки программы, поскольку путь установки по умолчанию зависит от операционной системы, версии ОС и решений системного администратора . Например, многие установки Microsoft Windows используют диск C: в качестве основного жесткого диска , но это не гарантируется.
Похожая проблема существовала и в микропроцессорах ранних компьютеров, которые начинали выполнение с фиксированного адреса в памяти.
Некоторые программы с защитой от копирования ищут определенный файл на дискете или флэш-накопителе при запуске, чтобы убедиться, что это не несанкционированные копии. Если компьютер заменен на более новую машину, в которой нет дисковода, программа, которой он требуется, теперь не может быть запущена, поскольку дискета не может быть вставлена.
Последний пример показывает, почему жесткое кодирование может оказаться непрактичным, даже если в то время казалось, что оно будет работать полностью. В 1980-х и 1990-х годах подавляющее большинство ПК были оснащены по крайней мере одним дисководом, но позже дисководы вышли из употребления. Программа, жестко закодированная таким образом 15 лет назад, могла столкнуться с проблемами, если ее не обновлять.
Некоторые операционные системы Windows имеют так называемые Специальные папки , которые логически организуют файлы на жестком диске. Существуют проблемы, которые могут возникнуть при жестком кодировании:
Некоторые программы Windows жестко кодируют путь профиля в определенных разработчиком местах, таких как . Это путь для большинства Windows 2000 или выше, но это вызовет ошибку, если профиль хранится в сети или иным образом перемещен. Правильный способ получить его — вызвать функцию или разрешить переменную окружения. Другое предположение, которое часто делают разработчики, заключается в том, что профиль находится на локальном жестком диске.C:\Documents and Settings\Username
GetUserProfileDirectory
%userprofile%
Некоторые программы Windows жестко кодируют путь к My Documents
как ProfilePath\My Documents
. Эти программы будут работать на машинах с английской версией, но в локализованных версиях Windows эта папка обычно имеет другое имя. Например, в итальянских версиях папка My Documents
называется Documenti . My Documents
также может быть перемещена с помощью перенаправления папок в групповой политике в Windows 2000 или выше. Правильный способ получить его — вызвать функцию SHGetFolderPath
.
Косвенную ссылку, например переменную внутри программы под названием «FileName», можно было бы расширить, открыв диалоговое окно «Обзор файла», и при перемещении файла не пришлось бы менять код программы.
Жесткое кодирование особенно проблематично при подготовке программного обеспечения к переводу на другие языки.
Во многих случаях одно жестко закодированное значение, например размер массива, может встречаться в исходном коде программы несколько раз. Это будет магическое число . Это может обычно вызывать ошибку программы, если некоторые появления значения изменяются, но не все. Такую ошибку трудно найти, и она может оставаться в программе в течение длительного времени. Похожая проблема может возникнуть, если одно и то же жестко закодированное значение используется для более чем одного значения параметра, например, массива из 6 элементов и минимальной длины входной строки 6. Программист может по ошибке изменить все экземпляры значения (часто используя функцию поиска и замены редактора), не проверив код, чтобы увидеть, как используется каждый экземпляр. Обеих ситуаций можно избежать, определяя константы , которые связывают имена со значениями, и используя имена констант для каждого появления в коде.
Одним из важных случаев жесткого кодирования является размещение строк непосредственно в файле, что заставляет переводчиков редактировать исходный код для перевода программы. (Существует инструмент gettext
, который позволяет оставлять строки в файлах, но позволяет переводчикам переводить их, не изменяя исходный код; он фактически снимает жесткое кодирование строк.)
В компьютерных соревнованиях, таких как Международная олимпиада по информатике , участники должны написать программу с определенной схемой ввода-вывода в соответствии с требованиями вопросов.
В редких случаях, когда возможное количество входов достаточно мало, участник может рассмотреть возможность использования подхода, который сопоставляет все возможные входы с их правильными выходами. Такая программа будет считаться жестко закодированным решением, а не алгоритмическим ( даже если жестко закодированная программа может быть выходом алгоритмической программы).
Softcoding — термин компьютерного кодирования , который относится к получению значения или функции из некоторого внешнего ресурса, такого как текстовые файлы , INI-файлы , макросы препроцессора , внешние константы, файлы конфигурации , аргументы командной строки , базы данных, пользовательский ввод, ответы HTTP-сервера. Это противоположность hardcoding , который относится к кодированию значений и функций в исходном коде.
Избегать жесткого кодирования часто изменяемых значений — это хорошая практика программирования. Пользователи программного обеспечения должны иметь возможность настраивать его под свои нужды, в разумных пределах, без необходимости редактировать исходный код программы. Аналогично, осторожные программисты избегают магических чисел в своем коде, чтобы улучшить его читаемость и облегчить обслуживание. Эти практики обычно не называются мягким кодированием .
Термин обычно используется там, где софткодирование становится анти-шаблоном . Абстрагирование слишком большого количества значений и функций может привести к большей сложности и проблемам обслуживания, чем при изменении кода по мере необходимости. Софткодирование в этом смысле было представлено в статье на The Daily WTF . [3]
В крайнем случае, программы с программным кодированием разрабатывают свои собственные плохо спроектированные и реализованные языки сценариев и файлы конфигурации, для редактирования которых требуются продвинутые навыки программирования. Это может привести к созданию утилит для помощи в настройке исходной программы, и эти утилиты часто сами оказываются «программными».
Граница между правильной настраиваемостью и проблемным программным кодированием меняется в зависимости от стиля и характера программы. Программы с закрытым исходным кодом должны быть очень настраиваемыми, поскольку конечный пользователь не имеет доступа к исходному коду для внесения каких-либо изменений. Внутреннее программное обеспечение и программное обеспечение с ограниченным распространением могут быть менее настраиваемыми, поскольку распространение измененных копий проще. Настраиваемые веб-приложения часто лучше всего подходят с ограниченной настраиваемостью, поскольку изменение скриптов редко бывает сложнее, чем изменение файла конфигурации.
Чтобы избежать софткодирования, оцените ценность для конечного пользователя любой дополнительной гибкости, которую вы предоставляете, и сравните ее с возросшей сложностью и соответствующими расходами на постоянное обслуживание, которые влечет за собой дополнительная конфигурируемость.
Существует несколько законных шаблонов проектирования для достижения гибкости, которую пытается обеспечить софткодинг. Приложение, требующее большей гибкости, чем это уместно для файла конфигурации, может выиграть от включения языка сценариев . Во многих случаях подходящим дизайном является доменно-специфический язык, интегрированный в устоявшийся язык сценариев. Другой подход заключается в перемещении большей части функциональности приложения в библиотеку, предоставляющую API для приложений, связанных с написанием, быстро.