{{htmlmetatags>metatag-robots=()
metatag-title=(Ottimizzazioni | ugBASIC)
metatag-keywords=(ugBASIC,Commodore 64,Commodore PLUS/4,ZX Spectrum)
metatag-description=(Ottimizzazioni per ugBASIC)
metatag-media-og:image=(:ugbasic:logo-ugbasic-fb.png)
metatag-og:title=(Ottimizzazioni | ugBASIC)
metatag-og:description=(Ottimizzazioni per ugBASIC)
}}
====== OTTIMIZZAZIONI PER ugBASIC ======
Questa pagina nasce per raccogliere, nel tempo, tutti i suggerimenti che sono stati proposti su [[https://github.com/spotlessmind1975/ugbasic/discussions|github]] e sul [[https://www.facebook.com/groups/867151224158600|gruppo Facebook]] di riferimento. Costituiscono, quindi, una interessante e pratica guida su come ottimizzare lo spazio o il tempo programmando con ugBASIC.
* **[[#inizializzazione_con_costanti|Inizializzazione con costanti]]**
* **[[#usare_le_costanti|Usare le costanti]]**
* **[[#usare_i_vettori|Usare i vettori]]**
* **[[#preferire_la_forma_prefissa|Preferire la forma prefissa]]**
===== Inizializzazione con costanti =====
In ugBASIC tutte le assegnazioni innescano una assegnazione per copia: il valore a destra, diretto o calcolato, viene copiato nel "contenitore" di sinistra. Questo è vero anche per i valori iniziali delle variabili, il che significa che (senza volerlo) state creando delle variabili temporanee per inizializzare delle variabili vere e proprie.
Per esempio, questo codice:
mapH = 9
sarà tradotto (in pseudo assembly) come:
MOVE 9 TO temp
MOVE temp TO mapH
Per ottimizzare questo punto è sufficiente utilizzare il carattere cancelletto (''#''), da anteporre al valore che volete sia considerato una costante. In tal modo, il valore NON sarà implicitamente convertito in una variabile temporanea ma utilizzato AS IS.
Ancora:
mapH = # 9
sarà tradotto (in pseudo assembly) come:
MOVE 9 TO mapH
===== Usare le costanti =====
Il linguaggio ugBASIC consente di definire costanti, da utiizzare al posto di valori fissi o di espressioni che saranno valutate una volta per tutte. Il vantaggio di usare le costanti sta tutto nel fatto che è il compilatore, e non il retro computer, ad effettuare i calcoli. Comodo!
Prendiamo questo codice:
north=1: x = north
Sarà tradotto (in pseudo assembly):
MOVE 1 TO temp
MOVE temp TO north
MOVE north TO x
Invece, se è definito come una costante:
CONST north=1: x = #north
Sarà invece tradotto (in pseudo assembly.
MOVE 1 TO x
===== Usare i vettori =====
In generale, l'accesso agli array bidimensionali o pluridimensionali è abbastanza lento sotto ugBASIC, perché richiede di calcolare l'offset preciso dove si trova l'elemento a cui si vuole accedere. Si tratta di un calcolo complesso, con molte addizioni e moltiplicazioni, e prende molto tempo. Se si può evitare, quindi, è meglio usare i vettori (array monodimensionali) che garantiscono, nel caso abbiamo meno di 256 elementi, un accesso rapido. In alternativa, ridurre il numero di dimensioni aiuta a diminuire la dimensione dell'eseguibile complessivo.
Prendiamo questo codice:
DIM a(3,4)
a(1,1) = 42
a(2,2) = 84
Sarebbe meglio scriverlo come:
DIM a0(4), a1(4), a2(4)
a1(1) = 42
a2(2) = 84
===== Preferire la forma prefissa =====
Per tutte le operazioni aritmetiche in cui la destinazione dell'operazione è uno degli operandi, ugBASIC supporta sia la forma infissa (''x=x+y'') che la forma pre-fissa (''ADD x,y''). Tuttavia, la forma pre-fissa è decisamente più veloce perché viene tradotta senza valori temporanei e, spesso, con l'opcode assembly corrispondente.
Prendiamo questo codice:
x = x + y
sarà tradotto (in pseudo assembly) come;
MOV x TO temp
ADD y TO temp
MOV temp TO x
Invece questo codice:
ADD x, y
sarà tradotto (in pseudo assembly) come;
ADD y TO x
Questa è la tabella degli operatori, prefissi e infissi:
^ operazione ^ prefissa ^ infissa ^
| somma | ADD | + |
| differenza | SUB | - |
| divisione | DIV | / |
| moltiplicazione | MUL | * |