Что это значит для программного обеспечения, чтобы работать нативно?

27

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

Тросби
источник
2
«native» означает, что он предназначен для работы на любой платформе / операционной системе, на которой он работает
yuritsuki
Я тоже ... кажется, что модераторам трудно читать вопросы ...
5
@faB Вы понимаете, что ни один модератор не участвовал в закрытии вопроса?
slhck
Признаюсь, название вопроса заставило меня задуматься о разнице между запуском «программы» в «операционной системе» или на самом процессоре (например, прямой доступ к оборудованию).
Прорыв
Дело не в том, что этот вопрос сам по себе плохой , но он не очень хорош для этого сайта. Как свидетельствуют ответы, это не то, на что можно ответить чисто, и имеет ряд аргументов, окружающих его, что делает его закрытие полностью уместным согласно FAQ.
afrazier

Ответы:

43

Программное обеспечение является родным для платформы, если оно было разработано для работы на этой платформе.

Под платформой обычно понимается операционная система, но она также может применяться к таким устройствам, как 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 установлен для этих операционных систем.


Разнообразный

исправления

* Спасибо, Майкл Kjörling , для ловли некоторых проблем с этим ответом .

Другие

Разница между «родным» и «не родным» не черно-белая . (Кредиты на афразир )

Deltik
источник
3
Незначительные мелочи: (это VirtualBox, а не VirualBox, и) VirtualBox не эмулирует операционную систему, а эмулирует аппаратное обеспечение . Таким образом, вы можете установить в VirtualBox любую понравившуюся вам операционную систему (с учетом ограничений виртуализации) или даже написать свою собственную с нуля.
CVn
1
Native также часто подразумевает, что он использует набор первичных библиотек и API для базовой платформы, что может сделать различия немного размытыми. Есть немало людей, которые не считают приложения .NET «нативными», как приложения Win32 API «нативными», и аналогичным образом некоторые люди не считают программу KDE, работающую на рабочем столе Gnome, «нативной».
afrazier
@afrazier: Это потому, что приложения .NET предназначены для работы в среде Common Language Runtime и нуждаются в слое совместимости для работы в Windows. Или другой уровень совместимости для запуска в Linux.
Бен Фойгт
@Ben Voigt: Это по-прежнему сторонний API, двоичные файлы скомпилированы в собственный код x86 / amd64 (будь то во время выполнения CLR или заранее с помощью ngen), и фреймворк поставляется с последними версиями Windows. Это часть более широкого аргумента, хотя и здесь не совсем уместно.
afrazier
Virtual Box технически не эмулятор, а виртуализатор. Эмулятор прошедших времен всегда эмулировал совершенно другое оборудование. Под виртуализатором операционная система и программное обеспечение фактически работают на центральном процессоре хоста. Разница в том, что устройства виртуальные или эмулированные. Это небольшое техническое различие, на которое указывает даже веб-сайт Virtual Box: virtualbox.org/wiki/Virtualization
Мэтт Х
4

Нативный код обычно используется как противоположность независимому от платформы коду. Если вы запускаете собственное программное обеспечение, вы запускаете скомпилированный двоичный файл, а не, например, независимый от платформы скрипт, такой как javascript или Java bytecode. Скомпилированный C или скомпилированный C ++ являются хорошими примерами нативного кода.

Никлас Розенкранц
источник
3

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

Ява не нативный код. Он компилируется в промежуточный байт-код, который затем запускается на конкретном чипсете. Java может вызывать нативный код. Eclipse является отличным примером - для скорости Java вызывает некоторые графические вызовы платформы.

Если вы запускаете WINE , эмулятор API MS Windows, это не нативный код. Хотя вы выполняете код, разработанный для этого набора микросхем (x86), вы не запускаете код для ОС, которая его загрузила, а заменяют библиотеки. MAME запускает двоичные файлы для разных процессоров и операционных систем.

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

Есть несколько размытых линий. Ваш веб-браузер работает как собственный код, но он также может запускать Java (скомпилированный в байт-код) или Javascript (язык интерпретации сценариев).

Рич Гомолка
источник
.NET, VBA, XUL , IA-32 (по крайней мере на процессорах AMD64), ...
CVn
3

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

Например, в 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», которые могут быть написаны на разных языках, некоторые скомпилированы, некоторые нет.

JDM
источник
2

Говоря более абстрактно, это все равно, что позволить кому-то другому доверять вам, выполняя программу на другом языке.

  • «Родной» означает, что ОС будет использовать самый быстрый и простой из известных ему диалектов - двоичный.

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

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

    Плюсы: API почти никогда не меняется, поэтому программистам намного легче работать (по крайней мере, когда они придерживаются именно этого языка). Минусы: производительность (это часто незначительное снижение, это редко может стать проблемой), и не каждый на самом деле будет использовать этот конкретный язык, так что это также может быть проблемой для принятия этой технологии. Безопасность также может быть проблемой, но она находится под большим контролем. Каким-то образом.

jokoon
источник