Programmazione e algoritmi
Prof. Giovanni Paolella
Dott. Leandra Sepe
Nelle lezioni precedenti sono stati descritti numerosi programmi, sia per l’assemblaggio di sequenze genomiche che per l’annotazione di caratteristiche strutturali e funzionali. Alcuni di questi sono inseriti in package come Emboss discusso nella scorsa lezione.
Ma che cos’è un programma?
Un programma è un file che contiene una lista di istruzioni che complessivamente dicono al computer cosa fare per ottenere un certo risultato. Poichè i programmi sono scritti dai programmatori, ma devono essere eseguiti da una macchina, è necessario che siano scritti in modo che il computer possa capire le istruzioni in maniera non ambigua ed eseguirle nell’ordine, in modo da ottenere il risultato atteso.
E’ utile, anche se non necessario, che il programma sia comprensibile facilmente anche alle persone che devono scriverlo e tenerlo in funzione.
Un programma è una cosa diversa dall’algoritmo su cui è basato. Per algoritmo si intende la descrizione delle procedure necessarie per ottenere un dato risultato. Non dovendo però essere utilizzato direttamente dal computer, un algoritmo può essere descritto in linguaggio comune, anche se l’uso di una sintassi rigorosa può aiutare ad evitare ambiguità.
Ad esempio, per cercare siti di restrizione all’interno di una sequenza, si può procedere come indicato in figura:
Un algoritmo è quindi una descrizione di una procedura. Come si fa a passare da un algoritmo ad un programma in grado di funzionare e di generare un risultato? E’ necessario trascrivere l’algoritmo in una forma utilizzabile dalla macchina usando un linguaggio di programmazione. Questa operazione può essere eseguita da un ricercatore, anche se per programmi di una certa complessità è necessaria la competenza di un programmatore.
Il programma eseguito nell’esempio calcola i quadrati dei primi mille numeri interi e può essere descritto dall’algoritmo indicato in prima figura. L’algoritmo di per sè non può essere eseguito dalla macchina, ma può essere utilizzato per generare un programma utilizzando un linguaggio di programmazione. L’esecuzione del programma produce il risultato desiderato, come riportato in seconda figura.
Il programma in grado di generare il risultato descritto è molto semplice e può essere compreso con poca difficoltà:
Un linguaggio di programmazione consiste in una serie di regole che definiscono come scrivere il codice. Elementi tipici di ogni linguaggio sono:
L’esempio descritto precedentemente è stato realizzato utilizzando il PHP, un linguaggio relativamente facile da usare, costituito di istruzioni in grado di eseguire operazioni anche molto complesse. Lo stesso programma è riportato in figura trascritto in C, un linguaggio di più difficile utilizzazione in quanto richiede più istruzioni per descrivere le stesse procedure. E’ comunque molto facile riconoscere le corrispondenze tra le due versioni del programma.
In realtà il processore presente in qualsiasi computer non esegue direttamente nè il codice scritto in PHP ne’ quello in C; ogni processore è in grado di comprendere un solo linguaggio definito linguaggio macchina, costituito di un numero più limitato di istruzioni molto semplici come “sposta un numero in una casella di memoria” o “somma due numeri”.
Per poter eseguire i programmi, è necessario quindi convertire qualsiasi linguaggio in linguaggio macchina, questa operazione è fatta da programmi definiti compilatori o interpreti che traducono il codice, istruzione per istruzione, e lo trasformano in linguaggio macchina. Nella figura è riportata la traduzione del programma in C in linguaggio macchina.
Le istruzioni del linguaggio macchina sono di tipo numerico, ma vengono di solito rappresentate in forma simbolica per renderle più comprensibili, una rappresentazione chiamata Assembler. Il linguaggio macchina è naturalmente di difficile comprensione, e in genere anche programmatori professionisti tendono a non usarlo direttamente se non in casi particolari in cui questo si rende necessario.
L’uso del C, e ancor più del linguaggio macchina, presenta difficoltà notevoli, ma ha il vantaggio di ottenere dal processore le migliori prestazioni.
I linguaggi di programmazione possono quindi prevedere o un’ampia gamma di istruzioni diverse che corrispondono ad operazioni complesse, o un piccolo numero di istruzioni più semplici.
Naturalmente i primi risultano in programmi più brevi e di più facile comprensione, ma che richiedono traduzioni complesse per essere eseguiti e sono quindi più lenti. I secondi risultano più difficili da utilizzare in fase di programmazione e producono programmi pu’ lunghi, ma sono molto efficienti e ottengono elevate velocità di esecuzione.
I linguaggi del primo tipo sono definiti di alto livello e sono indicati in alto in figura, in constrasto con quelli di basso livello riportati in basso.
1. Genomi: organizzazione e complessità
4. Assemblaggio e annotazione di genomi (ENSEMBL)
5. Package e interfacce per la gestione di sequenze
7. Allineamento di sequenze mediante matrici di punti
10. Algoritmi dinamici di allineamento
11. Elettroforesi
13. Algoritmi di allineamento di tipo euristico
14. Preparazione di acidi nucleici
15. Cromatografia
18. Banche dati
20. Vitalità e proliferazione di cellule in coltura
21. Microscopia