Se si sta attualmente utilizzando una versione a 64 bit di Windows avrete notato che ci sono due cartelle "Programmi", una per 64 bit e una per le applicazioni a 32 bit. Perché Windows ha bisogno della loro suddivisione?


La domanda
Lettore di SuperUser Stephen Jennings ha notato la divisione "Program Files" e voleva andare a fondo delle cose:

So che su una versione a 64 bit di Windows la cartella "Program Files" è per i programmi a 64 bit e il "Program Files (x86)" cartella è per programmi a 32 bit, ma perché è questo ancora necessario?

Con il termine "necessario", non voglio dire "perché non poteva Microsoft hanno fatto tutte le altre decisioni di progettazione?", Perché, naturalmente, potrebbero avere. Piuttosto, voglio dire, "perché, dato il design attuale a 64 bit di Windows, deve programmi a 32 bit hanno una cartella di livello superiore separato da programmi a 64 bit?» In altre parole, "che cosa sarebbe andare male se io in qualche modo evitato il meccanismo di reindirizzamento e costretto tutto installare al reale C: \ Program Files \? "

Ci sono un sacco di domande su Super User e altrove che affermare "una è per programmi a 32 bit, una è per i programmi a 64 bit", ma nessuno che posso trovare il motivo. Dalla mia esperienza, non sembra importare se un programma a 32 bit è installata in posizione corretta o meno.

Ha di Windows in qualche modo presentarsi in modo diverso a un programma corto di "Program Files (x86)"? C'è una descrizione che mostra esattamente cosa c'è di diverso per un programma installato in "Program Files (x86)" invece di "Program Files"? Penso che sia improbabile che Microsoft avrebbe introdotto una nuova cartella senza una ragione tecnica legittima.

E 'vero che ci sono un sacco di articoli Explainer incentrata sulla differenza tra i due, ad esempio il nostro trattamento del soggetto qui Ma perché fa esattamente di Windows sportive cartelle doppi?

La Risposta
Se siete alla ricerca di una risposta breve e dolce, girare a SuperUser collaboratore David Schwartz:

Risposta breve: Per garantire le applicazioni legacy a 32 bit continuano a lavorare allo stesso modo che hanno usato per senza imporre regole brutte su applicazioni a 64 bit che potrebbero creare un disastro permanente.

Non è necessario. E 'solo più conveniente rispetto ad altre soluzioni possibili come la richiesta ogni applicazione per creare il proprio modo di separare DLL a 32 bit ed eseguibili da DLL a 64 bit e gli eseguibili.

Il motivo principale è quello di rendere le applicazioni a 32 bit che non sanno nemmeno sistemi a 64 bit esistono "solo lavoro", anche se le DLL a 64 bit sono installati in punti le applicazioni potrebbero guardare. Un'applicazione a 32 bit non sarà in grado di caricare una DLL a 64 bit, quindi un metodo è stato necessario per garantire che un'applicazione a 32 bit (che potrebbe controllare la validità della data di sistemi a 64 bit e, quindi, non hanno file a 64 bit idea anche esistere) non trovare una DLL a 64 bit, provare a caricarlo, fallire, e quindi generare un messaggio di errore.

La soluzione più semplice per questo è costantemente directory separate. In realtà l'unica alternativa è quella di richiedere tutte le applicazioni a 64-bit per "nascondere" i suoi file eseguibili da qualche parte un'applicazione a 32 bit non apparirebbe, come ad esempio un bin64 directory all'interno di tale applicazione. Ma che imporrebbe la bruttezza permanente sui sistemi a 64 bit solo per supportare le applicazioni legacy.

Un altro collaboratore, Oliver Salisburgo, approfondisce il lato programmazione delle cose e perché esattamente Microsoft sarebbe andato su come strutturare le cartelle come hanno fatto:

Dopo aver guardato questa risposta e commento infilare il giorno dopo, mi rendo conto che una possibile svista importante nella mia risposta. Ho falsamente assunto uno sfondo di programmazione e quando ero a parlare di te nei miei commenti, non volevo dire che l'utente, ma il programmatore.

Non lavoro per Microsoft e non ho idea di cosa la vera ragione dietro a queste cartelle è, ma penso che il motivo per avere queste cartelle è così evidente che non ho alcun problema sostenendo che.

Quindi cerchiamo di scomposizione!

Le cartelle sono incredibili! Siamo d'accordo su qualcosa. Le cartelle sono grandi! Non abbiamo bisogno di loro, abbiamo abbastanza nomi di file possibile per mettere ogni singolo file nella directory principale del disco rigido, quindi perché avere cartelle a tutti? Beh, ci aiutano a ordinare la nostra roba. E ordinare roba è grande. Ci aiuta a elaborare le cose più facilmente. Ciò è particolarmente utile quando si lavora con una macchina che richiede la struttura.
La separazione dei dati e la logica è fantastico! Un paradigma spesso si trovano in programmazione, è quello di separare i dati dalla logica. Volete una parte che sa come fare qualcosa e volete un altro parte che si può fare qualcosa con .Questo si trova anche nel file system.
Abbiamo cartelle per applicazione (logica) e le cartelle per i nostri oggetti di valore (dati):

Logica

% WINDIR%
%FILE DI PROGRAMMA%
% PROGRAMFILES (x86)%
Dati

%DATI DEL PROGRAMMA%
% HOMEDRIVE %% HOMEPATH%
Così, sembra che le cartelle sono impressionanti e ha senso mettere i programmi nel loro piccolo cartella. Ma perché avere 2? Perché non lasciare che il programma di installazione di gestire che e mettere tutto in uno Programmi cartella?

Gli installatori non sono magicToday, che spesso utilizza piccoli programmi per installare i nostri programmi più grandi. Chiamiamo questi piccoli programmi installatori .Installers non sono magici. Devono essere scritti da programmatori e sono applicazioni (con possibili bug) come qualsiasi altra applicazione là fuori. Quindi cerchiamo di guardare la situazione un programmatore immaginario avrebbe dovuto affrontare con e senza il sistema attuale:
Cartella 1 Programma

Lo sviluppatore mantiene 2 installatori. Uno per il 32 bit e una per la versione a 64 bit della sua domanda. Il programma di installazione a 32 bit scriverà a C: \ Program Files \ App \ e l'installatore 64bit scriverà a C: \ Program Files \ App \ sessantaquattro \.

2 cartelle Program Files

Lo sviluppatore mantiene 1 installatore. Il programma di installazione sempre scrivere% PROGRAMFILES% e dipende dal sistema operativo per espandere il percorso di conseguenza (che in realtà non si utilizzano variabili di ambiente per questi casi, utilizza SHGetKnownFolderPath con FOLDERID_ProgramFiles per recuperare il percorso corretto).
Tutto ciò trova la sua posizionare automaticamente e lo schema è identico a tutte le applicazioni installate.

Coerenza fa senseWhen si impara qualcosa, che di solito implica che un comportamento osservato è stato coerente. Altrimenti non c'è davvero nulla da osservare e learn.The stesso vale per il nostro sistema di file poco. Ha senso mettere sempre le stesse cose nelle stesse cartelle. In questo modo, sapremo dove cercare quando stiamo cercando qualcosa.
Il sistema di 32/64 distinzione applicazione favorisce questo obiettivo. Le applicazioni sono separate in 2 posizioni per evitare conflitti nei nomi, comportamento binario di carico e di sicurezza (in qualche misura).

Io ancora non capisco. Questo sembra inutile

Non si dovrebbe mai dimenticare una cosa. La gente è incredibilmente stupido. Questo include gli utenti, utenti con privilegi e soprattutto programmatori.

Questo è il motivo per cui abbiamo bisogno di cose come file system di reindirizzamento a fare anche i nostri sistemi utilizzabili.

I programmatori sarà solo andare lì e provare a caricare C: \ Windows \ system32 \ awesome.dll e non si preoccupano se sono in esecuzione su un sistema a 32 o 64 bit. Avrebbero cercato di caricare la DLL a 64 bit e semplicemente in crash. Alcuni programmatori vogliono utilizzare alcuni Ufficio DLL, nessun problema, sanno dove trovarlo! C: \ Program Files \ Microsoft \ Office \ 14.0 \ wizards.dll e un altro schianto!

Tutte queste richieste di applicazione a 32 bit vengono reindirizzate nelle controparti a 32 bit per evitare crash dell'applicazione.

Abbiamo bisogno di alcuni nomi di cartella fissi per costruire un sistema del genere. Se non c'è struttura di cartelle per sostenere questo reindirizzamento, allora come hai intenzione di farlo funzionare?

Okay, ora ho capito. Ma perché non utilizzare C: \ Program Files \ x86 \ allora?

Ora stiamo ottenendo filosofica

Che cosa sarebbe andare male se io in qualche modo evitato il meccanismo di reindirizzamento e costretto tutto installare al reale C: \ Program Files \?

Molto probabilmente nulla (purché altre applicazioni non dipendono da una posizione fissa per l'applicazione).

I WOW64 meccanismo ganci in CreateProcess e si esibiranno i controlli più sofisticati (più sofisticato di controllo il nome della cartella del file eseguibile) sull'immagine eseguibile per determinare se si tratta di 32 o 64 bit.

Si, ma voglio dire, come, tutte le applicazioni!

Che cosa accadrebbe se ho messo sia diesel ea gas nella mia auto?
Che cosa accadrebbe se si tenta di utilizzare sia corrente alternata e continua sulla stessa linea?
Che cosa accadrebbe se tengo sia il mio gatto e il mio pesce nello stesso acquario?
Alcune domande non richiedono risposte. Non è destinato a essere fatto, non farlo. Non c'è nulla da guadagnare qui. La quantità di problemi che un tale cambiamento potrebbe causare sarà sempre controbilanciare eventuali benefici qualcuno potrebbe vedere in questo.