Seite 1 von 2

Purebasic 6 Beta 6 Frage zum C-Backend

Verfasst: 04.05.2022 11:25
von Heinz Mendax
Hallo !
Auf der Purebasic-Seite wird seit einiger Zeit von einer neuen Betaversion 6 gesprochen.
Dabei geht es um ein C-Backend. Der Begriff wird für Nichtinformatiker nicht weiter erklärt,
der Sinn eines solchen Backends scheint aber zu sein, das der Purebasic-Programmcode
in die Programmiersprache C überführt wird. Um der ständig wachsenden Zahl neuer Programmier-
sprachen für immer neue Plattformen gewachsen zu sein, und für eben diese neuen Plattformen
mit PB programmieren zu können, wurde das C-Backend geschaffen. So stelle ich es mir vor.
Dazu ist es sicher deshalb entwickelt worden, weil es für alle diese Plattformen sicher auch
C-Compiler gibt. Dann könnte das PB-programm mit der Zwischenstufe C-Backendergebnis
mit dem C-Compiler dieser Plattform für dieselbe zur App werden. Ist das noch so richtig ?
Es ist ja eine gute Sache, wenn ich mit Purebasic weiter auch für andere Plattformen pro-
grammieren kann, ohne mich immer in neue Programmiersprachen wie Swift,Xojo usw.
einarbeiten zu müssen. Das richtige dabei zu finden ist für den Nichteingeweihten sowieso
Glückssache - mir reichen die Möglichkeiten von Purebasic. Auf einer Internetseite wurden
die Compilierzeiten für Compiler VC++ und GCC verglichen. Meine Frage ist nun: woher
kommen die Quelldateien für diese C-Compiler (c und h). Bei der Installation der neuen Beta-
Versionen kann man nach bestimmten Einstellungen zwischen pbcompiler.exe und pbcompilerc.exe
(normaler x86-Compiler oder Purebasic 6.00 Beta 6 - C Backend (Windows x86)) wählen.
Der Backendcompiler ergibt aber auch nur eine EXE-Datei des Programmcodes - von Quelldateien
für C-Comiler keine Spur. Es wäre doch einmal an der Zeit, den Weg aufzuzeigen und nicht vielleicht
irgendwo versteckt, wie das Alleinstellungsmerkmal C-Backend von Purebasic seinen Dienst tut.
Wo kamen die Quelldateien her, mit denen die Geschwindigkeitsversuche mit VC++ und GCC
gemacht wurden ? In welchem Verzeichnis werden sie erzeugt ? Wenn so etwas entwickelt
und beworben wird, darf das nicht nur für ein paar Spezialisten durchsichtig sein und
muß in die vordere Reihe.

Re: Purebasic 6 Beta 6 Frage zum C-Backend

Verfasst: 04.05.2022 12:32
von NicTheQuick
Du kannst dir auch schon beim alten Purebasic-Compiler mit dem Flag -c, --commented oder /COMMENTED den generierten Assembler-Code ausgeben lassen. Siehe auch in der Hilfe unter Referenz-Handbuch -> Allgemeine Themen -> Benutzung des SHELL-Compilers.

Das geht so auch mit C-Code.

Im Hintergrund erstellt Purebasic im %temp%-Verzeichnis unter Windows einen Ordner mit dem Namen "PurebasicXXXXX", wobei die X für Ziffern stehen. Und darin enthalten sind alle Dateien, die zum Kompilieren notwendig sind. Allerdings verschwinden die auch ganz schnell wieder, wenn das Kompilieren abgeschlossen ist. Deswegen ist --commented Parameter die bessere Wahl.

Re: Purebasic 6 Beta 6 Frage zum C-Backend

Verfasst: 10.05.2022 06:32
von juergenkulow
Wenn mein Programm mit den Compiler Optionen C-Backend und Optimize Generated Code doppelt so schnell läuft, muß ich dann die Unterschiede im Assembler Code oder den Inhalt von purebasic.c kennen? Wenn ja empfehle ich das englischsprachige PB Forum seit Mai letzten Jahres.

Re: Purebasic 6 Beta 6 Frage zum C-Backend

Verfasst: 27.06.2022 16:47
von stab
Hallo, gibt es im C-Backend eigentlich jetzt die Möglichkeit, direkt C-Code einzufügen?

Re: Purebasic 6 Beta 6 Frage zum C-Backend

Verfasst: 27.06.2022 17:07
von mk-soft
Ja, das geht ...

Beispiel mit builtin funktion von GCC

Code: Alles auswählen

Procedure.l BSWAP32(Value.l)
  CompilerIf #PB_Compiler_Backend = #PB_Backend_Asm
    !MOV eax, dword[p.v_Value]
    !BSWAP eax
    !MOV dword[p.v_Value], eax
  CompilerElse
    !v_value = __builtin_bswap32(v_value);
  CompilerEndIf
  ProcedureReturn Value
EndProcedure

a.l = $12345678
b.l = BSWAP32(a)
Debug Hex(b, #PB_Long)

Re: Purebasic 6 Beta 6 Frage zum C-Backend

Verfasst: 27.06.2022 18:12
von stab
OK?!
Danke mk-soft, aber für mich sieht das immer noch sehr nach assembler-syntax aus. 2 register werden getauscht.
Ich dachte eher an sowas:

CompilerIf #PB_Compiler_Backend = #PB_Backend_C
?printf("Hello World\n");

:-)

Re: Purebasic 6 Beta 6 Frage zum C-Backend

Verfasst: 27.06.2022 18:16
von mk-soft
Nicht genau hin geschaut ...

Oberer Teil ASM und unterer Teil C

Re: Purebasic 6 Beta 6 Frage zum C-Backend

Verfasst: 27.06.2022 20:28
von stab
Ja stimmt, ich hatte nur den ASM Teil im Blick, weil bei mir dieser Teil durchlaufen wird.
Unter welchen Umständen wird denn "CompilerElse" ausgeführt?

Müssen wir aber von meiner Seite auch nicht vertiefen.
War eher eine allgemeine Frage.

Vielen Dank

Re: Purebasic 6 Beta 6 Frage zum C-Backend

Verfasst: 27.06.2022 22:22
von mk-soft
Wenn es nicht ASM ist, was bleibt denn übrig ... :roll:

Re: Purebasic 6 Beta 6 Frage zum C-Backend

Verfasst: 28.06.2022 08:39
von stab
Vielleicht habe ich ein Brett .....
PB 6.00 Beta 8

Code: Alles auswählen

Procedure.l BSWAP32(Value.l)
  CompilerIf #PB_Compiler_Backend = #PB_Backend_Asm
    !MOV eax, dword[p.v_Value]
    !BSWAP eax
    !MOV dword[p.v_Value], eax
    Debug "ASM"
  CompilerElse
    !v_value = __builtin_bswap32(v_value);
    Debug "C"
  CompilerEndIf
  ProcedureReturn Value
EndProcedure

a.l = $12345678
b.l = BSWAP32(a)
Debug Hex(b, #PB_Long)
ASM
78563412