Условная компиляция
В компьютерном программировании условная компиляция — это метод компиляции , который приводит к созданию различных исполняемых программ в зависимости от заданных параметров . Этот метод обычно используется, когда эти различия в программе необходимы для ее запуска на разных платформах или с разными версиями необходимых библиотек или оборудования .
Многие языки программирования поддерживают условную компиляцию. Обычно директивы компилятора определяют или «отменяют определение» определенных переменных ; другие директивы проверяют эти переменные и соответствующим образом изменяют компиляцию. Например, если не используется реальный язык, компилятор может быть настроен на определение «Macintosh» и отмену определения «PC», а код может содержать:
(* System generic code *)
if mac != Null then
(* macOS specific code *)
else if pc != Null
(* Windows specific code *)
В C и некоторых языках с похожим синтаксисом это делается с помощью директивы #ifdef .
Похожая процедура, получившая название « условный комментарий », используется Microsoft Internet Explorer версий с 5 по 9 для интерпретации HTML- кода. Существует также аналогичный запатентованный механизм добавления условных комментариев в JScript , известный как условная компиляция . [1]
Критика [ править ]
Когда условная компиляция зависит от слишком большого количества переменных, это может затруднить анализ кода, поскольку количество возможных комбинаций конфигурации увеличивается в геометрической прогрессии. [2] [3] [4] Когда условная компиляция выполняется с помощью препроцессора , который не гарантирует синтаксически правильный вывод на исходном языке, например препроцессора C , это может привести к трудно отлаживаемым ошибкам компиляции. [5] [6] [7] который иногда называют «адом #ifdef». [8] [9]
Ссылки [ править ]
- ^ «Условная компиляция» . Корпорация Майкрософт. Архивировано из оригинала 6 сентября 2008 г. Проверено 27 ноября 2011 г.
- ^ Газзилло, Пол; Вэй, Шии (27 мая 2019 г.). «Условная компиляция мертва, да здравствует условная компиляция!» (PDF) . ICSE-NIER '19: Материалы 41-й Международной конференции по программной инженерии: новые идеи и новые результаты . 41-я Международная конференция IEEE/ACM по разработке программного обеспечения: новые идеи и новые результаты (ICSE-NIER) , 2019 г. Монреаль, Квебек, Канада: IEEE Press. стр. 105–108. doi : 10.1109/ICSE-NIER.2019.00035 . ISBN 978-1-7281-1758-4 . Архивировано (PDF) из оригинала 7 ноября 2022 г. Проверено 21 января 2023 г.
- ^ Мейнике, Йенс; Тум, Томас; Шретер, Реймар; Бендун, Фабиан; Лейх, Томас; Сааке, Гюнтер (2017). Мейнике, Йенс; Тум, Томас; Шретер, Реймар; Бендун, Фабиан (ред.). Обеспечение качества условной компиляции . Чам: Международное издательство Springer. стр. 131–139. дои : 10.1007/978-3-319-61443-4_12 . ISBN 978-3-319-61443-4 . Проверено 21 января 2023 г.
{{cite book}}
:|work=
игнорируется ( помогите ) - ^ «Компилятор. Как условная компиляция влияет на качество продукта, безопасность и сложность кода?» . Обмен стеками программной инженерии . Проверено 21 января 2023 г.
- ^ Ле, Дюк; Уокингшоу, Эрик; Эрвиг, Мартин (18 сентября 2011 г.). «#ifdef подтвердил вредность: продвижение понятных вариаций программного обеспечения». Симпозиум IEEE 2011 по визуальным языкам и человеко-ориентированным вычислениям (VL/HCC) . стр. 143–150. дои : 10.1109/VLHCC.2011.6070391 . ISBN 978-1-4577-1246-3 .
- ^ «условная компиляция. Почему следует избегать #ifdef в файлах .c?» . Переполнение стека . Проверено 21 января 2023 г.
- ^ «С++ — что можно и чего нельзя делать при условной компиляции» . Переполнение стека . Проверено 21 января 2023 г.
- ^ Прешерн, Кристофер (3 июля 2019 г.). Шаблоны, которые помогут избежать ада #ifdef (PDF) . Материалы 24-й Европейской конференции по шаблонным языкам программ . ЕвроПЛоп '19. Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. стр. 1–12. дои : 10.1145/3361149.3361151 . ISBN 978-1-4503-6206-1 . Архивировано (PDF) из оригинала 21 декабря 2022 г.
- ^ «Жизнь в аду #ifdef» . www.cqse.eu. 28 октября 2015 г. Архивировано из оригинала 28 ноября 2022 г. Проверено 21 января 2023 г.