[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[OT] [Lungo] Linguaggi di programmazione "moderni"



On Mon, 23 Sep 2002 14:07:25 +0200
Francesco Paolo Lovergine <frankie@debian.org> wrote:

>  Si tratta solo di pigrizia mentale. E per i neofiti, ottusita'
>  imperdonabile: il fortran e' il linguaggio peggiore da usare per 
>  uno che di programmazione non sa nulla. E chi ne sa, lo evita come
>  la peste. Bah!

A questo punto, se mi è concesso dire la mia, bisognerebbe cominciare ad
usare strumenti che abbiano un controllo dei tipi più forte: il
controllo dei tipi è una dimostrazione di correttezza rispetto ad alcuni
aspetti del codice (in particolare che il tipo del risultato sia quello
voluto) e come tale elimina "a priori" alcuni problemi tipici dei
programmi attuali (primo fra tutti il segmentation fault).

Tra i linguaggi a controllo di tipi forte, ce ne sono alcuni che sono
particolarmente espressivi, i linguaggi funzionali con controllo di tipi
statico (ocaml (caml.inria.fr) è un esempio di linguaggio funzionale
molto facile da usare e molto efficiente, haskell (www.haskell.org) è
più complesso ma è lazy e quindi molto più espressivo, ma anche meno
efficiente).

Ocaml ha anche, per chi non ne potesse fare a meno, un binding per la
famosa libreria "lapack".

Un esempio che chiarisce quello che intendo:

codice C per fare la sommatoria dei numeri da 1 a 100

int sum=0;
for (int i=1;i<101;i++) sum+=i;

E' un codice chiaro? Più o meno

codice Haskell per fare la sommatoria dei numeri da 1 a 100

foldl (+) 0 [1..100] 

Dove (+) è ovviamente la funzione di somma, foldl la funzione che
"accumula" una funzione su una lista a partire dal valore iniziale,
[1..100] è la lista dei valori da 1 a 100.

Posso sbagliare con facilità nel codice C perchè meno espressivo? Si,
posso distrarmi e scrivere i<100, non se ne accorgerà nessuno per
giorni. Posso sbagliare con altrettanta facilità nel codice haskell? Me
ne accorgo!

Ok, allora si potrebbe ipotizzare che con l'esperienza questo problema
si risolva. Ma cosa succede se vogliamo scrivere la funzione
"sommatoria" di una funzione generica?

in C:

int sommatoria(int (* f)(int),int indice1,int indice2)
{
   int somma=0;
   for(int i=indice1,i<=indice2,i++) somma+=i;
}

Un po' poco chiaro, se si è abituati al linguaggio matematico.

In fortran, non si può scrivere la funzione "sommatoria" perchè
l'astrazione funzionale è completamente assente.

In Haskell

sommatoria f indice1 indice2 = foldl (+) 0  (map f [indice1..indice2])

dove la funzione "map" applica f a tutti gli elementi della lista
[indice1..indice2].

oppure, in modo ricorsivo:

sommatoria f indice1 indice2 = 
   if indice1 <= indice2 
      then (f indice1) + (sommatoria f (indice1 + 1) (indice2)
      else 0

Una volta abituatisi alla sintassi, che usa meno parentesi rispetto alla
notazione matematica standard, si possono esprimere concetti come le
funzioni che prendono come argomento funzioni, e le funzioni ricorsive,
in modo semplice ed intuitivo.

Un'ultima nota: un linguaggio funzionale lazy può anche esprimere
concetti inesprimibili in C, come ad esempio la lista infinita dei
numeri interi:

interi = [1..]

Come fa? Un linguaggio è lazy se valuta le espressioni solo quando
vengono usate. Cosa vuol dire? Che posso manipolare la lista degli
interi come qualunque altra lista, leggere la testa, ottenere la coda.
Se tento di usare TUTTI i valori della lista, per esempio scrivendo

print interi

il programma va in loop infinito, come un "while true".

Posso però ottenere per esempio dalla lista degli interi quella dei
numeri pari:

pari x = x `mod` 2 == 0

listaPari = filter pari interi

esattamente quello che voglio: "filtra la lista degli interi usando la
funzione booelana 'pari'".

Sono certo di aver confuso le idee agli interessati, un po' meno certo
che ci fossero interessati, chiedo scusa per l'OT e spero di aver almeno
incuriosito qualcuno.

Vincenzo

-- 
Fedeli alla linea, anche quando non c'è 
Quando l'imperatore è malato, quando muore,o è dubbioso, o è perplesso.
Fedeli alla linea la linea non c'è.
[CCCP]



Reply to: