New Immissions/Updates:
boundless - educate - edutalab - empatico - es-ebooks - es16 - fr16 - fsfiles - hesperian - solidaria - wikipediaforschools
- wikipediaforschoolses - wikipediaforschoolsfr - wikipediaforschoolspt - worldmap -

See also: Liber Liber - Libro Parlato - Liber Musica  - Manuzio -  Liber Liber ISO Files - Alphabetical Order - Multivolume ZIP Complete Archive - PDF Files - OGG Music Files -

PROJECT GUTENBERG HTML: Volume I - Volume II - Volume III - Volume IV - Volume V - Volume VI - Volume VII - Volume VIII - Volume IX

Ascolta ""Volevo solo fare un audiolibro"" su Spreaker.
CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Generative Programmierung - Wikipedia

Generative Programmierung

aus Wikipedia, der freien Enzyklopädie

Die Generative Programmierung ist ein besonderes Programmierparadigma bei der methodischen Softwareentwicklung. Charakteristisch für die generative Programmierung ist die automatische Erzeugung von Programmcode durch einen Generator.

Inhaltsverzeichnis

[Bearbeiten] Funktionsweise eines Programmgenerators

Ein Programmgenerator kann am besten wie ein gewöhnliches Programm nach dem EVA-Prinzip verstanden werden. Aufgrund bestimmter Inputparameter erzeugt der Programmgenerator einen bestimmten Output. Allerdings ist der Output eines generativen Programms wiederum ein Programmcode, nämlich der Code, welcher für die konkretisierte Situation ausgeführt werden soll.

Grundlage für automatisch erzeugten Code ist die Abstraktion häufig vorkommender Programmkonstrukte in formalen Modellen. Die Programmierung unterteilt sich in drei Phasen:

  1. Der Programmierung eines bestimmten Programmgenerators
  2. Der Parametrierung oder Ergänzung und Konfiguration des formalen Modells, auf eine spezifische Modellausprägung
  3. Dem Aufruf des Programmgenerators mit den spezifischen Inputparametern, welcher dann das spezifische Zielprogramm erstellt

Ein Programmgenerator bzw. Codegenerator ist demnach auf eine generische Anwendungs- und Programmklasse spezialisiert. Er bezieht sich auf ein bestimmtes, zugrundeliegendes generisches Programmodell, aus welchem er nach konkretisierender Parametrisierung den Zielcode erzeugt. Dies kann ein Quellcode, Zwischencode oder Binärcode sein.

Während ein normales, funktional programmiertes Programm die Varianz der Aufgabenstellungen ausschließlich mit Datenvariablen abdeckt, arbeitet die generative Programmierung auch mit variabilisiertem Programmcode, der erst im Hinblick auf den Zielcode eindeutig ausgeprägt wird.

Dieses Vorgehen eignet sich besonders für Problemlösungen, die in entsprechend großer Zahl von Variationen in der Praxis vorkommen, da für die Erstellung des Modells und des Generators ein nicht geringer Aufwand eingeplant werden muss. Dieser Aufwand kann sich aufgrund höherer Qualität des Programmcodes und kürzerer Entwicklungszeit amortisieren. Häufig werden die Zielprogramme nur temporär zum einmaligen Gebrauch generiert und danach wieder gelöscht. Dadurch kann der zu einem bestimmten Zeitpunkt persistent vorhandene Programmcode, z.B. gemessen anhand Anzahl Codezeilen, ggf. um einige Zehnerpotenzen reduziert werden.

Generative Programmierung ist überall dort sinnvoll, wo bestimmte Codeteile analog variablen Textbausteinen zu einer abzählbaren oder nicht mehr abzählbaren Vielzahl von Zielprogrammen zusammengefügt werden sollen. Die generative Programmierung erlaubt im weiteren auch die Erstellung von Zielprogrammen, deren Zielparameter zum Zeitpunkt der Codierung des Programmgenerators noch gar nicht bekannt sind.

[Bearbeiten] Persistenter Zielcode

Der von einem Programmcode erzeugte Zielcodes kann

  • einmal erzeugt, persistent gespeichert und dann permant genutzt werden, oder
  • nach Bedarf dynamisch erzeugt und ausgeführt und danach wieder gelöscht werden

Wenn ein Zielcode einmal erzeugt und dann persistent gehalten wird, kann die Programmgenerierung und die Ausführung des Zielprogramms zeitlich entkoppelt stattfinden. Die Programmgenerierung und die Ausführung des Zielprogramms sind hier nur insofern voneinander abhängig, dass die Generierung vor der Ausführung des Zielcodes stattfindet. Die Codegenerierung wird dann typischerweise vom Programmierer oder von einem Systemadministrator bei der Softwareinstallation angestoßen, also typischerweise nicht vom Endbenutzer.

Beispiel: Ein Programmgenerator (Codewizard) zur Erstellung des Basiscodes einer Programmklasse, fragt verschiedene Parameter ab, wie Klassennamen, Anzahl, Namen und Type der Klasseneigenschaften, Anzahl und Namen der Klassenmethoden und erstellt dann den Programmcode der Klasse.

Eine Neugenerierung ist nur dann notwendig, wenn sich Änderungen an den Generierungsparametern ergeben.

[Bearbeiten] Dynamisch erzeugter Zielcode

Im zweiten Fall wird die Programmgenerierung und die Ausführung des Zielcodes in der Regel direkt vom Endbenutzer angestoßen. Dabei erfolgt die Programmgenerierung idealerweise so schnell, dass der Endbenutzer gar nicht merkt, dass der von ihm genutzte Programmteil erst vor wenigen Sekundenbruchteilen automatisch ausprogrammiert worden ist. Der Ablauf dieses dynamischen Vorgangs soll in einzelnen Schritten nachvollzogen werden:

  1. Der Anwender macht eine Auswahl der Eingangsparameter, z.B den Namen einer Datenbanktabelle
  2. Der Programmgenerator nimmt den Tabellennamen vom Endbenutzer, liest aus dem Datadictionary der Datenbank die Felder, Feldtypen und Fremdschlüsselbeziehungen und erzeugt aus diesen Steuerparametern den Programmzielcode eines Suchformulars zur Datenanzeige für die vom Benutzer vorgegebene Datenbanktabelle.
  3. Der Programmzielcode wird nun kurz compiliert und dann vom Programmgenerator mit einem dynamischen Aufruf ausgeführt.

Der letzte Schritt stellt bestimmte Anforderungen an die verwendete Programmiersprache:

  • Es muss im Programmgenerator möglich sein, eine Routine aufzurufen, deren Namen variabel vorgegeben ist, und im Kontext des Programmgenerators nicht zwingend bekannt ist. (z.B. Vorgabe der aufzurufenden Routine durch eine Stringvariable, Late Binding)
  • Die notwendige Flexibilität in der Programmgenerierung verlangt nach einer interpretierten Sprache, d.h. in der Regel wird als Zielcode ein Interpretercode erzeugt und nicht ein Maschinencode. Grundsätzlich kann der Zielcode aber alles sein, d.h. ein Quellcode, Zwischencode oder Binärcode.

Der dynamisch erzeugter Zielcode ist sinnvollerweise oft in der gleichen Sprache codiert wie das codegenerierende Programmmodul. Ein Programmgenerator ist demnach ein auf eine generische Anwendungs- und Programmklasse spezialisierter Codegenerator. Er bezieht sich auf ein bestimmtes, zugrundeliegende generisches Programmodell, aus welchem er nach konkretisierender Parametrisierung den Zielcode erzeugt. Eine komplexe Parametrisierung kann z.B über ein Tabellenmodell in einer Datenbank erfolgen, welches die flexible Codegenerierung steuert.

[Bearbeiten] Anwendungsbeispiele

[Bearbeiten] UML

UML erlaubt die Erstellung einer Softwarearchitektur in Form eines Diagramms. Daraus kann dann automatisch Code erzeugt werden, der dann gewöhnlich "von Hand" vervollständigt werden muss. Anspruchsvollere Entwicklungsumgebungen ermöglichen auch das gleichzeitige Arbeiten auf der UML und Sourcecode-Ebene. Man kann so wahlweise den UML oder den Sourcecode verändern und die Entwicklungsumgebungen erstellt dann automatisch die jeweils andere Darstellung des Programms. Dabei wird also entweder UML-Code aus dem Sourcecode generiert oder umgekehrt.

[Bearbeiten] Mit XML und XSLT

Vor allem mit XSLT ist die automatische Codegenerierung sehr einfach und flexibel zu bewerkstelligen. Das gewünschte Modell wird in einem XML-Dokument dargestellt, dessen Syntax man selbst erfinden kann. Dann erstellt man ein zu dem XML-Dokument passendes XSLT-Skript, das den Programmcode generiert. Dies kann auch in einem mehrstufigen Prozess geschehen, z.B. generiert man mit einem ersten XSLT-Skript eine Batchdatei, ein Shellskript oder eine Makefile mit einer Liste weiterer XSLT-Verarbeitungsschritte oder anderer Befehle.

[Bearbeiten] Formulargeneratoren

Anhand einer listenförmigen Beschreibung der Tabellenstruktur, wird jeweils konkret vorgegebenen Tabellen eine Bildschirmmaske erstellt. Aufbau und Funktionsweise des Formulars ist fest vorgegeben. Die verschiedenen Tabellen unterscheiden sich jedoch bezüglich Art und Anzahl der Felder, der Feldbezeichnungen, -typen und Fremdschlüsselbeziehungen.

[Bearbeiten] Compiler-Compiler

Die Syntax einer Programmiersprache wird z.B. in EBNF-Notation vorgegeben. Aufgrund dieser formalen Sprachdefinition erzeugt ein Compiler-Compiler den Compiler, bzw. ein Parsergenerator den Parser für die spezifizierte Sprache. Siehe hierzu auch: Coco/R und yacc.

[Bearbeiten] Produktkonfiguration

Die generative Programmierung kann auch für die Abarbeitung von Stücklisten mit variablen Stücklistenpositionen verwendet werden. Im Rahmen des Customizings oder der Installation können generative Programme die Variantenkonfiguration von komplexen Softwareanwendungen auf die gewünschte Zielform bringen.

[Bearbeiten] Siehe auch

[Bearbeiten] Literatur

  • Czarnecki, Krzysztof; Ulrich W. Eisenecker: Generative Programming: Methods, Tools, and Applications, Addison Wesley, 2000, ISBN 0-201-30977-7
  • Olaf Zwintzscher: Komponentenbasierte & generative Software-Entwicklung, W3L, 2003, ISBN 3-937137-50-5
  • Peter Rechenberg; Hanspeter Mössenböck: Ein Compiler-Generator für Mikrocomputer. Grundlagen, Anwendung, Programmierung in Modula-2; Hanser, 1988, ISBN 3-446-15350-0
  • Christof A. Hurst; Ulrich W. Eisenecker: Generative Programmierung für web-orientierte Softwaresystemfamilien, Ein E-/Web-Learning-Projekt Projektbericht (PDF 2MB) Anlage A Anlage B
  • Michael Klar: Einfach generieren. Generative Programmierung verständlich und praxisnah Hanser, 2006, ISBN: 3446404481

[Bearbeiten] Weblinks

Andere Sprachen

Static Wikipedia (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu