Pregunta ¿Por qué Windows de 64 bits necesita una carpeta separada "Archivos de programa (x86)"?


Sé que en una versión de 64 bits de Windows, la carpeta "Archivos de programa" es para programas de 64 bits y la carpeta "Archivos de programa (x86)" es para programas de 32 bits, pero ¿Por qué es esto incluso necesario?

Por "necesario", no me refiero a "¿por qué Microsoft no pudo tomar ninguna otra decisión de diseño?" porque por supuesto que podrían tener. Más bien, quiero decir, "¿por qué, dado el diseño actual de Windows de 64 bits, los programas de 32 bits deben tener una carpeta de nivel superior separada de los programas de 64 bits?" Dicho de otra manera, "lo que iría mal si de alguna manera evitara el mecanismo de redirección y obligara a todo a instalar al real C:\Program Files\? "

Hay muchas preguntas sobre Superusuario y en otros lugares que afirman "uno es para programas de 32 bits, uno es para programas de 64 bits", pero ninguno que puedo encontrar da la razón. Desde mi experiencia, no lo hace parecer importar si un programa de 32 bits está instalado en el lugar correcto o no.

¿Windows de alguna manera se presenta de manera diferente a un programa que se está quedando sin "Archivos de programa (x86)"? ¿Hay alguna descripción que muestre exactamente qué es diferente para un programa instalado en "Archivos de programa (x86)" en lugar de "Archivos de programa"? Creo que es poco probable que Microsoft presente una nueva carpeta sin una razón técnica legítima.


175


origen


En lugar de responder su pregunta, preguntaría: ¿cómo manejaría \ Archivos de programa \ Archivos comunes? - sgmoore
Respuesta de una sola línea (y, por lo tanto, un comentario): dado que puede ejecutar fácilmente cualquier aplicación desde cualquier carpeta sin conocer su arquitectura, entonces claramente no existe obligatorio motivo de esta separación Es una cuestión de conveniencia para admitir instalaciones dobles de aplicaciones con ambas arquitecturas. En algunos casos, hace la diferencia, ya que no son necesariamente simples compilaciones. El principal problema es que las aplicaciones de 32 bits no pueden cargar dlls de 64 bits, por lo que normalmente no puede instalar ambas versiones en el mismo lugar. La otra alternativa es tener dos carpetas "bin" para cada aplicación. - Sklivvz
@Synetech Incluso tuve programas instalados en (x86) solo para tener x64 binarios. A veces es horrible. - sinni800
Siempre me he preguntado por qué Microsoft no puso programas de 64 bits en un "Archivos de programa (x64)" en lugar de * mover "el directorio de archivos de programa" heredado "a Archivos de programa (x86) - LawrenceC
El verdadero enredo sobre la diferenciación de 64/32 bits es que / Windows / System32 contiene contenido de 64 bits, mientras que / Windows / SysWOW64 contiene el material de 32 bits ... - poke


Respuestas:


Respuesta corta: para garantizar que las aplicaciones heredadas de 32 bits continúen funcionando de la misma manera que antes sin imponer reglas desagradables en las aplicaciones de 64 bits que crearían un desorden permanente.

No es necesario. Es simplemente más conveniente que otras soluciones posibles, como requerir que cada aplicación cree su propia forma de separar archivos DLL y ejecutables de 32 bits de archivos DLL y ejecutables de 64 bits.

La razón principal es hacer que las aplicaciones de 32 bits que ni siquiera saben que los sistemas de 64 bits existen "simplemente funcionen", incluso si los archivos DLL de 64 bits están instalados en los lugares que las aplicaciones podrían tener. Una aplicación de 32 bits no podrá cargar una DLL de 64 bits, por lo que se necesitaba un método para garantizar que una aplicación de 32 bits (que podría ser anterior a los sistemas de 64 bits y, por lo tanto, no tenga idea de los archivos de 64 bits incluso existe) no encontraría una DLL de 64 bits, intenta cargarla, falla y luego genera un mensaje de error.

La solución más simple a esto consiste en directorios consistentemente separados. Realmente, la única alternativa es requerir que cada aplicación de 64 bits "oculte" sus archivos ejecutables en algún lugar donde una aplicación de 32 bits no se vea, como una bin64 directorio dentro de esa aplicación. Pero eso impondría una fealdad permanente en los sistemas de 64 bits solo para admitir aplicaciones heredadas.


89



No tuvieron que pasar por estos aros para permitir programas de 32 bits y 16 bits en el mismo sistema. No recuerdo haber visto alguna vez ProgramFiles (16) o algo así. Además, ¿cómo exactamente un programa de 32 bits podría "encontrar un DLL de 64 bits e intentar cargarlo"? ¿Qué programas andan buscando DLL aleatorias en %programfiles%? Si es una DLL compartida, entonces va en WinSxS; si no se comparte, entonces le corresponde al programador administrar sus propios archivos DLL. La parte acerca de que se hace como una conveniencia para los programadores es razonable. - Synetech
IIRC Win3.1 no tenía un directorio de archivos de programa (o la mayoría de las aplicaciones lo ignoraron); como resultado, no habría ninguna aplicación heredada win16 que buscara cosas en los archivos del programa, para empezar. En cambio, las bibliotecas compartidas de IIRC a menudo se colocaron en algún lugar de la carpeta de Windows. Win32 tiene windows \ system y windows \ system32 es un artefacto de eso. - Dan Neely
Windows 3.1 no admitía nombres de archivo largos, por lo que no habría podido tener una carpeta de 'archivos de programa'. - Darth Egregious
@JarrodRoberson: todo lo contrario, es porque Microsoft valora extremadamente la compatibilidad con versiones anteriores. - David Schwartz
@Jarrod: en realidad, como todo desarrollador sabe, Microsoft valora la compatibilidad con versiones anteriores también altamente. Literalmente, cada API que tienen tiene métodos heredados que se niegan a eliminar, y a menudo grave errores que se niegan a corregir, porque tienen miedo de romper programas anteriores que se escribieron para esa API. Lo mismo se aplica a la mayoría de las API, pero no a ninguna parte cercana a la existente de Microsoft. - BlueRaja - Danny Pflughoeft


Le permite instalar tanto la versión de 32 bits como la de 64 bits de una aplicación sin que se sobrescriba a sí misma.


Después de mirar esta respuesta y el hilo de comentarios al día siguiente, me doy cuenta de una posible gran descuido en mi respuesta. Asumí falsamente un fondo de programación y cuando estaba hablando  en mis comentarios, no me refería al usuario, sino al programador.

No trabajo para Microsoft y no tengo idea de qué real El razonamiento detrás de estas carpetas es, pero creo que el motivo para tener estas carpetas es tan obvio que no tengo ningún problema para argumentarlo.

¡Así que vamos a analizarlo!

  1. ¡Las carpetas son increíbles!

    Vamos a acordar algo. Las carpetas son geniales! No los necesitamos, tenemos suficientes nombres de archivos posibles para poner cada archivo en la raíz de su disco duro, entonces ¿para qué tener carpetas?

    Bueno, nos ayudan a ordenar nuestras cosas. Y ordenar cosas es genial. Nos ayuda a procesar las cosas más fácilmente. Esto es especialmente útil cuando se trabaja con una máquina que requiere estructura.

  2. ¡Separar los datos y la lógica es genial!

    Un paradigma que a menudo se encuentra en la programación es separar los datos de la lógica. Quieres una parte que sabe cómo hacer algo y quieres otra parte puede hacer algo con


65



¿Es esa la razón original, sin embargo? ¿No podría simplemente instalar la aplicación para C:\Program Files\App32 y C:\Program Files\App64? - Stephen Jennings
@StephenJennings: Pero eso requeriría que tomaras la decisión de forma manual. La forma en que funciona ahora es que el proceso es automático, porque Windows sabe qué carpeta debe proporcionar cuando una aplicación llama SHGetSpecialFolderPath para determinar la ubicación de instalación. - Der Hochstapler
@Synetech: ¿Por qué instalarlo en %PROGRAMFILES% ¿en primer lugar? ¿Por qué no poner la versión de 32 bits en el escritorio de los usuarios y la de 64 bits en la Papelera de reciclaje? Solo porque se pueda hacer, no significa que sea una buena idea. Lo siento, no sigo tu razonamiento. - Der Hochstapler
@Synetech: Sí, dio un ejemplo perfectamente bueno de cómo se podría hacer. Otro ejemplo perfectamente bueno de cómo se podría hacer es la forma en que es en realidad se está haciendo en este momento. Simplemente escribir un archivo en% PROGRAMFILES% y estar seguro de que terminará en la carpeta correcta es una cosa. Comprobando usted mismo qué carpeta es la correcto uno es otro. Si realmente no ves el beneficio del enfoque anterior, entonces no seré capaz de convencerte. La pregunta era por qué hay 2 carpetas. Creo que mi respuesta es perfectamente razonable en ese sentido. - Der Hochstapler
@OliverSalzburg, No del todo. La pregunta es por qué dos carpetas son necesario, no por qué hay son. De hecho, incluso lo negó: ¿Por qué es esto incluso necesario? No explicaste por qué es necesario y el ejemplo que di (e incluso tu propio ejemplo sarcástico) solo muestra que no tener hacerse de la manera que es - Synetech


TL; DR:

Para resumir, no, no es necesario; ellos podría ha utilizado una sola carpeta, y no, Windows no se presenta de manera diferente a un programa que se ejecuta desde una ubicación u otra.


Bueno, todo el mundo parece estar arrojando sus opiniones sobre esto, así que lanzaré mi 2 ¢. Otros ya han conjeturado sobre los motivos de por qué Microsoft eligió crear carpetas de nivel superior separadas para las versiones de 32 bits y de 64 bits de los programas, por lo que dejaré esa parte (la mejor explicación fue la explicación de David de que es conveniente para los programadores). Por supuesto, incluso entonces, no aborda la pregunta directa ¿Por qué es esto incluso necesario?, a lo que la respuesta es presumiblemente: no es.

En cambio, abordaré el cuerpo principal de la pregunta

¿Windows de alguna manera se presenta de manera diferente a un programa que se está quedando sin "Archivos de programa (x86)"?

En realidad, no, pero la ubicación del programa poder afecta el comportamiento, pero no de la manera en que pensarías.

Cuando ejecuta un programa, Windows configura un entorno para ejecutarlo (quiero decir en términos de memoria, direccionamiento, etc., no solo variables de entorno). Este entorno depende del contenido del ejecutable (los programas de 32 bits y de 64 bits difieren internamente). Cuando ejecuta un programa de 32 bits en un sistema de 64 bits, se ejecuta en el subsistema de 32 bits que emula un entorno de 32 bits. Se llama WoW64 (WoW64 significa Windows en Windows de 64 bits) y es similar a cómo las aplicaciones de 16 bits se ejecutarían en XP utilizando el NTVDM.

Cuando ejecuta un programa con o sin privilegios de administrador, afecta cómo se ejecuta, pero la ubicación debería no lo afecta (aunque hay algunos ejemplos de dependencia de ubicación como algunos controladores, por ejemplo).

(Estoy usando una computadora diferente, así que no puedo confiar en el historial de mi navegador para seguir mis pasos, pero el otro día respondí esta pregunta SU Terminé en esta pregunta SO lo que me causó Google PROCESSOR_ARCHITEW6432que conducen a esta pregunta SO y este blog de Microsoft publicando.)

En algún momento, leí una publicación de StackOverflow sobre cómo la variable del entorno %processor_architecutre%  da diferentes resultados dependiendo de dónde ejecuta el comando-prompt de (Trataré de encontrar la cita exacta).

La respuesta resultó ser debida si se ejecutó la versión de 32 bits o 64 bits del símbolo del sistema (es decir, desde System32\ o SysWoW64\) En otras palabras, mientras la ubicación parece ser afectan el comportamiento del programa, es solo porque hay diferentes versiones del programa, no porque Windows trate la carpeta de una manera especial.

Esto tiene sentido porque el contenido del archivo ejecutable determina si es de 32 bits o de 64 bits, por lo que podría colocar una copia de 32 bits y de 64 bits del mismo programa (por ejemplo, foobar32.exe y foobar64.exe) en la misma carpeta y cuando los ejecuta, se cargarán correctamente (la versión de 64 bits se ejecutará de forma nativa y la de 32 bits se ejecutará en la capa de emulación WoW64).

FreePascal le permite instalar versiones de DOS y Windows y van en la misma carpeta: %programfiles%\FreePascal. Gestiona las diferentes arquitecturas manteniendo archivos ejecutables (.exe, .sys, .dll, .ovr, etc.) en carpetas separadas y compartir archivos de recursos como imágenes, archivos fuente, etc. No existe una razón técnica para que esto tampoco se pueda hacer para las versiones de 32 y 64 bits de un programa. Como dijo David, es más fácil para el programador mantenerlos separados (es decir, usar variables para que parezca que solo hay un conjunto de archivos, etc.)


14



Venganza bajando la votación! Muahahaha! suspiro - Synetech
Voto a la baja extraño: \. Por cierto, bueno explicar +1. - avirk


Otra razón es que la mayoría de los programas solían usar variables ambientales como% PROGRAMFILES% para indicar dónde se instaló su programa. Para programas de 64 bits, va al lugar normal. Para programas de 32 bits, redirigirá eso a la nueva Program Files (x86) carpeta.

Aunque, al menos con el nuevo material .Net en Visual Studio, ahora tienen la variable App.Local que elimina toda la necesidad de esto.


11



Eso no lo explica. ¿Quién está usando exactamente la variable de entorno y por qué le importaría si un programa es de 32 bits o de 64 bits? - Synetech
@Synetech: el autor de los programas usa la variable de entorno. En cuanto a la razón por la que le importaría es debido a las referencias a dlls. No puede cargar un dll de 32 bits dentro de un proceso de 64 bits y viceversa. - Ramhound
Y como hacer %programfiles%, %programfiles(x86)%, o %programw6432% hacer la diferencia allí? Todos los DLL compartidos van al único directorio WinSxS, y cualquier archivo DLL no compartido está allí con el ejecutable. Esto solo importaría si por alguna razón tienes instaladas tanto las versiones de 32 bits como de 64 bits del mismo programa, e incluso entonces, mantendrías las DLL de 32 bits con el ejecutable de 32 bits y la DLL de 64 bits con el ejecutable de 64 bits. Puedes hacer esto así: %programfiles%\CoolApp\bin\32 y% programfiles% \ CoolApp \ bin \ 64`, ¿por qué las carpetas de nivel superior separadas? - Synetech
@Synetech Claro que sí; % programfiles% ha estado por un tiempo. Si instala un programa de 32 bits en una computadora de 64 bits, tener un lugar podría causar problemas para esa aplicación de 32 bits. Aunque WoW puede redirigir% programfile% a la versión (x86) para aplicaciones de 32 bits, y la versión que no es x86 para 64. - Andy
creo que la gente no estaría tan confundida, si no hubiera una redirección implícita - kommradHomer


La solución de Microsoft para esta transición de 32 bits a 64 bits ha sido agregar soporte heredado para la mayoría de las aplicaciones de 32 bits. En otras palabras, la mayoría de las aplicaciones de 32 bits funcionarán en el entorno operativo de 64 bits. Tenga en cuenta que otros sistemas operativos que operan en una arquitectura de 64 bits no pueden cargar o ejecutar aplicaciones de 32 bits.

Para ayudar a facilitar la transición, Microsoft ha designado que todas las aplicaciones de 32 bits deben cargarse de manera predeterminada en la carpeta Archivos de programa (x86) en lugar de mezclarse con aplicaciones reales de 64 bits en la carpeta Archivos de programa normales.

Fuente 

"¿Qué iría mal si de alguna manera evitara el mecanismo de redirección y forzara todo para instalarlo en C: \ Program Files real?" 

Nada. Los dos directorios de programa son solo para organización o para mantener separados los programas que tienen dos versiones, una de 32 bits y otra de 64 bits, como Internet Explorer. Pero puede instalar un programa de 32 bits en "Archivos de programa" y un programa de 64 bits en "Archivos de programa x86" y no ocurrirá nada, el programa se ejecutará de la misma manera.

Wiki dice:

Algunos instaladores de aplicaciones rechazan espacios dentro de la ubicación de la ruta de instalación. Para sistemas de 32 bits, el nombre abreviado de la carpeta Archivos de programa es Progra ~ 1. Para sistemas de 64 bits, el nombre abreviado de la carpeta Archivos de programa de 64 bits es Progra ~ 1 (igual que en los sistemas de 32 bits); mientras que el nombre abreviado de la carpeta Archivos de programa de 32 bits (x86) es ahora Progra ~ 2.


8



Jeje. Buen articulo. Los comentarios a ese artículo suenan exactamente como los que están aquí. Peor aún, ese artículo era de hace más de dos años, lo que demuestra que esta pregunta no es nueva y si aún no puede responderse con autoridad, entonces supongo que nunca lo hará (a menos que alguien del equipo de Windows intervenga). Bueno, supongo que todos deberíamos dejar de preocuparnos y aprender a amar la bomba, quiero vivir con eso. +1 por señalar el artículo y mostrar que esta pregunta ha estado presente por mucho tiempo. - Synetech
@Synetech gracias! Sí, la idea detrás de poner el enlace del artículo es la misma que tienes. Esta es una pregunta muy antigua, pero IDK explica por qué las personas aún no pueden obtenerla. Sin embargo, la MS debería escribir una KB o documentación para este problema :) - avirk
Sí, deberían hacerlo, especialmente porque no son solo los desarrolladores los que preguntan, incluso los usuarios normales se preguntan al respecto. Lamentablemente, la documentación de Microsoft no suele ser demasiado buena. - Synetech
@Synetech yup! La documentación de MS apesta la mayor parte del tiempo. Pero sí, también han escrito algunos buenos artículos y estoy bastante seguro de que son contables;) - avirk


El motivo es facilitar la actualización de un programa a 64 bits para los desarrolladores. No tienen que escribir ningún código personalizado para verificar el programa en un directorio cuando compilan en modo de 32 bits y en otro directorio cuando compilan en modo de 64 bits; ellos solo chequean C:\Program Files, y cuando se ejecuta en modo de 32 bits, esto se cambia automáticamente a C:\Program Files (x86) por Windows de 64 bits. Del mismo modo, las entradas del registro están aisladas entre los programas de 32 bits y 64 bits.

Esto evita conflictos de desconocimiento para los desarrolladores que simplemente cambian su modo de compilación a 64 bits sin pensarlo mucho, y evita una enorme cantidad de trabajo para los desarrolladores que desean que los usuarios puedan instalar versiones de 32 y 64 bits de sus software al mismo tiempo.


¿Pero por qué un programa quiere permitir que ambas versiones se instalen simultáneamente? Un ejemplo: Photoshop e IE tienen extensiones que son .dll nativas. No puede tener el código de 32 y 64 bits mezclado en el mismo proceso, por lo que un complemento para la versión de 32 bits no se puede usar con la versión de 64 bits, y viceversa. Por lo tanto, Photoshop / IE tener permitir que se instalen ambas versiones, o arriesgarse a romper su gran base de complementos existentes.


6



+1 Al menos abordó la pregunta subyacente de por qué los usuarios promedio tendrían ambas versiones. - Synetech


Los programas que se ejecutan en "Archivos de programa (x86)" usan el WOW64 subsistema (Windows de 32 bits en Windows de 64 bits es un conjunto de controladores y API diseñados para ejecutar aplicaciones x32 a través de un sistema de arquitectura x64):

El subsistema WoW64 comprende una capa de compatibilidad ligera que   tiene interfaces similares en todas las versiones de 64 bits de Windows. Apunta a   crear un entorno de 32 bits que proporciona las interfaces necesarias para   ejecutar aplicaciones de Windows de 32 bits sin modificar en un sistema de 64 bits.   Técnicamente, WoW64 se implementa utilizando tres bibliotecas de enlaces dinámicos   (DLL):

  • Wow64.dll, la interfaz principal del kernel de Windows NT que traduce entre llamadas de 32 y 64 bits, incluidos el puntero y la llamada   manipulaciones de pila
  • Wow64win.dll, que proporciona los puntos de entrada apropiados para aplicaciones de 32 bits
  • Wow64cpu.dll, que se encarga de cambiar el procesador de 32 bits a modo de 64 bits

El sistema de 64 bits necesita "emular" aplicaciones de 32 bits, esa es la razón por la cual Windows necesita "segregar" dos carpetas de Archivos de programa.


5



Pero ¿por qué tiene que ponerlo en diferentes carpetas? Windows ya es completamente capaz de determinar la arquitectura de un ejecutable mirando el encabezado PE. ¿Por qué no puede cargar el entorno apropiado cuando carga el ejecutable? - Synetech
Creo que es solo una elección de Microsoft para mostrarles fácilmente a los usuarios qué arquitectura quieren de la versión de dos programas al abrir un programa. Quiero decir, si no hubiera estas dos carpetas y si fuera transparente para los usuarios (si cambia automáticamente), no sabrían si ejecutan una aplicación de 32 o 64 bits, incluso, no sabrían qué programa abrir si se ejecuta en 64 bits ... - Diogo
La versión de 64 bits de IE tiene una reputación de ser terrible. - Samuel Edwin Ward
MS recomienda usar Office32 a menos que esté trabajando con conjuntos de datos lo suficientemente grandes como para superar las limitaciones de memoria. Creo que la necesidad de recompilar complementos binarios para trabajar con office64; combinado con no dar ningún beneficio en casos de uso normal está detrás de la decisión. - Dan Neely
Creo que encontrará que un programa de 64 bits instalado explícitamente en la carpeta Archivos de programa (x86) funcionará perfectamente normalmente (y, en la mayoría de los casos, viceversa). Windows no usa la ubicación de la carpeta para determinar cómo tratar el ejecutable. - Harry Johnston


Es interesante que las respuestas aquí y en Internet varíen bastante. Encontrar una respuesta precisa a esta importante pregunta ha sido un desafío. Parece que hay bastante información falsa presentada en Internet, lo que genera confusión.

Realicé una gran cantidad de investigación y saqué la siguiente conclusión, que creo que es precisa:

  • No importa dónde se almacena una aplicación. En tiempo de ejecución, Windows determinará si la aplicación es de 32 bits o de 64 bits y utilizará automáticamente las DLL y la sección de registro correspondientes.

Esto sucede automáticamente y es independiente de donde se almacena la aplicación. No hay velocidad, fiabilidad u otro beneficio funcional al tener carpetas separadas de 32 bits y 64 bits.

La única razón para la separación predeterminada en dos carpetas ('Archivos de programa' y 'Archivos de programa (x86)') es que si tiene dos versiones del mismo programa (una versión de 32 y 64 bits), proporciona una forma simple de mantener los archivos superpuestos separados. Incluso en este caso, siempre que todos los nombres de archivo sean únicos, podrían existir en la misma carpeta sin ninguna consecuencia.

Hay una advertencia a la conclusión anterior, y esa es la de las aplicaciones mal codificadas. Si una aplicación tiene rutas de acceso codificadas en ella, solo usará esa ruta. Como regla general, las rutas nunca deben estar codificadas en una aplicación, pero ocasionalmente un programador cometerá este error. En este caso, el programa usará la ruta codificada; el directorio en el que está instalada la aplicación no afectará a dónde realmente busca los archivos.


5





Al tener que separar las carpetas, es posible mantener las aplicaciones nativas de 64 bits y las que requieren WoW64 aparte.

Esto puede ser útil, como @OliverSalzburg ya se indicó, si desea instalar tanto el navegador de 64 bits como el de 32 bits (por ejemplo), ya que algunos complementos y complementos solo podrían estar disponibles para uno de los dos.

Tener que separar las carpetas hace que esta separación automáticousando técnicas como redirección de registro.

Supongamos que un instalador intenta determinar la carpeta de archivos del programa leyendo el registro usando, por ejemplo, RegQueryValueEx.

En cualquier caso, intenta leer la clave de registro

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

que normalmente apunta a C:\Program Files.

Sin embargo, si el instalador es una aplicación de 32 bits, la redirección del registro causará la clave de registro

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion

para ser leído en su lugar, lo que normalmente apunta a C:\Program Files (x86).

Por qué estos especial Los nombres de las carpetas que se han usado solo pueden ser respondidas por las personas que hicieron esta elección. Siempre puede cambiar los nombres de las carpetas predeterminadas si lo desea.

¿Windows de alguna manera se presenta de manera diferente a un programa que se está quedando sin "Archivos de programa (x86)"?

Lo dudo. La mayoría de los instaladores le permiten elegir una carpeta de instalación personalizada, por lo que realmente no importa dónde un programa se instala


3



Lo siento, mezclé "permiso" con "prohibir" - Wernfried Domscheit