Мне было интересно, что это значит для программного обеспечения, чтобы работать нативно. Что именно такое программное обеспечение и чем оно отличается от программного обеспечения, которое не запускается изначально? Как я могу определить, будет ли данная часть программного обеспечения работать на моем компьютере? Есть ли вероятность того, что на моем компьютере уже установлено программное обеспечение?
5 ответов
Программное обеспечение является родным для платформы, если оно было разработано для работы на этой платформе.
Под платформой обычно понимается операционная система, но она также может применяться к таким устройствам, как Nintendo Game Boy.
Используя Game Boy в качестве примера, он получает свое программное обеспечение из картриджей. Эти картриджи содержат код, который изначально работает на Game Boy.
Эмуляторы - это слой, позволяющий запускать программное обеспечение, разработанное для одной платформы, на другой. Например, есть эмуляторы, которые могут запускать образы картриджей Game Boy и позволяют играть в игры Game Boy на компьютере или даже на мобильном телефоне.
Уровень совместимости похож на эмулятор. Когда 64-разрядные компьютеры и операционные системы стали массовыми, они должны были быть совместимы с существующими 32-разрядными технологиями. Поскольку 64-разрядные и 32-разрядные архитектуры сильно различаются, часто требуется уровень совместимости для запуска 32-разрядного программного обеспечения на 64-разрядных компьютерах. Для 64-разрядных версий Microsoft Windows Microsoft необходимо было написать слой совместимости, чтобы 32-разрядные программы по-прежнему работали в новой 64-разрядной системе. Вот почему некоторые программы часто устанавливаются в папку с именем Program Files (x86)
, где x86
означает «32-разрядный».
Слои совместимости имеют тенденцию быть более близкими к нативной системе, чем эмуляторы. VirtualBox эмулирует аппаратное обеспечение для операционных систем *, и системы, которые он эмулирует, не имеют непосредственного взаимодействия с хост-системой. WoW64 - это уровень совместимости, который позволяет 32-битным программам работать в 64-битной Windows более интегрированным образом. WoW64 помогает сделать программы совместимыми, а не эмулировать их в изолированной среде.
Библиотека переводов является компонентом уровней совместимости. Всякий раз, когда двоичный код выполняется не нативно, библиотека перевода помогает перенаправить внешние, не нативные вызовы на нативные вызовы, которые может понять система. Программы сборки, написанные для оригинального TI-83, могут быть несовместимы с более новыми калькуляторами TI-83/84 Plus, потому что некоторые вызовы, имеющие смысл в архитектуре TI-83, могут больше не работать в TI-83/84+. Библиотека переводов (возможно, включена в такие оболочки, как MirageOS) гарантирует, что вызовы для TI-83 перейдут в новые, обновленные места в калькуляторах TI-83/84+.
Независимый от платформы код написан на языке, который интерпретируется чем-то, что обычно выполняется изначально. Например, PHP - это язык программирования, который интерпретируется и исполняется установленным двоичным файлом PHP, который уже был скомпилирован изначально для операционных систем Windows, Mac и Unix. Код PHP, который пишут веб-скрипты, не зависит от платформы, что позволяет коду работать в нескольких операционных системах, если PHP установлен для этих операционных систем.
Разнообразный
исправления
* Спасибо, Michael Kjörling, за то, что вы ответили на некоторые вопросы этого ответа.
Другой
Разница между "родным" и "не родным" не черно-белая. (Кредиты на афразир)
Нативный код обычно используется как противоположность независимому от платформы коду. Если вы работаете с собственным программным обеспечением, вы запускаете скомпилированный двоичный файл, а не, например, независимый от платформы скрипт, такой как javascript или Java bytecode. Скомпилированный C или скомпилированный C++ являются хорошими примерами нативного кода.
Это во многом зависит от контекста. Для меня "родной" означает, что приложение использует функции и механизмы, которые предоставляет операционная система, вместо того, чтобы использовать свои собственные. Это может относиться к функциям пользовательского интерфейса (кнопки, окна, диалоги выбора файлов), а также к функциям под капотом (например, интеграция с «Открыть с помощью ...»).
Например, в Windows нативное приложение будет использовать "WinAPI" для получения тех же кнопок, полос прокрутки и т.д., Что и в других приложениях. Они ведут себя точно так же в системных приложениях (блокнот), как и в собственных сторонних приложениях.
Java-приложения часто используют Swing и выглядят совершенно иначе, потому что они сами рисуют свои элементы управления, а не используют системные. Преимущество заключается в том, что программа выглядит одинаково на всех ОС.
Другой вариант создания графического интерфейса - это кроссплатформенный инструментарий, такой как "QT". QT попросит ОС нарисовать элементы управления для нее, чтобы они выглядели очень естественно, независимо от того, используете ли вы Windows, OSX или Linux. Текстовое поле QT будет выглядеть так же, как текстовое поле Windows, однако это не просто нативное, а своего рода эмуляция. Вы можете заметить небольшие различия в деталях (например, контекстное меню, методы ввода и т.д.).
Обратите внимание, что когда люди говорят "нативный", они часто подразумевают, что программа компилируется в машинный код, а не в промежуточный код, который запускается на виртуальной машине (например, программах Java и .NET). В приведенных выше примерах WinAPI и приложение QT используют машинный код, тогда как программа Java компилируется в байт-код Java. Такое использование в настоящее время немного проблематично, поскольку многие пользователи считают хорошо сделанное нативное приложение .NET для Windows - это просто .exe, используют те же элементы управления и API-интерфейсы под капотом и практически неотличимы от программы, скомпилированной для Машинный код.
Кроме того, я бы рассмотрел программу, которая использует GTK, знает о структуре файловой системы Unix и, возможно, поставляется в виде пакета .deb, родного для Ubuntu или Gnome. Есть даже собственные приложения Gnome, написанные на javascript, которые можно назвать native! То же самое относится к приложениям Windows 8 "Metro", которые могут быть написаны на разных языках, некоторые скомпилированы, некоторые нет.
На удивление есть пара возможных ответов, но стандарт обычно таков: код, скомпилированный с кодами операций для ЦП, и работающий с библиотеками программирования ОС, которая загрузила компьютер. В этом случае большая часть кода, который вы запускаете, будет нативным. Возможно, некоторые контрпримеры прояснят ситуацию.
Ява не нативный код. Он компилируется в промежуточный байт-код, который затем запускается на конкретном чипсете. Java может вызывать нативный код. Eclipse - отличный пример - для скорости Java вызывает некоторые графические вызовы платформы.
Если вы запускаете WINE, эмулятор API MS Windows, это не нативный код. Хотя вы выполняете код, разработанный для этого набора микросхем (x86), вы не запускаете код для ОС, которая его загрузила, а заменяют библиотеки. MAME запускает двоичные файлы для разных процессоров и операционных систем.
Скрипты не являются нативным кодом. Они написаны на языке более высокого уровня, который затем должен быть преобразован во время выполнения в код, работающий на вашем процессоре.
Есть несколько размытых линий. Ваш веб-браузер работает как собственный код, но он также может запускать Java (скомпилированный в байт-код) или Javascript (язык интерпретации сценариев).
Говоря более абстрактно, это все равно, что позволить кому-то другому доверять вам, выполняя программу на другом языке.
«Родной» означает, что ОС будет использовать самый быстрый и простой из известных ему диалектов - двоичный.
Плюсы: быстрая, широкая доступность языка, который может общаться друг с другом, так как это до металла. Минусы: безопасность, сложный API, ограниченный возможностями ОС, также трудно создавать компиляторы, потому что однажды скомпилированная программа выпущена на волю.
Не собственный, означает, что ваш код не будет выполняться непосредственно операционной системой. Он может быть выполнен многими разными способами, причем основные из них интерпретируются и запускаются версии вашей программы с байт-кодом на виртуальной машине.
Плюсы: API почти никогда не меняется, поэтому программистам намного легче работать (по крайней мере, когда они придерживаются этого конкретного языка). Минусы: производительность (это часто незначительное снижение, это редко может стать проблемой), и не каждый на самом деле будет использовать этот конкретный язык, так что это также может быть проблемой для принятия этой технологии. Безопасность также может быть проблемой, но она находится под большим контролем. Каким-то образом.