Linguaggio macchina: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
(oggetto della modifica nascosto)
Nessun oggetto della modifica
 
(61 versioni intermedie di 42 utenti non mostrate)
Riga 1:
Il '''linguaggio macchina''' (o '''codice macchina'''), in [[informatica]], èindica il linguaggio in cui sono scritti i [[programma eseguibile|programmi eseguibili]] per [[computer]].: Puòpuò venire classificato come [[linguaggio di programmazione]], sebbene quest'ultima espressione sia più spesso riservata per indicare i [[linguaggio di programmazione ad alto livello|linguaggi di alto livello]] con cui si scrivono programmi non direttamente eseguibili, ma che per poter essere eseguiti richiedono una [[Traduttore (informatica)|traduzione]] in linguaggio macchina, per esempioes. per mezzo di un [[compilatore]].
{{F|linguaggi di programmazione|marzo 2013|Nessuna fonte}}
Il '''linguaggio macchina''' o '''codice macchina''' è il linguaggio in cui sono scritti i [[programma eseguibile|programmi eseguibili]] per [[computer]]. Può venire classificato come [[linguaggio di programmazione]], sebbene quest'ultima espressione sia più spesso riservata per indicare i [[linguaggio di programmazione ad alto livello|linguaggi di alto livello]] con cui si scrivono programmi non direttamente eseguibili, ma che richiedono una [[traduzione]] in linguaggio macchina, per esempio per mezzo di un [[compilatore]].
 
== Descrizione ==
Il linguaggio macchina è basato su un [[alfabeto]] detto ''[[Sistema numerico binario|binario]]'' perché comprende due soli simboli, generalmente indicati con [[0 (numero)|0]] e [[1 (numero)|1]]. Un simbolo di questo alfabeto viene detto [[Bit (informatica)|bit]]. Il [[CPU|processore]] o CPU è quella componente [[hardware]] di un [[computer]] che è in grado di eseguire i programmi scritti in linguaggio macchina. In altre parole in linguaggio macchina sono definite l'insieme di istruzioni fondamentali che un processore è in grado di compiere (''[[instruction set]]'') in cui i codici di programmi da eseguire devono essere tradotti. In particolare i linguaggi a più basso livello si ottengono come semplice codifica (tabella di associazione) a partire dal linguaggio macchina in un crescendo di astrazione.
{{vedi anche|Sistema numerico binario}}
[[File:CicloDelProcessore.gif|framethumb|[[Ciclo macchina|Ciclo del processore]]]]
 
Il linguaggio macchina è basato su un [[alfabeto]] detto ''[[Sistema numerico binario|binario]]'' perchéin quanto comprende due soli simboli, generalmente indicati con [[0 (numero)|0]] e [[1 (numero)|1]].: Unun simbolo di questo alfabeto viene detto [[Bit (informatica)|bit]]. Il [[CPU|processore]] (o CPU) è quella componente [[hardware]] di un [[computer]] che è in grado di eseguire i programmi scritti in linguaggio macchina. In altre parole, incon linguaggio macchina sono definite l'insieme di istruzioni fondamentali che un processore è in grado di compiere (''[[instruction set]]''), in cui i codici di programmi da eseguire devono essere tradotti. In particolare, i linguaggi a più basso livello si ottengono come semplice codifica (tabella di associazione) a partire dal linguaggio macchina in un crescendo di astrazione.
== Compatibilità dei linguaggi macchina ==
L'espressione "''il'' linguaggio macchina" è, strettamente parlando, scorretta; infatti, ogni modello di processore è in grado di comprendere un proprio particolare linguaggio macchina. Tuttavia, pur variando nella [[sintassi]] specifica, i linguaggi macchina di tutti i processori sono basati su un insieme di principi e di concetti analoghi.
 
Se un determinato processore P1 comprende esattamente il linguaggio di un altro processore P2, si dice che P1 è [[compatibilità a livello di linguaggio macchina|compatibile]] con P2. Per esempio, i processori cosiddetti [[x86]] sono chiamati in questo modo perché sono in grado di comprendere un linguaggio macchina inventato dalla [[Intel]] e in seguito usato anche su processori [[AMD]], [[VIA Technologies|VIA]] o [[Cyrix]]. È da notare come diversi processori compatibili non debbano esserlo anche a livello hardware: i processori Intel e AMD x86 interpretano lo stesso linguaggio macchina anche se internamente sono molto diversi.
 
== Struttura ==
[[File:CicloDelProcessore.gif|frame|Ciclo del processore]]
Come nelle [[Lingua (linguistica)|lingue naturali]], nel linguaggio macchina i simboli dell'alfabeto utilizzato (1 e 0) sono organizzati in "parole" che a loro volta costituiscono "frasi". Le frasi del linguaggio macchina sono dette [[istruzione (informatica)|istruzioni]]; ognuna di esse ordina al processore di eseguire un'azione elementare afferente allo stato interno del computer, come la lettura di una locazione di [[RAM|memoria]] oppure il calcolo della somma dei valori contenuti in due [[registro (informatica)|registri]].
 
Le frasi sono generalmente costituite da una parola iniziale detta [[codice operativo]] iniziale, che indica il tipo di azione da eseguire, seguita da altre parole che specificano gli eventuali parametri (o dati) a cui l'azione deve essere applicata (per esempio "SOMMA"-"15"-"20"). Se consideriamo la prima parola come "verbo" della frase, possiamo dire per analogia che il linguaggio macchina prevede solo verbi all'imperativo; non a caso, i linguaggi di programmazione che presentano questa caratteristica sono detti proprio ''[[paradigma imperativo|linguaggi imperativi]]''. I processori tradizionali erano in grado di eseguire una sola istruzione per volta; attualmente si stanno diffondendo tecnologie (come quella dei processori [[Microprocessore superscalare|superscalari]]) che consentono l'esecuzione di più istruzioni in [[calcolo parallelo|parallelo]]. Le istruzioni che possono comparire in un programma in linguaggio macchina descrivono azioni semplici quali ad esempio "somma", "dividi" o "confronta".
 
=== Compatibilità dei linguaggi macchina ===
I processori tradizionali erano in grado di eseguire una sola istruzione per volta; attualmente si stanno diffondendo tecnologie (come quella dei processori [[Microprocessore superscalare|superscalari]]) che consentono l'esecuzione di più istruzioni in [[calcolo parallelo|parallelo]].
L'espressione "''il'' linguaggio macchina" è, strettamente parlando, scorretta; infatti, ogni modello di processore è in grado di comprendere un proprio particolare linguaggio macchina. Tuttavia, pur variando nella [[sintassi]] specifica, i linguaggi macchina di tutti i processori sono basati su un insieme di principi e di concetti analoghi.
 
Se un determinato processore P1 comprende esattamente il linguaggio di un altro processore P2, si dice che P1 è [[compatibilità a livello di linguaggio macchina|compatibile]] con P2. Per esempio, i processori cosiddetti [[x86]] sono chiamati in questo modo perché sono in grado di comprendere un linguaggio macchina inventato dalla [[Intel]] e in seguito usato anche su processori [[AMD]], [[VIA Technologies|VIA]] o [[Cyrix]]. È da notare come diversi processori compatibili non debbano esserlo anche a livello [[hardware]]: i processori Intel e AMD x86 interpretano lo stesso linguaggio macchina anche se internamente sono molto diversi.
Le istruzioni che possono comparire in un programma in linguaggio macchina descrivono azioni semplici quali ad esempio "somma", "dividi" o "confronta".
 
=== Rapporto con l'assembly ===
== Assembly ==
{{vedi anche|Linguaggio assembly}}
Il linguaggio macchina viene spesso confuso con il linguaggio [[assembly]] e viceversa.
L'assembly è in realtà un [[linguaggio di programmazione a basso livello]] che, analogamente ai [[linguaggio di programmazione ad alto livello|linguaggi ad alto livello]] come [[linguaggio C|C]], [[C++]], [[C sharp|C#]], [[Pascal (linguaggio)|Pascal]], [[Java (linguaggio)|Java]], [[Python]], [[Visual Basic]], [[Ruby]], ecc., richiede un processo di traduzione.
A differenza di questi ultimi, l'assembly consente una traduzione particolarmente semplice che trasforma ogni istruzione dell'assembly, in modo univoco, in una istruzione in linguaggio macchina.
 
L'Il linguaggio macchina viene spesso confuso con il [[linguaggio assembly]] èma in realtà quest'ultimo è un [[linguaggio di programmazione a basso livello]] che, analogamente ai [[linguaggio di programmazione ad alto livello|linguaggi ad alto livello]] come [[linguaggio C|C]], [[C++]], [[C sharp|C#]], [[Pascal (linguaggio)|Pascal]], [[Java (linguaggio di programmazione)|Java]], [[Python]], [[Visual Basic]], [[Ruby (linguaggio di programmazione)|Ruby]], ecc., richiede un processo di traduzione. A differenza di questi ultimi, l'assembly consente una traduzione particolarmente semplice che trasforma ogni istruzione dell'assembly, in modo univoco, in una istruzione in linguaggio macchina.
I codici operativi e i dati nel linguaggio macchina sono [[pattern]] (stringhe) di [[bit]]. L'assembly utilizza al loro posto istruzioni mnemoniche, che rendono più semplice al [[programmatore]] umano lo [[sviluppo (informatica)|sviluppo]] e il [[debug]] di programmi.
 
I codici operativi e i dati nel linguaggio macchina sono [[pattern]] (stringhe) di [[bit]]. L'assembly utilizza al loro posto istruzioni mnemoniche, che rendono più semplice al [[programmatore]] umano lo [[sviluppo (informatica)|sviluppo]] e il [[debug]] di programmi. Per esempio, sul processore [[Z80]], il codice macchina <code>00000101b (05h)</code> corrisponde all'ordine di decrementare il numero contenuto nel [[registro (informatica)|registro]] B<ref>{{cita web | url=http://z80.info/zip/z80cpu_um.pdf | titolo=Manuale processore Z80, codici operativi delle istruzioni, tabella operazioni aritmetiche/logiche | pp=50-51 | formato=pdf | accesso=31 ottobre 2020 | urlmorto=no | urlarchivio=https://web.archive.org/web/20200914025313/http://z80.info/zip/z80cpu_um.pdf | lingua=inglese}}</ref>, mentre in linguaggio assembly lo stesso ordine si scrive <code>DEC B</code><ref>{{cita web | url=http://z80.info/zip/z80cpu_um.pdf | titolo=Manuale processore Z80, assembly, istruzione DEC | pp=170-171 | formato=pdf | accesso=31 ottobre 2020 | urlmorto=no | urlarchivio=https://web.archive.org/web/20200914025313/http://z80.info/zip/z80cpu_um.pdf | lingua=inglese}}</ref>.
 
=== Esempi di notazione ===
I codici macchina si possono trascrivere, per comodità anche in notazione [[esadecimale]]: ad esempio sempre nello Z80 il susseguirsi di codici:
 
3E 41 D3
 
Riga 38 ⟶ 34:
6 5 5 5 5 6 bit
[ op | rs | rt | address/immediate] tipo I
[ op | target address ] tipo viva la figaJ
[ op | rs | rt | rd |shamt| funct] tipo R
 
Riga 53 ⟶ 49:
[ op | rs | rt | address/immediate]
35 3 8 68 forma decimale
 
== AssemblyNote ==
<references/>
 
== Bibliografia ==
* {{cita libro| autore1=David Andrew Patterson | autore2=John Leroy Hennessy | titolo=Struttura e progetto dei calcolatori | editore=Zanichelli | anno=2015 | ed=4 | ISBN=978-88-08-35202-6 | capitolo=Il calcolatore: astrazioni e tecnologia }}
* {{cita libro| autore1=David Andrew Patterson | autore2=John Leroy Hennessy | titolo=Struttura e progetto dei calcolatori | editore=Zanichelli | anno=2015 | ed=4 | ISBN=978-88-08-35202-6 | capitolo=Le istruzioni: il linguaggio dei calcolatori }}
 
== Voci correlate ==
* [[Unità centrale di elaborazione]]
* [[Architettura MIPS]]
* [[IBM compatibile]]
* [[Instruction set]]
* [[Linguaggio assembly]]
* [[Microprogrammazione]]
* [[Sistema numerico binario]]
* [[Unità centrale di elaborazione]]
 
== Altri progetti ==
{{Interprogetto|preposizione=sul|wikt=codice di macchina|wikt_etichetta=codice di macchina}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC|machine code|machine code}}
 
{{Controllo di autorità}}