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

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

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

Это верно? Используя программное обеспечение, такое как Word/Excel/и т.д., Установщики могут выбрать 32-битную или 64-битную установку. В чем разница?

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

Это верно?

Здесь задается очень похожий вопрос: с точки зрения программирования, что это значит, когда программа является 32- или 64-битной? - и в принятом ответе упоминается, что разница - это объем памяти, который может быть выделен приложению. Но это слишком расплывчато - разве 32-битное /64-битное программное обеспечение как концепция полностью не связано с размером 32-битного /64-битного текстового процессора?

4b9b3361

Ответ 1

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

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

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

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

Большая часть данных, используемых в типичных приложениях, даже в 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-разрядный), представляет собой просто набор возможностей, которые, как правило, связаны с ЦП определенного технологического поколения и/или программное обеспечение, которое использует эти возможности. Длина слова является частью этого, но не единственной или обязательно самой важной частью.

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

Используя программное обеспечение, такое как Word/Excel/и т.д., Установщики могут выбрать 32-битную или 64-битную установку. В чем разница?

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

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

64-битные программы используют дополнительные операции, которые не поддерживаются процессорами 32- bit SPARC. С другой стороны, операционная система Solaris или 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.

Ответ 5

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

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

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

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

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

Так как архитектура компьютера исправлена

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

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Когда мы говорим о MCU или CPU (также о других цифровых компонентах, таких как АЦП и ЦАП), мы говорим, что компонент может иметь: х-битные регистры, х-битный адрес шины, х-битную шину данных, х-битный вход, х-битный выход.

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

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

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

Ответ 8

Краткий ответ: это соглашение, основанное исключительно на ширине базовой шины данных

N-битная программа - это программа, оптимизированная для n-битного процессора. Иначе говоря, 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 бит" происходит от количества оперативной памяти, переданной за один цикл чтения/записи.

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

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

32/64 битный процессор, техническое определение

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

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

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

Когда биты передаются между ЦП и ОЗУ, напряжение на разных медных дорожках шины данных должно быть стабильным до считывания данных на шине, иначе одно или несколько битовых значений будут неправильными. Для стабилизации 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-разрядного ЦП является ретро-совместимым. Однако некоторые корректировки необходимы.

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

Запуск 32-битной программы на 64-битной архитектуре:

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

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

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

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

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

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

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

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

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