Что такое исполняемый файл
Раньше его покупали на «Горбушке», а сегодня можно сделать своими руками
Мы кликаем на иконку на рабочем столе и через несколько мгновений уже играем в любимую игру или работаем с документом в офисном приложении. Но что и как происходит в компьютере за эти мгновения? Давайте разберёмся.
Что такое исполняемый файл
То, что выглядит для нас как иконка с подписью, для компьютера — ссылка на конкретный файл, а двойным кликом мышью по иконке мы даем команду компьютеру открыть этот файл.
В операционной системе нашего компьютера (пока для простоты будем считать, что это Windows) прописаны правила, определяющие, какими программами открывать файлы разных типов: если кликнутый файл был с расширением .docx, он откроется в текстовом редакторе, если с расширением .py — выполнится в интерпретаторе языка Python, с расширением .bat/.cmd — командным интерпретатором.
Однако есть уникальный тип файла, который ОС выполняет без программ-посредников...
Это бинарный исполняемый файл, содержащий прямые инструкции на машинном коде для процессора. В Windows такие файлы имеют расширение .exe (от англ. executable — исполняемый). Вот фрагмент бинарного исполняемого файла в шестнадцатеричном представлении:
BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
Это не просто набор символов, а код программы, выводящей на экран сообщение «Hello World». Согласитесь, для нас это выглядит как шифр, но для процессора — это понятные команды.
Как создаются исполняемые файлы?
Первым программистам приходилось не только составлять программы, но и переводить их в бинарный код вручную. Чтобы облегчить их работу, создали Assembler — программу-транслятор, которая переводит с низкоуровневого языка программирования в двоичный код. Вот так выглядит текст программы «Hello World» на assembler:
.model small
.stack 100h
.data message db 'Hello World',13,10,'$' ;
.code
start:
mov ax, @data
mov ds, ax
mov dx, offset message
mov ah, 09h
int 21h
mov ah, 4Ch
int 21h
end start
Код стал читабельнее, но не сильно проще: ведь «Ассемблер» — высокоуровневый язык, каждая его команда соответствуют отдельной инструкции процессора. И быстро писать на этом языке не получится. А программ со временем требовалось всё больше и больше, и, чтобы ускорить процесс их разработки, были придуманы высокоуровневые языки. На большинстве из них «Hello world» выглядит приблизительно так:
print("Hello world")
Языки высокого уровня — это набор команд и синтаксических правил языка, и программа-транслятор, переводящая программы с этого языка в машинный код. Трансляторы по способу работы делятся на компиляторы и интерпретаторы.
Интерпретаторы выполняют код программ построчно, переводя каждую строку с языка высокого уровня в блок байт-кода для процессора. Интерпретируемый код выполняется медленнее, но его быстрее отлаживать и модифицировать.
Компиляторы переводят сразу весь текст программы в байт-код, и записывают его в файл, называемый объектным. Затем объектный файл компонуется с библиотеками в бинарный исполняемый файл.
Если исполняемый файл содержит в себе всё необходимое для своей работы, он может быть выполнен на любом компьютере без дополнительных действий, и называется портативным («portable»). Такими были почти все программы на заре эры персональных компьютеров.
Но со временем программы усложнились, стали многомодульными, им необходимы мультимедиа-данные и внешние библиотеки, поэтому теперь большинство программ не станут работать без предварительной установки (инсталляции) на компьютере.
Так что ещё одна забота программиста — создание установочного пакета (инсталлятора). Инсталлятор — это исполняемый бинарный файл, который содержит внутри архив всех компонентов программы и специальный скрипт, где расписан процесс установки по шагам. При запуске на компьютере инсталлятор распакует архив и по скрипту распределит модули программы в нужные каталоги, проверит наличие в операционной системе необходимых библиотек, скачает из интернета и установит недостающие, зарегистрирует программу в операционной системе и создаст ярлычки на рабочем столе и в меню «Пуск». Красота!
Как программы попадают на компьютеры?
В корпоративной сфере на все офисные компьютеры софт устанавливают системные администраторы по локальной сети.
Но где обычному человеку брать программы или установочные пакеты? До широкого распространения интернета «домашние» пользователи передавали их из рук в руки на дискетах, CD-дисках и флешках...
А также — о ужас! — покупали диски с программами на компьютерных рынках.
Но это было крайне небезопасно из-за компьютерных вирусов, и очень неудобно: просто представьте, что за нужной программой вам нужно ехать после работы на рынок на другом конце города.
Поэтому с проникновением интернета в каждый дом физические способы получения программ были вытеснены скачиванием их с сайтов компаний-разработчиков или с сайтов, содержащих каталоги программ. И если официальные сайты гарантировали отсутствие вирусов, то при скачивании из анонимных сетевых каталогов пользователь получал «кота в мешке», иногда довольно злобного.
Бродить по всемирной сети в поисках нужной программы, конечно, комфортнее, чем по условному компьютерному рынку «Горбушка».
Но было бы куда удобнее собрать все проверенные, безопасные программы в одном надежном глобальном сетевом каталоге. Идея магазина приложений была реализована в 2004 году в виде Windows Marketplace.
А ещё очень удобно было бы иметь в операционной системе программу, которая периодически проверяет актуальность всех установленных программ, незаметно для пользователя скачивает и ставит обновления (как «Центр Обновления» Windows, только для программ).
Эта концепция пришла из мира UNIX и Linux и называется «Система управления пакетами» или «Package manager». Но Windows Marketplace такого не умел, поэтому в 2012 году под влиянием уже существующих Мас App Store и Google Play появился его преемник — Windows Store. Это была уже платформа, сочетающая каталог программ, магазин и менеджер пакетов установки, но... Только для новых проверенных компанией Microsoft программ с интерфейсом Metro, появившимся в Windows 8.
А классические приложения для Windows, которых за примерно 20 лет доминирования операционной системы на рынке было создано несколько миллионов, продолжали пользоваться собственными механизмами обновления или не обновлялись вовсе. Только с выходом Windows 10 магазин приложений (теперь он называется Microsoft Store) и его каталог стали доступны для всех программ. И до сих пор в силу истории развития Windows в ней не работает единый механизм установки и обновления софта, хотя технически он уже есть.
Итак, разобрались с тем, такое бинарные исполняемые файлы в мире Windows, как они создаются и распространяются. А как в других мирах?
Исполняемые файлы в других операционных системах
Во всех сегодняшних операционных системах есть бинарные исполняемые файлы, но у них разный внутренний формат. Поэтому нельзя просто взять и запустить exe-файл из ОС Windows на MacBook, или .bin-файл из Linux на Windows. Но при разнице в деталях общие принципы распространения и установки программ есть во всех операционных системах!
Linux — это целый род операционных систем (на текущий момент более 300 актуальных дистрибутивов), разделенных на семейства. А в каждой семье, как в реальном мире — свои правила.
Хорошо еще, что во всех дистрибутивах этого рода операционных систем единый формат бинарных исполняемых файлов и договоренность присваивать им расширение .bin. Также все дистрибутивы Linux придерживаются одного принципа установки и обновления программ, который называется Система управления пакетами или менеджер пакетов. А вот дальше начинаются расхождения в правилах: пакетные менеджеры и формат пакетов в разных семействах Linux разные, вот самые известные из них:
- RPM и yum используются в дистрибутивах Red Hat, Fedora, Mandriva, openSUSE и других,
- dpkg и apt — в Debian и большом семействе дистрибутивов, основанных на нём: Ubuntu, Astra Linux, Kali Linux, Linux Mint и др.,
- Pacman — в Arch Linux и его семействе: Antergmos, Parabola GNU, ConnochaetOS, Manjaro и др.,
- Portage — в Gentoo Linux и дистрибутивах, основанных на нём.
Каждый из этих пакетных менеджеров работает со своим каталогом программ («репозиторием»). Это может привести, хотя и в редких случаях, к ситуации, когда нужной программы в виде установочного пакета нет ни в репозитории его дистрибутива Linux, ни на сайте автора программы. Тогда linux-пользователь может скачать исходный код нужной программы с сайта автора, своими руками скомпилировать и скомпоновать программу в исполняемый файл, благо, в состав любого Linux входит набор компиляторов для распространённых языков и средства компоновки.
А ещё все пакетные менеджеры — это консольные утилиты, работающие в терминале. Ну а что поделать!
Менеджер пакетов скачивает список с номерами последних версий программ и обновляет устаревшие через «терминал» в Linux Mint
ОС Linux появилась в 1991 году, когда основным способом взаимодействия человека с компьютером был «терминал», то есть клавиатура и дисплей, способный отображать только буквы и цифры.
Человек вводил команды с клавиатуры, машина отчитывалась о результатах их выполнения на дисплее. Хорошее было время...
Но в последнее время появляется всё больше Linux-дистрибутивов, ориентированных на пользователей, которые привыкли работать в Windows и всё делать мышкой. В составе таких дистрибутивов (Linux Mint, elementaryOS, Manjaro и др.) обязательно есть менеджер установки программ с графическим интерфейсом под мышь, нечто вроде магазина приложений от Microsoft или Apple, только программ немного, зато все бесплатны, это же Linux.
Менеджер установки программ в Linux Mint
В macOS бинарные исполняемые файлы, как правило, имеют расширение .app (application). За установку и обновление пакетов программ отвечает Mac App Store (не путать с отдельным App Store для мобильных устройств на iOS).
Каталог магазина открыт для всех разработчиков программ, но модерируется в соответствии со строгой политикой Apple. В macOS возможна как ручная установка программ, скачанных из интернета (традиционный способ в Windows), так и установка программ из независимых каталогов с помощью консольных менеджеров пакетов (как в Linux), например, Homebrew. Но большинству обладателей MacBook достаточно родного магазина приложений, поскольку он хорошо интегрирован в систему и радует обширным каталогом действительно качественных программ.
Как видите, различий не так много, потому что миры разных операционных систем не изолированы, и разработчики «вдохновляются» идеями друг друга. Ну и прекрасно — а мы едем дальше!

