Discussion:
Procedure Alias
(zu alt für eine Antwort)
Hans-Peter Diettrich
2017-06-14 12:15:56 UTC
Permalink
Für Typen kann mit
type T2 = T1;
und für Konstanten mit
const B = A;
ein Alias erzeugt werden, der weder Speicherplatz noch Laufzeit kostet,
abgesehen vielleicht von RTTI.

Gibt es etwas Vergleichbares auch für Namen von Prozeduren?

Hintergrund: Ich möchte etwas wie in C
#define NewName OldName
auch für Prozedur-Namen.

Gefunden habe ich nur
type TProc = procedure;
const NewName: TProc = OldName;
wobei Speicherplatz für jeden Pointer benötigt wird, und ein eigener Typ
für jeden vorkommenden prozeduralen Typ erzeugt werden muß,
einschließlich Parameterliste und Ergebnis-Typ.

DoDi
Sieghard Schicktanz
2017-06-15 00:13:00 UTC
Permalink
Hallo Hans-Peter,
Post by Hans-Peter Diettrich
Für Typen kann mit
type T2 = T1;
und für Konstanten mit
const B = A;
ein Alias erzeugt werden, der weder Speicherplatz noch Laufzeit kostet,
abgesehen vielleicht von RTTI.
Gibt es etwas Vergleichbares auch für Namen von Prozeduren?
Nein. Wozu? Um Verwirrung zu stiften?
Post by Hans-Peter Diettrich
Hintergrund: Ich möchte etwas wie in C
#define NewName OldName
auch für Prozedur-Namen.
Gefunden habe ich nur
type TProc = procedure;
const NewName: TProc = OldName;
wobei Speicherplatz für jeden Pointer benötigt wird, und ein eigener Typ
für jeden vorkommenden prozeduralen Typ erzeugt werden muß,
einschließlich Parameterliste und Ergebnis-Typ.
Zumindest FPC (und damit Lazarus) kann Macros. Das ist ähnlich wie der
Präprozessor von C, also eine syntaktische Katastrophe. Damit geht das,
--
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Hans-Peter Diettrich
2017-06-15 09:49:24 UTC
Permalink
Post by Sieghard Schicktanz
Hallo Hans-Peter,
Post by Hans-Peter Diettrich
Für Typen kann mit
type T2 = T1;
und für Konstanten mit
const B = A;
ein Alias erzeugt werden, der weder Speicherplatz noch Laufzeit kostet,
abgesehen vielleicht von RTTI.
Gibt es etwas Vergleichbares auch für Namen von Prozeduren?
Nein. Wozu? Um Verwirrung zu stiften?
Im Gegenteil, um einen C Quelltext möglichst wörtlich in Pascal zu
übersetzen :-)

Wenn das funktioniert, kann man mit Delphi Bugs im C Code besser jagen,
und die Korrekturen sollen dann wieder in den C Code eingebaut werden.
Dabei stört es natürlich, wenn die Prozeduraufrufe in C und in Pascal
unterschiedliche Bezeichner verwenden. Ansonsten funktioniert die
Übersetzung schon ganz passabel :-)
Post by Sieghard Schicktanz
Zumindest FPC (und damit Lazarus) kann Macros. Das ist ähnlich wie der
Präprozessor von C, also eine syntaktische Katastrophe. Damit geht das,
Das weiß ich, ich möchte aber mit Delphi (D7) kompatibel bleiben.

DoDi
Sieghard Schicktanz
2017-06-16 22:43:56 UTC
Permalink
Hallo Hans-Peter,

Du schriebst am Thu, 15 Jun 2017 11:49:24 +0200:

...
Post by Hans-Peter Diettrich
Post by Sieghard Schicktanz
Post by Hans-Peter Diettrich
ein Alias erzeugt werden, der weder Speicherplatz noch Laufzeit kostet,
abgesehen vielleicht von RTTI.
Gibt es etwas Vergleichbares auch für Namen von Prozeduren?
Nein. Wozu? Um Verwirrung zu stiften?
Im Gegenteil, um einen C Quelltext möglichst wörtlich in Pascal zu
übersetzen :-)
C Quelltext ist Verwirrung...
Post by Hans-Peter Diettrich
Wenn das funktioniert, kann man mit Delphi Bugs im C Code besser jagen,
und die Korrekturen sollen dann wieder in den C Code eingebaut werden.
Na, viel Spaß...
Post by Hans-Peter Diettrich
Dabei stört es natürlich, wenn die Prozeduraufrufe in C und in Pascal
unterschiedliche Bezeichner verwenden. Ansonsten funktioniert die
Übersetzung schon ganz passabel :-)
Wenn Du schon einen Übersetzer hast, kannst Du dort doch einen Makro-
Generator mit einbauen? Oder Du könntest den C-Präprozessor direkt vor dem
Kompilieren laufen lassen.
Post by Hans-Peter Diettrich
Post by Sieghard Schicktanz
Zumindest FPC (und damit Lazarus) kann Macros. Das ist ähnlich wie der
...
Post by Hans-Peter Diettrich
Das weiß ich, ich möchte aber mit Delphi (D7) kompatibel bleiben.
Naja, ich hatte irgendwie in Erinnerung, daß es schon damals eine "DEFINE"-
Direktive auch im Delphi-Compiler gab. Nachschauen hat sich jetzt bisserl
verzögert, aber jetzt habe ich gesehen, daß das auch tatsächlich der Fall
ist. Allerdins werden damit keine C-artigen "Makros" definiert, sondern nur
Compiler-interne Symbole für die bedingte Kompilierung.
Andererseits - mit "{$MODE Delphi}" versucht FPC doch, soweit möglich
Delphi-kompatibel zu sein. Reicht das nicht vielleicht schon?
--
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Hans-Peter Diettrich
2017-06-17 11:03:32 UTC
Permalink
Post by Sieghard Schicktanz
Hallo Hans-Peter,
Post by Hans-Peter Diettrich
Wenn das funktioniert, kann man mit Delphi Bugs im C Code besser jagen,
und die Korrekturen sollen dann wieder in den C Code eingebaut werden.
Na, viel Spaß...
Habe ich schon mehrfach erfolgreich durchexerziert, nur eben mit
manueller Übertrangung nach Pascal. So habe ich einem Bug in einem
Zip-Kompressor gefunden, der dort schon über 10 Jahre unerkannt
geschlummert hat :-)
Post by Sieghard Schicktanz
Post by Hans-Peter Diettrich
Dabei stört es natürlich, wenn die Prozeduraufrufe in C und in Pascal
unterschiedliche Bezeichner verwenden. Ansonsten funktioniert die
Übersetzung schon ganz passabel :-)
Wenn Du schon einen Übersetzer hast, kannst Du dort doch einen Makro-
Generator mit einbauen? Oder Du könntest den C-Präprozessor direkt vor dem
Kompilieren laufen lassen.
Genau da bin ich gerade dran. Bislang werden alle Makros expandiert, und
machen damit die Zusammenhänge mit dem C Quelltext undurchsichtig.
Deshalb habe ich schon eine Erkennung für die Ersetzung von literalen
Makros (Zahlen und Strings als Ergebnis) eingebaut, die automatisch in
benannte Konstanten übersetzt werden, so daß die Makro-Namen auch im
Pascal Quelltext erhalten bleiben. Das läßt sich auch noch auf
Datentypen erweitern, nur bei Prozedurnamen spielt Delphi nicht mit.
Post by Sieghard Schicktanz
Post by Hans-Peter Diettrich
Post by Sieghard Schicktanz
Zumindest FPC (und damit Lazarus) kann Macros. Das ist ähnlich wie der
...
Post by Hans-Peter Diettrich
Das weiß ich, ich möchte aber mit Delphi (D7) kompatibel bleiben.
Die #defines in C haben schon so viele Haken und Ösen, da wird es noch
lange kein funktional identisches Pascal-Äquivalent geben. Das ist auch
gut so, denn ein C Compiler verbringt die Hälfte seiner Zeit in der
Analyse des Quelltextes und der Expandierung von Makros. Ein
wesentlicher Grund, weshalb Delphi so viel schneller compiliert als C :-)
Post by Sieghard Schicktanz
Naja, ich hatte irgendwie in Erinnerung, daß es schon damals eine "DEFINE"-
Direktive auch im Delphi-Compiler gab. Nachschauen hat sich jetzt bisserl
verzögert, aber jetzt habe ich gesehen, daß das auch tatsächlich der Fall
ist. Allerdins werden damit keine C-artigen "Makros" definiert, sondern nur
Compiler-interne Symbole für die bedingte Kompilierung.
Richtig, das nützt hier wenig. Abgesehen davon lassen sich auch
untypisierte Konstanten für die bedingte Übersetzung benutzen, man muß
also garnicht unbedingt $DEFINE verwenden.

Eine ganz andere Möglichkeit wäre ein Mix aus Delphi und C++Builder
Code, mit dem die Expansion von nicht direkt übersetzbaren Makros auf
den C++Builder abwälzen ließe. Ich fürchte allerdings, daß sich der so
aufgeteilte Quellcode mit dem ursprünglichen C Code nicht mehr richtig
vergleichen läßt. Bei der Fehlersuche kommt es mir ja nicht darauf an,
die Fehler nur im Pascal-Code zu beseitigen, sondern daß erkannte Bugs
auch im ursprünglichen C Code dauerhaft beseitigt werden können.
Post by Sieghard Schicktanz
Andererseits - mit "{$MODE Delphi}" versucht FPC doch, soweit möglich
Delphi-kompatibel zu sein. Reicht das nicht vielleicht schon?
FPC und Lazarus leiden u.a. daran, daß sie ständig den neuesten
Delphi-Erweiterungen hinterherhecheln. Deshalb habe ich mich bei Delphi
auf D7 (Ansi) festgelegt, und bringe mein Programm damit zum Laufen. An
Unicode und andere Neuerungen möchte ich meine Programme nicht anpassen,
die bringen IMO keine Vorteile bei diesem Projekt. Außer wenn mir jemand
zeigen kann, wie sich dort Prozedur-Alias erzeugen lassen, oder echte
Makros nachbilden lassen.

DoDi
Sieghard Schicktanz
2017-06-17 23:51:44 UTC
Permalink
Hallo Hans-Peter,
Post by Hans-Peter Diettrich
Post by Sieghard Schicktanz
Post by Hans-Peter Diettrich
Wenn das funktioniert, kann man mit Delphi Bugs im C Code besser jagen,
...
Post by Hans-Peter Diettrich
Post by Sieghard Schicktanz
Na, viel Spaß...
Habe ich schon mehrfach erfolgreich durchexerziert, nur eben mit
War auch nur ganz allgemein zum "Bugs [] jagen" gemeint.

...
Post by Hans-Peter Diettrich
Post by Sieghard Schicktanz
Wenn Du schon einen Übersetzer hast, kannst Du dort doch einen Makro-
Generator mit einbauen? Oder Du könntest den C-Präprozessor direkt vor
dem Kompilieren laufen lassen.
Genau da bin ich gerade dran. Bislang werden alle Makros expandiert, und
machen damit die Zusammenhänge mit dem C Quelltext undurchsichtig.
Das ist bei dem originalen C-Programm aber doch genauso. Wenn Du das im
Debugger bearbeitest, siehst Du auch von den Macros nix mehr. Da kann dann
auch mal ein Aufruf einer Funktion auf eine Zeile verweisen, in der deren
Name überhaupt nicht vorkommt. Dann geht (mal wieder) die Sucherei los...
(Und ganz besonders schön sind die "manifest constants" von C...)

...
Post by Hans-Peter Diettrich
erweitern, nur bei Prozedurnamen spielt Delphi nicht mit.
Mach' halt 'ne Prozedurvariable draus? Oder erzeug' Dir eine neu benannte,
die nur die alte aufruft. Oder vielleicht ginge was mit dem "inline"-
Assembler?
--
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Loading...