In questa sezione metto a disposizione qualche testo che si può liberamente scaricare e che tratta di qualche argomento di informatica del quale mi sono professionalmente od occasionalmente interessato.
I testi sono forniti in html o pdf, e questi ultimi sono spesso anche forniti nel formati dvi (compresso nel formato zip), utilizzato nella comunicazione scientifica: per leggerli è disponibile del software gratuito: Acrobat Reader per i file pdf e TeX per i file dvi.
Un breve saggio divulgativo sui numeri pseudo-casuali e le loro applicazioni: la nota introduce in modo intuitivo, e inquadrandoli storicamente, tutti i concetti matematici necessari per inquadrare la questione, come il concetto di funzione, di variabile aleatoria, di casualità e complessità secondo Kolmogorov, etc.
Nel 2005, approdato al gruppo di Finanza Quantitativa di Capitalia ho redatto una proposta per uniformare lo stile nei codici sorgenti in C e C#. La metto ora in rete, perché contiene alcune osservazioni generali sulla codifica dei programmi che possono risultare utili, e anche alcuni suggerimenti a proposito delle trappole del C.
Si tratta di brevi note che introducono le principali tecniche crittografiche in modo (spero) semplice anche per un non matematico, toccando vari argomenti in modo ovviamente non approfondito.
I programmi che metto a disposizione sulla mia pagina sono forniti nel loro codice sorgente, che si può utilizzare e modificare per i propri scopi, purché non siano fini di lucro (la licenza GPL accompagna ciascun sorgente). La maggior parte di questi programmi sono scritti in C, secondo lo standard ANSI 89 che è disponibile su ogni compilatore: alcuni compilatori gratuiti disponibili in rete sono elencati in questa sezione del mio sito. Per scaricare un programma "clickate" sull'icona o sul suo nome.
Per chi ci abbia provato, scrivere una app per iPhone è complicato quanto avere udienza dal Papa: bisogna iscriversi al sito degli sviluppatori Apple, avere a disposizione un computer Apple, imparare Objective-C, pagare 99$ per la pubblicazione e sperare che poi funzioni. Una alternativa è utilizzare le caratteristiche di HTML5, in particolare l'API disponibile da Javascript, oltre che la compatibilità di Safari con questi standard. Trovate delle informazioni utili sul Matt Might Blog. Ho scritto per esercizio una app che disegna il grafico di una funzione della variabile x e consente, con le dita, di spostare e zoomare il grafico. Oltre a espressioni algebriche della variabile x alcuni semplici comandi consentono di pulire lo schermo e definire variabili e funzioni per costruire espressioni più complesse. Le migliorìe sarebbero molte, ma si tratta di un semplice esercizietto, magari utile a qualche studente per verificare alle prese con uno studio di funzione. Per installare l'app andare con Safari alla URL http://www.caressa.it/iphone/funplot.html e, una volta caricata la pagina, dal menu di Safari dal quale si aggiunge una URL ai preferiti cliccare su "Aggiungi a Home": a quel punto una icona con una f(x) dovrebbe materializzarsi sul desktop ed essere attiva. Ulteriori informazioni sulla pagina http://www.caressa.it/iphone/funplot_help.html. Naturalmente l'"app" funziona anche su un browser compatibile con HTML5, come Firefox, e il grafico in questo caso si sposta con i tasti freccia e si zooma con i tasti PGUP-PGDOWN.
Si tratta di una libreria, fornita come file di inclusione e loro relative implementazioni, che implementa alcuni classici algoritmi dell'Analisi Numerica, precisamente i metodi che riguardano le matrici, i sistemi lineari e gli autovalori. Originariamente si trattava di una semplice collezione di funzioni scritte mentre studiavo per un esame del corso di dottorato (Calcolo Numerico, Prof. A.Pasquali; metto anche a disposizione alcuni appunti introduttivi di calcolo numerico che ho scritto mentre preparavo l'esame [versione dvi]. Col tempo questa raccolta di funzioni si è evoluta in una vera e propria libreria che esporta dei tipi (vettori, matrici, numeri complessi, ...) e che consente di trattare vettori e matrici a coefficienti in un qualsiasi campo numerico, anche definito dall'utente: l'ultima versione si trova in questo file .zip ed è descritta in un tutorial.
Si tratta del programma che ho usato nel comporre queste pagine a partire da pezzi html: a partire da un file di configurazione e dai vari pezzi produce sia il sorgente html delle pagine che un file javascript per i menu (che utilizza il pacchetto gratuito Tigra Menu della SoftComplex). Ovviamente è un programma ad hoc che ho scritto per semplificare la composizione e soprattutto la manutenzione di queste pagine, difficilmente utile a meno di non rimaneggiarlo per i propri scopi, o per clonare il mio sito.
Un altro programmino che uso per scrivere le pagine dei miei siti WEB, ma che in questo caso potrebbe tornare utile per altri scopi: si tratta di un preprocessore html, cioè di un programma che prende dei file di testo, ne fa il parsing ed opera delle sostituzioni nei tag html, che consentono di usare forme stenografiche per tag complicati, ed anche di definire tag dipendenti da parametri, oltre che di includere altri file da un file html. Ovviamente l'ho pensato e implementato prima di imparare PHP, ma è comunque un programmino compatto e divertente.
È un programma didattico che risolve con l'eliminazione di Gauss sistemi di equazioni lineari qualsiasi (anche non quadrati): le equazioni vanno scritte nell'usuale notazione algebrica in un file di testo, ed il programma mostra tutti i passaggi effettuati per calcolare la soluzione.
Un semplice programmino per effettuare il dump di una directory in un file HTML, selezionando il tipo di file ed eventualmente esaminando le sotto-directory; il programma può essere compilato sia sotto Unix(TM) che sotto Windows(TM) (un file eseguibile per Windows(TM) viene allegato alla distribuzione).
Questo è una versione presentabile, documentata e funzionante di un programma i cui pezzi uso da anni per documentare il mio codice: ovviamente non ha né la potenza né la versatilità né le altre belle caratteristiche di doxygen, ad esempio, ma quando ho cominciato a scriverlo non conoscevo doxygen (che forse nemmeno esisteva). Non so se possa essere di utilità a qualcuno (che non sia io) perché è tarato sul mio stile di commentare i programmi e sul mio modo di sviluppare il codice (partendo da sorgenti che hanno solo commenti ed aggiungendo il codice via via). Comunque eccolo qui.
Si tratta di un semplice programmino scritto invocando le API di Windows (la SDK Win32 e NON la MFC) che consente di disegnare il grafico di una funzione di tipo double f(double) fornita in un file da compilare unitamente a quello da me scritto: un modo semplice per plottare anche se non si conosce la libreria Win32, ma si dispone di un compilatore che la può compilare.
Un buffo ed inefficiente programmino scritto invocando le API di Windows (la SDK Win32 e NON la MFC) che consente di disegnare il grafico definita implicitamente fornita in un file da compilare unitamente a quello da me scritto: un modo semplice per plottare anche se non si conosce la libreria Win32, ma si dispone di un compilatore che la può compilare.
Si tratta di un programmino scritto invocando le API di Windows (la SDK Win32 e NON la MFC) che consente di plottare i grafici di una o più funzioni fornite per mezzo dei valori che assumono su un insieme finito di punti: basta fornire un array double A[n_punti][n_valori]: un modo semplice per plottare anche se non si conosce la libreria Win32, ma si dispone di un compilatore che la può compilare.
Contiene alcune semplici classi per l'algebra lineare numerica: vettori, matrici, matrici simmetriche, sistemi lineari, e costituiscono la versione C++ della libreria precedente, con in più una interfaccia per l'algebra lineare (operazioni fra matrici etc.). Non lo mantengo e non l'ho praticamente testato, quindi sarà pieno di errori: ma forse può essere utile a qualcuno.
È una classe Java che implementa un calcolatore algebrico: si costruisce un oggetto di questa classe inizializzandolo con una stringa che denota una espressione da valutare; poi si possono definire delle variabili (i cui valori sono a loro volta stringhe) e valutare l'espressione. Le variabili si comportano come macro, ma possono anche essere delle costanti.
Si tratta di una applet in Java che richiede una funzione e ne visualizza il grafico: contiene un analizzatore lessicale di espressioni algebriche, che capisce la notazione matematica (ad esempio "3|x|-2log x/sen(x+pi)" invece di "3*abs(x)-2*log(x)/sin(x+3.14)"). Il programma richiede una espressione che deve contenere la variabile "x" come incognita (attenzione: si possono giustapporre lettere a denotare la moltiplicazione, ma separate da uno o più spazi: "xe^x" si scrive "x e^x", o col tradizionale "x*e^x").
Elenco alcuni libri di informatica che ho particolarmente amato, per un motivo o per l'altro, e che quindi suggerisco di leggere o consultare: alcuni sono datati, ma, sebbene tecnicamente superati, spesso ancora illuminanti.
A. Aho, R. Sethi, J. Ullman, Compilers. Principles, Techniques and Tools, Addison-Wesley, 1986.
Uno dei testi di riferimento sulla costruzione dei compilatori: contiene molti esempi sulle strutture di dati e sulla teoria dei linguaggi formali, e degli ottimi esercizi. Una miniera di informazioni.
M. Arbib, A. Kfoury, R. Moll A Programming Approach to Computability, Springer, 1982.
La teoria della calcolabilità è qui esposta in termini informatici: invece delle macchine di Turing, dei sistemi di Markov o della teoria delle funzioni ricorsive, gli argomenti vengono presentati in termini di linguaggi di programmazione.
J. Bentley, Programming Pearls, Addison-Wesley, 1999.
Si tratta di una preziosa raccolta di lezione sull'arte dello sviluppo del software, distillate in "colonne" pubblicate sui Communications of the ACM: costituiscono una deliziosa, brillante e profonda introduzione ai vari aspetti dello sviluppo del software, con esempi, suggerimenti e molto altro. Da leggere con attenzione, anche se, essendo scritto molto bene, si tende a leggerlo come un romanzo o una antologia di racconti.
P. Darnell, P. Margolis, Software Engineering in C, Springer, 1986.
Resta, secondo me, il miglior libro per imparare la programmazione in C: è zeppo di consigli e suggerimenti fondamentali per imparare a programmare in un qualsiasi linguaggio, e contiene un progetto completo di interprete in C scritto in C stesso e sviluppato secondo le tecniche di progettazione spiegate nel libro.
D. Gries, Principi di progettazione dei compilatori, Franco Angeli, 1984.
Un testo sulla progettazione dei compilatori, molto datato ma ancora valido per capire la struttura di un compilatore e per il capitolo sui linguaggi formali, sulle macro e sulle strutture di dati.
D.R. Hanson, C Interfaces and Implementations, Addison-Wesley, 1997.
Questo libro dimostra che le sparate sulla presunta superiorità dei linguaggi ad oggetti (C++, Java, Modula-3,...) su quelli procedurali (C, Fortran, Modula-2, ...) sono una finzione: il testo consiste infatti in una serie di moduli scritti in C puro che dimostrano come strutture di dati dinamiche, threads, eccezioni e quant'altro si possano realizzare in modo elegante, efficiente ed utile in C. Una lettura obbligata per chiunque voglia implementare progetti di una certa dimensione in C.
B. Kernighan, R. Pike, The Practice of Programming, Addison-Wesley, 1999.
Testo che ogni programmatore dovrebbe leggere: oltre a contenere una brillante presentazione dei temi base della programmazione (algoritmi, strutture di dati, complessità) è ricco di esempi elegantissimi in C, C++, Java ed altri linguaggi, e spiega in dettaglio come affrontare i problemi pratici che capitano nello sviluppo del software (testing, debugging, profiling etc.).
B. Kernighan, P.J. Plauger, Software Tools.
Questo libro è solo in apparenza datato: si tratta di una raccolta di programmi in Fortran, completi e funzionanti, che sono poi quelli di base del sistema UNIX: editor, macro, formattazione testi e quant'altro.
B. Kernighan, D. Ritchie, The C Programming Language, Prentice Hall, 1978.
Il manuale classico sul C (la seconda edizione contempla lo standard ANSI), che è in realtà un libro completo sulla programmazione, per la ricchezza di esempi e la brillantezza dell'esposizione.
D. Knuth, The Art of Computer Programming, 3 voll, Addison-Wesley, 1968, 1973, 1975.
Non ha bisogno di presentazioni: il testo definitivo sugli algoritmi, le strutture di dati e la programmazione, che ha avuto svariate riedizioni. I programmi sono scritti nel linguaggio macchina del processore MMIX, inventato da Knuth all'uopo. È un testo che richiede molto impegno, specie per gli esercizi nei quali è posta una cura estrema, ma ripaga ampiamente. Si tratta di un libro non solo bello ma anche ben scritto, cosa rara nel campo della letteratura "tecnica".
A. la Mothe, Tricks of the Windows Game Programming Gurus, 2 Voll, SAMS, 1999.
Un libro che insegna a programmare videogiochi (in 2D nel I volume, in 3D nel II volume) per le piattaforme Windows; contiene una introduzione alla programmazione in Win32 sintetica ed efficace, e molte informazioni interessanti sulle strutture di dati, l'intelligenza artificiale e le applicazioni dell'algebra lineare e della geometria analitica alla grafica computerizzata. È scritto in uno stile (forse troppo) colloquiale, ma è chiarissimo.
M. Minsky, S. Papert, Perceptrons, MIT, 1969.
Un vecchio testo di intelligenza artificiale, matematicamente rigoroso ma facile da capire: sviluppa la teoria dei perceptroni, una delle più bistrattate macchine dell'intelligenza artificiale. A dispetto di questo, sono i progenitori delle famose reti di neuroni, e hanno il vantaggio di avere una solida teoria, anche che ne sancisce i limiti, alle spalle.
T. Mitchell, Machine Learning, Wiley, 1997.
Una concisa e completa esposizione del più affascinante argomento di intelligenza artificiale (almeno per me): le macchine che apprendono. La discussione sui metodi bayesiani è magistrale.
R. Sedgewick, Algorithms in C, Addison-Wesley, 1990.
Una collezione di algoritmi fondamentali e programmi che li implementano in C (esistono anche versioni in C++ e Java): praticamente tutti gli algoritmi di base dell'informatica. Ogni algoritmo è spiegato in dettaglio e motivato, così che il libro è una specie di versione non teorica e semplificata dei libri di Knuth, è sia di riferimento che di studio.
N. Wirth, Algorithms + Data Structures = Programs, Prentice Hall, 1976.
Un classico della programmazione: il testo si riferisce alla programmazione nei linguaggi della famiglia del Pascal, ma è ancora attualissimo, specie negli aspetti teorici, dato che introduce le tecniche di base e gli algoritmi classici, spiegati in modo completo e rigoroso. Il codice è fra i più raffinati che si possano trovare in un libro e l'esposizione brillante.
N. Wirth, Programming in MODULA-2, Springer, 1986.
Questo è un manuale del linguaggio Modula-2, ma può costiture una elegante e sintetica introduzione alla programmazione tout court. Bello, semplice, elegante.
I linguaggi per computer, come le lingue umane, vanno e vengono e sono soggetti a dialettizzazioni e metamorfosi (oltre che all'estinzione); lascio alcuni link su dei linguaggi di programmazione che trovo interessanti o belli esteticamente, mentre non cito quelli che magari uso (come Java) ma che ritengo un male necessario imposto dalla moda informatica del momento.
Secondo me, il C resta il linguaggio di programmazione migliore a disposizione per la media dei problemi di programmazione (è chiaro che problemi specifici richiedono linguaggi specifici, e se l'efficienza non è un punto cruciale in un progetto, si può usare anche un linguaggio interpretato come Perl o Awk). In molti libri recenti, dell'ultimo decennio, si dichiara che il paradigma di programmazione in seno al quale il C è stato concepito, la programmazione procedurale, è obsoleto e che la programmazione orientata agli oggetti è il paradigma del presente e del futuro (ma anche del passato visto che risale al 1967). Ma io ritengo che la programmazione ad oggetti sia solo una reincarnazione in ambiente event-driven della programmazione strutturata: si può programmare con dati pubblici e privati anche in C, e creare e distruggere oggetti dinamici, e via discorrendo.
La programmazione a oggetti è piuttosto una tecnica utile in certi contesti nei quali il problema è formulato in termini di oggetti: ad esempio nelle simulazioni di eventi discreti dove molti oggetti della stessa classe debbono essere generati, o nella gestione degli eventi nei sistemi operativi o delle interfacce grafiche. Insomma, è come la ricorsione, un modo in cui, in certi contesti, i problemi si presentano in modo naturale: ma come è assurdo dire che la programmazione orientata alla ricorsione (cioè la programmazione funzionale) è il miglior paradigma possibile, mi sembra parimenti insensato attribuire alla programmazione orientata agli oggetti il ruolo di paradigma universale di programmazione. In effetti nei linguaggi a oggetti, ad esempio in Java, è impossibile non usare gli oggetti, anche quando non servono: ma, per quanto tautologico sia definire una classe con un solo oggetto, questi linguaggi vi obbligheranno a farlo.
Il nucleo base di Java, come linguaggio per le applicazioni orientate agli oggetti, è estremamente pulito e sintetico, ma, per renderlo adatto ad ogni tipo di applicazione, si è resa caotica la libreria sulla quale si appoggia; inoltre, questa libreria si è evoluta in modo parallelo alle sue implementazioni, il che rende il linguaggio difficile e pesante. Una critica razionale ed autorevole della programmazione a oggetti come paradigma universale si trova ad esempio in una pagina del sito di Paul Graham.
Ecco perché qui di seguito non elenco né Java, né Visual Basic né altri popolari e diffusi linguaggi, ma mi rifaccio ai miei criteri estetici, fornendo qualche informazione sui linguaggi che mi piacciono, che mi paiono eleganti e raffinati e che, in una parola, vorrei aver progettato io!
La programmazione è un'attività che può essere creativa e gratificante come la composizione di romanzi e sinfonie, o tediosa come la compilazione di moduli bancari ed elenchi telefonici; l'attività di programmazione più interessante è senza dubbio l'implementazione di compilatori (non la più complicata: i videogame sono forse i programmi più complessi da realizzare). Secondo me, programmazione, linguaggi e progettazione di compilatori sono argomenti strettamente correlati: lascio qui qualche link sugli ultimi due.
Artificial Intelligence Laboratory presso il M.I.T: una raccolta fondamentale di materiale sull'intelligenza artificiale e la programmazione funzionale e logica.
L'Algol 60 è la madre (ha il nome di una stella!) di tutti i linguaggi procedurali: elegante, semplice e rigoroso fa venir voglia di programmare. Mi sembra inconcepibile che si sia estinto alla metà degli anni '70 ed oggi considerato una lingua morta non meno dell'Assiro-Babilonese, mentre dinosauri come Fortran o Cobol ancora ingolfano i computer di questo mondo. Con L'Algol (nel 1958) nascono essenzialmente le strutture sintattiche e semantiche dei linguaggi ancor oggi in uso che saranno iterate ad nauseam nei decenni seguenti: ad esempio nel PL/1, nel Pascal, nel C, fino a Java. Come ha acutamente scritto C.A.R. Hoare, uno dei grandi della computer science:
Algol 60 was a great achievement; it was a significant advance over most of its successors.
L'Algol 68 è invece un linguaggio nato purtroppo prima del suo tempo e quindi prematuramente ucciso dalla scarsità di implementazioni e di utenza, ma con le sue ceneri si è concimato il C++: polimorfismo, sovraccaricamento degli operatori e molte altre caratteristiche sono state prese dall'Algol 68. L'altra scaturigine dell'Algol 60 è il Simula 67, nel quale si introduce il concetto di classe: per capirci vale la proporzione Algol 60:Simula 67=C:C++, e Stroustrup ha applicato al C la stessa procedura che Nygard ha applicato all'Algol 60 per ottenere il Simula 67.
Algol 60 References è il miglior punto di partenza per esplorare il mondo dell'Algol.
The Algol Bulletin online! Le annate complete della rivista dedicata all'Algol, per la gioia di studiosi e patiti, con articoli scritti da grandi nomi della computer science.
marst - Algol to C translator è un compilatore Algol che ha il C come linguaggio oggetto: combinandone l'output con l'input di un compilatore C si ottiene un compilatore Algol 60.
Algol 68 Genie Si tratta di un interprete di un sottoinsieme dell'Algol 68, sviluppato da Marcel van der Veer. Notevole, come pure i riferimenti contenuti nel sito.
L'unico vero linguaggio di programmazione è l'assembly, il linguaggio parlato dalla macchina: tutti gli altri sono forme di comunicazione intermedie fra questo e il linguaggio umano. Credo sia tempo ben speso imparare un po' di linguaggio macchina, anche se varia da processore a processore; non è un caso che il più importante libro di programmazione, The Art of Computer Programming di D. Knuth, abbia gli esempi in linguaggio macchina.
WEBster un sito pieno di risorse: in particolare si segnala Art of Assembly Programming, un libro on-line sulla programmazione dell'assembly 80x86 che parte praticamente da zero, di Randall Hyde, e HLA un assemblatore free.
Il linguaggio che uso di più e che ritengo più sintetico, efficiente e interessante da programmare è il C (ad esempio queste pagine WEB sono assemblate per mezzo di un programma in C): dal programmino di dieci righe al progetto con decine di migliaia di linee di codice, il C, progettato a metà degli anni '70, contestualmente allo sviluppo del sistema operativo UNIX, resta secondo me la soluzione migliore, dopo l'assembler ovviamente. Né il C++ né Java possono costituire miglioramenti del C, semmai ne sono degenerazioni (il C++, che doveva soppiantarlo, è meno efficiente, più complicato, troppo dispersivo) o hanno scopi differenti (Java è un linguaggio orientato alla applicazioni grafiche e WEB).
Il C è un linguaggio di basso livello, il che non vuol dire che sia peggiore di altri, ma solo che consente una padronanza profonda della macchina sulla quale i programmi girano. Alcune caratteristiche di un linguaggio a basso livello sono:
la possibilità di puntare direttamente a porzioni di memoria (puntatori);
la possibilità di puntare direttamente a porzioni di codice (enunciati di salto incondizionato, goto);
facilità di convertire tipi di dati differenti fra loro dal punto di vista concettuale ma simili o identici dal punto di vista della rappresentazione;
interazione stretta col sistema operativo ospite e possibilità di manipolare le unità periferiche;
avere una sintassi versatile ed una semantica espressiva;
Ad esempio C è di basso livello perché possiede puntatori, goto, casting implicito di dati numerici, librerie di I/O e grafiche orientate alla macchina, etc. Viceversa, un linguaggio di alto livello deve possedere:
Strutture di dati (stringhe, liste, tabelle, alberi, ...);
Librerie di alto livello per interagire col sistema operativo: grafica, I/O, finestre, ...;
Una sintassi rigorosa ed una semantica ortogonale;
Ad esempio Java e Visual Basic sono linguaggi di alto livello; il miglior linguaggio di alto livello a me noto è, fra quelli ancora in uso, il Lisp ed i suoi derivati (come Scheme), mentre il miglior linguaggio di alto livello mai progettato è il defunto (e compianto) Algol 68.
Queste distinzioni non devono essere rigorose: un linguaggio di basso livello può avere strutture di dati, purché questo non ne appesantisca la sintassi, o non aggiunga concetti inutili: non ha senso includere le liste se ci sono i puntatori ad esempio. Analogamente un linguaggio di alto livello può includere qualche caratteristica di basso livello.
Ed infatti esistono molti "ibridi": ad esempio il FORTRAN non è di basso livello perché non include puntatori ed una stretta interazione col sistema, ma non ammette strutture di dati sofisticate ed ha una sintassi antidiluviana. All'altro estremo abbiamo il C++, che contiene sia i costrutti di basso livello (includendo il C come sottoinsieme) sia strutture che possono essere implementate per mezzo di questi (ad esempio ha sia puntatori che liste, sia array che vettori, etc.)
C'è anche da dire che la distinzione fra linguaggi di basso e alto livello riguarda l'uso che se ne fa, coinvolge cioè lo stile e le capacità del programmatore: un programmatore pigro e con poco stile non deve usare un linguaggio di basso livello, che gli lascia troppa libertà di scrivere programmi confusi, pesanti e complicati; deve invece usare un linguaggio di alto livello che lo forza ad uno stile di programmazione razionale e che limita i danni derivanti dalle sue negligenze.
Viceversa un programmatore versato e di bello stile potrà scrivere programmi strutturati, eleganti e complessi in un linguaggio di basso livello, con in più il pregio dell'efficienza: un buon programmatore di solito finisce per usare l'assembler.
Detto questo ecco alcuni luoghi comuni sul C, sfacciatamente falsi, che spesso vengono addotti come motivazione per l'uso del C++:
In C non si possono separare interfacce ed implementazioni;
In C non si possono nascondere dati ed algoritmi in seno ad uno stesso progetto;
In C non si possono sviluppare larghi progetti in modo razionale e modularizzato;
In C non si possono scrivere programmi di manipolazione simbolica;
In C non si possono manipolare strutture di dati dinamiche;
Tutto questo è ovviamente falso: quello che il C++ fa per soddisfare questi requisiti in realtà già soddisfatti è di estendere il C introducendo molte caratteristiche inutili, ed altre dannose. In realtà il C++ non è un singolo linguaggio, ma una famiglia di linguaggi condensati in uno. Si potrebbe trasformare in un ottimo linguaggio eliminando la maggior parte delle caratteristiche del C che vi sono incluse (ma grazie a ciò il C++, e qui sta il trucco ed il motivo del suo successo, includendo il C, ha potuto fagocitare milioni di linee di codice già scritte).
L'ultima versione del C++ (quella descritta nella terza edizione del libro di Stroustrup) è un linguaggio completo su vari livelli, abbastanza difficile da maneggiare globalmente, ma utile localmente: in qualche senso si tratta di una famiglia di linguaggi, dato che, a seconda dello stile del programmatore e delle sue abilità ingegneristiche, può essere una semplice estensione del C, un linguaggio orientato agli oggetti, un linguaggio modulare, un linguaggio di alto livello con polimorfismo e strumenti per la programmazione generica, e molto altro ancora: è un gran linguaggio se le risorse che mette a disposizione sono usate orizzontalmente, ed una immane accozzaglia di costrutti sintattici se usato verticalmente... Comunque la sua libreria standard è ben progettata, utile e ne è la caratteristica principale: si noti la differenza col caotico mucchio di classi che costituiscono la libreria di Java!!!
E tuttavia il C++ non è così soddisfacente come promette di essere: per una critica articolata del C++ (ed anche del C) si veda C++??: A critique of C++ di Ian Joyner. Non condivido il suo punto di vista su Java, ma le sue osservazioni sono interessanti e stimolanti.
Lascio qui alcuni link sul C (storia, programmazione, libreria Win32,
compilatori gratuiti, &c.):
Informazioni generali sul C
Dennis Ritchie home page: l'inventore del C: la pagina contiene documenti storici preziosi (ad esempio il codice del primo compilatore in UNIX scritto in C).
Bjarne Stroustrup Home Page: l'inventore del C++, che ovviamente magnifica la sua creatura sulla sua pagina, che contiene molto materiale interessante.
C programming una pagina con moltissime risorse: programmi, compilatori, link, libri,...
Forth è un linguaggio compatto ed estremamente efficiente, vicino alla logica della macchina ma sorprendentemente elegante: la sua principale caratteristica è di essere sia compilato che interpretato, nel senso che le sue istruzioni di base sono codificate in codice macchina e le altre, che si possono costruire basandosi su queste, sono compilate mediante puntatori, la cui scansione rende molto veloce il processo di interpretazione.
Inoltre il meccanismo di passaggio dei parametri alle funzioni non è quello usuale ma avviene direttamente lasciando i parametri su uno stack (questo è il modo col quale i compilatori implementano generalmente il passaggio dei parametri) il che rende molto efficiente il linguaggio e ne spiega la notazione, che a prima vista può sembrare bizzarra, vale a dire la notazione polacca inversa.
Forth Interest Group è la principale risorsa per chi è interessato al Forth: vi si trovano documenti, compilatori, programmi e così via.
colorForth è il (vecchio) sito di Chuck Moore, che (fra le altre cose) ha progettato e implementato il Forth.
Lisp
Il Lisp è un capolavoro di eleganza, semplicità e profondità teorica: fu inventato da John McCarthy come una notazione per definire in modo rigoroso la semantica del concetto di valutazione di una funzione: la notazione ed il meccanismo sono così ben fondati e semplici che McCarthy si è subito reso conto di poter effettivamente scrivere un interprete per quella notazione, scritto nella notazione stessa!
Il Lisp è una reificazione del λ-calcolo di Church, che è una versione della teoria della calcolabilità equivalente a quella data dalle macchine di Turing. L'idea è così semplice e geniale che il Lisp è ancora vivo e vegeto, ed è il venerando ed insuperato capostipite di una stirpe di linguaggi, i linguaggi funzionali, che consentono, in molti problemi di natura non numerica, di ottenere soluzioni efficienti ed eleganti: precisamente questi linguaggi sono adatti a risolvere i problemi che si presentano in modo naturale come ricorsivi.
La versione oggi più diffusa del Lisp è il Common Lisp (ma Clojure è la versione "state of the art"), un linguaggio (troppo) esteso e complesso, col quale si può programmare per ogni necessità. Derivati del Lisp sono Scheme ed Emacs, e, attraverso il linguaggio funzionale ML, i linguaggi della famiglia Caml. Inoltre i linguaggi logici, come il Prolog e i Goedel, sono strettamente imparentati con il Lisp.
John Mc Carthy Home Page: uno dei grandi della computer science, inventore del Lisp.
The Gödel Programming Language (a declarative, general-purpose programming language in the family of logic programming languages.)
Modula
Il Modula-2 è secondo me il miglior linguaggio della famiglia del Pascal: quest'ultimo è stato una figliazione diretta dell'Algol-W, creato per fini didattici all'ETH di Zurigo, da Niklaus Wirth. Si tratta di un linguaggio pulito, semplice e compatto, che però non si presta allo sviluppo di programmi complessi. Il Modula fu il suo successore, nel quale fu incorporato il meccanismo della suddivisione in moduli di un programma, cioè in parti indipendenti che è possibile compilare separatamente e che possono usare gli uni i pezzi degli altri.
La programmazione a moduli è possibile anche in C, ma il Modula mette a disposizione una sintassi rigorosa per sviluppare progetti con questo sistema e, del pari del C, ingloba una libreria di moduli di sistema per effettuare le operazioni dipendenti dal sistema operativo (I/O, grafica, etc.). I linguaggi ad oggetti oggi diffusi (C++, Java, etc.) vantano l'incapsulamento e il data hiding che infatti sono sinonimi della programmazione modulare. L'ultima versione del Modula, il Modula-3, è stata contaminata dalla programmazione a oggetti e costituisce un linguaggio enorme e poco maneggevole, non migliore di Ada.
modula-2 is a site with many resources: tutorials, links to (mostly free compilers), Win32 API, source code, and more.
www.modulaware.com Oberon-2 and Modula-2 Technical Publication Ubaye's First Independent Modula-2 & Oberon-2 Journal.
ETH Oberon Home page Oberon is the name of a modern integrated software environment for single-user workstations. Oberon is also the name of a programming language in the Pascal/Modula tradition and a highly effective and compact operating platform. The Oberon project was launched in 1985 by Niklaus Wirth and Jürg Gutknecht. While this project was originally targeted towards in-house built hardware, ported versions of the Oberon language and system are now available for numerous commercial platforms.
Il TeX (pronunciato come in greco: "tek") è un linguaggio di programmazione inventato da Donald Knuth che è orientato alla produzione di testi professionali. Cioè il codice sorgente consiste nella specifica di un testo (un documento, un articolo, un libro intero) e, dopo la compilazione, viene prodotto un codice oggetto (un file "dvi") che contiene una descrizione del documento che può essere utilizzata per visualizzarlo o per stamparlo. Il TeX ha cambiato completamente il mondo della produzione scientifica, dato che consente di scrivere qualsiasi tipo di formula matematica senza ricorrere a strumenti complicati ed inefficienti (come Equation Editor di Word, ad esempio). Il testo prodotto dal TeX è al livello delle migliori stampe analogiche e supera qualsiasi altro word processor.
Il TeX è comunque un vero e proprio linguaggio di programmazione, col quale si possono fare cose sorprendenti. La versione più usata è il LATeX, di Leslie Lamport, che è semplicemente un grosso pacchetto di macro-istruzioni TeX che ne standardizzano e semplificano l'uso per quelli interessati alla produzione di testi uniformi senza esigenze particolari di composizione del testo.
Donald Knuth Home Page: l'inventore di TeX, METAFONT e CWEB, un sistema di linguaggi di programmazione per produrre testi professionali, senza nessuna limitazione tipografica, ed autore di The Art of Computer Programming, il capolavoro della computer science.
TeX Users Group Home Page il sito con più risorse sul TeX: documentazione, compilatori, ed altro, il tutto rigorosamente gratuito.
Xml
XML è un linguaggio i cui codici sorgenti contengono dati e la descrizione di questi stessi dati (o solo la descrizione) in modo da renderne semplice il reperimento e l'elaborazione. Non si tratta di un linguaggio di programmazione, ma di un linguaggio di specifica e descrizione: tuttavia la sua semplicità e la generalità dei suoi costrutti lo rendono flessibile e potente. Tanto per dirne una, il linguaggio HTML, quello nel quale sono composte le pagine dei siti WEB, come questa che state leggendo, ad esempio, è un derivato ed una semplificazione di XML (il quale a sua volta deriva da SGML, un linguaggio di specifica giudicato troppo generale per la maggior parte degli scopi).
W3C: World Wide Web Consortium mantiene le informazioni sul linguaggio XML e derivati.
Nel 2001 (da aprile a giugno) ho prestato una consulenza per l'Engineering s.p.a. nel quadro di un progetto di classificazione automatica dei testi: ho implementato un classico algoritmo IR-like, il famoso Rocchio, e progettato ed implementato in C una dll le cui funzioni consistono in un completo sistema di classificazione basato sul modello degli spazi vettoriali e che usa il classico algoritmo di apprendimento del perceptrone di Rosenblatt con la regola delta di Widrow-Hoff.
Si tratta in pratica di un sistema che, basandosi un un corpus di documenti preventivamente classificati, impara a classificarli correttamente e quindi può essere usato per classificarne di nuovi sulla base di quanto ha appreso (per classificare intendo attaccare etichette a documenti: ad esempio riconoscere l'autore, gli argomenti principali di un testo, e così via); il sistema che ho progettato ed implementato è indipendente dalla lingua, nel senso che la sua analisi dei testi è puramente statistica e non usa tecniche legate alla grammatica di una o più lingue: questo lo rende meno potente dei sistemi basati sull'analisi linguistica ma assai più versatile.
Lascio qui di seguito alcuni link sulla classificazione automatica, compreso un link alla pagina di McCallum, che contiene un sistema di classificazione per l'inglese assai potente e free:
Intext è un Software gratuito per l'analisi dei testi.
Texts, text centres, resources and programs on the Web.
CiteSeer: Computer Science un enorme archivio elettronico di testi tecnici di informatica, in particolare di intelligenza artificiale, macchine che apprendono e classificazione dei testi.
Yiming Yang's HomePage: qui si trovano molti lavori interessanti di questa studiosa ed anche una versione del corpus Reuter, una collezione di testi sulla quale comunemente si effettuano esperimenti.
GNU + Cygnus + Windows è una spettacolare raccolta di programmi che fornisce praticamente un sistema UNIX dentro Windows (completo di una implementazione del sistema grafico X).
www.spychecker.com offre Ad-Aware, un software gratuito che verifica la presenza di intrusi nel vostro computer.
Steve Gibson mantiene un sito molto interessante sugli spyware, i programmini spia che girano in rete e che forse avete sul vostro computer senza saperlo.
Numerical Recipes è il sito web di una collezione di libri gratuiti che offrono una trattazione estesa e dettagliata dell'analisi numerica dal punto di vista operativo, con programmi in C o in Fortran.
Netlib Repository at UTK and ORNL is a collection of mathematical software, papers, and databases. The Netlib repository contains freely available software, documents, and databases of interest to the numerical, scientific computing, and other communities. The repository is maintained by AT&T Bell Laboratories, the University of Tennessee and Oak Ridge National Laboratory, and by colleagues world-wide. The collection is replicated at several sites around the world, automatically synchronized, to provide reliable and network efficient service to the global community.
DoCIS Documents in Computer and Library & Information Science, is a service of the rclis digital library, which, in turn, is dedicated to promoting free access to data about documents in computing and library and information science.
Kolekcja matematyczno-fizyczna presso la Biblioteka Wirtualna Nauki in Polonia mette on line alcuni numeri di International Journal of Applied Mathematics and Computer Science (2001-2004).
Marco Liverani ospita sulle sue pagine web molto materiale interessante di informatica, in particolare le sue note su Unix e Perl.