Жесткое кодирование
Эта статья нуждается в дополнительных цитатах для проверки . ( май 2021 г. ) |
Жесткое кодирование (также жесткое кодирование или жесткое кодирование ) — это практика разработки программного обеспечения, заключающаяся в встраивании данных непосредственно в исходный код программы или другой исполняемый объект, в отличие от получения данных из внешних источников или их генерации во время выполнения .
Жестко закодированные данные обычно можно изменить только путем редактирования исходного кода и перекомпиляции исполняемого файла, хотя их можно изменить в памяти или на диске с помощью отладчика или шестнадцатеричного редактора .
Данные, которые жестко запрограммированы, лучше всего подходят для неизменяемых фрагментов информации, таких как физические константы , номера версий и статические текстовые элементы.
Данные с программным кодированием, с другой стороны, кодируют произвольную информацию посредством пользовательского ввода , текстовых файлов , файлов INI , ответов HTTP-сервера, файлов конфигурации, макросов препроцессора, внешних констант, баз данных, аргументов командной строки и определяются во время выполнения.
Обзор
[ редактировать ]Жесткое кодирование требует изменения исходного кода программы каждый раз, когда изменяются входные данные или желаемый формат, когда конечному пользователю может быть удобнее изменить детали каким-либо образом вне программы. [1]
Часто требуется жесткое кодирование, но его также можно считать антишаблоном . [2] У программистов может не быть разработанного решения динамического пользовательского интерфейса для конечного пользователя, но они все равно должны предоставить эту функцию или выпустить программу. Обычно это носит временный характер, но в краткосрочной перспективе устраняет необходимость доставки кода. Позже выполняется программное кодирование, позволяющее пользователю передавать параметры, которые дают конечному пользователю возможность изменять результаты или результат.
Термин «жестко закодированный» изначально использовался как аналогия с аппаратными схемами и должен был передать негибкость, возникающую в результате его использования при проектировании и реализации программного обеспечения. В контексте расширяемых сред совместной разработки во время выполнения, таких как MUD , жесткое кодирование также относится к разработке основного механизма системы, ответственного за задачи низкого уровня и выполнение сценариев , в отличие от программного кодирования , которое разрабатывает сценарии высокого уровня, которые получают интерпретируется системой во время выполнения со значениями из внешних источников, таких как текстовые файлы , файлы INI , макросы препроцессора , внешние константы, базы данных , аргументы командной строки , HTTP- сервера ответы , файлы конфигурации и пользовательский ввод . В данном случае этот термин не является уничижительным и относится к общему развитию, а не к конкретному внедрению выходных данных.
Хардкодинг и бэкдоры
[ редактировать ]Жесткое кодирование учетных данных — популярный способ создания бэкдора . Жестко закодированные учетные данные обычно не видны в файлах конфигурации или выводе команд перечисления учетных записей, и пользователи не могут легко изменить или обойти их. В случае обнаружения пользователь может отключить такой бэкдор, изменив и пересобрав программу из ее исходного кода ( если исходный код общедоступен ), декомпилировав или реконструировав программное обеспечение , напрямую отредактировав программы двоичный код или установив целостность. проверки (например, цифровые подписи, защита от несанкционированного доступа и защита от мошенничества ), чтобы предотвратить неожиданный доступ, но такие действия часто запрещены лицензионным соглашением с конечным пользователем .
Жесткое кодирование и DRM
[ редактировать ]В качестве меры управления цифровыми правами разработчики программного обеспечения могут жестко закодировать уникальный серийный номер непосредственно в программе. Или принято жестко запрограммировать открытый ключ , создавая DRM, для которого невозможно создать генератор ключей.
В противоположном случае взломщик программного обеспечения может жестко запрограммировать действительный серийный номер программы или даже запретить исполняемому файлу запрашивать его у пользователя, позволяя перераспределять неавторизованные копии без необходимости ввода действительного номера, таким образом используя один и тот же код. ключ для каждой копии, если она жестко запрограммирована.
Исправлен путь установки
[ редактировать ]Если программа Windows запрограммирована так, что она всегда устанавливается в C:\Program Files\Appname, и кто-то пытается установить ее на другой диск из-за нехватки места или по организационным причинам, она может не установиться или не запустится после установки. Эту проблему можно не выявить в процессе тестирования, поскольку средний пользователь выполняет установку на диск и каталог по умолчанию, а тестирование может не включать возможность изменения каталога установки. Однако программистам и разработчикам желательно не фиксировать путь установки программы, поскольку путь установки по умолчанию зависит от операционной системы, версии ОС и сисадмина решений . Например, во многих установках Microsoft Windows используется диск C:, в качестве основного жесткого диска но это не гарантируется.
Похожая проблема была с микропроцессорами ранних компьютеров, которые начинали выполнение по фиксированному адресу в памяти.
Загрузочный диск
[ редактировать ]Некоторые « защищенные от копирования » программы при запуске ищут определенный файл на дискете или флэш-накопителе, чтобы убедиться, что он не является неавторизованной копией. Если компьютер заменяется новым компьютером, у которого нет дисковода, программу, которая требует его, невозможно запустить, поскольку дискету невозможно вставить.
Этот последний пример показывает, почему жесткое программирование может оказаться непрактичным, даже если на тот момент казалось, что оно будет работать полностью. В 1980-х и 1990-х годах подавляющее большинство компьютеров было оснащено хотя бы одним дисководом для гибких дисков, но позже дисководы для гибких дисков вышли из употребления. Программа, жестко запрограммированная таким образом 15 лет назад, может столкнуться с проблемами, если ее не обновить.
Специальные папки
[ редактировать ]Некоторые операционные системы Windows имеют так называемые специальные папки , которые логически упорядочивают файлы на жестком диске. Существуют проблемы, которые могут возникнуть при жестком кодировании:
Путь к профилю
[ редактировать ]Некоторые программы Windows жестко кодируют путь профиля к местам, определенным разработчиком, например C:\Documents and Settings\Username
. Это путь для подавляющего большинства Windows 2000 или более поздних версий, но это может привести к ошибке, если профиль хранится в сети или перемещается иным образом. Правильный способ получить его — позвонить в GetUserProfileDirectory
функцию или решить %userprofile%
переменная среды. Еще одно предположение, которое часто делают разработчики, — это предположение, что профиль находится на локальном жестком диске.
Путь к папке «Мои документы»
[ редактировать ]Некоторые программы Windows жестко прописывают путь к My Documents
как ProfilePath\My Documents
. Эти программы будут работать на компьютерах с английской версией, но в локализованных версиях Windows эта папка обычно имеет другое имя. Например, в итальянских версиях My Documents
папка называется Documenti . My Documents
также могли быть перемещены с помощью перенаправления папок в групповой политике в Windows 2000 или более поздней версии. Правильный способ получить его — позвонить в SHGetFolderPath
функция.
Решение
[ редактировать ]Косвенную ссылку, такую как переменная внутри программы под названием «Имя файла», можно расширить, открыв диалоговое окно «Обзор файла», и код программы не придется изменять, если файл будет перемещен.
Жесткое кодирование особенно проблематично при подготовке программного обеспечения к переводу на другие языки.
Во многих случаях одно и то же жестко запрограммированное значение, например размер массива, может встречаться в исходном коде программы несколько раз. Это было бы магическое число . Обычно это может привести к ошибке программы, если изменены некоторые проявления значения, но не все. Такую ошибку трудно обнаружить, и она может оставаться в программе долгое время. Аналогичная проблема может возникнуть, если одно и то же жестко закодированное значение используется для более чем одного значения параметра, например, массив из 6 элементов и минимальная длина входной строки 6. Программист может ошибочно изменить все экземпляры значения (часто используя возможность поиска и замены редактора), не проверяя код, чтобы увидеть, как используется каждый экземпляр. Обеих ситуаций можно избежать, определяя константы , которые связывают имена со значениями, и используя имена констант для каждого появления в коде.
Одним из важных случаев жесткого кодирования является размещение строк непосредственно в файле, что заставляет переводчиков редактировать исходный код для перевода программы. (Есть инструмент под названием gettext
это позволяет оставлять строки в файлах, но позволяет переводчикам переводить их без изменения исходного кода; он эффективно дежестко кодирует строки.)
Жесткое программирование на соревнованиях
[ редактировать ]В компьютерных соревнованиях, таких как Международная олимпиада по информатике , участники должны написать программу с определенным шаблоном ввода-вывода в соответствии с требованиями вопросов.
В редких случаях, когда возможное количество входных данных достаточно мало, участник может рассмотреть возможность использования подхода, который сопоставляет все возможные входные данные с их правильными выходными данными. Эта программа будет считаться жестко запрограммированным решением, а не алгоритмическим (даже несмотря на то, что жестко закодированная программа может быть результатом алгоритмической программы).
Программное кодирование
[ редактировать ]Программное кодирование — это термин компьютерного кодирования , который относится к получению значения или функции из некоторого внешнего ресурса, такого как текстовые файлы , файлы INI , препроцессора макросы , внешние константы, файлы конфигурации , аргументы командной строки , базы данных, пользовательский ввод, ответы HTTP-сервера. Это противоположность жесткому кодированию , которое относится к кодированию значений и функций в исходном коде.
Практика программирования
[ редактировать ]Хорошей практикой программирования является отказ от жесткого кодирования часто изменяемых значений. Пользователи программного обеспечения должны иметь возможность настраивать его в соответствии со своими потребностями в разумных пределах без необходимости редактировать исходный код программы. Точно так же осторожные программисты избегают магических чисел в своем коде, чтобы улучшить его читаемость и облегчить обслуживание. Эти методы обычно не называются программным кодированием .
Этот термин обычно используется там, где программное кодирование становится антишаблоном . Абстрагирование слишком большого количества значений и функций может привести к большей сложности и проблемам обслуживания, чем при изменении кода, когда это необходимо. Софткодинг в этом смысле был рассмотрен в статье на The Daily WTF . [3]
Потенциальные проблемы
[ редактировать ]В крайнем случае, программы с программным кодом разрабатывают свои собственные плохо спроектированные и реализованные языки сценариев и файлы конфигурации, для редактирования которых требуются продвинутые навыки программирования. Это может привести к созданию утилит, помогающих в настройке исходной программы, и эти утилиты часто сами оказываются «программно закодированными».
Граница между правильной конфигурацией и проблематичным программным кодированием меняется в зависимости от стиля и характера программы. Программы с закрытым исходным кодом должны быть легко настраиваемыми, поскольку конечный пользователь не имеет доступа к исходному коду для внесения каких-либо изменений. Программное обеспечение собственного производства и программное обеспечение с ограниченным распространением может быть менее настраиваемым, поскольку распространение измененных копий проще. Созданные по индивидуальному заказу веб-приложения зачастую лучше всего имеют ограниченные возможности настройки, поскольку изменение сценариев редко бывает сложнее, чем изменение файла конфигурации.
Чтобы избежать программного кодирования, оцените ценность для конечного пользователя любой дополнительной гибкости, которую вы предоставляете, и сравните ее с возросшей сложностью и соответствующими текущими затратами на обслуживание, которые влечет за собой дополнительная возможность настройки.
Достижение гибкости
[ редактировать ]Существует несколько законных шаблонов проектирования для достижения гибкости, которую пытается обеспечить программное кодирование. Приложение, требующее большей гибкости, чем это необходимо для файла конфигурации, может выиграть от включения языка сценариев . Во многих случаях подходящим проектом является предметно-ориентированный язык, интегрированный в установленный язык сценариев. Другой подход — переместить большую часть функций приложения в библиотеку, предоставляя API для быстрого написания приложений, связанных с написанием приложений.
См. также
[ редактировать ]- Программное обеспечение с закрытым исходным кодом
- Прошивка
- Эффект внутренней платформы
- Правило наименьшей мощности
- Самомодифицирующийся код
Ссылки
[ редактировать ]- ^ Эльфрида Дастин (2002). Эффективное тестирование программного обеспечения: 50 конкретных способов улучшить тестирование . Аддисон-Уэсли Профессионал. стр. 188–. ISBN 978-0-201-79429-8 .
- ^ Таня Янка (14 октября 2020 г.). Алиса и Боб изучают безопасность приложений . Уайли. стр. 15–. ISBN 978-1-119-68740-5 .
- ^ Программное кодирование от The Daily WTF