Sì e no. Dipende dai vincoli che si desidera soddisfare e dalle condizioni preliminari necessarie per eseguire l'algoritmo.
Idealmente, un algoritmo è una ricetta astratta che definisce passo per passo come fare qualcosa. Gli algoritmi sono stati definiti in questo modo con l'obiettivo di riproducibilità e successiva automazione. Gli algoritmi provengono da lambda-calcul, quindi puoi facilmente capire perché sono fatti in questo modo. Questa definizione è la solita, ma i moderni algoritmi possono essere non sequenziali (non graduali, come algoritmi concorrenti, o logici come quelli che usano l'unificazione), non lineari (algoritmi stocastici) o semplicemente stranamente (quantici algoritmi), ma lo passerò.
Pertanto, idealmente, un algoritmo dovrebbe essere il più astratto possibile senza tenere conto di alcun hardware.
Ma, come con qualsiasi sistema, è necessario definire alcuni assiomi , non solo per ottenere un sistema coerente, ma anche per guadagnare tempo. Ad esempio, la maggior parte degli algoritmi presume, almeno implicitamente, che siano definiti su una macchina Von-Neumann. Se così non fosse, avrebbero bisogno di definire esplicitamente ogni parte del sistema su cui devono essere eseguiti (poiché ciò è necessario per riprodurre la ricetta, questo è una specie di precondizione). Inoltre, spesso gli algoritmi si basano su comandi comuni come write () senza definirli completamente.
Un altro motivo per cui gli algoritmi non sono così astratti dall'architettura hardware, è quando è necessario soddisfare alcuni vincoli .
Supponiamo che tu stia lavorando su sistemi embedded, quindi probabilmente non puoi fare affidamento sulla stessa quantità di risorse che hai sulle workstation. Una delle risorse più contenute è probabilmente la memoria. Tuttavia, la maggior parte degli algoritmi tende a ottimizzare la complessità temporale (velocità di esecuzione sulla CPU), non la complessità della memoria (quantità di memoria necessaria per lavorare sui dati). Per questi sistemi, sono stati ideati algoritmi ottimizzati per la memoria in cui algoritmi non ottimizzati per la memoria fallirebbero o funzionerebbero molto più lentamente. In effetti, i sistemi integrati non sono il solo obiettivo di algoritmi efficienti in termini di memoria: ad esempio, esistono algoritmi ignari della cache che adattano il loro processo per utilizzare in modo efficiente la cache della CPU. Un altro esempio: alcuni algoritmi di machine learning per i big data sono personalizzatiapprendimento incrementale o elaborazione fuori core per elaborare enormi quantità di dati molto più grandi della memoria disponibile su qualsiasi computer, ecc.
Esistono anche algoritmi che non ottimizzano una parte specifica del computer, ma uno standard che dipende dall'architettura hardware. Ad esempio, i dati numerici che richiedono precisione sono memorizzati all'interno di float o double, che per loro natura sono limitati a causa di limiti hardware. Il problema è che calcoli complessi possono portare all'arrotondamento e più calcoli si eseguono su numeri arrotondati, più si va alla deriva. Questo si chiama interferenza catastrofica . Alcune applicazioni richiedono una precisione critica, anche a scapito della peggiore complessità. Per questo tipo di applicazioni, sono stati realizzati algoritmi che ottimizzano il loro calcolo per ridurre o rimuovere interferenze catastrofiche.
Pertanto, la progettazione di un algoritmo può anche essere un compromesso tra astrazione e vincoli.
Alla fine, possiamo dire che un algoritmo è tanto astratto quanto lo è il suo target e le sue esigenze precondizionali (architettura) . Quanto più specifico è l'obiettivo del tuo algoritmo, tanto più probabilmente dipenderà dall'architettura hardware.
Alcune parole chiave correlate che potrebbero interessarti: