175

Я знаю, что в 64-разрядной версии Windows папка "Program Files" предназначена для 64-разрядных программ, а папка «Program Files (x86)» - для 32-разрядных программ, но зачем это вообще нужно?

Под "необходимым" я не имею в виду «почему Microsoft не смогла принять никаких других дизайнерских решений?«потому что, конечно, они могли бы иметь. Скорее я имею в виду, «почему, учитывая текущий дизайн 64-битной Windows, 32-битные программы должны иметь отдельную папку верхнего уровня из 64-битных программ?"Другими словами", что могло бы пойти не так, если бы я как-то избежал механизма перенаправления и заставил все установить на настоящий C:\Program Files\?"

Есть много вопросов о Super User и других местах, которые утверждают, что «один для 32-битных программ, другой для 64-битных программ», но ни один, который я могу найти, не дает оснований. Исходя из моего опыта, это , кажется, не имеет значения, установлена ли 32-разрядная программа в правильном месте или нет.

Windows как-то отличается от программы, в которой заканчивается «Program Files (x86)»? Есть ли описание, которое показывает, что именно отличается от программы, установленной в «Program Files (x86)» вместо "Program Files"? Я думаю, что вряд ли Microsoft представит новую папку без уважительной технической причины.

11 ответов11

89

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

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

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

Самое простое решение для этого - последовательно отдельные каталоги. На самом деле единственная альтернатива - требовать от каждого 64-разрядного приложения "прятать" свои исполняемые файлы там, где 32-разрядное приложение не будет выглядеть, например, в каталоге bin64 внутри этого приложения. Но это наложило бы постоянное уродство на 64-битные системы только для поддержки устаревших приложений.

65

Это позволяет вам устанавливать как 32-битную, так и 64-битную версию приложения без перезаписи.


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

Я не работаю на Microsoft, и я понятия не имею, какова реальная причина этих папок, но я думаю, что причина наличия этих папок настолько очевидна, что у меня нет проблем с этим спорить.

Итак, давайте разберемся!

  1. Папки потрясающие!

    Давайте договоримся о чем-то. Папки отличные! Они нам не нужны, у нас достаточно возможных имен файлов, чтобы поместить каждый отдельный файл в корень жесткого диска, так зачем вообще иметь папки?

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

  2. Разделение данных и логики - это здорово!

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

    Это также находится в файловой системе.

    У нас есть папки для приложения (логика) и папки для наших ценностей (данных):

    логика

    • %WINDIR%
    • %PROGRAMFILES%
    • %PROGRAMFILES(x86)%

    Данные

    • %PROGRAMDATA%
    • %HOMEDRIVE%%HOMEPATH%

    Таким образом, кажется, что папки потрясающие, и имеет смысл помещать программы в их собственную маленькую папку. Но почему 2? Почему бы не позволить установщику справиться с этим и поместить все в одну папку « Programs »?

  3. Установщики не волшебны

    Сегодня мы часто используем небольшие программы для установки наших больших программ. Мы называем эти маленькие программы- установщики.

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

    1 папка программных файлов

    Разработчик поддерживает 2 установщика. Один для 32-битной и один для 64-битной версии его приложения. 32-битный установщик запишет в C:\Program Files\App\ а 64-битный установщик запишет в C:\Program Files\App\sixtyfour\ .

    2 папки с программными файлами

    Разработчик поддерживает 1 установщик. Установщик всегда будет записывать в %PROGRAMFILES% и зависит от операционной системы, чтобы соответствующим образом расширить путь (вы фактически не используете переменные среды для этих случаев, вы использовали бы SHGetKnownFolderPath с FOLDERID_ProgramFiles для получения правильного пути).
    Все находит свое место автоматически, и шаблон идентичен для каждого приложения, которое вы устанавливаете .

  4. Последовательность имеет смысл

    Когда вы чему-то учитесь , это обычно означает, что наблюдаемое поведение было последовательным. Иначе действительно нечего наблюдать и учиться.

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

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

Я до сих пор не понимаю. Это кажется бесполезным

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

Вот почему нам нужны такие вещи, как перенаправление файловой системы, чтобы сделать наши системы работоспособными.

Программисты просто зайдут туда и попытаются загрузить C:\Windows\system32\awesome.dll и не заботятся о том, работают ли они в 32- или 64-битной системе. Они будут пытаться загрузить 64-битную DLL и просто потерпеть крах. Некоторые программисты хотят использовать некоторую Office DLL, нет проблем, они знают, где ее найти! C:\Program Files\Microsoft\Office\14.0\wizards.dll ... и еще один сбой!

Все эти запросы 32-битным приложением перенаправляются в 32-битные аналоги, чтобы избежать сбоев приложения.

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

Хорошо, теперь я понял. Но почему бы тогда не использовать C:\Program Files\x86\ ?

Теперь мы становимся философскими ...

Что бы пошло не так, если бы я как-то избежал механизма перенаправления и заставил все установить на настоящий C:\Program Files\?

Скорее всего, ничего (если другие приложения не зависят от фиксированного местоположения этого приложения).

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

Да, но я имею ввиду ВСЕ приложения!

  • Что произойдет , если я ставлю как дизельное топливо и газ в мою машину?
  • Что произойдет, если я попытаюсь использовать как переменный, так и постоянный ток на одной линии?
  • Что произойдет , если я продолжу и мою кошку и мою рыбу в том же аквариуме?

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

15

TL; DR:

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


Ну, все, кажется, высказывают свое мнение по этому поводу, поэтому я брошу свои 2 ¢. Другие уже предположили причины, по которым Microsoft решила создать отдельные папки верхнего уровня для 32-разрядных и 64-разрядных версий программ, поэтому я оставлю эту часть (лучшей причиной было объяснение Дэвида, что это как удобство для программистов). Конечно, даже тогда, это не совсем решает прямой вопрос, почему это вообще необходимо?, на который, по-видимому, ответ: это не так.

Вместо этого я рассмотрю основную часть вопроса

Windows как-то отличается от программы, в которой заканчивается «Program Files (x86)»?

Не совсем, но расположение программы может повлиять на поведение, но не так, как вы думаете.

Когда вы запускаете программу, Windows устанавливает среду, в которой она запускается (я имею в виду память, адресацию и т.д., А не только переменные среды). Эта среда зависит от содержимого исполняемого файла (32-битные и 64-битные программы внутренне различаются). Когда вы запускаете 32-битную программу в 64-битной системе, она запускается в 32-битной подсистеме, которая эмулирует 32-битную среду. Он называется WoW64 (WoW64 означает Windows на 64-битной Windows) и похож на то, как 16-битные приложения будут запускаться в XP с использованием NTVDM.

Когда вы запускаете программу с правами администратора или без них, это влияет на то, как она работает, но местоположение не должно влиять на нее (хотя есть некоторые примеры зависимости от местоположения, например, некоторые драйверы).

(Я использую другой компьютер, поэтому я не могу полагаться на историю своего браузера, чтобы отследить свои шаги, но на днях, отвечая на этот вопрос SU, я оказался на этом вопросе SO, который привел меня к Google PROCESSOR_ARCHITEW6432, который привел к этому вопросу SO и это публикация в блоге Microsoft.)

Где-то по пути я читал пост StackOverflow о том, как переменная окружения %processor_architecutre% дает разные результаты в зависимости от того, откуда вы запускаете командную строку (я постараюсь найти точную цитату).

Ответ оказался обусловлен тем, была ли запущена 32-разрядная или 64-разрядная версия командной строки (т. Е. Из System32\ или SysWoW64\). Другими словами, хотя местоположение, кажется, влияет на поведение программы, это происходит только потому, что существуют разные версии программы, а не потому, что Windows обрабатывает папку особым образом.

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

FreePascal позволяет устанавливать версии как для DOS, так и для Windows, и они находятся в одной папке: %programfiles%\FreePascal . Он управляет различными архитектурами, храня исполняемые файлы (.exe , .sys , .dll , .ovr и т.д.) В отдельных папках и обмениваясь файлами ресурсов, такими как картинки, исходные файлы и т.д.) Нет технической причины, по которой это нельзя было бы сделать для 32- и 64-разрядных версий программы. Как сказал Дэвид, программисту будет проще, если они будут храниться отдельно (т. Е. Использовать переменные, чтобы они выглядели так, будто существует только один набор файлов и т.д.)

11

Другая причина в том, что большинство программ использовали переменные среды, такие как% PROGRAMFILES%, чтобы указать, где была установлена их программа. Для 64-битных программ он идет в обычное место. Для 32-битных программ он перенаправит их в новую папку Program Files (x86) .

Хотя, по крайней мере, с новыми вещами .Net в Visual Studio, у них теперь есть переменная App.Local, которая устраняет всю потребность в этом.

8

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

Чтобы упростить переход, Microsoft назначила, что все 32-разрядные приложения должны по умолчанию загружаться в папку Program Files (x86), а не смешиваться с настоящими 64-разрядными приложениями в обычной папке Program Files.

Источник

"что бы пошло не так, если бы я как-то избежал механизма перенаправления и заставил все установить на настоящий C:\Program Files\?"

Ничего такого. Два каталога программ предназначены только для организации или для разделения программ с двумя версиями, 32-разрядной и 64-разрядной, например, Internet Explorer. Но вы можете установить 32-разрядную программу в "Program Files" и 64-разрядную программу в "Program Files x86", и ничего не произойдет, программа будет работать одинаково.

Вики говорит:

Некоторые установщики приложений отклоняют пробелы в пути установки. Для 32-разрядных систем короткое имя для папки Program Files - Progra ~ 1. Для 64-битных систем короткое имя для папки 64-битных программных файлов - Progra ~ 1 (так же, как в 32-битных системах); в то время как короткое имя для папки 32-разрядных программных файлов (x86) теперь Progra ~ 2.

6

Причина состоит в том, чтобы сделать обновление программы до 64-битной проще для разработчиков. Им не нужно писать какой-либо специальный код для проверки программы в одном каталоге при компиляции в 32-битном режиме и в другом каталоге при компиляции в 64-битном режиме; они просто проверяют C:\Program Files , и при работе в 32-битном режиме это автоматически изменяется на C:\Program Files (x86) в 64-битной Windows. Аналогично, записи реестра изолированы между 32-битными и 64-битными программами.

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


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

5

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

Я провел значительное количество исследований и сделал следующий вывод, который я считаю точным:

  • Не имеет значения, где хранится приложение. Во время выполнения Windows определит, является ли приложение 32-разрядным или 64-разрядным, и автоматически использует соответствующие разделы DLL и реестра.

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

Единственная причина разделения по умолчанию на две папки («Program Files» и «Program Files (x86)») заключается в том, что если у вас есть две версии одной и той же программы (32-битная и 64-битная версия), она обеспечивает простой способ разделять перекрывающиеся файлы. Даже в этом случае, если все имена файлов уникальны, они могут фактически существовать в одной папке без каких-либо последствий.

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

5

Программы, работающие на «Program Files(x86)», используют подсистему WOW64 (32-битная Windows на 64-битной Windows - это набор драйверов и API, предназначенных для запуска приложений x32 в системе архитектуры x64):

Подсистема WoW64 содержит облегченный уровень совместимости, который имеет аналогичные интерфейсы во всех 64-разрядных версиях Windows. Он направлен на создание 32-разрядной среды, которая обеспечивает интерфейсы, необходимые для запуска неизмененных 32-разрядных приложений Windows в 64-разрядной системе. Технически WoW64 реализован с использованием трех динамически подключаемых библиотек (DLL):

  • Wow64.dll, основной интерфейс к ядру Windows NT, который транслирует между 32-битными и 64-битными вызовами, включая манипуляции указателя и стека вызовов
  • Wow64win.dll, который обеспечивает соответствующие точки входа для 32-битных приложений
  • Wow64cpu.dll, который заботится о переключении процессора из 32-битного в 64-битный режим

64-битная система должна "эмулировать" 32-битные приложения, поэтому Windows должна "разделять" две папки Program Files.

3

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

MS сделала это, чтобы решить случай, когда DLL используется как более старыми 32-битными приложениями, так и более новыми 64-битными приложениями. Более старый метод не может быть изменен (System32, Program Files и т.д.), Потому что это сломает старые программы, которые не могут быть перекомпилированы.

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

На самом деле DLL-библиотеки .Net могут сосуществовать с другими версиями на той же машине. Например, у вас может быть Library.1.0.1, Library.1.0.2, Library 1.1.0 и т.д. И это только для определенного размера бит (32 или 64). Если отдельные папки не используются, то каждая сборка должна иметь 32- и 64-разрядную версию. Это может сильно загромождать каталог, который уже содержит несколько версий одной и той же сборки.

Это все для разработчиков. Мне, как пользователю, приходится иметь дело с ним только тогда, когда я работаю с 32-битной программой в Windows 7 64. И я предпочитаю иметь возможность запускать 32-битную версию и то же приложение в 64-битной версии. Когда я работаю над 32-разрядным приложением, которое мне нужно скомпилировать в 64-разрядном, все, что я делаю, это говорю компилятору сделать это. Имена Dll и все остальное остается прежним.

Причина, по которой этого не было в Windows 95/98, заключается в том, что эти системы имитировали 32-разрядную среду выполнения; это была не настоящая 32-битная операционная система. Это симулировало 32-битное исполнение с чем-то под названием "thunking".

Вот хорошее определение: http://searchwinit.techtarget.com/definition/thunk

3

Необходимость разделять папки позволяет сохранить родные 64-битные приложения и те, которые требуют WoW64, отдельно.

Это может быть полезно - как уже указывал @OliverSalzburg - если вы хотите установить как 64-битный, так и 32-битный веб-браузер (например), так как некоторые плагины и дополнения могут быть доступны только для одного из два.

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

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

В любом случае он пытается прочитать раздел реестра

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

который обычно указывает на C:\Program Files .

Однако, если установщик является 32-разрядным приложением, перенаправление реестра вызовет ключ regitry.

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

вместо этого, который обычно указывает на C:\Program Files (x86) .

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

Windows как-то отличается от программы, в которой заканчивается «Program Files (x86)»?

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

0

Это совсем не обязательно. Например, на моем рабочем компьютере я устанавливаю каждое приложение в папку C:\MyPrograms\ , чтобы отделить их от приложений, установленных нашим ИТ-отделом.

Конечно, это мешает мне установить обе версии (32- и 64-битную) одного приложения, но в моем случае это не проблема.

Каждый раз, когда вы запускаете программу, всегда выполняется первая DLL C:\Windows\System32\ntdll.dll . Эта DLL определяет, является ли ваша программа 32- или 64-битным приложением. В зависимости от этого вы будете перенаправлены на WoW64 который уже упоминался в нескольких ответах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .