Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Alessio Saltarin ` E laureato in Ingegneria Gestionale. Si occupa di progettazione e sviluppo di applicazioni enterprise in Vodafone Italia.
Limpaginazione automatica di questa rivista e realizzata al ` 100% con strumenti Open Source usando OpenOffice, Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp, Python e BASH
For copyright information about the contents of DEV, please see the section Copyright at the end of each article if exists, otherwise ask authors. Infomedia contents is 2004 Infomedia and released as Creative Commons 2.5 BY-NC-ND. Turing Club content is 2004 Turing Club released as Creative Commons 2.5 BY-ND. Le informazioni di copyright sul contenuto di DEV sono riportate nella sezione Copyright alla ne di ciascun articolo o vanno richieste direttamente agli autori. Il contenuto Infomedia e 2004 Infomedia e rilasciato ` con Licenza Creative Commons 2.5 BY-NC-ND. Il contenuto Turing Club e 2004 Turing Club e rilasciato ` con Licenza Creative Commons 2.5 BY-ND. Si applicano tutte le norme di tutela dei marchi e dei segni distintivi. ` E in ogni caso ammessa la riproduzione parziale o totale dei testi e delle immagini per scopo didattico purch e vengano integralmente citati gli autori e la completa identicazione della testata. Manoscritti e foto originali, anche se non pubblicati, non si restituiscono. Contenuto pubblicitario inferiore al 45%. La biograa dellautore riportata nellarticolo e sul sito www.infomedia.it e di norma quella disponibi` le nella stampa dellarticolo o aggiornata a cura dellautore stesso. Per aggiornarla scrivere a info@infomedia.it o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa
cegliere un linguaggio di programmazione un fatto non banale. Di linguaggi ce ne sono migliaia, di cui attualmente supportati almeno centosessantacinque tanti, perlomeno, ne mostra lOpen Director y Project alla voce Computers / Programming / Languages [1]. Per chi voglia imparare a programmare, o magari aggiornarsi, la scelta avr conseguenze importanti sul tipo di applicazioni da sviluppare e di progetti da seguire. Naturalmente non esiste il linguaggio migliore in assoluto; esiste invece quello che ha le caratteristiche per rispondere al meglio ad un particolare compito. Ben sapendo poi che la scelta si deve basare anche su considerazioni e inclinazioni personali, sulla disponibilit di strumenti e di conoscenza adeguati, vorrei con questo articolo almeno tentare una prima classificazione, basata sulle esperienze storiche e sugli standard oggi in atto nel mondo delle imprese. Una nota: intendo qui per linguaggio una tecnologia in grado di produrre unapplicazione per computer generica (all purpose) - escludo dunque tutti quelli che servono per esigenze specifiche come SQL, XML, HTML e via dicendo.
Non esiste il linguaggio migliore in assoluto, esiste quello migliore per un certo compito
Oggi, nonostante le cose siano in un certo senso molto evolute, la principale distinzione ancora tra linguaggi compilati (che generano cio codice direttamente eseguibile) e linguaggi interpretati (che devono cio girare allinterno di un programma interprete per funzionare). Con vari ricicli, ci sono state epoche in cui si preferivano i primi, ed epoche in cui si preferivano i secondi. Oggi, come dir, sembra che il modello vincente sia qualcosa che sta un po a met strada.
Quale compito
Quali sono oggi i principali campi per i quali il software viene scritto? Direi che ne esistono almeno cinque. Forse la categoria pi importante, quella che certamente in Italia impiega pi risorse, lo sviluppo di software cosiddetto web-based. Si tratta di tutte le applicazioni che possono essere fruite attraverso un browser. Queste possono essere suddivise in applicazioni Internet, caratterizzate dallavere uno scambio di dati ridotto al minimo, oppure applicazioni Intranet, tipicamente su reti aziendali dotate di larga banda, anche dette enterprise. Queste hanno avuto successo soprattutto per un fattore: cio che dopo gli anni di anarchia del modello clientserver, per cui ogni singolo client aveva la propria particolare configurazione e necessitava di manutenzione specifica, si tornati al modello centrale, per cui un unico server in grado di servire lapplicazione ai suoi terminali, senza un intervento diretto su questi ultimi. Se nelle applicazioni Internet la gran parte del codice funzionale a ci che appare a video, nelle applicazioni enterprise la parte di front end solo la punta delliceberg: la gran parte delle logiche risiede a livello di back end, ovvero di interazione con le basi di dati, con le code di messaggi, con i sistemi di integrazione (EDI, EAI, Biztalk). Ma il modello client-server non sparito, e a questo tipo di software aggiungerei tutto il cosiddetto legacy (eredit del passato). Si tratta di applicazioni vecchie, sviluppate in larga parte prima dellavvento di Internet con tecnologie obsolete. In genere utilizzano un collegamento continuo con una o pi basi di dati e necessitano di una serie di procedure per linstallazione sui client. Paradossalmente, anche questa categoria di software tra le maggiori: i sistemi legacy continua21 <<
RIQUADRO 1
Negli ultimi anni si notata una tendenza molto forte nel campo dello sviluppo software, e cio il passaggio dai linguaggi (compilati o interpretati) alle piattaforme (framework) [2]. Il megatrend stato lanciato da Sun, con Java, nel 1995. Lidea era quella di fondere le qualit dei linguaggi compilati (ottimizzazione, velocit di esecuzione) con quelle dei linguaggi interpretati (tra cui soprattutto il controllo sulle operazioni che il programma sta eseguendo). Il codice viene prima compilato in uno pseudo codice binario (bytecode o linguaggio intermedio), poi eseguito da un interprete o controllato da ambiente di run-time. Non era unidea del tutto nuova: un modello analogo era gi stato introdotto da Microsoft con il Visual Basic e il suo p-code nel 1991. Il run-time esegue tutta una serie di operazioni primitive come lallocazione della memoria, la compilazione justin-time, il controllo delle eccezioni, il multitasking e di fatto svincola il programmatore dallimplementazione di tutti questi aspetti. Un framework comprende dunque uno o pi linguaggi, un interprete, un compilatore, e in genere anche delle librerie o API standard, che permettono al programmatore di ridurre i tempi di sviluppo (una volta imparate, le stesse API possono servire ogni progetto, mentre di contro, per esempio in C, la mancanza di librerie standard obbliga lo sviluppatore a crearsele in proprio o a doverne imparare sempre di nuove). Lintroduzione della piattaforma Java venne inizialmente pubblicizzata con la sua capacit di eseguire lo stesso codice (il bytecode) su differenti sistemi operativi, cambiando solamente linterprete (write once, run anywhere). Ma, specie allora, la cross-portabilit interessava a pochi (oggi, con il maggior peso di Linux e MacOS il discorso comincia a cambiare). Quello che emerso, invece, che il successo di Java si deve alla sua straordinaria robustezza perch il runtime prende su di s le maggiori responsabilit quanto alla sicurezza e alla correttezza di implementazione delle operazioni low-level (accesso al disco, alla memoria, alla rete, gestione dei thread). Con lentrata in scena del .NET Framework, Microsoft ha sposato integralmente questa visione. Si consideri, ad esempio, che con Visual Studio .NET la compilazione in linguaggio macchina praticamente del tutto sparita. C#, J# .NET, VisualBasic .NET e Managed C++ producono tutti codice intermedio (MSIL). Il compilatore in linguaggio macchina nativo lasciato come opzione per il solo Visual C++ .NET. Una nota finale. A differenza del mondo Microsoft, dove la piattaforma ha un nome (.NET) e i linguaggi ad essa associati altri nomi, nel mondo Sun la piattaforma (Java) ha lo stesso nome del linguaggio. Non me ne voglia il lettore se questo pu causare confusione. Spesso, se si sta parlando del linguaggio Java o della piattaforma Java si pu capire solo dal contesto. no ad essere utilizzati per questioni economiche e necessitano continuamente di manutenzione, piccoli cambiamenti e integrazione con il nuovo software. Esistono poi tutte le applicazioni desktop, ovvero il mercato generico del software commerciale o shareware, per esempio office automation, antivirus, strumenti di sviluppo, foto e video editing, utility varie. Forse la classe di applicazioni pi affascinante per quella
>> 22
del software che definirei estremo, dove le risorse a disposizione CPU, scheda video, RAM, hard disk - devono essere sfruttate al 100%. Vi ricadono certamente le applicazioni di calcolo (centrale o distribuito), di CAD e CAM, scientifiche (soprattutto, ultimamente la ricerca medico-biologica) e, perch no, certi videogiochi. Infine, una categoria di crescente interesse riguarda le applicazioni mobili, cio tutto il software scritto per telefoni cellulari e computer palmari.
RIQUADRO 2
Matrice Compito/Linguaggio
Applicazione
Legacy
Desktop
++ + + +
+ + ++
+ ++
+ ++ +
+ ++
Ottimizzazione. La capacit di sfruttare fino in fondo i processori e di utilizzare librerie specifiche per lo sfruttamento di hardware specializzato. Sono linguaggi che producono LM fortemente ottimizzato. Questo il campo in cui C/C++ ancor oggi eccelle, e non si vedono concorrenti allorizzonte. Per specifiche esigenze esistono per anche Delphi (che un Pascal a oggetti specializzato nella produzione di applicazioni desktop) e il buon vecchio ADA (nella nuova incarnazione, Ada95 la scelta principale in ambienti militari e scientifici). Infine, lAssembly (che mappa il LM su alcune keyword, ed dunque lo strumento per programmare in LM) utile nei casi di ottimizzazione pi spinta. Compatibilit. Rimane un grosso problema. La compatibilit allindietro con il software prodotto anni o decadi prima quasi un sogno irrealizzabile. Oggi le richieste di compatibilit si riducono quasi tutte alla produzione di strati software collante in grado di parlare non gi con le applicazioni, ma con gli input e gli output delle stesse (quindi via database, via XML, eccetera). Il linguaggio delezione della compatibilit lANSI C++ (che vanta una vera compatibilit allindietro con il C, una forte standardizzazione, e una presenza pressoch universale, poich non esiste sistema operativo che non offra un compilatore C++). Forse, lunico nel suo genere.
o PHP) interpretati dal Web Server o direttamente dal browser. Va notato che il noto problema dello spaghetti code (logica e codice HTML mischiati insieme) sta suggerendo anche per questo tipo di applicazioni una migrazione verso i framework (con servlet Java e pagine JSP, oppure ASP .NET) e lo spostamento dellesecuzione dellapplicazione dal Web Server ad uno specifico Application Server. Per le applicazioni legacy, la propriet chiave sembra essere la disponibilit di linguaggi in grado di produrre codice compatibile con lesistente. Su tutti, emerge il C++, avendo cura di seguire le specifiche standard ANSI (altro invece il discorso dellintegrazione tra sistemi nuovi e sistemi legacy, categoria che ricade nel software enterprise). Non sottovaluterei oggi la possibilit di approfondire i linguaggi storici, come Cobol e Algol, data la sentita necessit di intervenire dove sia rimasto il codice sorgente originale. Per le applicazioni desktop, la propriet chiave la manutenibilit del codice. Nellindustria del software commerciale il maggior problema quello del turn over, sia delle risorse umane, sia delle tecnologie. Questo tipo di software quindi deve essere facilmente convertibile tecnologicamente, molto ben documentato e scritto con paradigmi che favoriscano la riutilizzabilit. Si parla quindi di linguaggi a oggetti, o a componenti, ma anche delluso di metodologie di design standard come UML. In questo settore importante ladozione del look and feel del sistema operativo target, cosa che al momento sfavorisce leggermente Java, mentre nella pratica il Visual C++ (prima di .NET) rimane il linguaggio di riferimento, seguito da Delphi e Visual Basic. La sempre maggiore adozione del .NET Framework, comunque, spinger gli sviluppatori di applicazioni desktop verso C# e Visual Basic .NET. Se esister in futuro un rilevante mercato Unix/Linux anche per il desktop, potrebbero assumere importanza gli ambienti tipo Kylix (C++ e Delphi) o Java Swing, dove significativi sono i miglioramenti fatti nelle ultime versioni verso la standardizzazione del look and feel (specie per MacOS e Windows XP). Per le applicazioni extreme, com ovvio, la propriet chiave lottimizzazione. Il linguaggio deve essere compilabile in linguaggio macchina, utilizzando ogni caratteristica hardware disponibile. Come si visto, ANSI C++ su tutti, e porzioni di Assembly dove serve. Rimane il mobile, dove la situazione non ancora chiara. Se fino a oggi si trattava di produrre codice macchina per lo specifico sistema operativo del telefonino, lapparizione dei framework Java e .NET per le tecnologie mobili lo rendono una categoria assimilabile allo sviluppo enterprise (se il client mobile in qualche modo connesso a dei server centrali), o allo sviluppo desktop.
23 <<
Il futuro
Parlare di cosa ci aspetta nel futuro sempre un po un esercizio sterile. Molti hanno fallito nel tentare di individuare un percorso evolutivo nei linguaggi di programmazione. Per esempio oggi non ha pi molto senso parlare di linguaggi di prima, seconda, terza dodicesima generazione, perch quel tipo di classificazione si basava sul presupposto di un passaggio dal codice scritto verso altri paradigmi di sviluppo, basati su strumenti RAD, su sistemi esperti e su tool CASE. Se vero che questi esistono, non hanno tuttavia soppiantato i linguaggi classici, che sono tuttora pi vivi che mai. Forse per possibile inquadrare almeno due importanti linee guida. La prima certamente il megatrend verso i framework, cio verso un progressivo allontanamento dalle performance e dalle ottimizzazioni (dalle logiche della macchina), per avvicinarci alla stabilit, portabilit e manutenibilit (alle logiche dellapplicazione). Questo vale in quasi tutti i campi applicativi visti in precedenza. La seconda che il paradigma della programmazione OO ha avuto un successo cos importante, che praticamente non esiste linguaggio o piattaforma che non si sia evoluto per supportarlo. Al momento pare abbastanza certo che avr ancora lunga vita e sembra quindi saggio, potendo fare una scelta senza vincoli, puntare su un linguaggio a oggetti puro, come C# o Java. Tra gli altri paradigmi si distingue la programmazione funzionale, tra cui soprattutto i linguaggi ML, Haskell o il misterioso F#. presto per per capire se e come questi linguaggi avranno un ruolo.
Conclusioni
In questo articolo ho tentato una classificazione dei linguaggi in base ai compiti che sono chiamati a svolgere. evidente per che limplementazione di un particolare progetto software, specie se di grandi dimensioni, pu beneficiare delle migliori caratteristiche di ciascuno. Lintelaiatura di un progetto pu essere scritta in Java, per ottimizzare i processi critici si pu fare ricorso a codice compilato in C++ attraverso JNI, mentre per impartire comandi allapplicazione dallesterno si pu usare Python (Jython). Se preferite .NET, sostituite Java con C#, Jini con C++ unmanaged e Python con JScript. Le possibilit, fortunatamente, sono infinite.
Bibliografia
[1] Computer/Programming/Languages - http://dmoz.org/ Computers/Programming/Languages/ [2] Marc Clifton What is a framework? -http://www.codeproject.com/gen/design/WhatIsAFramework.asp [3] Alessio Saltarin Prove di performance in Managed C++ - Computer Programming nr.120 [4] Gregg Wonderly Whats in a programming language http://www.artima.com/weblogs/viewpost.jsp?thread= 28518
Alessio Saltarin
laureato in Ingegneria Gestionale. Si occupa di progettazione e sviluppo di applicazioni enterprise in Vodafone Italia.
Doktor Morb
TRASPORTO ALLASTROPORTO
Progettazione ottimizzata delle strutture
Il Centro di progettazione di Deneb IV brulicava di personale indaffarato. Enorme e sontuosa, la sala di controllo al quarto piano mostrava un continuo andirivieni di tecnici e analisti, mentre poco distante dalledificio, su di uno spiazzo che si stendeva a perdita docchio, sorgeva un sinistro scheletro di acciaio che avrebbe rappresentato il magazzino del futuro nuovo astroporto: nel cielo punteggiato di stelle infatti salivano dal terreno enormi travi, struttura di sostegno della costruzione cubica in allestimento.
ovviamente variabile, sebbene sempre cubica e rapportata ai pallets. Ci di cui avremmo bisogno un sistema univoco che ci consenta di progettare le fasi di scarico di astronavi da carico provenienti da settori diversi della galassia senza spreco di risorse, adottando tempistiche e collegamenti efficienti scaglionando opportunamente gli arrivi. Il nostro scopo quello di creare un precedente nella storia dellarchitettura, in cui la struttura nasce gi adattata alle richieste ed alle necessit alle quali dovr sopperire.
apri la sua cartellina ed inizi freneticamente a sfogliare gli appunti e le note, infine sillumin dicendo: Direi pari alla radice cubica della quantit di merce trasportata, con trasporto a pieno carico. Allora semplice sorrise Morb, e tir una boccata di simil-tabacco dalla inseparabile pipa.
Soluzione
Ogni cargo cubico contiene n3 contenitori. Quindi ogni equipaggio avr diritto, a pieno carico, a tenere per s n contenitori come indennizzo del viaggio. Rimarranno pertanto da trasbordare n3 n contenitori, pari a n(n2 1), o ancora a n(n+1)(n-1) pallets cubici. Le vostre navette trasportano sei pallets ciascuna, e mi avete chiesto come ottimizzare i trasporti: avr sicuramente notato che c=n(n+1)(n-1) multiplo di tre numeri consecutivi: n-1, n ed n+1. Allinterno di una terna di numeri consecutivi, mi perdoni il gioco di parole, c sempre almeno un numero pari, ed uno divisibile per tre. Il loro prodotto sar quindi multiplo di 6. Con navette che portano 6 cubi ciascuna, non avrete mai una navetta con carico minore di sei. Concluse tranquillo, e torn a contemplare le stelle. DEV > n. 118 maggio 2004
>> 24