Файл содержащий программу в виде в котором она может быть исполнена компьютером это модуль

Обновлено: 07.07.2024

Исполняемый файл - словосочетание, довольно часто встречающееся, в основном, в документации. В живом общении (в том числе и в виртуальном) для обозначения данного вида файлов пользователи используют менее громоздкие термины, более точно отражающие, что именно они имеют в виду.

Итак, что же скрывается за этим словосочетанием? Исполняемыми файлами называются файлы, содержащие в себе готовые к запуску компьютерные программы. В зависимости от того, в каком виде записана программа в исполняемом файле, выделяют две большие подгруппы файлов данного класса. Первая подгруппа - это бинарные файлы; они содержат в себе запись программы в виде специальных машинных кодов, которые, чаще всего, передаются непосредственно процессору. Такие файлы ещё сокращённо называют бинарниками. В противоположность им существуют исполняемые файлы, в которых программа записана в виде текста - то есть, в том самом виде, в каком с ней работал создавший её программист. Такие исполняемые файлы называют скриптами. Также этот термин нередко употребляют и по отношению к самим программам, которые хранятся в подобных файлах.

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

В Windows наиболее распространены бинарные исполняемые файлы. Самый часто встречающийся их вид - это приложение. Приложения имеют расширения EXE и могут запускаться самостоятельно. Помимо них, существуют динамические библиотеки (их расширение - DLL), которые содержат в себе общие для разных приложений функции. Ещё есть драйверы (DRV или VXD) - специальные программы, нужные для того, чтобы система могла взаимодействовать с конкретными моделями тех или иных устройств. Исполняемые файлы (в Windows особенно) могут зависеть друг от друга: например, для запуска любого приложения нужны определённые системные динамические библиотеки, а им, в свою очередь, нужны драйверы.

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

Исполни́мый (исполня́емый) мо́дуль, исполнимый файл (англ. executable file ) — файл, содержащий программу в виде, в котором она может быть (после загрузки в память и настройки по месту) исполнена компьютером.

Чаще всего он содержит двоичное представление машинных инструкций для определённого процессора (по этой причине на программистском сленге в отношении него используют слово бинарник — кальку с английского binary), но может содержать и инструкции на интерпретируемом языке программирования, для исполнения которых требуется интерпретатор. В отношении последних часто используется термин «скрипт».

Статус исполнимости файла чаще всего определяется принятыми соглашениями. Так, в одних операционных системах исполнимые файлы распознаются благодаря соглашению об именовании файлов (например, путём указания в имени расширения файла — .exe или .bin), тогда как в других исполнимые файлы обладают специфичными метаданными (например, битом разрешения execute в UNIX-подобных операционных системах).

В современных компьютерных архитектурах исполнимые файлы содержат большие объемы данных, не являющихся компьютерной программой: описание программного окружения, в котором программа может быть выполнена, данные для отладки программы, используемые константы, данные, которые могут потребоваться операционной системе для запуска процесса (например, рекомендуемый размер кучи), и даже описания структур окон графической подсистемы, используемых программой.

Зачастую исполнимые файлы содержат вызовы библиотечных функций, например, вызовы функций операционной системы. Таким образом, наряду с процессорозависимостью (машинозависимым является любой бинарный исполнимый файл, содержащий машинный код) исполнимым файлам может быть свойственна зависимость от версии операционной системы и её компонент.

В настоящее время существует большое количество файловых форматов исполняемых файлов для различных операционных систем. При этом документация, хотя и существует, зачастую разрознена или практически недоступна (например, описание формата LX/LE становится всё сложнее и сложнее найти). Плюс к этому различные производители программного обеспечения вводят дополнительные расширения, которые, зачастую, становится трудно сопоставить с оригинальным форматом или они взаимоисключающие.

Данная работа является попыткой составить единый справочник по работе с исполняемыми файлами, их анализа, разбора и создания исполняемого образа, готового для работы в памяти. Скриптовый формат исполняемых файлов оставим на откуп соответствующих руководств по языкам программирования, а рассмотрим именно двоичные форматы.

Развитие машин класса IBM PC привело к появлению новых режимов адресации, появлению виртуальной памяти и прочих механизмов, что делало формат .EXE MZ недостаточно гибким и не приспособленным к реалиям. В частности, многие производители реализовывали так называемые оверлеи, что позволяло осуществлять простейшую подкачку нужных функций в ОЗУ. Плюс, неэффективное использование повторяющегося исполняемого кода привело к реализации библиотек динамического связывания, код которых мог использоваться различными процессами без его дублирования в физической памяти. В итоге формат .EXE был расширен и были реализованы его более современные версии LX/LE и NE.

Формат .EXE NE был разработан Microsoft для применения в операционной системе OS/2 и оболочки Windows. Данный формат ориентирован, как и .EXE MZ, на 16-разрядные среды исполнения. Основная дополнительная функциональность, обеспечиваемая данным форматом - это поддержка .DLL.

С приходом на рынок микропроцессоров 386+ возникла необходимость поддержки 32-разрядного кода, что, естественно, привело к появлению такого формата, как LE (использовался в оболочках семейства Windows 3.x и операционных систем семейства Windows 9x) и LX (использовался в операционной системе OS/2). Данные форматы позволили смешивать как 16-битный код, так и 32-битный. Кроме смешанного кода переходной период также потребовал реализации такого механизма, как thunking, что также наложило отпечаток на данные форматы файлов.

При разработке OS/2 NT 3.0 (в последующем - Windows NT 3.51) был разработан формат .EXE PE, который был предназначен для хранения кода ориентированного на различные аппаратные платформы. В настоящее время данный формат является основным для семейства операционных систем Windows.

В кросс платформенной OS/2 (OS/2 PPC, Workstation OS) конечным форматом файлы был принят формат ELF, о котором будет сказано несколько дальше.

В мире операционных систем семейства Unix также наблюдалось развитие форматов исполняемых файлов. Первый формат, a.out, появился с первой версией UNIX. На наименование повлияла специфика процесса получения двоичного файла. В отличие от систем семейства CP/M, для которых всегда была характерна нехватка памяти, Unix системы позволяли осуществлять полный цикл: компиляция, компиляция, компоновка. a.out - это сокращение от assembler output. Формат a.out по структуре похож на форматы .EXE. За свое существование претерпел ряд модификаций.

С появлением разделяемых библиотек формат a.out из-за ряда ограничений был заменен на формат COFF. Из основных нововведений - это добавление отладочной информации и относительного виртуального адреса, что позволило загружать его по произвольному фактическому адресу. Использование формата COFF в Unix системах в настоящее время ограничено, однако формат .EXE PE является наиболее известным вариантом формата COFF.

Формат COFF был принят не всеми производителями семейства Unix и многие все еще продолжали использовать a.out. Ситуация изменилась с появлением формата ELF. Достаточно удачное решение и учет того, что формат не был ориентирован под специфические особенности определенной архитектуры, он получил широкое распространение. Большинство современных реализаций Unix и ряд других операционных систем используют именно его. Существует также "универсальный" формат ELF, содержащий двоичные образы для большинства различных платформ. Сложно сказать, будет ли формат FatELF широко использован, но если оглянуться на историю подобный "многосистемных" форматов, то, скорее всего, FatELF не получит широкого распространения.

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

Обычно, в исполняемом файле данные (информация) хранятся в каком-либо формате (например, ELF; см. список) и состоят из нескольких частей:

  • заголовки [⇨] ;
  • инструкции (код) [⇨] ;
  • другое [⇨] .

Содержание

Заголовки

В заголовках могут указываться:

  • предполагаемые исполнители инструкций;
  • параметры (настройки) исполнителя инструкций и окружения;
  • формат инструкций (кода).

Инструкции

Инструкции (код) — это:

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

Обычно, инструкции предназначены для ограниченного набора исполнителей, например, только для процессоров архитектуры x86-64, или только для виртуальной машины Java. Кроме того, исполняемые файлы зачастую содержат вызовы библиотечных функций, в частности, вызовы функций ОС. Таким образом, исполняемым файлам может быть свойственна зависимость не только от архитектуры, но и от версий:

  • библиотек;
  • ядра ОС;
  • компонентов (модулей) ОС.

Исполняемый файл отличают от других файлов:

Другое

Кроме заголовков и инструкций (кода), исполняемые файлы могут содержать:

Для уменьшения размера исполняемые файлы или их части могут сжиматься (см. упаковка исполняемых файлов).

См. также

Напишите отзыв о статье "Исполнимый модуль"

Примечания

<imagemap>: неверное или отсутствующее изображение

  • Найти и оформить в виде сносок ссылки на независимые авторитетные источники, подтверждающие написанное.К:Википедия:Статьи без источников (тип: не указан)

Отрывок, характеризующий Исполнимый модуль

Дух войска – есть множитель на массу, дающий произведение силы. Определить и выразить значение духа войска, этого неизвестного множителя, есть задача науки.
Задача эта возможна только тогда, когда мы перестанем произвольно подставлять вместо значения всего неизвестного Х те условия, при которых проявляется сила, как то: распоряжения полководца, вооружение и т. д., принимая их за значение множителя, а признаем это неизвестное во всей его цельности, то есть как большее или меньшее желание драться и подвергать себя опасности. Тогда только, выражая уравнениями известные исторические факты, из сравнения относительного значения этого неизвестного можно надеяться на определение самого неизвестного.
Десять человек, батальонов или дивизий, сражаясь с пятнадцатью человеками, батальонами или дивизиями, победили пятнадцать, то есть убили и забрали в плен всех без остатка и сами потеряли четыре; стало быть, уничтожились с одной стороны четыре, с другой стороны пятнадцать. Следовательно, четыре были равны пятнадцати, и, следовательно, 4а:=15у. Следовательно, ж: г/==15:4. Уравнение это не дает значения неизвестного, но оно дает отношение между двумя неизвестными. И из подведения под таковые уравнения исторических различно взятых единиц (сражений, кампаний, периодов войн) получатся ряды чисел, в которых должны существовать и могут быть открыты законы.
Тактическое правило о том, что надо действовать массами при наступлении и разрозненно при отступлении, бессознательно подтверждает только ту истину, что сила войска зависит от его духа. Для того чтобы вести людей под ядра, нужно больше дисциплины, достигаемой только движением в массах, чем для того, чтобы отбиваться от нападающих. Но правило это, при котором упускается из вида дух войска, беспрестанно оказывается неверным и в особенности поразительно противоречит действительности там, где является сильный подъем или упадок духа войска, – во всех народных войнах.
Французы, отступая в 1812 м году, хотя и должны бы защищаться отдельно, по тактике, жмутся в кучу, потому что дух войска упал так, что только масса сдерживает войско вместе. Русские, напротив, по тактике должны бы были нападать массой, на деле же раздробляются, потому что дух поднят так, что отдельные лица бьют без приказания французов и не нуждаются в принуждении для того, чтобы подвергать себя трудам и опасностям.


Так называемая партизанская война началась со вступления неприятеля в Смоленск.
Прежде чем партизанская война была официально принята нашим правительством, уже тысячи людей неприятельской армии – отсталые мародеры, фуражиры – были истреблены казаками и мужиками, побивавшими этих людей так же бессознательно, как бессознательно собаки загрызают забеглую бешеную собаку. Денис Давыдов своим русским чутьем первый понял значение той страшной дубины, которая, не спрашивая правил военного искусства, уничтожала французов, и ему принадлежит слава первого шага для узаконения этого приема войны.
24 го августа был учрежден первый партизанский отряд Давыдова, и вслед за его отрядом стали учреждаться другие. Чем дальше подвигалась кампания, тем более увеличивалось число этих отрядов.
Партизаны уничтожали Великую армию по частям. Они подбирали те отпадавшие листья, которые сами собою сыпались с иссохшего дерева – французского войска, и иногда трясли это дерево. В октябре, в то время как французы бежали к Смоленску, этих партий различных величин и характеров были сотни. Были партии, перенимавшие все приемы армии, с пехотой, артиллерией, штабами, с удобствами жизни; были одни казачьи, кавалерийские; были мелкие, сборные, пешие и конные, были мужицкие и помещичьи, никому не известные. Был дьячок начальником партии, взявший в месяц несколько сот пленных. Была старостиха Василиса, побившая сотни французов.
Последние числа октября было время самого разгара партизанской войны. Тот первый период этой войны, во время которого партизаны, сами удивляясь своей дерзости, боялись всякую минуту быть пойманными и окруженными французами и, не расседлывая и почти не слезая с лошадей, прятались по лесам, ожидая всякую минуту погони, – уже прошел. Теперь уже война эта определилась, всем стало ясно, что можно было предпринять с французами и чего нельзя было предпринимать. Теперь уже только те начальники отрядов, которые с штабами, по правилам ходили вдали от французов, считали еще многое невозможным. Мелкие же партизаны, давно уже начавшие свое дело и близко высматривавшие французов, считали возможным то, о чем не смели и думать начальники больших отрядов. Казаки же и мужики, лазившие между французами, считали, что теперь уже все было возможно.

Исполняемый файл [1] (англ. executable file , также выполняемый, реже исполнимый, выполнимый) — файл, содержащий программу в виде, в котором она может быть исполнена компьютером. Перед исполнением программа загружается в память, и выполняются некоторые подготовительные операции (настройка окружения, загрузка библиотек).

Обычно в исполняемом файле данные (информация) хранятся в каком-либо формате (например, ELF; см. список) и состоят из нескольких частей:

Содержание

В заголовках могут указываться:

  • предполагаемые исполнители инструкций;
  • параметры (настройки) исполнителя инструкций и окружения;
  • формат инструкций (кода).

Исполнитель инструкций — это некий аппаратно-программный или программный комплекс, способный исполнить инструкции (код). Примеры исполнителей [2] :

Инструкции (код) — это:

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

Обычно, инструкции предназначены для ограниченного набора исполнителей, например, только для процессоров архитектуры x86-64, или только для виртуальной машины Java. Кроме того, исполняемые файлы зачастую содержат вызовы библиотечных функций, в частности, вызовы функций ОС. Таким образом, исполняемым файлам может быть свойственна зависимость не только от архитектуры, но и от версий:

Исполняемый файл отличают от других файлов:

Кроме заголовков и инструкций (кода), исполняемые файлы могут содержать:

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

Для уменьшения размера исполняемые файлы или их части могут сжиматься (см. упаковка исполняемых файлов).

Исполняемый файл — файл, который может быть обработан или выполнен компьютером без предварительной трансляции. Обычно исполняемый файл: получается в результате трансляции и компоновки объектных модулей; содержит машинные команды и/или команды операционной системы.… … Финансовый словарь

файл — поименованная совокупность байтов, записанная на жёстком или гибком магнитном диске, в которой хранится отдельный элемент файловой системы, напр. документ Word или рисунок. Вся информация, записанная на магнитный диск, представлена блоками байтов … Энциклопедия техники

Файл заголовков — Заголовочный файл (иногда головной файл, англ. header file) (или подключаемый файл) в языках программирования Си и C++ файл, содержащий определения типов данных, структуры, прототипы функций, перечисления, макросы препроцессора. Имеет по… … Википедия

исполняемый код — 3.4. исполняемый код : Файл, установленный в вычислительном компоненте СИ, электронном устройстве или его части (ПЗУ, жесткий диск и т.д.). Микропроцессор интерпретирует содержимое файла (код) и преобразует его в определенные логические,… … Словарь-справочник терминов нормативно-технической документации

Исполняемый модуль — Исполнимый (исполняемый) модуль (также исполнимый файл, англ. executable file) это разновидность файла, содержимое которого является готовой к непосредственному исполнению компьютерной программой. Чаще всего он содержит двоичное представление… … Википедия

Заголовочный файл — (иногда головной файл, англ. header file), или подключаемый файл в языках программирования файл, механически «вставляемый» компилятором в исходный текст в том месте, где располагается некоторая директива ( <$I file.inc>в Паскале,… … Википедия

SafeDisc — Работа с оптическими дисками Оптический диск Образ оптического диска, ISO образ Эмулятор оптических дисководов Программное обеспечение для работы с файловыми системами оптических дисков Технологии записи Режимы записи Пакетная запись Типы… … Википедия

SafeDisk — SafeDisc это система защиты от копирования для Windows приложений и игр, разработанная Macrovision Corporation. Содержание 1 Цели 2 Уязвимости 3 История версий 3.1 SafeDisc (V1) … Википедия

Portable Executable — Переносимый исполняемый файл Расширение .exe, .dll, .ocx, .sys, .scr, .drv, .cpl Сигнатура MZ (опционально), PE Разработан Microsoft Тип формата двоичный, исполняемый, объектный … Википедия

Взлом программного обеспечения — (англ. software cracking) действия, направленные на устранение защиты программного обеспечения (ПО), встроенной разработчиками для ограничения функциональных возможностей. Последнее необходимо для стимуляции покупки такого… … Википедия

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

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

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

Скрипты, модули и библиотеки главное изображение

В динамических языках файлы с кодом могут выполнять две разных роли: быть исполняемым скриптом, либо быть модулем. В зависимости от роли на эти файлы накладываются разные ограничения, они по-разному устроены и ведут себя тоже по-разному.

На проектах Хекслета студентам приходится писать и то и другое. При этом совершаются типовые ошибки, которые усложняют тестирование кода, его поддержку и расширяемость. Эта статья помогает разобраться с тем, что есть что, и как правильно организовывать код. Бонусом идет объяснение принципов создания утилит командной строки.

Примеры в этой статье приводятся на JavaScript, но язык не принципиален. Все эти особенности присущи и остальным динамическим языкам, таким как PHP, Python или Ruby.

Модуль

Начнем с терминологии. Модуль — это файл, содержащий определения функций, классов и других сущностей (в зависимости от языка). В разных языках модули называют разными словами, но суть от этого не меняется. Ниже пример модуля, содержащего класс User :

Сами по себе модули не являются законченными программами. Их нельзя (бессмысленно) выполнять напрямую, например, запустив в командной строке. Модули предназначены для использования другими модулями (или скриптами). Обычно в языках для этого есть либо механизм импортов, либо механизм автозагрузки, либо то и другое вместе. В JavaScript, чтобы получить доступ к определениям внутри какого-то модуля, его нужно импортировать:

Частая ошибка, которую совершают новички при создании модулей, – выполнение кода вне определений. Например, так:

В какой момент вызовется эта функция? Она будет вызвана ровно в тот момент, когда этот файл будет загружен через импорт или автозагрузку.

В некоторых языках так написать просто невозможно, например, в Java. Компилятор это просто не пропустит. В других языках такой код запрещен стандартами кодирования. Например, линтер в PHP выводит следующее предупреждение:

A file SHOULD declare new symbols (classes, functions, constants, etc.) and cause no other side effects, or it SHOULD execute logic with side effects, but SHOULD NOT do both.

Почему? Главная причина в непредсказуемости поведения. Код, определенный на уровне модуля (вне других функций), вызывается во время автозагрузки или при импорте. Причём не всегда можно точно сказать, где это происходит и сколько раз. Обычно за загрузку кода отвечает какой-либо фреймворк.

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

Помимо указанных особенностей подобный код часто выполняет побочные эффекты, меняет внутреннее состояние программы, например, глобальные переменные. Это значит, что после загрузки такого модуля у вас вдруг внезапно программа начинает вести себя по-другому. Особенно этим грешат Ruby и Javascript.

Чтобы быть до конца справедливым, иногда это оправдано.

И последнее по списку, но не последнее по важности. Подобные вызовы могут блокировать возможность тестирования. Например, если на уровне модуля есть подобный вызов:

Такой файл будет невозможно загрузить в среду, где отсутствует document . И подмену тоже никак не сделать, так как модуль – это не функция, он не позволяет реализовать инверсию зависимостей.

Если модуль написан правильно, то его безопасно включать в другие модули, и он может быть протестирован.

Скрипт

Что такое скрипт? Скрипт – это любой файл, который предназначен для запуска из командной строки. Он может быть исполняемым, но в общем случае это не обязательно:

Этот скрипт содержит вызов функции, которая печатает на экран текущую дату:

Сам скрипт запускается не напрямую, а через интерпретатор. Такой подход часто используется во время разработки.

Когда скрипт «выпускается» для использования другими людьми, то наличие интерпретатора скрывают, а сам скрипт делают исполняемым. В некоторых языках, дополнительно, из названия исполняемого файла удаляют расширение. Это связано с тем, что для пользователей этого скрипта становится неважно, на каком языке он написан. В JavaScript этого делать не нужно, потому что имя скрипта не связано с названием файла.

Запуск такого скрипта выглядит так:

Чтобы сделать наш файл date исполняемым, нужно выполнить две задачи:

Добавить шебанг в начало файла:

Такая запись внутри исполняемых файлов (скриптов) помогает командному интерпретатору, например, bash, подобрать правильный интерпретатор для запуска файла на исполнение.

Исполняемый файл предназначен только для прямого запуска. Это тупиковый файл. Его нельзя (технически можно, но нельзя) импортировать в другие модули. Он просто не предназначен для этого. Скрипты могут использовать модули, но модули не могут обращаться к скриптам.

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

Что насчет тестирования? Из-за своей природы скрипты крайне плохо тестируются. С ними нельзя работать, как с обычным кодом. В тестах придётся запускать их как обычную программу и смотреть, что она делает через, например, анализ STDOUT.

Из этого следует одно очень важное правило. Любой нетривиальный скрипт должен быть всего лишь способом запустить библиотечный код.

Библиотеки и утилиты командной строки

Такие пакеты, как eslint или babel, могут использоваться в двух режимах:

  1. Как программы, которые можно запускать из командной строки.
  2. Как библиотеки, которые можно поставить в качестве зависимостей, импортировать в код и вызывать.

При таком подходе, исполняемый файл (скрипт) становится клиентом библиотеки. Он не должен делать ничего, что библиотека должна делать сама. Только в этом случае библиотеку можно будет использовать где-то еще.

Это разделение резко упрощает тестирование. Так как логика сосредоточена внутри библиотеки, то с ней можно работать, как с обычным кодом.

В свою очередь скрипт может иметь отдельную логику, которая не имеет отношения к библиотеке. К такой логике, например, относится парсинг аргументов командной строки: eslint —formatter json src . Эта часть приложения существует только тогда, когда с пакетом работают как с утилитой. Парсинг можно размещать напрямую в скриптах, либо выносить в отдельный модуль, который не связан напрямую с используемой библиотекой.

Читайте также: