1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
|
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100083.html;106,k100085.html;107,k100087.html;108,k100090.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100083.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100085.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100087.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100090.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">Kapitel 13 - Strukturierung von Java-Programmen
</table>
<hr>
<!-- Section -->
<a name="sectlevel2id013003"></a>
<h2>13.3 Der <a name="ixa100816">Entwicklungszyklus</a> </h2>
<hr>
<ul>
<li><a href="k100086.html#sectlevel2id013003">13.3 Der Entwicklungszyklus</a>
<ul>
<li><a href="k100086.html#sectlevel3id013003001">13.3.1 Schematische Darstellung</a>
<li><a href="k100086.html#sectlevel3id013003002">13.3.2 Projektverwaltung</a>
<ul>
<li><a href="k100086.html#sectlevel4id013003002001">Getrenntes Kompilieren</a>
<li><a href="k100086.html#sectlevel4id013003002002">Java und make</a>
</ul>
</ul>
</ul>
<hr>
<!-- Section -->
<a name="sectlevel3id013003001"></a>
<h3>13.3.1 Schematische Darstellung </h3>
<p>
Der Turn-around-Zyklus beim Entwickeln von Java-Programmen unterscheidet
sich in mehrfacher Hinsicht von dem in traditionellen kompilierten
Programmiersprachen.
<ul>
<li>Der Compiler erzeugt keine direkt ausführbaren Programme,
sondern <font color="#660099">.class</font>-Files<a name="ixa100817"></a>,
die von einem Java-Interpreter ausgeführt werden. Mittlerweile
arbeiten bereits mehrere Betriebssystem-Hersteller daran, <font color="#660099">.class</font>-Files
direkt ausführbar zu machen, und es gibt schon Prozessoren, die
den Maschinencode in <font color="#660099">.class</font>-Files ohne
zwischengeschalteten Interpreter verstehen.
<li>Es gibt keinen expliziten Link-Lauf, denn die verschiedenen <font color="#660099">.class</font>-Files
werden zur Ausführungszeit gebunden.
<li>Die <font color="#660099">.class</font>-Files eines einzigen Projekts
können auf unterschiedlichen Plattformen mit unterschiedlichen
Compilern erzeugt werden.
<li>Die <font color="#660099">.class</font>-Files lassen sich auf
allen Plattformen ausführen, die einen Java-Interpreter besitzen;
unabhängig davon, wo sie ursprünglich entwickelt wurden.
</ul>
<p>
<a href="k100086.html#entwicklungszyklus">Abbildung 13.1</a> zeigt
den schematischen Ablauf bei der Entwicklung eines Java-Programms,
das aus den Klassen <font color="#000077"><tt>A</tt></font>, <font color="#000077"><tt>B</tt></font>
und <font color="#000077"><tt>C</tt></font> besteht.
<p>
<a name="entwicklungszyklus"></a>
<img src="images/EntZyklus1.gif">
<p>
<p><i>
Abbildung 13.1: Der Entwicklungszyklus in Java</i></p>
<p>
Da der Java-<a name="ixa100818">Bytecode</a> plattformunabhängig
ist, hätten die Klassen <font color="#000077"><tt>A</tt></font>,
<font color="#000077"><tt>B</tt></font> und <font color="#000077"><tt>C</tt></font>
aber auch ebensogut von verschiedenen Entwicklern auf drei unterschiedlichen
Plattformen entwickelt werden können, um später auf einer
vierten Plattform ausgeführt zu werden. <a href="k100086.html#plattformuebergreifend">Abbildung 13.2</a>
zeigt dies beispielhaft.
<p>
<a name="plattformuebergreifend"></a>
<img src="images/EntZyklus2.gif">
<p>
<p><i>
Abbildung 13.2: Plattformübergreifende Entwicklung in Java</i></p>
<!-- Section -->
<a name="sectlevel3id013003002"></a>
<h3>13.3.2 <a name="ixa100819">Projektverwaltung</a></h3>
<!-- Section -->
<a name="sectlevel4id013003002001"></a>
<h4>Getrenntes Kompilieren </h4>
<p>
Wie die Abbildungen deutlich machen, spielen die <font color="#660099">.class</font>-Files
<a name="ixa100820"></a><a name="ixa100821"></a> für den Entwicklungsprozess
und die Portierbarkeit von Java-Programmen eine entscheidende Rolle.
Jede <font color="#660099">.class</font>-Datei enthält den Bytecode
für eine übersetzte Klasse. Zusätzlich sind in ihr
Informationen enthalten, um dynamisches Linken und Late-Bindung zu
unterstützen und gegebenenfalls Symbole, Zeilennummern und andere
Informationen für den Debugger zur Verfügung zu stellen.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Eine der Grundregeln bei der Entwicklung von Java-Programmen ist es,
genau eine Klassendefinition je Quelldatei aufzunehmen. Anders als
etwa in C++, ist es in Java grundsätzlich nicht möglich,
die Quellen einer einzigen Klasse auf mehrere Dateien zu verteilen
(und auf diese Weise <i>weniger</i> als eine Klasse in einer Quelldatei
zu speichern). Obwohl es - wie wir gleich sehen werden - möglich
ist, <i>mehr</i> als eine Klasse in einer Quelldatei abzulegen, sollte
dies in der Regel nicht getan werden. Wenn diese Regeln eingehalten
werden, ergibt sich eine eindeutige Abbildung zwischen Klassen und
Quelldateien, die bei der sauberen Strukturierung eines Projektes
hilft. Durch die Verwendung von Paketen kann eine Verteilung der Quelltexte
auf verschiedene Verzeichnisse und Unterverzeichnisse erreicht werden.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Wie bereits angedeutet, dürfen tatsächlich auch zwei oder
mehr Klassen in einer Quelldatei enthalten sein. Voraussetzung dafür
ist allerdings, dass höchstens eine von ihnen als <a name="ixa100822"><a href="index_p.html#ixb100084"><font color=#000080><tt>public</tt></font></a></a>
deklariert wurde. Eine solche Vorgehensweise kann beispielsweise bei
sehr kleinen Projekten, die nur aus ganz wenigen Klassen bestehen,
sinnvoll sein, um alle Klassen in eine einzige Datei zu bekommen.
Sie kann auch angewendet werden, wenn kleine Hilfsklassen benötigt
werden, die nur für eine einzige andere Klasse von Bedeutung
sind. Der Compiler erzeugt in jedem Fall eine separate <font color="#660099">.class</font>-Datei
für jede Klasse, die in einer Quelldatei enthalten ist. Wurde
in einer Quelldatei mehr als eine Klasse <a href="index_p.html#ixb100084"><font color=#000080><tt>public</tt></font></a>
deklariert, gibt es einen Compiler-Fehler.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Wichtig ist in dem Zusammenhang auch, dass der Name der <a href="index_p.html#ixb100084"><font color=#000080><tt>public</tt></font></a>-Klasse
und der Name der Quelldatei identisch sein müssen. Dabei muss
die Groß- und Kleinschreibung eingehalten werden, und auch bei
Klassennamen, die länger als 8 Zeichen sind, muss der Dateiname
so lang wie der Klassenname sein. Klassen- und Dateiname unterscheiden
sich also nur durch die Extension <font color="#660099">.java</font>.
So befindet sich beispielsweise die Klasse <a href="index_i.html#ixb100170"><font color=#000080><tt>Integer</tt></font></a>
in einer Datei mit dem Namen <font color="#660099">Integer.java</font>
und die Klasse <a href="index_i.html#ixb100628"><font color=#000080><tt>InterruptedException</tt></font></a>
in einer Datei mit dem Namen <font color="#660099">InterruptedException.java</font>.
Da die Extension einer Java-Quelldatei in jedem Fall <font color="#660099">.java</font>
(und damit vierstellig) ist, ist eine vernünftige Portierung
von Java auf Plattformen, die nur 8+3-Dateinamen unterstützen,
kaum sinnvoll möglich und bisher auch nur ansatzweise gelungen.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF"> Warnung </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Interessanterweise bietet Java volle <a name="ixa100823">Typsicherheit</a>
auch über die Grenzen von Quelldateien hinweg, ohne dass dazu
Header-Dateien oder andere Interface-Beschreibungen nötig wären.
Der Compiler verwendet während der Übersetzung einer Java-Klasse
die <font color="#660099">.class</font>-Dateien aller eingebundenen
Klassen und entnimmt diesen die Signatur der aufgerufenen Methoden.
Die Notwendigkeit zur Bereitstellung von separaten Header-Dateien
(wie beispielsweise in C++) und das fehlerträchtige Management
der Abhängigkeiten zwischen ihnen und ihren Quelltexten entfällt
daher.
<!-- Section -->
<a name="sectlevel4id013003002002"></a>
<h4>Java und make </h4>
<p>
Genau aus diesem Grund ist aber auch die Verwendung des <a name="ixa100824"><a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a></a>-Tools
zur Verwaltung der Dateiabhängigkeiten in Java-Projekten schwierig.
Anstelle der klar definierten Abhängigkeit einer Quelldatei von
einigen Headerdateien besitzt eine Java-Quelle meist eine Vielzahl
von (teilweise impliziten oder indirekten) Abhängigkeiten zu
anderen Java-Quellen. Diese korrekt zu pflegen ist nicht einfach,
und ein <a name="ixa100825"><a href="index_m.html#ixb100631"><font color=#000080><tt>makefile</tt></font></a></a>
kann leicht unvollständige Abhängigkeitsregeln enthalten.
Die daraus entstehenden Inkonsistenzen können zu schwer zu lokalisierenden
Laufzeitfehlern führen.
<p>
Ein anderes Problem bei der Verwendung von <a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a>
ist die Vielzahl der separaten Compiler-Aufrufe. Da der Java-Compiler
des JDK selbst in Java geschrieben wurde, verursacht jeder Aufruf
einen erheblichen Overhead durch das erforderliche Starten der virtuellen
Maschine, der sich bei umfangreichen Projekten in unzumutbaren Wartezeiten
niederschlägt.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Aus diesen Gründen ist es bei kleineren und mittleren Projekten
oftmals sinnvoll, auf den Einsatz von <a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a>
zu verzichten und die Programme bei Bedarf durch Aufruf von <font color="#000077"><tt>javac
*.java</tt></font> komplett neu zu kompilieren. Der Aufruf-Overhead
entsteht in diesem Fall nur einmal, und der Compiler braucht nicht
wesentlich länger, als wenn lediglich eine einzige Quelle übersetzt
würde.
<p>
Eine Alternative zu <a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a>
ist das Open-Source-Projekt <a name="ixa100826"><a href="index_a.html#ixb100632"><font color=#000080><tt>ant</tt></font></a></a>,
ein komplett in Java geschriebenes <a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a>-Tool
mit umfangreichen Scripting-Möglichkeiten. <a href="index_a.html#ixb100632"><font color=#000080><tt>ant</tt></font></a>
kann am ehesten als Kombination aus <a href="index_m.html#ixb100630"><font color=#000080><tt>make</tt></font></a>
und Kommando-Shell angesehen werden. Basierend auf XML als Steuerungssprache
bietet es eine Vielzahl von eingebauten Kommandos, die beim Übersetzen
von Java-Programm und während des gesamten Build-Prozesses nützlich
sind. Eigene Erweiterungen können in Java geschrieben und nahtlos
integriert werden. <a href="index_a.html#ixb100632"><font color=#000080><tt>ant</tt></font></a>
wird als <a name="ixa100827"><i>Jakarta</i></a>-Projekt entwickelt,
und seine Homepage ist <a href="http://ant.apache.org/">http://ant.apache.org/</a>.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
<tr>
<td><font color="#FFFFFF"> Tipp </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
</tr>
</table>
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100083.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100085.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100087.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100090.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">© 1998, 2007 Guido Krüger & Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>
|