Почему Виртуальные машины необходимы?

Рекурсивное решение

public static int printSequence(int n,int count){
    if(count == 2*n){
        return 0;
    }
    else{
        if(count<=n){
            int i=1;
            while(i<=count)
            {
                System.out.print(i);
                i++;
            }
            System.out.println();
            return printSequence(n,count+1);
        }
        else{
            int i=1;
            while(i<=n-(count-n)) 
            {
                System.out.print(i);
                i++;
            }
            System.out.println();
            return printSequence(n,count+1);
        }
    }
}

printSequence (n, 1);

26
задан Community 23 May 2017 в 12:02
поделиться

10 ответов

AMD и процессоры Intel используют ту же систему команд и архитектуру машины (с точки зрения выполнения машинного кода).

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

Поэтому когда-то скомпилированный, они связаны с машиной (X86, система команд Intel и AMD и архитектура) и ОС.

Поэтому они могут работать на любой совместимой x86 машине и любой совместимой ОС (win95 через winvista, для некоторого программного обеспечения).

Однако они не могут работать на машине OSX, даже если она работает на процессоре Intel - двоичный файл не совместим, если Вы не запускаете дополнительное программное обеспечение эмуляции (такое как параллели или VM с окнами).

Кроме того, если Вы хотите выполнить их на процессоре ARM, или MIPS или PowerPC, затем необходимо выполнить полный эмулятор набора машинной команды, который интерпретирует двоичный машинный код от X86 в любую машину, Вы работаете на нем.

Контраст это с.NET.

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

Внезапно можно записать одной машине определенный эмулятор для любого процессора, Вы хотите работать на.NET, и затем ЛЮБАЯ программа.NET может работать на нем. Никакая потребность волноваться об ОС или базовой архитектуре ЦП - если будет VM.NET, то программное обеспечение будет работать.

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

Поэтому теперь у Вас могут быть C, C#, C++, Java, JavaScript, Основной, Python, lua, или любой другой языковой компилятор, который преобразовывает написанный код, таким образом, он будет работать на этой виртуальной машине.

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

, Если Вы все еще задаетесь вопросом, почему это - хорошая вещь, рассмотрите ранние машины DOS, и каков Microsoft реальный вклад в мир был:

AutoCAD должен был записать драйверы для каждого принтера, к которому они могли распечатать. Также - лотос 1-2-3. На самом деле, если бы Вы хотели, чтобы Ваше программное обеспечение распечатало, то необходимо было записать собственные драйверы. Если бы было 10 принтеров и 10 программ, то 100 различных частей по существу того же кода должны были быть записаны отдельно и независимо.

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

Теперь с 10 программами и 10 принтерами, только 20 частей кода должны быть записаны, и так как сторона Microsoft кода была тем же для всех, затем примеры от MS означали, что у Вас было очень мало работы, чтобы сделать.

Теперь программа не была ограничена просто этими 10 принтерами, которые они приняли решение поддерживать, но все принтеры, производители которых обеспечили драйверы для в окнах.

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

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

.NET ближе, но никто не разрабатывает VMs мирового класса для платформ кроме Windows (моно, так близко... и все же не совсем там).

Так... Вот почему нам нужен VMs. Поскольку я не хочу ограничивать меня меньшей аудиторией просто, потому что они выбрали комбинацию OS/machine, отличающуюся от моего собственного.

-Adam

38
ответ дан Adam Davis 28 November 2019 в 06:39
поделиться

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

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

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

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

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

CLR также предлагает форму безопасности кода для Вас.

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

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

7
ответ дан casperOne 28 November 2019 в 06:39
поделиться

По существу это допускает 'управляемый код', что означает точно, что это говорит - виртуальная машина управляет кодом, когда это работает. Три основных преимущества этого являются своевременной компиляцией, управляемыми указателями/сборкой "мусора" и управлением безопасностью.

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

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

безопасность является очевидной, виртуальная машина мешает коду делать вещи, это не было должно, потому что это смотрит. Лично я думаю, что это - вероятно, самая большая причина, почему Microsoft выбрала управляемый код для C#.

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

4
ответ дан Ray Hidayat 28 November 2019 в 06:39
поделиться

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

Это главным образом сделано для сокращения стоимости строительства компилятора. Существуют много (N) языки программирования в мире. Существуют также много (M) твердые платформы изделия в мире. Если бы компиляторы работали, не используя промежуточный язык, то общее количество "компиляторов", которые должны были бы быть записаны для поддержки всех языков на всех аппаратных платформах, было бы N*M.

Однако путем определения промежуточного языка и разбивания компилятора в 2 части, фронтэнд и бэкэнд, с фронтэндом, компилирующим исходный код в IL и бэкэнд, компилирующий IL в машинный код, можно сойти с рук запись только компиляторов N+M. Это заканчивает тем, что было огромным снижением расходов.

большая разница между CLR / компиляторы JVM и компиляторы собственного кода являются способом, которым фронтэнд и компиляторы бэкэнда связаны друг с другом. В компиляторе собственного кода эти два компонента обычно объединяются в тот же исполняемый файл, и оба выполняются, когда программист поражает "сборку" в IDE.

С CLR / компиляторы JVM, фронтэнд и бэкэнд запущены в разное время. Фронтэнд выполняется во время компиляции, производя IL, который на самом деле поставляется клиентам. Бэкэнд затем воплощен в отдельном компоненте, который вызывается во времени выполнения.

Так, это поднимает альтернативный вопрос, "Каковы преимущества задержки компиляции бэкэнда до времени выполнения"?

ответ: "Это зависит".

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

Однако существуют, также тянут спины. Анализ, необходимый для реализации обширной оптимизации компилятора, может быть дорогим. Это означает, что бэкэнды "JIT" будут часто делать меньше оптимизации, чем первичные бэкенды. Это может повредить производительность. Кроме того, потребность вызвать компилятор во времени выполнения также увеличивает время, необходимое для загрузки программ. Программы, сгенерированные с "первичными" компиляторами, не имеют тех проблем.

4
ответ дан Scott Wisniewski 28 November 2019 в 06:39
поделиться

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

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

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

3
ответ дан mP. 28 November 2019 в 06:39
поделиться

AMD и процессоры Intel оба имеют x86 архитектуру, если Вы хотите выполнить c/c ++ программа на другой архитектуре, необходимо использовать компилятор для той архитектуры, тот же двоичный исполняемый файл не будет натыкаться на различные архитектуры процессора.

2
ответ дан Element 28 November 2019 в 06:39
поделиться

я знаю, что Java имеет версии виртуальной машины на в значительной степени любой ОС, но является там CLR для другой ОС помимо Windows?

Моно

2
ответ дан Tim 28 November 2019 в 06:39
поделиться

Очень упрощенным способом поэтому Intel и AMD реализуют тот же ассемблер, с тем же количеством регистра, и т.д. и т.д.

Так Ваш код компиляций компилятора C для работы над Linux. Тот блок использует Linux ABI, поэтому, пока программа компиляции запускается на Linux на x86 блоке и правильной функциональной подписи, затем все - денди.

Теперь попытка, берущая тот скомпилированный код и палку это на, говорится в Linux/PPC (например, Linux на старом iBook). Это не собирается работать. Где, поскольку программа Java была бы, потому что JVM была реализована на платформе Linux/PPC.

язык блока в наше время является в основном другим интерфейсом, к которому может программировать программист. (32-разрядный) x86 позволяет Вам доступу eax, ebx, ecx, edx для целочисленных регистров общего назначения и f00-f07 для плавающей точки. Негласно, ЦП на самом деле имеет сотню большего количества регистров и смешал тот материал вокруг для отжимания производительности.

2
ответ дан Calyth 28 November 2019 в 06:39
поделиться

Вы правы в своем анализе, Java или C#, возможно, были разработаны для компиляции прямо к работавшему любой машины и вероятно будут быстрее, если они сделали это. Но подход виртуальной машины дает полный контроль среды, в которой работает Ваш код, VM создает безопасную песочницу, которая только позволяет командам с правильным доступом безопасности выполнять потенциально разрушительный код - как изменяющийся пароль или обновление загрузочного сектора HD. Существует много других преимуществ, но это - уничтожающая причина. Вы не можете получить StackOverflow в C#...

0
ответ дан MrTelly 28 November 2019 в 06:39
поделиться

Я думаю, что предпосылка Вашего вопроса допустима - Вы являетесь, конечно, не первыми для задавания этого вопроса. Так выезд http://llvm.org для наблюдения альтернативного подхода (который является теперь выполняемым проектом? или спонсируемый Apple)

0
ответ дан ankushnarula 28 November 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: