Один размер не подходит всем: почему программное обеспечение не является универсально совместимым

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

За исключением того, что ваш новый ноутбук с Linux не совместим с вашим установочным пакетом Windows. Как насчет вашего планшета Android? iPhone? PS4? Почему вы не можете просто взять этот кусок программного обеспечения и использовать его где угодно? Давайте рассмотрим некоторые препятствия на пути к мечте «купи один раз, беги куда угодно».

Разработка программного обеспечения и архитектура ОС

Чтобы понять, почему программное обеспечение не работает в разных операционных системах, требуется немного (я обещаю, немного) знаний о том, как создается программное обеспечение.

Процесс разработки программного обеспечения

В самом простом потоке разработки программного обеспечения для настольных компьютеров, серверов и мобильных устройств (т. Е. Не в Интернете)

), программист будет:

  1. Введите некоторые код в один или несколько файлов.
  2. компилировать код в то, что компьютер может выполнить.
  3. Тестовое задание чтобы убедиться, что программа работает, как ожидалось.
  4. Упаковать и распространить / развернуть программное обеспечение

процесс разработки программного обеспечения совместимости

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

ОС архитектура

Важно понимать, что операционная система не является единым целым. Скорее, он состоит из слоев программного обеспечения.

Ядра операционной системы

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

Основы ядра совместимости программного обеспеченияИзображение предоставлено: Wikimedia Commons

Ядро каждой операционной системы будет реализовывать системные вызовы по-разному, в зависимости от того, какие из них доступны, как они называются или какие опции они выбирают. В результате программное обеспечение должно учитывать системные вызовы, поддерживаемые ядром каждой ОС, для которой оно предназначено. Системный вызов, который вы используете для отправки данных на графический процессор в Linux, может иметь другое имя, список информации, которую вам нужно предоставить, или оба в Windows. Точного звонка может вообще не быть.

Системные библиотеки

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

,

программные библиотеки совместимости с ОСИзображение предоставлено: ScottXW через Wikimedia Commons

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

Заголовки выполнения операционной системы

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

, Например, файлы исполняемого и связанного формата (ELF), работающие в операционных системах, таких как Linux и FreeBSD, должны указывать определенные свойства файла в определенных байтах, как показано на рисунке ниже.

совместимость программного обеспечения и заголовок эльфа

двоичный интерфейс приложения (ABI) Показанный способ имеет особое значение. Комбинация вызовов, доступных из процессора, ядра и системных библиотек, ABI аналогична интерфейс прикладного программирования (API) тем, что он определяет, как две программы взаимодействуют друг с другом. Но API — это то, что используется программистами (людьми) в исходном коде для обозначения двух частей программного обеспечения. должен разговаривать друг с другом. ABI — это то, что фактически позволяет им делать это после компиляции и запуска программного обеспечения. Каждая операционная система реализует определенный ABI, который может изменяться или не изменяться между версиями этой же ОС.

В целом, операционные системы реализуют свой собственный ABI, определяемый комбинацией типа процессора, ядра и любых стандартных системных библиотек. Но иногда ОС будет реализовывать более одного. FreeBSD поддерживает двоичные файлы Linux, например, потому что предоставляет Linux ABI в качестве дополнения к ядру FreeBSD (вместо ядра Linux). Это отличается от виртуализации программ

такие как VMWare или VirtualBox, которые используют программное обеспечение для имитации всего компьютера (аппаратного обеспечения и всего). В результате этот тип ABI-совместимости быстрее, но требует гораздо больших усилий для поддержки. Вот почему это редко, хотя Microsoft недавно увидела ценность

при этом.

Исключение: интерпретированное программное обеспечение

На основании вышеизложенного мы узнали, что разработчики пишут программное обеспечение для одной и только одного типа целевой системы. За исключением случаев, когда они этого не делают. Есть много приложений, которые вы можете загрузить и запустить на Mac, затем скопировать и запустить в Windows, и, возможно, даже скопировать и запустить в Linux без проблем. Как это возможно?

Я лежал до сих пор?

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

Джава

Когда Java впервые был выпущен, он обещал (буквально) «писать один раз, запускать где угодно». Идея заключалась в том, чтобы создавать приложения с помощью функций Java для сохранения файлов, выполнения вычислений или создания окна приложения. Затем Java Runtime Enviornment (JRE) для каждой поддерживаемой компьютерной платформы будет выполняться код и переводить их в собственные функции ОС. Хитрость к Java заключается в том, что он не запускается «напрямую» в операционной системе. Он работает в той части JRE, которая называется Виртуальная машина Java и это то, что работает в операционной системе.

Вставляя этот дополнительный программный уровень между приложением и ОС, Java позволяет вам сосредоточиться на наборе функций, которые одинаковы в разных операционных системах. Вы сообщаете Java, что вы хотите сделать, и позволяете JVM для вашей системы беспокоиться о том, как на самом деле это сделать. На следующем рисунке это показано в действии, где Java Desktop Framework для Java-приложений Software Software отображает одно и то же приложение для Mac (вверху), Windows (в центре слева), «чистой Java» (в центре справа) и Linux (внизу).

совместимость программного обеспечения jide jdafИзображение предоставлено: JIDE Software

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

питон

Популярный интерпретируемый язык Python

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

Отличный побочный продукт этой работы «по требованию» заключается в том, что вы можете использовать интерпретатор для интерактивной разработки сценариев. Просто набрав «python» в командной строке, вы запустите интерпретатор, и вы сможете запустить код и сразу увидеть результаты.

совместимость программного обеспечения Python интерпретатор

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

Даже если программное обеспечение одно и то же, скорее всего, нет

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

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

Кредиты изображений: Masterchief_Productions / Shutterstock

Ссылка на основную публикацию
Adblock
detector