Реклама
Вы только что загрузили упакованное обновление в ваше любимое приложение с открытым исходным кодом. Все работает хорошо, и вы используете его на других своих устройствах - так что пришло время распространить его и на них.
За исключением того, что ваш новый ноутбук с Linux не совместим с вашим установочным пакетом Windows. Как насчет вашего планшета Android? iPhone? PS4? Почему вы не можете просто взять этот кусок программного обеспечения и использовать его где угодно? Давайте рассмотрим некоторые препятствия на пути к мечте «купи один раз, беги куда угодно».
Разработка программного обеспечения и архитектура ОС
Чтобы понять, почему программное обеспечение не работает в разных операционных системах, требуется немного (я обещаю, немного) знаний о том, как создается программное обеспечение.
Процесс разработки программного обеспечения
В очень простом процессе разработки программного обеспечения для настольных компьютеров, серверов и мобильных устройств (т.е. не веб Программирование против Веб-разработка: в чем разница? Вы можете подумать, что программисты приложений и веб-разработчики выполняют одну и ту же работу, но это далеко от истины. Вот ключевые различия между программистами и веб-разработчиками. Подробнее ), программист будет:
- Введите некоторые код в один или несколько файлов.
- Compile код в то, что компьютер может выполнить.
- Тестовое задание чтобы убедиться, что программа работает, как ожидалось.
- Упаковать и распространить / развернуть программное обеспечение

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

Ядро каждой операционной системы будет реализовывать системные вызовы по-разному, в зависимости от того, какие из них доступны, как они называются или какие опции они выбирают. В результате программное обеспечение должно учитывать системные вызовы, поддерживаемые ядром каждой ОС, для которой оно предназначено. Системный вызов, который вы используете для отправки данных на графический процессор в Linux, может иметь другое имя, список информации, которую вам нужно предоставить, или оба в Windows. Точного звонка может вообще не быть.
Системные библиотеки
Во многих случаях программное обеспечение не обращается напрямую к ядру. Вместо этого он призывает системные библиотекиили коллекции основных функций. Библиотеки существуют, поэтому (например) каждой программе, которая сохраняет файлы на жесткий диск, не требуется писать функцию для этого. Вместо этого это просто ссылки на системная библиотека и использует существующую функцию. Библиотека GLibC для Linux является ярким примером, как и файлы .DLL в Win32 API или содержимое каталога Mac / System / Library Как получить доступ к папке библиотеки OS X и почему это удобноБольшинство папок библиотеки OS X лучше всего оставить в покое, но полезно знать, как проникнуть в пользовательскую библиотеку и вокруг нее Подробнее .

Системные библиотеки действуют как своего рода переводчик между приложениями и ядром для рутинных задач. Приложения делают вызовы функций к этим библиотекам, которые обрабатывают много деталей низкого уровня. Для удобства они также могут выполнять системные вызовы ядра. Как вы могли догадаться, это означает, что эти библиотеки написаны для конкретного ядра и поэтому не могут использоваться в операционных системах с разными ядрами.
Заголовки выполнения операционной системы
Последнее препятствие для универсального программного обеспечения - это формат исполняемых файлов для операционных систем. ОС ожидает, что файлы, которые она запускает, будут следовать определенному двоичный формат файла Все, что вам нужно знать о форматах файлов и их свойствахМы используем файл слова взаимозаменяемо: музыка, изображение, электронная таблица, слайд-шоу и так далее. Но что делает файл "файлом"? Давайте попробуем понять эту фундаментальную часть вычислений. Подробнее . Например, файлы исполняемого и связанного формата (ELF), которые работают в операционных системах, таких как Linux и FreeBSD должны указывать определенные свойства файла в определенных байтах, как показано ниже образ.

двоичный интерфейс приложения (ABI) Показанный способ имеет особое значение. Комбинация вызовов, доступных из процессора, ядра и системных библиотек, ABI аналогична интерфейс прикладного программирования (API) тем, что он определяет, как две программы взаимодействуют друг с другом. Но API - это то, что программисты (люди) используют в исходном коде для обозначения двух частей программного обеспечения. должен разговаривать друг с другом. ABI - это то, что фактически позволяет им делать это после компиляции и запуска программного обеспечения. Каждая операционная система реализует определенный ABI, который может изменяться или не изменяться между версиями этой же ОС.
В целом, операционные системы реализуют свой собственный ABI, определяемый комбинацией типа процессора, ядра и любых стандартных системных библиотек. Но иногда ОС будет реализовывать более одного. Например, FreeBSD поддерживает двоичные файлы Linux, поскольку предоставляет Linux ABI в качестве дополнения к ядру FreeBSD (вместо ядра Linux). Это отличается от программы виртуализации Что такое виртуальная машина? Все, что Вам нужно знатьВиртуальные машины позволяют запускать другие операционные системы на вашем текущем компьютере. Вот что вы должны знать о них. Подробнее такие как VMWare или VirtualBox, которые используют программное обеспечение для моделирования всего компьютера (аппаратного обеспечения и всего). В результате этот тип ABI-совместимости быстрее, но требует гораздо больших усилий для поддержки. Вот почему это редко, хотя Microsoft недавно увидела ценность Ubuntu теперь доступна в Магазине WindowsИнсайдеры Windows теперь могут загрузить и установить Ubuntu на Windows 10. Это объединяет Linux и Windows в нечестивый союз, который мало кто когда-либо предполагал, что они будут жить достаточно долго, чтобы стать свидетелями. Подробнее при этом.
Исключение: интерпретированное программное обеспечение
На основании вышеизложенного мы узнали, что разработчики пишут программное обеспечение для одной и только одного типа целевой системы. За исключением случаев, когда они этого не делают. Есть много приложений, которые вы можете загрузить и запустить на Mac, затем скопировать и запустить в Windows, и, возможно, даже скопировать и запустить в Linux без проблем. Как это возможно?
Я лежал до сих пор?
Оказывается, есть категория программного обеспечения, которая выглядит на первый взгляд так, будто она «работает везде». Вы можете скачать и запустить его на любом поддерживаемая платформа - ключевое слово «поддерживается». Фактически, вы загружаете исходный код приложения, а другое приложение ( переводчик) это своего рода запуск исходного кода напрямую в режиме реального времени. Это упрощение, поэтому давайте посмотрим, как именно это работает с несколькими языками.
Джава
Когда Java впервые был выпущен, он обещал (буквально) «пиши один раз, беги куда угодно». Идея заключалась в том, чтобы создать приложения с помощью функций Java для сохранения файлов, выполнения расчетов или создания приложения окно. Потом Java Runtime Enviornment (JRE) для каждой поддерживаемой компьютерной платформы будет запускаться код и переводить их в собственные функции ОС. Хитрость к Java заключается в том, что он не запускается «напрямую» в операционной системе. Он работает в части JRE под названием Виртуальная машина Java и это то, что работает в операционной системе.
Вставляя этот дополнительный программный уровень между приложением и ОС, Java позволяет вам сосредоточиться на наборе функций, которые одинаковы в разных операционных системах. Вы сообщаете Java, что вы хотите сделать, и позволяете JVM для вашей системы беспокоиться о том, как на самом деле это сделать. На рисунке ниже показано это в действии, где Программная среда Java для настольных приложений JIDE Software отображает одно и то же приложение для Mac (вверху), Windows (в центре слева), «чистой Java» (в центре справа) и Linux (внизу).

Java-программы точно не «компилируются» в реальном времени. Скорее, компилятор Java отобразит их в «байт-код». Вы можете думать о байт-коде как о недоделанной программе. Когда разработчик выпускает приложение, оно компилируется настолько, насколько это возможно, не зная, на какой ОС оно будет работать. Когда вы на самом деле запускаете его, JVM «запекает его до конца», чтобы соответствовать функциям конкретной ОС хоста.
питон
Популярный интерпретируемый язык питон 5 причин, почему программирование на Python не бесполезноPython - Вы или любите это или ненавидите это. Вы можете даже качаться с одного конца до другого, как маятник. Несмотря на это, Python - это язык, с которым трудно быть двойственным. Подробнее . Когда вы запускаете скрипт Python, интерпретатор Python преобразует код в инструкции для ОС. Он также может работать аналогично Java: когда вы «импортируете» код из-за пределов приложения, он компилируется для байт-кода при первом запуске. Затем интерпретатор узнает, изменился ли исходный код при последующих запусках, после чего он перекомпилирует его в новый байт-код.
Отличный побочный продукт этой работы «по требованию» заключается в том, что вы можете использовать интерпретатор для интерактивной разработки сценариев. Просто набрав «python» в командной строке, вы запустите интерпретатор, и вы сможете запустить код и сразу увидеть результаты.

Это означает, что разработчики могут поиграть и настроить вещи «вживую». Затем, когда строка кода делает то, что они хотят, скопируйте и вставьте ее в файл сценария (который гораздо более эффективен, чем цикл «код-компиляция-тест», который приходится делать программистам, не интерпретирующим язык).
Даже если программное обеспечение одно и то же, скорее всего, нет
К сожалению для пользователей, индустрия технологий не разработала действительно «универсальный» формат. И это может никогда не случиться. Внедрение этих типов стандартов часто приводит к решению «наименьшего общего знаменателя» с уступками в интересах получения всеобщего одобрения.
Как вы думаете? Вы бы предпочли иметь универсально совместимое программное обеспечение, даже если бы оно означало, что оно не так хорошо? Или вы согласны с используемой операционной системой и не интересуетесь приложениями с других платформ? Дайте нам знать ниже в комментариях!
Кредиты изображений: Masterchief_Productions / Shutterstock
В течение пятнадцати лет Аарон работал в области технологий как бизнес-аналитик и менеджер проектов, и почти столько же лет был лояльным пользователем Ubuntu (со времен Breezy Badger). Его интересы включают в себя открытый исходный код, приложения для малого бизнеса, интеграцию Linux и Android, а также вычисления в текстовом режиме.