DE19617719C2 - Verfahren zur Programmübersetzung eines in der Programmiersprache C++ geschriebenen Programms - Google Patents
Verfahren zur Programmübersetzung eines in der Programmiersprache C++ geschriebenen ProgrammsInfo
- Publication number
- DE19617719C2 DE19617719C2 DE19617719A DE19617719A DE19617719C2 DE 19617719 C2 DE19617719 C2 DE 19617719C2 DE 19617719 A DE19617719 A DE 19617719A DE 19617719 A DE19617719 A DE 19617719A DE 19617719 C2 DE19617719 C2 DE 19617719C2
- Authority
- DE
- Germany
- Prior art keywords
- program
- code
- translation
- templates
- translated
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Description
Die Erfindung bezieht sich auf ein Verfahren zur
Programmübersetzung eines in der Programmiersprache C++
geschriebenen, aus mehreren Quelldateien bestehenden
Programms, dessen Quelldateien insbesondere zur
Software-Entwicklung mehrmals, in getrennten
Durchgängen, zu übersetzen sind und Templates benutzen,
die durch Instantiierung einem Code zugewiesen werden,
in einen Objektcode, der durch anschließendes Linken in
einen ausführbaren Code umgesetzt wird.
Bei der Programm- bzw. Software-Entwicklung wird in
üblicher Weise ein Quellprogramm vom Programmierer
erstellt, das in einer höheren Programmiersprache
geschrieben ist. Derartige höhere Programmiersprachen,
auch Hochsprachen genannt, verfügen über einen
prozessorunabhängigen Befehlssatz, der zur
Weiterverarbeitung in einem Computer zunächst in eine
maschinenlesbare Sprache übersetzt werden muß. Für
diesen Übersetzungsschritt bedient man sich spezieller
Übersetzungsprogramme, sogenannte Compiler-Programme,
die das Quellprogramm vollständig einmal und dauerhaft
übersetzen, wobei zur vollständigen Übersetzung des
Gesamtquellprogramms meist mehrere Über
setzungsdurchgänge notwendig sind. Durch diesen soge
nannten Compilierungsvorgang wird ein Objektcode er
halten, der zur fehlerfreien Anwendung in einem Rechner
noch mit entsprechenden sogenannten Bibliotheken ver
bunden werden muß. Dies erfolgt mit Hilfe eines
Linkers, der ebenfalls ein Programm darstellt und den
mit einem Compiler generierten Objektcode mit den
Bibliotheken zu einem ablauffähigen Programm verbindet.
Unter der Vielzahl bekannter höherer
Programmiersprachen beschränken sich die folgenden
Ausführungen ausschließlich auf die Programmiersprache
C++, die im Jahre 1980 als Weiterentwicklung der
Programmiersprache C hervorging. Zwar gilt sie als
assemblernahe Programmiersprache, d. h. es werden
maschinennahe Anweisungen verwendet, doch sind die in
C++ verwendeten Anweisungen prozessorunabhängig, so daß
ein in C++ geschriebenes Programm wie vorstehend
beschrieben in einen maschinenlesbaren Code übersetzt
werden muß.
Neben den in der Programmiersprache C++ geschriebenen
Anweisungen, aus denen die einzelnen Quelldateien eines
in der C++-Sprache geschriebenen Programmes bestehen,
sehen C++-Programme sogenannte Templates vor, die als
Platzhalter für näher zu spezifizierende Informationen
im Programm integriert sind. Templates ermöglichen es
beispielsweise Implementationen von Klassen und
Funktionen zu parametrisieren. Derartige, als Templates
bezeichnete Platzhalter, werden häufig in C++-
Programmen benutzt.
Eine besondere Eigenart von Templates besteht darin,
daß bei der Compilation der in der C++-Sprache
geschriebenen Quelldateien, in denen Templates
enthalten sind, für jedes Template ein Code erzeugt
wird, der in einer vom Compiler zu erzeugenden,
sogenannten Template-Include-Datei abgespeichert wird.
Dieser Vorgang der Codeerzeugung für Templates wird
auch als Instantiierung bezeichnet und ist für den nach
folgenden Linkvorgang, wie im weiteren beschrieben
wird, von entscheidender Bedeutung. Zu Beginn des Link-
Prozesses für C++-Programme wird zunächst geprüft, ob
von bestehenden Template-Include-Dateien aktuelle
Objektcode-Dateien existieren. Ist das nicht der Fall,
so werden diese durch den C++-Compiler erzeugt.
Je größer die Anzahl der im Quellprogramm vorhandenen
Templates, umso mehr Codes werden bei der In
stantiierung in die Template-Include-Datei einge
schrieben, wodurch die Template-Include-Datei an
Speichervolumen zunimmt.
Hinzukommt, daß insbesondere im Stadium der Programm-
Entwicklung Übersetzungsdurchgänge für einzelne Quelldateien
mehrmals durchgeführt werden müssen, bei
denen pro Übersetzungsdurchgang bei jedem auftretenden
Template eine Codezuweisung erfolgt, die in der Template
-Include-Datei abgespeichert wird. Auf diese Weise
wächst das Speichervolumen der Template-Include-Datei
sehr stark an.
Bei den bisher bekannten Compiler-Programmen für
die Übersetzung von C++-Programmen werden die von
Templates herrührenden Codes additiv in der generierten
Template-Include-Datei abgespeichert, unabhängig davon,
ob inhaltsgleiche Informationen bereits in der Datei
enthalten sind oder nicht. Bei zyklischen
Programmübersetzungsprozessen hat diese Vorgehensweise
jedoch fatale Folgen: Zum einen werden die Template-
Include-Dateien sehr groß und zum anderen wird das
Compiler-Programm durch Hinzufügen identischer
Informationen vor dem Linkvorgang der Objekt-Dateien
gezwungen, die Informationen in der Template-Include-
Datei neu zu übersetzen.
Aufgrund des großen Speichervolumens der sich im Rahmen
mehrerer Entwicklungszyklen bildenden Template-Include-
Datei bewegen sich die Zeitdauern für den nachfolgenden
Linkprozeß in der Größenordnung von 20 bis 40 Minuten.
Der Erfindung liegt daher die Aufgabe zugrunde, ein
Verfahren zur Programmübersetzung eines mit der
Programmiersprache C++ geschriebenen, aus mehreren
Quelldateien bestehenden Programms, dessen Quelldateien
insbesondere zur Software-Entwicklung mehrmals, in
getrennten Durchgängen, zu übersetzen sind und
Templates benutzen, die durch Instantiierung einem Code
zugewiesen werden, in einen Objektcode, der durch
anschließendes Linken in einen ausführbaren Code
umgesetzt wird, dadurch weiterzuentwickeln, daß die
Größe der bei der Instantiierung von Templates
erforderlichen Template-Include-Datei erheblich
minimiert wird, so daß die Zeitdauer für das an
schließende Linken wesentlich verkürzt werden kann.
Die Lösung der der Erfindung zugrundeliegenden Aufgabe
ist im Anspruch 1 angegeben. Vorteilhafte
Ausführungsformen sind den Ansprüchen 2 ff. zu
entnehmen.
Dabei wird ein Verfahren zur Programmüber
setzung eines in der Programmiersprache C++ ge
schriebenen, aus mehreren Quelldateien bestehenden
Programms, gemäß des Oberbegriffs des Anspruchs 1,
derart ausgebildet, daß die Übersetzung der
Quelldateien in Objektcode-Dateien und die
Codeerzeugung für die Instantiierung der Templates in
getrennten Übersetzungsdurchgängen durchgeführt wird,
wobei für die Instantiierung der Templates alle
Quelldateien des Programms benutzt werden.
Insbesondere zeichnet sich das vorliegende
Verfahren dadurch aus, daß bei der getrennten
Übersetzung der Quelldateien in den Objektcode solange
kein Code für die Instantiierung der Templates erzeugt
wird, bis alle Quelldateien übersetzt sind und daß im
Anschluß daran in einem getrennten
Übersetzungsvorgang unter Benutzung aller
Quelldateien des Programms ein optimierter Code für die
Instantiierung der Templates erzeugt wird, der während
des nachfolgenden Linkens benutzt wird.
Der Erfindung liegt die Idee zugrunde, die in einem
C++-Programm enthaltenen Templates in einem einzigen
Übersetzungsdurchgang zu übersetzen, der getrennt von
den Übersetzungsdurchgängen für die Quelldateien
abläuft. Insbesondere bei der Software-Entwicklung ist
diese Vorgehensweise von besonderem Vorteil, da der
Inhalt der Template-Include-Dateien auch bei
mehrmaligem Übersetzen gleicher Programmteile nicht
modifiziert wird, wodurch der nachfolgende Link-Vorgang in
wesentlich kürzerer Zeit, d. h. in wenigen Minuten,
vorzugsweise 2 bis 4 Minuten, und unabhängig von der
Zahl der zuvor erfolgten Übersetzungsdurchläufe ab
laufen kann.
Die im vorstehenden beschriebene erfindungsgemäße Idee
ist anhand eines konkreten Forschungsprojektes der
Anmelderin getestet worden. In einem Projekt "FAPU" ist
in der Programmiersprache C++ ein Programmsystem reali
siert worden, daß in etwa 160000 Zeilen Code über etwa
100 mittels Templates realisierte parametrisierte Klas
sen enthält. Bei ständig wachsender Anzahl der Pro
grammdurchläufe durch den andauernden Entwicklungszyk
lus traten auf einer IBM RS/6000, Typ 390 H mit 128 MB-
Hauptspeicher reine Linkzeiten von etwa 40 Minuten auf.
Zur Erklärung hierfür sei im folgenden eine Passage aus
dem Programmübersetzungs-Benutzerhandbuch (x1C-Überset
zer, IBM 93) zitiert:
"By default, the compiler builds and compiles the special template-include files in the tempinc subdirec tory of the working directory.
"By default, the compiler builds and compiles the special template-include files in the tempinc subdirec tory of the working directory.
The compiler builds a template-include file correspon
ding to each header file containing template function
declarations. After the compiler creates one of these
files, it may add any information to it as each compi
lation unit is compiled. However, the compiler never
removes information from the file."
Bei einem wie im Vorstehenden zitiert, Datei-basierten
Arbeiten, ist dies die einzige mögliche Vorgehensweise.
Der Compiler besitzt keinerlei sogenannte Kontextinfor
mationen über die zu einer Anwendung gehörenden Da
teien, so daß er nur Informationen zu den Beschrei
bungsdateien hinzufügen kann. Bei zyklischen Entwick
lungsprozess hat dies jedoch fatale Folgen.
Zum einen werden die Dateien im tempinc-Unterverzeich
nis schnell sehr groß, und zum anderen wird der Compi
ler durch das Hinzufügen identischer Informationen vor
dem eigentlichen Binden der Objektdateien gezwungen,
die Dateien im tempinc-Unterverzeichnis neu zu überset
zen.
Als Endeffekt erhält man je nach der Anzahl der Ent
wicklungszyklen seit dem letzten kompletten Löschen des
tempinc-Verzeichnisses reine Linkzeiten in der Größen
ordnung von 20 bis 40 Minuten. Die im Benutzerhandbuch
vorgeschlagene Lösung, das tempinc-Unterverzeichnis zu
löschen, kann jedoch nicht immer verwendet werden.
Gerade bei großen Anwendungen kann dies nicht reali
siert werden, da dann alle zur Anwendung gehörenden
Dateien auch neu kompiliert werden müßten. Dies bedeu
tet, daß die Vorteile des Make-Mechanismus außer Kraft
gesetzt würden und eine Verkürzung der Linkzeit durch
eine längere Kompilationszeit erkauft wird.
Die prototypische Lösung im vorstehenden Projekt be
stand darin, aus allen zu einem Programmsystem gehö
renden Dateien eine spezielle "template-include-Datei"
vor dem Linkprozeß zu generiern.
So kann dem verwendeten xlC-Compiler über einen "Schal
ter" mitgeteilt werden, in welchem Verzeichnis die
Template-Include-Dateien angelegt werden sollen. Es ist
jedoch nicht möglich, die Generierung dieser Dateien zu
unterbinden, ohne daß die Codes für die Instantiierung
der Templates "inline" kompiliert werden. Deshalb wird
mit unterschiedlichen Verzeichnissen für die Template-
Include-Dateien während der Übersetzungs- und der Link
phase gearbeitet. Die zur Kompilationszeit erfolgten
Einträge werden anschließend gelöscht. Die eigentlische
Datei zur Beschreibung der Templates - fapu.hh.C - wird
vor der Link-Phase unabhängig vom verwendeten Compiler
zunächst als temporäre Datei gemäß der in dem vorste
hend genannten Benutzerhandbuch (IBM93) beschriebenen
Struktur erzeugt. Dazu werden alle zu einem Projekt
gehörenden Header- und Implementationsdateien parsiert.
Um unnötige Kompilationen der Template-Beschreibungs
funktionen während der Link-Phase zu vermeiden, wird
die temporäre im Template-Include-Datei nur dann in das
Verzeichnis fapu-tempinc kopiert, wenn dort noch keine
Datei fapu. hh. C im entsprechenden Verzeichnis exis
tiert, oder wenn diese Unterschiede zu der temporären
Version aufweist.
Das im folgenden angegebene Programm ist ein sogenann
tes Shell-Programm und dient sowohl zur Generierung
eines Datenbank-Schemas zur Benutzung mit der objekt
orientierten Datenbank "ObjektStore" (ODI94) als auch
zur Generierung der Template-Include-Datei für den x1C-
Compiler, da beide mit analogen Strukturen arbeiten. In
dem vorstehend beschriebenen Projekt "FAPU" sind nur
Templates für spezielle Arten von ObjektStore-Collec
tion-Klassen benutzt worden, wodurch die Programmstruk
tur sehr einfach gehalten werden konnte.
Der folgende Programmteil dient lediglich zur Angabe
eines erfindungsgemäßen Beispieles zur Anwendung der
technischen Lehre des vorstehend geschilderten er
findungsgemäßen Gedankens:
Claims (4)
1. Verfahren zur Programmübersetzung eines in der
Programmiersprache C++ geschriebenen, aus mehreren
Quelldateien bestehenden Pogramms, dessen Quelldateien
insbesondere zur Software-Entwicklung mehrmals, in
getrennten Durchgängen, zu übersetzen sind und Templates
benutzen, die durch Instantiierung einem Code zuge
wiesen werden, in einen Objektcode, der durch an
schließendes Linken in einen ausführbaren Code umge
setzt wird,
dadurch gekennzeichnet, daß ein xlC-Übersetzer verwendet wird, der in getrennten Übersetzungschritten der Quelldateien in den Objektcode solange keinen Code für die Instantiierung der Templates erzeugt, bis alle Quelldateien übersetzt sind, und
daß im Anschluß daran in einem getrennten Übersetzungsdurchgang unter Benutzung aller Quelldateien des Programms ein optimierter Code für die Instantiierung der Templates erzeugt wird, der während des nachfolgenden Linkens benutzt wird, so daß der Link-Vorgang wenige Minuten benötigt.
dadurch gekennzeichnet, daß ein xlC-Übersetzer verwendet wird, der in getrennten Übersetzungschritten der Quelldateien in den Objektcode solange keinen Code für die Instantiierung der Templates erzeugt, bis alle Quelldateien übersetzt sind, und
daß im Anschluß daran in einem getrennten Übersetzungsdurchgang unter Benutzung aller Quelldateien des Programms ein optimierter Code für die Instantiierung der Templates erzeugt wird, der während des nachfolgenden Linkens benutzt wird, so daß der Link-Vorgang wenige Minuten benötigt.
2. Verfahren nach Anspruch 1,
dadurch gekennzeichnet, daß eine Template-include-Datei
generiert wird, in die die im Quellprogramm enthaltenen
Templates in übersetzter Code-Form eingeschrieben
werden.
3. Verfahren nach Anspruch 2,
dadurch gekennzeichnet, daß bei einer erneuten Pro
grammübersetzung eines bereits übersetzten Quellpro
gramms die erzeugte temporäre Template-include-Datei
mit der bereits bestehenden Template-inlcude-Datei
verglichen wird und bei Übereinstimmung übernommen
wird.
4. Verfahren nach Anspruch 3,
dadurch gekennzeichnet, daß bei der Übernahme der
Erzeugungszeitpunkt der alten Template-include-Datei
auf einen aktuellen Übersetzungszeitpunkt gesetzt wird,
so daß diese Datei nicht noch einmal übersetzt wird.
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
DE19617719A DE19617719C2 (de) | 1996-04-30 | 1996-04-30 | Verfahren zur Programmübersetzung eines in der Programmiersprache C++ geschriebenen Programms |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
DE19617719A DE19617719C2 (de) | 1996-04-30 | 1996-04-30 | Verfahren zur Programmübersetzung eines in der Programmiersprache C++ geschriebenen Programms |
Publications (2)
Publication Number | Publication Date |
---|---|
DE19617719A1 DE19617719A1 (de) | 1997-11-13 |
DE19617719C2 true DE19617719C2 (de) | 2000-01-05 |
Family
ID=7793193
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
DE19617719A Expired - Fee Related DE19617719C2 (de) | 1996-04-30 | 1996-04-30 | Verfahren zur Programmübersetzung eines in der Programmiersprache C++ geschriebenen Programms |
Country Status (1)
Country | Link |
---|---|
DE (1) | DE19617719C2 (de) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7272821B2 (en) | 2003-08-25 | 2007-09-18 | Tech Mahindra Limited | System and method of universal programming language conversion |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0371944A2 (de) * | 1988-11-29 | 1990-06-06 | International Business Machines Corporation | Rechnersystem und Verfahren zur Übersetzung eines Programms |
US5375242A (en) * | 1993-09-29 | 1994-12-20 | Hewlett-Packard Company | Compiler architecture for cross-module optimization |
-
1996
- 1996-04-30 DE DE19617719A patent/DE19617719C2/de not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0371944A2 (de) * | 1988-11-29 | 1990-06-06 | International Business Machines Corporation | Rechnersystem und Verfahren zur Übersetzung eines Programms |
US5375242A (en) * | 1993-09-29 | 1994-12-20 | Hewlett-Packard Company | Compiler architecture for cross-module optimization |
Also Published As
Publication number | Publication date |
---|---|
DE19617719A1 (de) | 1997-11-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
DE69516891T2 (de) | Verfahren zum übersetzen von quellkode aus einer computer-hochsprache in eine andere | |
DE69503065T2 (de) | Objektorientierte vorrichtung für konfigurationsverlaufsverwaltung | |
DE3855696T2 (de) | Relationelles Datenbanksystem | |
DE69328665T2 (de) | Gerät zur Auflösung von Datenreferenzen in erzeugtem Kode | |
DE10121790B4 (de) | Softwarekonfigurationsverfahren zur Verwendung in einem Computersystem | |
DE69226484T2 (de) | System zur umwandlung von unterprogrammaufrufen in einer simulierten umgebung zur programmentwicklung | |
DE69031078T2 (de) | Rechnerunterstützte softwareentwicklungseinrichtung | |
WO2010040597A2 (de) | Verfahren und vorrichtung zum austauschen einer komponente eines computersystems | |
WO1991008534A1 (de) | Verfahren zur dynamischen bindung von definierbaren programmelementen eines interaktiven datenverarbeitungssystems | |
DE102005045852A1 (de) | Verfahren und System zum Schutz von Quellcode | |
EP1738257B1 (de) | Verfahren zum vermeiden von dateninkonsistenz zwischen zugriffen verschiedener funktionen einer anwendung auf eine globale variable in einer datenverarbeitungsanlage | |
DE69226404T2 (de) | Verfahren und Gerät zum Umwandlen von abstrakten Syntaxen auf hohem Niveau in eine Zwischenform | |
EP1040414A1 (de) | Verfahren zum umsetzen eines systemaufrufs | |
DE102004009676A1 (de) | Verfahren und Systeme zum Erzeugen von Unterstützungsdateien für Befehle | |
DE19617719C2 (de) | Verfahren zur Programmübersetzung eines in der Programmiersprache C++ geschriebenen Programms | |
EP2977888B1 (de) | Verfahren und System zur Speicherung und zur Versionsverwaltung von Computerprogrammen | |
DE102019105418B3 (de) | Verfahren zum Erzeugen einer Darstellung einer Programmlogik, Dekompiliervorrichtung, Rekompiliersystem und Computerprogrammprodukte | |
DE69219420T2 (de) | Verfahren und gerät zur rechnercode-verarbeitung in einem codeübersetzer | |
EP1609061A2 (de) | Verfahren und anordnung zur veränderung von software oder quellcode | |
DE112010003774T5 (de) | Kompatibilität auf objektebene und klassenskalierung unter verwendung semantischer werte | |
DE19725593A1 (de) | Verfahren zum Steuern einer Datenverarbeitungsanlage | |
DE19637883B4 (de) | Datenverarbeitungsanlage zur Ausführung großer Programmsysteme | |
DE3854428T2 (de) | System und Verfahren, um Objekt-Programmodule zu erzeugen. | |
DE102012202603B3 (de) | Verfahren zur modellbasierten Softwareentwicklung von Programmen mit Datenbankzugriff | |
DE102008044808B4 (de) | Verfahren zur Generierung von Programmcode in einem Betriebssystemspeicher und einem Applikationsspeicher eines Datenträgers |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
OP8 | Request for examination as to paragraph 44 patent law | ||
D2 | Grant after examination | ||
8364 | No opposition during term of opposition | ||
8339 | Ceased/non-payment of the annual fee |