|
|
|
|
Strumenti |
13-03-2006, 12:22 | #1 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
[Tutorial Java] Uso del processore di annotazioni APT di Java 5
Il tutorial richiede che si conosca l'esistenza delle annotazioni e poco più.
Ho omesso per brevità le istruzioni Java per mutare il testo dei sorgenti oggetto della manipolazione. Non so dire se il comportamento mostrato nel tutorial sia esattamente quello di un preprocessore perchè il risultato è una mutazione permanente del testo che compone il codice del programma annotato. Sicuramente pre-processa. Occorrerebbe sapere se il concetto di preprocessore escluda o meno la possibilità di cambiare il codice "masticato" in modo permanente. Una curiosità terminologica, in definitiva. annotazioni.pdf Dulcis in fundo, Java 6 (b74+) integra le funzioni di APT in javac, rendendo il tutto anche più semplice. Ciao . |
13-03-2006, 14:47 | #2 | |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
13-03-2006, 15:25 | #3 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Che la "P" di APT stia per "processor" è innegabile così come il fatto che APT possa "processare" nel senso di produrre un output non finalizzato all'uso da parte di altri programmi.
Il mio dubbio, relativo all'altro comportamento di APT che, nel contesto esposto, è certo quello di un preprocessore, è se APT ed una parte del neonato javac 1.6 rientrino effettivamente nella categoria dei preprocessori (programmi che manipolano dati ad uso di altri programmi) o se definiscano una super-categoria della classe dei preprocessori che io ho definito cacofonicamente "preprocessori programmabili". Ametto che possa apparire un po' sterile come curiosità ma non posso negare di averla. Ciao. |
14-03-2006, 12:41 | #4 | |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
Per chiarirmi/ci le idee, per te cosa sarebbe il compilatore 'javac'?
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
14-03-2006, 12:59 | #5 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Pensandoci, "super-categoria" è effettivamente il termine errato. Come dici tu, è "sotto" e non "super". Avrebbe tutte le caratteristiche essenziali della categoria dei preprocessori più qualcosaltro di essenziale, il che fonda il rapporto di genere (preprocessori) a specie (programmabili).
Per me javac 1.5 è un processore: prende dei dati, li trasforma e restituisce il risultato della trasformazione. |
14-03-2006, 13:14 | #6 | |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
Gradito un esempio reale di 'processore non preprocessore' sempre per chiarirci le idee.
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|
14-03-2006, 13:48 | #7 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Circa l'asino io sarei stato un po più cauto .
Sottolinerei ancora una volta, ad uso degli ascoltatori, che la questione è poco pratica: a me interessa e per curiosità personale e per amore delle opinioni altrui. Dopo aver esaminato i sorgenti e preso le decisioni che deve prendere, APT lancia javac. Il preprocessore di C fa la stessa cosa: esamina i sorgenti, esegue le macro e passa il prodotto al compilatore. Dopo aver esaminato i sorgenti e preso le decisioni che deve prendere, javac 1.5 finisce il suo lavoro. E' vero che il prodotto di javac è in qualche modo destinato alla JVM. Ma nel sistema javac non esiste alcun collegamento con la JVM. Detto altrimenti, javac non offre i propri dati in uscita come dati in entrata per la JVM. E' la JVM che deve prenderseli in via autonoma. Dire allora che un processore è qualsiasi programma che riceva dei dati in entrata, li trasformi (ricordo che anche l'identità è una trasformazione) e restituisca il prodotto della trasformazione, in qualsiasi forma. Un preprocessore è qualsiasi processore che affidi il prodotto della propria trasformazione ad un altro processore. Intenderei "affidare il prodotto" nel senso di "A avvia B usando come input di B il proprio output". Per rispondere alla tua domanda, le proprietà essenziali di un processore sono: 1. riceve dei dati 2. li trasforma 3. restituisce il prodotto della trasformazione Le caratteristiche distinguenti di un preprocessore, restando nella colonna dell'essenza, sarebbero: 4. usa il prodotto della trasformazione come input di un diverso processore La faccenda comunque diventa intricata perchè occorrerebbe stabilire cosa di intenda per "diverso processore". Su questo non saprei cosa dire. Ciao. |
14-03-2006, 14:17 | #8 | |||||
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
Quote:
Quote:
Quote:
Quote:
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
|||||
14-03-2006, 14:53 | #9 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Effettivamente non è che si faccia a bastonate per partecipare .
Certo sarebbe più interessante se avesse qualche conseguenza, tipo "se A è un preprocessore allora A deve usare 3.2 megabyte di memoria". Insomma, qualcosa di concreto. Chiuderei qui la questione "preprocessore o non preprocessore". Come sosteneva Popper, le asserzioni circa l'essere di una cosa non sono scientificamente criticabili, ergo potremmo andare avanti fino ad avere la barba bianca. Restando comunque in tema, approfitterei del fatto che sai come argomentare un discorso per chiederti cosa ne pensi di questa faccenda di APT, delle annotazioni e della possibilità di trasformare i sorgenti o di crearne di nuovi. A me pare la novità più rilevante di Java 5 ma ho avuto l'occasione di usarla in produzione solo due volte che, in due (o tre?) anni di vita della piattaforma 5 non è certo molto. Tu ne hai mai approfittato? |
14-03-2006, 15:57 | #10 | |||
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Quote:
Quote:
Quote:
Oltre ad APT hai pensato che le annotazioni sono utilizzabili, volendo, anche in runtime? Non ho avuto ancora esperienza diretta e personale delle annotazioni, è l'ultimo aspetto che mi manca della piattaforma tiger. Sto combattendo per adeguare il codice esistente in azienda, e le annotazioni le ho lasciate come 'botta finale'. Finora pare che abbiano preso piede soprattutto in ambito enterprise (sono parte fondamentale delle nuove specifiche JEE5). Ho il sospetto che la parte più divertente di APT si nasconda nella possibilità (?) di generare file .java ex-novo, ma devo ammettere che al momento non ne ho trovato applicazioni utili, salvo entrare nel mondo dei 'dialetti java' citati nei PDF. Quello che invece mi lascia perplesso è come gli IDE maggiormente in voga gestiscano le annotazioni in fase di 'background-compiling' e 'code-discovering'. Dal punto di vista del design mi pare che le annotazioni giocheranno un ruolo importante nell''inversion of control' e in tutti quei framework che gestiscono aspetti legati allo sviluppo, come il testing e l'AOP. Mi rendo conto che APT potrebbe giocare un ruolo marginale in tutto questo, ma staremo a vedere.
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } Ultima modifica di Angus : 14-03-2006 alle 15:58. Motivo: correzione |
|||
14-03-2006, 17:10 | #11 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Tutti dovrebbero laurearsi in Filosofia e Psicologia. Putroppo io non ho seguito il consiglio che do e, come noti, sono rimasto a livello di appassionato.
Sfortunatamente non riesco ad abituarmi agli IDE di fascia alta e non ho avuto quindi modo di apprezzare l'uso che questi strumenti facciano delle annotazioni. Pur non occupandomi di programmazione server-side ho letto qualcosa sulla terza generazione dei fagioli d'impresa e mi pare che la semplificazione sia notevole, se non altro per la riduzione negli elementi che è necessario creare. La mia è comunque un'impressione, occorrerebbe il parere di qualcuno più avvezzo alla materia J2EE. Per Annotazioni e Runtime la questione è a mio giudizio meno rilevante di quanto si segnali in alcuni testi. Nell'orrenda quarta edizione di The Java Programming Language pare che sia il loro carattere più esalatante ma, a mio modo di vedere e nel contesto dell'introspezione, hanno una sola differenza rispetto alle interfacce marcatrici (tipo java.io.Serializable o java.util.EventListener) e sta nella loro capacità di "marcare" un membro a prescindere dall'esistenza di un rapporto di parentela tra il Tipo del membro ed il Tipo usato come discrimine per l'esecuzione riflessiva di un blocco ideale di istruzioni. Faccio un esempio: Codice:
@interface Control {} class A { @Control X member = new X(); } Nella maggior parte delle situazioni, mi sfugge dove stia il miglioramento pratico rispetto a: Codice:
interface Control {} class SubX extends X implements Control {} class A { X member = new SubX(); } Codice:
class A { X suffixMember = new X(); } Con le annotazioni c'è un vantaggio in chiarezza. "Tutti sanno che", l'at preposto ad un nome indica annotazione: se l'annotazione è "RUNTIME", allora occorre drizzare le antenne . |
14-03-2006, 19:01 | #12 |
Senior Member
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
|
Non so se hai tempo di farlo, ma il discorso sulle annotazioni, ed in particolare sul loro utilizzo a runtime, trova un'applicazione pratica nello studio riportato qui.
Secondo me le annotazioni non si riducono a dei semplici 'attributi formali', ma hanno qualcosa in più, proprio per il fatto di poter essere parametriche. Quello che mi sfugge è quale applicazione, a parte i tool di sviluppo e gli application server, possa trarre beneficio dall'ispezione a runtime delle annotazioni.
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer °SetiEmperor°| Ninja Technologies { qualunque cosa sia, è veloce e fa male (cit.) } |
14-03-2006, 22:56 | #13 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Ho letto con interesse ma in quel contesto trovo più ragionevole usare dei Tipi ad hoc per immagazzinare gli stati di un oggetto (RangedString piuttosto che RangedInt e via fantasticando).
A me capita, scrivendo o manutenendo codice, di osservare taluni casi in cui è possibile ridurre la quantità materiale di codice applicando annotazioni generici e riflessione, tutti insieme appassionatamente. E' curioso come i tre strumenti si incastrino, forse per via del fatto che tutti presuppongono l'esistenza di una forma regolare: i generici limitati fondano meccanismi applicabili a tutto ciò che rispetta certi rapporti di parentela, le annotazioni creano all'interno dei membri di un Tipo degli insiemi di membri distinti dagli altri e la riflessione è in grado di scandire l'insieme dei membri e scegliere tra questi dei sottoinsiemi. Non è un risultato eccezionalmente innovativo ma ha un valore pratico altrimenti non ottenibile. Condivido la difficoltà nel trovare un'applicazione "runtime" delle annotazioni che faccia gridare al miracolo. Forse bisognerebbe cercarla in direzione della capacità di accomunare elementi altrimenti non correlati ma il rischio è quello di attribuire uno scopo ad una caratteristica del linguaggio non perchè utile ma perchè "diamine, almeno uno dovrà averlo" . Ultima modifica di PGI-Bis : 14-03-2006 alle 22:57. Motivo: sgarrupamento grammaticale |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:19.