2010-03-21 11 views
19

Potrebbe UML essere utilizzato per programmare un sistema informatico da solo, senza un linguaggio di implementazione di supporto, ad es. diagrammi direttamente su codice macchina (magari via C o C++ ecc.), senza intervento di codifica umana.UML è un linguaggio di programmazione?

+0

Sviluppo guidato dal modello di Google. –

+0

Non parliamo semplicemente di persone con la generazione di modelli, ma tutto su, posto dei pantaloni, wow stuff, direttamente al codice eseguibile. – WeNeedAnswers

+0

@ John Grazie John, ottimo collegamento, continua a lavorare bene, attaboy :) – WeNeedAnswers

risposta

22

Ho intenzione di andare contro la tendenza generale e condividere un'esperienza che mostra ciò che UML può fare oggi, e ciò che potrebbe essere una versione futura di UML (o un altro approccio di modellazione).

Prima un po 'di storia.

Indietro quando, la gente ha programmato i computer in assemblea (non andando ALL al ritorno qui). Poi sono arrivati ​​linguaggi di alto livello come C e Basic. I programmatori che erano molto bravi in ​​assemblaggio sostenevano che non è possibile esprimere completamente tutto ciò che il processore è in grado di fare (in modo ottimizzato) in un linguaggio di livello superiore. In effetti, avevano ragione. Alcune cose erano molto meno ottimali dal punto di vista della memoria e delle prestazioni nei linguaggi di livello superiore perché non si riusciva a controllare completamente le istruzioni impartite al processore.

Il fatto è che i linguaggi di livello superiore fornivano una forma di espressione molto più astratta. Quindi, hanno capito e dopo un po ', la gente non si preoccupava davvero che non si potesse controllare completamente ogni aspetto del processore perché gli sviluppatori erano molto più produttivi (anche Moore's Law aiutava).

Giri simili si sono verificati con linguaggi orientati agli oggetti e di nuovo con le lingue gestite. Ogni volta, un livello più alto di astrazione divenne disponibile e alla fine vinse perché era più efficiente da usare come sviluppatore. Di fatto, generalmente le inefficienze nei livelli più alti di espressione scompaiono quando i compilatori migliorano e le tecniche di ottimizzazione migliorano.

Lo sviluppo guidato dal modello è un livello più elevato di espressione. Non è possibile rappresentare completamente qualsiasi codice che si possa scrivere, ad esempio in C# o Java. Soprattutto non fuori dalla scatola. Tuttavia, è possibile generare una porzione molto consistente di un'applicazione direttamente da un modello UML.

Ho guidato lo sforzo di generazione del codice basato su UML per diversi progetti piuttosto grandi. In molti casi, è possibile generare dal 30% al 60% dell'intero codice sorgente delle applicazioni (di vita reale, di classe enterprise). E questo è solo con un piccolo team che scrive generatori per un particolare dominio. Alla fine, un'intera industria sarà dietro gli strumenti per generare sempre più applicazioni reali dai modelli.

Questo è il prossimo passo nell'evoluzione naturale che abbiamo visto nel nostro settore più e più volte, dal momento che il primo assembly ha codificato gli opcode astratti (probabilmente c'era qualcosa prima, ma quello era prima del mio tempo).

+12

ottima risposta. Era autogenerato :) – WeNeedAnswers

+0

@Eric, scherzando solo grazie, quanto tempo impiega il 40% del codice che deve essere umano a sviluppare? C'è un problema con la transizione tra la macchina in umana, qual è il tasso di errore del codice generato (simboli divertenti e simili)? – WeNeedAnswers

+0

@WeNeedAnswers: Ci è voluto molto tempo (2-3 mesi con 3 persone) la prima volta che lo abbiamo mai fatto. L'ultima volta che l'ho fatto (con il beneficio dell'esperienza e degli strumenti precedentemente sviluppati) ci sono voluti circa un mese con 3 persone. Il primo 10% -15% arriva molto velocemente. Lo sforzo aumenta più che linearmente (ma non in modo esponenziale) più si vuole generare, perché si tende prima a fare le cose facili. –

5

Ci sono alcuni strumenti per convertire i diagrammi di modellazione UML in codice, in particolare diagrammi di stato UML. Ad esempio, ho usato uno strumento chiamato "Rhapsody" (da I-Logix) nel 2000 che convertiva un diagramma UML in C++. Era bello perché lo strumento poteva eseguire direttamente la macchina a stati e poteva anche eseguire codice su una macchina remota (in questo caso, una scheda su cui gira vxworks).

Ma in generale, UML viene utilizzato come strumento di modellazione. Usalo per modellare il tuo sistema e fornire diagrammi per i tuoi documenti di progettazione, o qualsiasi altra cosa. Quindi usa questa conoscenza per sviluppare il tuo sistema in modo organizzato.

+1

Se si utilizza UML come strumento di modellazione, il modello diventerà obsoleto piuttosto velocemente. Se si sfrutta appieno il potenziale per la generazione del codice, il modello rimane fresco perché aggiunge valore continuo per tutta la durata del progetto. –

+1

Vero, questo è un punto eccellente. I documenti di progettazione e i diagrammi sono la prima cosa che diventa obsoleta una volta che il codice inizia a essere scritto. Ma il compromesso è che devi sviluppare il tuo "codice" in UML. Pensaci per un momento. Dovrai utilizzare lo strumento UML per eseguire il debug del tuo codice e qualsiasi nuovo sviluppatore del team dovrà imparare uno strumento che probabilmente non ha mai usato prima. Durante la vita del tuo progetto potrebbe essere ancora più pratico tornare indietro e aggiornare i tuoi diagrammi UML. –

0

Il diagramma di classe può essere inoltrato nel linguaggio di programmazione in base allo strumento UML che si sta utilizzando. Penso che sia ancora necessario codificare la propria logica aziendale, ecc.

+1

@codemeit: tranne che i migliori strumenti UML consentono di specificare il comportamento delle operazioni nei diagrammi delle classi utilizzando diagrammi di attività o di sequenza, da cui è possibile generare il codice. –

+0

@John: Uso Sparx EA per i progetti di generazione del codice che faccio riferimento alla mia risposta perché hai la possibilità di modellare il comportamento e anche perché tutti i dati del modello si trovano in un database SQL (e la maggior parte è disponibile tramite un'API). –

+0

@Eric J - ROFLMAO. Ho avuto una discussione qualche tempo fa con qualcuno che ha proclamato a gran voce che Sparx non avrebbe mai potuto fare tutto questo e che potevamo contare solo su uno strumento UML/MDA di un venditore "mainstream" che costa $$$$$$ +++++ ++. Beh, non dovrei dire che era un argomento, perché a malapena ho avuto modo di dire qualcosa oltre "ciao". –

1

UML può modellare una macchina a stati. Quindi, può rappresentare una macchina di Turing. Un compilatore con sufficiente sofisticazione può leggere questa rappresentazione e creare una rappresentazione binaria (eseguibile) della macchina Turing .

Quindi, la mia risposta è sì.

Modifica

Dal momento che la mia risposta sembra essere sgradevole per alcuni ... vorrei chiarire che questo "compilatore con abbastanza sofisticazione" è completamente immaginario e probabilmente lontano nel futuro ... ma sembra da le altre risposte, ci sono alcuni programmi in grado di generare un codice boilerplate o anche di generare ed eseguire un intero programma.

Penso che ciò dimostri che UML (o qualche suo sottoinsieme) si qualifica come linguaggio di programmazione, ma probabilmente non è buono.

+1

Questo è talmente sbagliato in così tanti modi. 1. Una macchina a stati non è completa Turing, quindi non può modellare una macchina di Turing. 2. Solo perché è possibile modellarlo in UML non significa che UML possa descrivere come eseguirlo. Dimmi come puoi tradurre un diagramma UML in qualcosa di eseguibile. –

+0

@Jeff Meatball Yang: Quanti anni ci stiamo parlando, o è solo teoria? – WeNeedAnswers

+0

Penso che tu abbia invertito il mio significato: una macchina di Turing è una macchina di stato. E questo mi sembra paradossale: "solo perché puoi modellarlo in UML non significa che UML possa descrivere come eseguirlo" ... non è ESATTAMENTE quello che fa UML? Mostra possibili stati, transizioni, valori, ecc. Il mio compilatore "magico" lo trasforma in binario in modo che possa essere eseguito su un processore. Proprio come non puoi scrivere gobbledy-gook C++ e aspettarti che si compili, probabilmente dovrai seguire particolari convenzioni/sintassi nel tuo UML. –

0

Non lo è. Affatto.

Non può prendere decisioni (se è) o eseguire cicli. È meno di un linguaggio di programmazione di una macchina a stati finiti. Almeno un FSM può prendere decisioni. UML non ha nemmeno stato.

+0

nemmeno i linguaggi di programmazione funzionale come Haskell in teoria :). Ha dei loop. strane cose che possono essere disegnate per rappresentare un loop. – WeNeedAnswers

+0

ma hanno chiamate di funzione. UML non definisce nemmeno un "metodo principale". –

+0

true true, ma main non dovrebbe esistere realmente in alcun linguaggio OO, si rimette al codice procedurale e prima di quel Assembler. Quanto in basso si può andare? Penso che Main sia implicito. – WeNeedAnswers

9

Risposta breve: no. Alcuni strumenti di modellazione UML possono generare Java, C++ e codice in altri linguaggi di programmazione. Tuttavia, ciò che genera sono solitamente interfacce e relazioni di classe. Questi strumenti generano stub per i quali è ancora necessario fornire l'implementazione, quindi è necessario l'intervento umano.

+0

Ho generato fino al 60% del codice totale in alcune applicazioni di classe enterprise (utilizzando la generazione di codice personalizzata). –

+5

@Eric: che ti ha lasciato solo il 40% difficile da scrivere, no? Non è quello che non è una vittoria. – dmckee

+1

@dmckee: Ho generato il layout dell'interfaccia utente, le regole di convalida dell'interfaccia utente, l'UI/Business object binding, le regole di convalida della logica di business (utilizzando lo stesso elemento UML per UI e Business Object per coerenza garantita), i binding ORM ... nel primo 15% . Le risorse rimanenti hanno contribuito a generare flussi di lavoro, vincoli di sicurezza per i servizi Web/oggetti dell'oggetto business/elementi dell'interfaccia utente basati su modelli di ruoli e calcoli complessi (generati da diagrammi di attività con annotazioni specializzate). Per me, questa è la parte più difficile perché è routine e noiosa ;-) –

2

In teoria? Sì, è possibile utilizzare un gajillion state machine diagrams e specificare tutto con i minimi dettagli, quindi collegare i diagrammi della macchina di stato ai metodi nel diagramma delle classi ed eseguire uno strumento orribilmente complicato per generare tutto questo.

Ma questo non è qualcosa che vorresti fare. Non otterrai più libertà nel modo in cui ti esprimi, perché devi usare il giusto tipo di sintassi in modo che lo strumento capisca tutto ciò che scrivi. Non solo, ma saresti in grado di scrivere il codice in te stesso in molto meno tempo di quanto ti porterebbe a fare tutti questi diagrammi - e l'unica cosa che ti dà è che il codice è una copia carbone delle specifiche (perché la specifica genera il codice). Questa potrebbe essere una buona cosa, ma dal momento che non hai codice reale, significa anche che il debugging significa debugging dei diagrammi - e quasi sicuramente sarà quasi impossibile.

+0

tranne che le macchine a stati non fanno parte di UML. –

+3

Cosa !? Sì! http://en.wikipedia.org/wiki/UML_state_machine –

0

Risposta breve: come è ora, non è possibile generare il 100% del codice.

Probabilmente si potrebbe generare la struttura di classe dei propri sistemi tramite Class Diagram e probabilmente parte del corpo dei metodi tramite i diagrammi di interazione e/o i diagrammi di stato, ma penso che sia a riguardo.

+0

heh, e questo è tutto ciò di cui hai bisogno, è completo Turing :) –

0

Alcuni link per WeNeedAnswers da quando ero così colpiti dal suo commento:

Questo dovrebbe essere un inizio.

+0

Grazie, ma qual è la TUA risposta su questo. Posso leggere google fino a quando le mucche tornano a casa, ma per quanto riguarda le tue esperienze, conoscenze interne e simili. È l'unica cosa che ottengo un vero calcio da questi forum. È il tocco personale. Dai un'occhiata ai commenti di Eric J sulla soluzione del mondo reale a un problema che ha preso piede sin dalle promesse degli anni '80. Ehi, i tuoi commenti potrebbero non essere la risposta VAILD, ma la risposta è ancora valida come viene da te e non da molte persone che vendono idee su google. – WeNeedAnswers

+0

@WeNeedAnswers: raramente ho generato codice dai diagrammi UML. Una volta ho usato Sparx EA per sviluppare uno schema XML trasformando un diagramma di classe in XSD, ma il gioco è fatto.Quell'esperienza mi ha insegnato che potrebbe essere fatto, ma non l'ho fatto. –

+0

Grazie Giovanni. l'esperienza ti ha fatto sentire che c'è di più che si può fare? Per quanto riguarda la mia esperienza, ho visto alcuni generatori di codice che funzionano sul retro di UML, l'ultima volta che ho giocato con Umbrello o qualcosa del genere nel dominio open source. Ha fatto un buon lavoro nel creare shell di domini dal dizionario di base, ma certamente non è stato abbastanza completo da consentirgli di scrivere da solo. Ho iniziato a guardare questo materiale nel 1998, era uno strumento mobile chiamato Select Enterprise, e usavo diagrammi OMT e SSADM. Non ha mai generato il codice, ma ha promesso di farlo! – WeNeedAnswers

1

Sì, è possibile, basta controllare approcci come ExecutableUML (e un nuovo standard sulle stesse linee è in arrivo) che si basano sull'uso di un linguaggio di azione per esprimere i dettagli del comportamento del sistema (tipo di uno psedocode con iteratori, condizioni e creare, leggere, aggiornare e distruggere azioni).

Una discussione completamente diversa è ciò che vale. Modellare il sistema con precisione e dettagli sufficienti per essere in grado di generare il 100% del codice non sempre si ripaga. preferisco attaccare al mio principio di Pareto (o 80-20 regola) per lo sviluppo model-driven: il 20% dello sforzo di modellazione sufficiente a generare l'80% del codice dell'applicazione

spiegazione più dettagliata qui: http://modeling-languages.com/blog/content/pareto-principle-applied-mdd

+0

Vilfredo Pareto, che osservò nel 1906 che l'80% del terreno in Italia era di proprietà del 20% della popolazione. Hmmm pensa che l'economia e il software generato automaticamente siano due sfere diverse. Eric J sottolinea nel suo post di sopra che è più simile al 60% di auto 40% fatto dall'uomo. Mi piace quella statistica meglio perché delinea che, sebbene il materiale sia stato generato automaticamente, dovrete comunque dedicarvi alcune ore, ma ha risparmiato tempo e denaro. La regola 80/20 era un'osservazione fatta all'epoca del tempo della ricchezza fondiaria. Alla gente piace la combo e la usa molto perché sembra appariscente. – WeNeedAnswers

+0

lo sapevate che il 20% di tutte le statistiche sono fatte sul posto. Per sostenere ciò, una volta ho lavorato con un economista, che dopo aver applicato alcune cifre a un dato di questionario di ritorno, ha fatto esattamente questo perché il numero di resi era così basso. Ha avuto un po 'di problemi con la British Dental Association :) – WeNeedAnswers

0

La semantica delle azioni UML supporta l'allocazione/eliminazione degli oggetti, gli attributi di lettura/scrittura e le variabili locali, invocando un'operazione, lanciando e catturando eccezioni, navigando in una relazione, blocchi, cicli e comportamento condizionale e molto altro ancora.

See:

http://abstratt.com/blog/2008/11/02/what-can-uml-do-for-you/

http://abstratt.com/blog/2008/11/07/executable-models-with-textuml-toolkit-12-m1/

A quelli dire "no": la questione è di circa UML, non gli "strumenti UML che si utilizzano", gente. UML è un linguaggio enorme e gli strumenti ne implementano un sottoinsieme, che spesso può essere piuttosto piccolo.

1

Esiste ora una semantica di esecuzione completamente OMG standardizzata, Turing-completa, per un sottoinsieme di UML 2.3, noto come "UML di base" (fUML). Guarda here per un'implementazione di riferimento e puntatore alle specifiche OMG. È in corso anche un lavoro su un linguaggio di azione UML standard OMG.

Nel bene o nel male, quando questo lavoro è terminato, FUML sarà un un linguaggio di programmazione.

- Ed

+0

Puoi anche trovare l'ultima bozza della presentazione delle specifiche della lingua d'azione su http://lib.modeldriven.org/MDLibrary/trunk/Applications/Alf-Reference-Implementation/doc /. –

Problemi correlati