Что означает, что программа должна быть 32- или 64-битной? [закрыто]

57
задан 17 May 2019 в 15:28

7 ответов

Размер Word является существенным различием, но это не единственное. Это имеет тенденцию определять число битов, для которых "оценивается" ЦП, но размер слова и полная возможность только свободно связаны. И полная возможность - то, что имеет значение.

На Intel или AMD ЦП, 32-разрядный по сравнению с 64-разрядным программным обеспечением действительно, относится к режиму, в котором ЦП работает при выполнении его. 32-разрядный режим имеет в наличии меньше/меньшие регистры и инструкции, но самое важное ограничение является доступным объемом памяти. 32-разрядное программное обеспечение обычно ограничивается использованием между 2 ГБ и чуть менее чем 4 ГБ памяти .

Каждый байт памяти имеет уникальный адрес, который не очень отличается от каждого дома, имеющего уникальный почтовый адрес. Адрес памяти является просто числом, которое программа может использовать для нахождения части данных снова, после того как это сохранило его в памяти, и каждый байт памяти должен иметь адрес. Если адрес составляет 32 бита, то существует 2^32 возможные адреса, и это означает 2^32 адресуемые байты памяти. На сегодняшнем Intel/AMD CPUs размер адреса памяти совпадает с размером регистров (хотя это было не всегда верно).

С адресами на 32 бита, 4 ГБ (2^32 байты) могут быть обращены программой, однако до половины того пространства резервируется ОС. В доступное пространство памяти должен соответствовать коду программы, данным и часто также получаемым доступ файлам. В сегодняшних ПК, со многими гигабайтами RAM, этому не удается использовать в своих интересах доступную память. Это - главная причина, почему 64-разрядный стал популярным. 64-разрядные центральные процессоры были доступны и широко используемые (обычно в 32-разрядном режиме) в течение нескольких лет до емкостей памяти, больше, чем 2 ГБ стали распространены, в которой точке 64-разрядный режим начал предлагать реальные преимущества, и это стало популярным. 64 бита пространства адреса памяти обеспечивают 16 эксабайт адресуемой памяти (~18 байтов квинтильона), который является больше, чем какое-либо текущее программное обеспечение может использовать, и конечно никакой ПК не имеет в какой-либо степени так много RAM.

большинство данных, используемых в типовых приложениях, даже в 64-разрядном режиме, не должно быть 64-разрядным и таким образом, большая часть из него все еще хранится в 32-разрядном (или еще меньшая) форматы. Общий ASCII и представления UTF-8 текста используют 8-разрядные форматы данных. Если программа должна переместить большой блок текста от одного места до другого в памяти, это может попытаться сделать это 64 бита за один раз, но если это должно интерпретировать текст, это, вероятно, сделает это 8 битов за один раз. Точно так же 32 бита являются общим размером для целых чисел (максимальный диапазон +/-2^31, или приблизительно +/-2,1 миллиарда). 2,1 миллиарда являются достаточным количеством диапазона для многого использования. Графические данные обычно естественно представлены попиксельно, и каждый пиксель, обычно, содержит самое большее 32 бита данных.

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

До 32-разрядного, адрес и размер слова обычно отличались (например, 16-разрядный 8086/88 с 20-разрядными адресами памяти, но 16-разрядными регистрами или 8-разрядными 6502 с 16-разрядными адресами памяти или даже ранним 32-разрядным ARM с 26-разрядными адресами). В то время как никакой программист никогда не задирал их нос перед лучшими регистрами, пространство памяти обычно было реальной движущей силой для каждого совершенствующегося поколения технологии. Это вызвано тем, что большинство программистов редко работает непосредственно с регистрами, но действительно работает непосредственно с памятью, и ограничения памяти непосредственно вызывают неприятность для программиста, и в 32-разрядном к 64-разрядному случаю, для пользователя также.

Таким образом, в то время как существуют реальные и важные технологические различия между различными диаметрами долота, что 32-разрядный или 64-разрядный (или 16-разрядный или 8-разрядный) действительно средство является просто набором возможностей, которые имеют тенденцию быть связанными с центральными процессорами конкретного технологического поколения и/или программным обеспечением, которое использует в своих интересах те возможности. Длина слова является частью этого, но не единственным, или обязательно самой важной частью.

Источник: был программист в течение всех этих технологических эр.

27
ответ дан 1 November 2019 в 16:55

Ответ, на который Вы ссылаетесь, описывает преимущества из 64-разрядных по 32-разрядному. До того, что является на самом деле особенным в самой программе, она зависит от Вашей перспективы.

Вообще говоря, исходный код программы не должен отличаться вообще. Большинство программ может быть записано так, чтобы они скомпилировали отлично или как 32-разрядные или как 64-разрядные программы, как управляется соответствующим выбором компилятора и / или параметры компилятора. Часто существует приблизительно влияние на источник, однако, в этом, (C) компилятор, предназначающийся 64-разрядного, может принять решение определить свои типы по-другому. В частности, long int повсеместно 32 бита шириной на 32-разрядных платформах, но это 64 бита шириной на многих (но не все) 64-разрядные платформы. Это может быть источником ошибок в коде, который делает неоправданные предположения о таких деталях.

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

31
ответ дан 1 November 2019 в 16:55

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

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

На протяжении всей истории, было много архитектуры различных размеров слова, даже странных. В наше время можно легко найти процессоры вокруг Вас, которые не являются просто 32-разрядными и 64-разрядными, но также и например, 8-разрядными и 16-разрядными (обычно во встроенных устройствах). В обычном настольном компьютере Вы используете x86 или x64, которые являются 32-разрядными и 64-разрядными соответственно.

Поэтому, когда Вы говорите, что программа является 32-разрядной или 64-разрядной, Вы обращаетесь к конкретной архитектуре. В популярном настольном сценарии Вы обращаетесь к x86 по сравнению с x64. Существует много вопросов, статей и книг, обсуждая различия между двумя.

Теперь, заключительное примечание: по причинам совместимости, x64 процессоры может работать в различных режимах, один из которых способен к выполнению 32-битного кода от x86. Это означает, что, если Ваш компьютер является x64 (вероятно), и если Ваша операционная система имеет поддержку его (также, вероятно, например, 64-разрядный Windows), она может все еще запустить программы, скомпилированные для x86.

12
ответ дан 1 November 2019 в 16:55

программное обеспечение Using как Word/Excel/и т.д., установщики имеют опцию для 32 битов или установку на 64 бита. Каково различие?

Это зависит от используемого ЦП:

На центральных процессорах SPARC, различие между "32-разрядными" и "64-разрядными" программами точно, что Вы думаете:

64-разрядные программы используют дополнительные операции, которые не поддерживаются 32-разрядными центральными процессорами SPARC. С другой стороны, Солярис или операционная система Linux помещают данные, к которым получают доступ 64-разрядные программы в областях памяти, к которым можно только получить доступ с помощью 64-разрядных инструкций. Это означает, что 64-разрядная программа даже ДОЛЖНА использовать инструкции, не поддерживаемые 32-разрядными центральными процессорами.

Для x86 центральных процессоров это отличается:

современные x86 центральные процессоры имеют различные рабочие режимы, и они могут выполнить различные типы кода. В различных режимах они могут выполниться 16-, 32-или 64-битный код.

В 16-, 32-и 64-битный код, ЦП интерпретирует байты по-другому:

байты (шестнадцатеричные) b8 4e 61 bc 00 c3, были бы интерпретированы как:

mov    eax,0xbc614e
ret

... в 32-битном коде и как:

mov    ax,0x614e
mov    sp,0xc300

... в коде на 16 битов.

байты в EXE-файле "64-разрядной установки" и "32-разрядной установки" должны быть интерпретированы по-другому ЦП.

И 64 битных программы приложил бы усилия для выравнивания систем команд с размерами слова на 64 бита.

16-битный код (см. выше) может получить доступ к 32-разрядным регистрам, когда ЦП не является 16-разрядный ЦП.

, Таким образом, "16-разрядная программа" может получить доступ к 32-разрядным регистрам на 32-или 64-разрядному x86 ЦП.

6
ответ дан 1 November 2019 в 16:55

упоминания, что размер слова относится к диаметру долота регистра процессора

Обычно да (хотя существуют некоторые исключения/сложности)

  • , который я беру для значения числа битов, которыми процессор компьютера управляет на / т.е. самая маленькая 'неделимая' сумма битов, на которые воздействует процессор.

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

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

, Так как архитектура ЭВМ фиксируется

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

Как правило, ОС, работающая в 64-разрядном режиме, может поддержать приложения, работающие в 32-разрядном режиме, но не наоборот.

Так 32-разрядное выполнение приложения в 32-разрядном режиме или на 32-разрядном процессоре, выполняющем 32-разрядную ОС, 64-разрядный процессор, выполняющий 32-разрядную ОС или на 64-разрядном процессоре, выполняющем 64-разрядную ОС.

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

4
ответ дан 1 November 2019 в 16:55

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

32 бита по сравнению с 64 битами связан с архитектурой процессора. Увеличение размера слова делает несколько вещей:

  • Больший размер слова позволяет большему количеству инструкций быть определенным. Например, и 8-разрядный процессор, который делает единственную инструкцию по загрузке, может только иметь 256 общих инструкций, где больший размер слова позволяет большему количеству инструкций быть определенным в микрокоде процессоров. Очевидно, существует предел тому, сколько действительно полезных инструкций определяется.
  • [еще 111] данные могут быть обработаны с единственным командным циклом, поскольку существует больше доступных битов. Это ускоряет выполнение.
  • Как Вы указанный, это также предоставляет доступ к большему пространству памяти, не имея необходимость делать вещи как многоадресные циклы, или мультиплексируя высокие/низкие слова данных.

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

3
ответ дан 1 November 2019 в 16:55

Короткий ответ: Это - конвенция, базирующаяся только на ширине базовой шины данных

, n-bit программа является программой, которая является , оптимизировал для n-bit ЦП. Сказанный иначе 64-разрядная программа является программой в двоичном представлении , скомпилировал для ЦП на 64 бита. ЦП на 64 бита, в свою очередь, является тем, использующим в своих интересах 64-разрядную шину данных для обмена данными между ЦП и памятью.

Это так же просто, но можно читать больше ниже.

<час>

определение на самом деле перенаправляет к пониманию, что является ЦП на 32/64 бита, косвенно к тому, что является операционной системой на 32/64 бита, и как компиляторы оптимизируют двоичные файлы для данной архитектуры.

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

<час>

ЦП на 32/64 бита, первое определение

ЦП может хранить/вспоминать определенное количество данных в памяти в единственный инструкция. 32-разрядный ЦП может передать 4 байта (32 бита) сразу, и 64-разрядный ЦП может передать 8 байтов (64 бита) сразу. Таким образом, префикс "на 32/64 бита" прибывает из количества RAM, переданной в единственном цикле чтения-записи.

Это количество влияет на время выполнения: Чем меньше циклов передачи требуется, тем меньше ЦП ожидает памяти, программа выполняется быстрее. Это похоже на перенос большого количества воды с маленьким или большим блоком.

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

ЦП на 32/64 бита, техническое определение

, Очевидно, RAM и ЦП должен оба быть в состоянии справиться с 32/64-bit передачей данных, которая в свою очередь решает, что количество проводов раньше подключало ЦП к RAM ( системная шина ). 32/64 бита является на самом деле количеством проводов/дорожек, сочиняющих шина данных (обычно названный шиной "ширина").

System Bus
<глоток> (Википедия: Системная шина - ширина шины данных определяет префикс 32/64 бита для ЦП, программы, ОС...)

(Другая шина адресная шина , который обычно более широк, но ширина адресной шины не важна в именовании ЦП как ЦП на 32 или 64 бита. Эта ширина адресной шины определяет общее количество RAM, которая может быть достигнута / "обращенный" ЦП, например, 2 ГБ или 32 ГБ. Что касается шина управления , это - маленькая шина, используемая для синхронизации всего подключенного к шине данных, в частности, это указывает, когда шина данных стабильна и готова быть выбранной в операции передачи данных).

, Когда биты передаются между ЦП и RAM, напряжение на различных медных дорожках шины данных должно быть стабильным до чтения данных на шине, еще одно или несколько битовых значений были бы неправильными. Требуется меньше времени для стабилизации 8 битов, чем 64 бита, так увеличение ширины шины данных не без проблем для решения.

32/64 битная программа: вопрос компилятора

Программы должны не всегда передавать 4 байта (32-разрядная шина данных) или 8 байтов (64-разрядная шина данных), таким образом, они используют различные инструкции считать 1 байт, 2 байта, 4 байта и 8 битов, по причинам производительности.

Двоичные файлы (собственные программы на языке ассемблера) записаны или с 32-разрядной архитектурой в памяти, или с 64-разрядной архитектурой и связанной системой команд. Так имя 32/64 битная программа.

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

Однако большинство программ полагается на готовые библиотеки, записанные другими программистами (например, программа редактирования видео может использовать библиотека FFmpeg). Чтобы произвести полностью 64-разрядное приложение, компилятор (на самом деле редактор связей, но позволить нам сохранить это простым) должен получить доступ к 64-разрядной версии любой пользовавшейся библиотеки, который не может быть возможным.

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

32-разрядная программная совместимость с 64-разрядным ЦП

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

, Кроме того, ширины шины данных и подмножества инструкций по чтению-записи, существует много других различий между ЦП на 64 бита и на 32 бита (операции регистра, кэши памяти, выравнивание/границы данных, синхронизация...).

Запущение 32-разрядной программы на 64-разрядной архитектуре:

  • более эффективно, чем выполнение, на более старой 32-разрядной архитектуре (почти только из-за улучшения тактовой частоты ЦП по сравнению с более старыми поколениями ЦП на 32/64 бита)
  • менее эффективно, чем запуск того же приложения, скомпилированного в 64-разрядный двоичный файл использовать в своих интересах 64-разрядную архитектуру, в частности, способность передать 64 бита сразу из/в память.

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

для получения информации, приложения, скомпилированные в двоичные файлы Windows на 16 битов (более ранние версии Windows, работающего 80-286 ЦП с 16-разрядной шиной данных), не полностью больше поддерживаются, хотя существует все еще возможность в Windows 10 для активации NTVDM.

случай.NET, Java и другого интерпретируемого "байт-кода"

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

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

текущая идея состоит в том, чтобы использовать промежуточное представление (IR) инструкций, полученных из источника. Java (Sun, печально теперь Oracle) и IL (Microsoft) является такими промежуточными представлениями. Тот же файл IR может использоваться на любой ОС, поддерживающей IR.

, После того как ОС открывает файл, она выполняет заключительную компиляцию на "локальный" машинный язык, понятый под фактическим ЦП и принятием во внимание заключительной архитектуры, на которой можно запустить программу. Например, для Microsoft.NET, универсальная версия выполняется виртуальной машиной CoreCLR, расположенной на заключительном компьютере. Обычно нет никакого понятия ширины шины данных на таких промежуточных языках, следовательно все меньше и меньше приложение будет иметь этот n-bit префикс.

Однако мы не можем забыть фактическую архитектуру, таким образом, будет все еще версии на 32 и 64 бита, произведенные, чтобы CoreCLR оптимизировал заключительный код, даже если само приложение, на уровне IR, не оптимизировано для данной архитектуры (только одна версия IR, чтобы загрузить и установить).

1
ответ дан 1 November 2019 в 16:55

Другие вопросы по тегам:

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