2016-04-16 1 views
0

Java часто упоминается как более переносимый, чем другие, скажем, скомпилированные языки, поскольку исполняемый файл может быть запущен на любой платформе с помощью JVM. Но код, написанный на C, может быть запущен на любой платформе с компилятором C.Почему интерпретируемый язык считается более портативным?

Итак, наивно существует две альтернативы: создавайте множество разных компиляторов для множества разных платформ и передавайте исходный код по сети, скажем, апплет, который скомпилирован на стороне клиента; или сделать множество разных виртуальных машин для работы на множестве разных платформ и передавать одну и ту же исполняемую программу или апплеты по сетям.

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

+0

Ваш вопрос несколько запутан. Я всегда могу написать программу 'Java', которая отлично работает в Linux и которая вообще не запускается в Windows. Переносимость - это артефакт программы, учитывая, что на целевой платформе существует соответствующая «runtime» (виртуальная машина или простой старый компоновщик/загрузчик), нет? –

+0

Обе прагмы (компиляция или Runtime-engines) имеют свое преимущество. – jogo

ответ

1

Но код, написанный на C, может быть запущен на любой платформе с компилятором C.

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

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

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

Кстати, есть так называемый «портативный» код C/C++, но он также зависит от аналогичных понятий, таких как JVM. Если вы используете Qt и подобные библиотеки, которые предлагают унифицированные API-интерфейсы на нескольких платформах, то вы можете создавать вполне переносимые C/C++-программы.

1

возможно, самый авторитетный ответ, почему Java был разработан, чтобы быть истолковано можно найти в whitepaper that announced the Java language back in 1995:

1.2.3 Нейтральный и портативный

технологии архитектуры Java разработан для поддержки приложений которые будут развернуты в гетерогенных сетевых средах. В таких средах приложения должны быть способны выполнять на различных аппаратных архитектурах. В рамках этого множества аппаратных платформ приложения должны выполняться на множестве операционных систем и взаимодействовать с несколькими языками интерфейса программирования. Чтобы удовлетворить разнообразие рабочих сред, продукт Java Compiler TM генерирует байт-коды - нейтральный по архитектуре промежуточный формат, предназначенный для эффективного переноса кода на несколько аппаратных и программных платформ. Понятый характер технологии Java решает как проблему двоичного распространения, так и проблему с версией; одни и те же кодовые коды языка программирования Java будут работать на любой платформе.

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

и

1.2.5 Интерпретированный, Каскадный и Dynamic

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

Следует также упомянуть, что Java API выходит далеко за рамки стандартных библиотек для C или C++.

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

Смежные вопросы