PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OffTop » PureBasic 6.00


PureBasic 6.00

Сообщений 1 страница 20 из 20

1

https://www.purebasic.fr/english/viewto … mp;t=77272
Теперь PB может транслировать код не только в асссемблер, но и в Си.

0

2

Немного потестировал эту версию. :)
Транслятор в Си дает хороший прирост скорости выполнения программы. :)  Для теста взял код вычисления числа PI.
Вычисление 20 тысяч знаков после запятой выполняется примерно в 2 раза быстрее чем при трансляции в асм. http://pure-basic.narod.ru/forum_files/PI_C.zip
А вот скорость компиляции не небольшая, точнее ее сильно тормозит антивирус. Такое впечатление что он усилено сканирует создаваемый исполняемый файл и ищет угрозы. При трансляции в асм такого обычно не было.

0

3

Имхо, версия 6 идёт в сторону Си, хотя идеология Pb изначально была в виде чистого и компактного кода, удобной надстройкой над fasm'ом с удобным ide, а Си уже не догнать - слишком далеко ушёл.
Скорость обеспечивается алгоритмами, а не оптимизацией кода. Число пи в maple до миллионного знака вычисляется за доли секунды, есть экспорт в библиотеки для подключения на Си. Версия 6 не компилирует модальные окна из ресурсов, что-то сломали..

Отредактировано bizdon (01.08.2021 20:25:21)

0

4

bizdon написал(а):

Число пи в maple до миллионного знака вычисляется за доли секунды, есть экспорт в библиотеки для подключения на Си

spigot побыстрее считает.

0

5

bizdon написал(а):

Имхо, версия 6 идёт в сторону Си, хотя идёология Pb изначально была в виде чистого и компактного кода, удобной надстройкой над fasm'ом

Проблема асма в том что он платформозависим. Даже в пределах одного процессора Intel, есть большая разница между асмом x86 и x64.
Про ARM и другие процессоры и говорить нечего. Трансляция в Си позволяет уйти от различий процессора переложив это с транслятора PB на компилятор Си. Фред об этом писал https://www.purebasic.fr/blog/?p=480

bizdon написал(а):

Скорость обеспечивается алгоритмами, а не оптимизацией кода.

Если скомпилировать один и тот же PB код, транслятором в асм и транслятором в Си, последний вариант работает быстрее. Пример я выкладывал PureBasic 6.00

bizdon написал(а):

Версия 6 не компилирует модальные окна из ресурсов, что-то сломали

Она пока на стадии альфы. Посмотрим на релиз.

0

6

bizdon написал(а):

Имхо, версия 6 идёт в сторону Си

Я бы сказал, что идёт в сторону FreeBasic, который как раз кросс-компилятор для gcc.

0

7

если ориентируется на Си, то хорошо бы сделано, о чем просили - возможность объявления массивов, как в Си.

0

8

egons написал(а):

если ориентируется на Си, то хорошо бы сделано, о чем просили - возможность объявления массивов, как в Си.

А что, по вашему, не так с массивами сейчас?

Надеюсь код заставит улыбнуться

Код:
; массив целых 10 на 10 на 10
Structure LLL
  ll.i[10]
EndStructure
Structure MMM
  mm.LLL[10]
EndStructure
Structure NNN
  nn.MMM[10]
EndStructure  

Define M_3_10.NNN
Define *p_Int.Integer

M_3_10\nn[0]\mm[0]\ll[0] = 0
M_3_10\nn[9]\mm[9]\ll[9] = 999

Debug M_3_10\nn[0]\mm[0]\ll[0]
Debug M_3_10\nn[9]\mm[9]\ll[9]

; и вишека на торте
Debug SizeOf(M_3_10)/SizeOf(Integer)

*p_Int = @M_3_10
Debug *p_Int\i
*p_Int = *p_Int + SizeOf(M_3_10) - SizeOf(Integer)
Debug *p_Int\i

Я долго не подозревал, что в PB таки есть типизированные указатели.
Пока Пётр не ткнул меня в то, что всё реализовано через структуры. ( в том числе для базовых типов )
Почему то я сам не сразу обратил на это внимание.

Отредактировано useful (02.08.2021 21:26:50)

0

9

useful написал(а):

А что, по вашему, не так с массивами сейчас?

код на Си/Борман Паскаль:

Код:
    pindex: array[0..23] of byte = {plane index: 4 points = 1 plane}
     (0,3,1,2,0,5,4,1,0,6,2,4,6,3,2,7,3,5,1,7,4,7,6,5);
Код:
short lx[8]={1,1,1,1,-1,-1,-1,-1};
short ly[8]={1,1,-1,-1,1,1,-1,-1};
short lz[8]={1,-1,1,-1,1,-1,1,-1};

Код здесь:

Код:
  Restore pindex_
 For i=0 To 23
   Read.b pindex(i)
 Next i

pindex_:
Data.b 0,3,1,2,0,5,4,1,0,6,2,4,6,3,2,7,3,5,1,7,4,7,6,5

0

10

Код:
DataSection
pindex_:
Data.b 0,3,1,2,0,5,4,1,0,6,2,4,6,3,2,7,3,5,1,7,4,7,6,5
EndDataSection

Structure PIND
  pindex.b[24]
EndStructure
Define *p_pindex.PIND
*p_pindex = ?pindex_
Debug *p_pindex\pindex[ 0] ;0
Debug *p_pindex\pindex[23] ;5

0

11

о-о-о-о, в области указателей я неосилятор xD

0

12

Код Си можно получить или оно просто компилирует сразу в исполняемый не показывая промежуточного результата?

0

13

Как то так...

Код:
Debug 1
; IDE Options = PureBasic 6.00 Alpha 4 (Windows - x64)
; EnableThread
; EnableXP
Код:
// 
// PureBasic 6.00 Alpha 4 - C Backend (Windows - x64) generated code
// 
// (c) 2021 Fantaisie Software
// 
// The header must remain intact for Re-Assembly
// 
// :System
// 
#pragma warning(disable: 4024)
// 
typedef long long quad;
typedef quad integer;
#define PB_INFINITY (1.0 / 0.0)
#define PB_NEG_INFINITY (-1.0 / 0.0)
typedef struct pb_array { void *a; } pb_array;
typedef struct pb_array2 { void *a; integer b[2]; } pb_array2;
typedef struct pb_array3 { void *a; integer b[3]; } pb_array3;
typedef struct pb_array4 { void *a; integer b[4]; } pb_array4;
typedef struct pb_array5 { void *a; integer b[5]; } pb_array5;
typedef struct pb_array6 { void *a; integer b[6]; } pb_array6;
typedef struct pb_array7 { void *a; integer b[7]; } pb_array7;
typedef struct pb_array8 { void *a; integer b[8]; } pb_array8;
typedef struct pb_array9 { void *a; integer b[9]; } pb_array9;
typedef struct pb_listitem { void *a; void *b; void *c;} pb_listitem;
typedef struct pb_list { void *a; pb_listitem *b; } pb_list;
typedef struct pb_mapitem { void *a; void *b; void *c;} pb_mapitem;
typedef struct pb_pbmap { pb_mapitem *a; } pb_pbmap;
typedef struct pb_map { pb_pbmap *a; } pb_map;
static integer s_s[]={0, -1};
#define M_SYSFUNCTION(a) a __stdcall
#define M_PBFUNCTION(a) a __stdcall
#define M_CDECL
typedef void TCHAR;
static integer SYS_BankerRound(double i) { return i >= 0 ? i+0.5 : i-0.5; }
integer __stdcall ExitProcess(integer);
integer __stdcall HeapCreate(integer,integer,integer);
integer __stdcall HeapDestroy(integer);
integer __stdcall GetModuleHandleW(integer);
// 
static char *tls;
int PB_ExitCode=0;
integer PB_MemoryBase=0;
integer PB_Instance=0;
// 
// 
// 
// 
void SYS_Quit();
int PB_DEBUGGER_LineNumber=-1;
int PB_DEBUGGER_IncludedFiles=0;
char *PB_DEBUGGER_FileName=0;
// 

integer ms_s[]={0,-1};
// 
// 
// 
char PB_OpenGLSubsystem=0;
int PB_Compiler_Unicode=1;
int PB_Compiler_Thread=0;
int PB_Compiler_Purifier=0;
int PB_Compiler_Debugger=0;
int PB_Compiler_DPIAware=0;
int PB_Compiler_XPSkins=0;
int PB_ExecutableType=0;
// 
void PB_EndFunctions() {
}
// 
int __stdcall WinMain(void *instance, void *prevInstance, void *cmdLine, int cmdShow) {
PB_Instance = GetModuleHandleW(0);
PB_MemoryBase = HeapCreate(0,4096,0);
// Debug 1
SYS_Quit();
}

void SYS_Quit() {
PB_EndFunctions();
HeapDestroy(PB_MemoryBase);
ExitProcess(PB_ExitCode);
}

0

14

Код:
EnableExplicit
Define ans.s
OpenConsole()
PrintN("Си")
ans = Input()
CloseConsole()

c:\Sys\PB6A4\Compilers>pbcompilerc /CONSOLE /COMMENTED d.pb

Код:
// 
// PureBasic 6.00 Alpha 4 - C Backend (Windows - x64) generated code
// 
// (c) 2021 Fantaisie Software
// 
// The header must remain intact for Re-Assembly
// 
// Console
// :System
// 
#pragma warning(disable: 4024)
// 
typedef long long quad;
typedef quad integer;
#define PB_INFINITY (1.0 / 0.0)
#define PB_NEG_INFINITY (-1.0 / 0.0)
typedef struct pb_array { void *a; } pb_array;
typedef struct pb_array2 { void *a; integer b[2]; } pb_array2;
typedef struct pb_array3 { void *a; integer b[3]; } pb_array3;
typedef struct pb_array4 { void *a; integer b[4]; } pb_array4;
typedef struct pb_array5 { void *a; integer b[5]; } pb_array5;
typedef struct pb_array6 { void *a; integer b[6]; } pb_array6;
typedef struct pb_array7 { void *a; integer b[7]; } pb_array7;
typedef struct pb_array8 { void *a; integer b[8]; } pb_array8;
typedef struct pb_array9 { void *a; integer b[9]; } pb_array9;
typedef struct pb_listitem { void *a; void *b; void *c;} pb_listitem;
typedef struct pb_list { void *a; pb_listitem *b; } pb_list;
typedef struct pb_mapitem { void *a; void *b; void *c;} pb_mapitem;
typedef struct pb_pbmap { pb_mapitem *a; } pb_pbmap;
typedef struct pb_map { pb_pbmap *a; } pb_map;
static integer s_s[]={0, -1};
#define M_SYSFUNCTION(a) a __stdcall
#define M_PBFUNCTION(a) a __stdcall
#define M_CDECL
typedef void TCHAR;
static integer SYS_BankerRound(double i) { return i >= 0 ? i+0.5 : i-0.5; }
integer __stdcall ExitProcess(integer);
integer __stdcall HeapCreate(integer,integer,integer);
integer __stdcall HeapDestroy(integer);
integer __stdcall GetModuleHandleW(integer);
// 
integer PB_CloseConsole();
typedef void* (*pbv_Input)(int);
extern pbv_Input PB_Input;
integer PB_OpenConsole();
typedef integer (*pbv_PrintN)(void*);
extern pbv_PrintN PB_PrintN;
static char *tls;
int PB_ExitCode=0;
integer PB_MemoryBase=0;
integer PB_Instance=0;
// 
// 
// 
// 
void SYS_Quit();
M_SYSFUNCTION(void) SYS_AllocateString4(TCHAR **String, int PreviousPosition);
extern void *PB_StringBase;
extern integer PB_StringBasePosition;
M_SYSFUNCTION(void) SYS_InitString(void);
M_SYSFUNCTION(void) SYS_FreeStrings(void);
// 
M_SYSFUNCTION(void) SYS_PushStringBasePosition(void);
M_SYSFUNCTION(integer) SYS_PopStringBasePosition(void);
M_SYSFUNCTION(integer) SYS_PopStringBasePositionUpdate(void);
M_SYSFUNCTION(void *) SYS_PopStringBasePositionValue(void);
M_SYSFUNCTION(void *) SYS_PopStringBasePositionValueNoUpdate(void);
M_SYSFUNCTION(integer) SYS_GetStringBasePosition(void);
M_SYSFUNCTION(void) SYS_SetStringBasePosition(integer Position);
M_SYSFUNCTION(integer) SYS_StringBasePositionNoPop(void);
M_SYSFUNCTION(char *) SYS_GetStringBase(void);
int PB_DEBUGGER_LineNumber=-1;
int PB_DEBUGGER_IncludedFiles=0;
char *PB_DEBUGGER_FileName=0;
// 
static unsigned short _S1[]={1057,1080,0};
void *PB_NullString=0;

integer ms_s[]={0,-1};
void* v_ans=0;
// 
// 
// 
char PB_OpenGLSubsystem=0;
int PB_Compiler_Unicode=1;
int PB_Compiler_Thread=0;
int PB_Compiler_Purifier=0;
int PB_Compiler_Debugger=0;
int PB_Compiler_DPIAware=0;
int PB_Compiler_XPSkins=0;
int PB_ExecutableType=1;
// 
void PB_EndFunctions() {
}
// 
int pb_main(int argc, char* argv[]) {
PB_Instance = GetModuleHandleW(0);
PB_MemoryBase = HeapCreate(0,4096,0);
SYS_InitString();
// EnableExplicit
// Define ans.s;
// OpenConsole()
integer rr0=PB_OpenConsole();
// PrintN("")
integer rr1=PB_PrintN(_S1);
// ans = Input()
SYS_PushStringBasePosition();
SYS_PushStringBasePosition();
PB_Input(SYS_PopStringBasePosition());
SYS_AllocateString4(&v_ans,SYS_PopStringBasePosition());
// CloseConsole()
integer rr2=PB_CloseConsole();
SYS_Quit();
}

void SYS_Quit() {
PB_EndFunctions();
HeapDestroy(PB_MemoryBase);
ExitProcess(PB_ExitCode);
}

0

15

Через ком-строку сделал в AkelPad, а как сделать в PureBasic? То есть я уже выбрал компилятор по описанию на оффоруме, но есть ли способ задать параметр /COMMENTED в GUI-настройках компилятора? Там есть только ком-строка для уже скомпилированного приложения, а для компилятора похоже нет. Но может я просто не знаю, может в каком то конфиге можно указать? Или сделать это через "Инструменты"?

0

16

есть же инструмент для предоставления кода в asm, ну, то есть теперь в Си:

код

; FileName: AsmTools.pb
; Author:   void
; Compiler: PB531 (Windows only)
; Ver:      001
;
;  Запускать как Tools из IDE с параметром "%FILE" (ручной запуск, без условий)
;
;  по мотивам: http://www.purebasic.fr/english/viewtop … mp;t=30864
;  Отличается:
;  1) Путь к компилятору берет из переменной среды (правильно работает с портабельными версиями)
;  2) Использует все доступные флаги компиляции (Unicode, ThreadSafe, итд), никто это не учитывал.
;  3) ASM файл кладет рядом с исходником, с именем исходника + ".asm"
;  4) Временный бинарник кладет во временную папку, и удаляет, по окончании работы.
;  Известные проблемы:
;  1) Нет кросс-платформенности (надо допиливать ключи компилятора, мне лень)
;*********************************
EnableExplicit

Define compiler$ = GetEnvironmentVariable("PB_TOOL_Compiler")
If Not (Len(compiler$) And FileSize(compiler$) > 0)
  MessageRequester("ERROR!!!", "Run only as <PB_Tools>")
  End
EndIf

Define srcFile$ = ProgramParameter(0)   
If Not (Len(srcFile$) > 0 And FileSize(srcFile$) > 0)   
  MessageRequester("ERROR!!!", "Not found source file: " + srcFile$)
  End
EndIf

Define options$ = #DQUOTE$ + srcFile$ + #DQUOTE$ + " /COMMENTED"
If Val(GetEnvironmentVariable("PB_TOOL_Debugger"))
  options$ + " /DEBUGGER"
EndIf
If Val(GetEnvironmentVariable("PB_TOOL_Unicode"))
  options$ + " /UNICODE"
EndIf
If Val(GetEnvironmentVariable("PB_TOOL_Thread"))
  options$ + " /THREAD"
EndIf
If Val(GetEnvironmentVariable("PB_TOOL_XPSkin"))
  options$ + " /XP"
EndIf
If Val(GetEnvironmentVariable("PB_TOOL_OnError"))
  options$ + " /LINENUMBERING"
EndIf
If Len(GetEnvironmentVariable("PB_TOOL_SubSystem"))
  options$ + " /SUBSYSTEM " + #DQUOTE$ + GetEnvironmentVariable("PB_TOOL_SubSystem") + #DQUOTE$
EndIf
Define tmpBin$ = GetTemporaryDirectory() + "~tmpcompile"
options$ + " /EXE " + #DQUOTE$ + tmpBin$ + #DQUOTE$

;ищем недостающие настройки (выходной формат) в конце файла
Define tmpStr$
Define srcFile = ReadFile(#PB_Any, srcFile$)
Define format = ReadStringFormat(srcFile)
While Not Eof(srcFile)
  tmpStr$ = ReadString(srcFile, format)
  If Left(tmpStr$,21) = "; ExecutableFormat = "
    tmpStr$ = LCase(Trim(Mid(tmpStr$,22)))
    Select tmpStr$
      Case "console" 
        options$ + " /CONSOLE"
      Case "shared dll"
        options$ + " /DLL"
    EndSelect
    Break
  EndIf
Wend 
CloseFile(srcFile) 

Define srcPath$ = GetPathPart(srcFile$)
Define asmFile$ = srcPath$ +"PureBasic.asm"
Define trgName$ = srcPath$ + GetFilePart(srcFile$) + ".asm"

DeleteFile(asmFile$, #PB_FileSystem_Force)
DeleteFile(trgName$, #PB_FileSystem_Force)

;MessageRequester("Compiler options:", options$) ;For Debug

RunProgram(compiler$, options$, srcPath$, #PB_Program_Hide|#PB_Program_Wait)
Delay(500)
DeleteFile(tmpBin$, #PB_FileSystem_Force)

If Not (FileSize(asmFile$)>0)
  MessageRequester("ERROR!!!", "Not create ASM file: " + asmFile$ + #CRLF$ + "Compiler options: " + options$)
  End
EndIf

RenameFile(asmFile$, trgName$)

RunProgram("notepad", trgName$, srcPath$)
; IDE Options = PureBasic 5.61 (Windows - x86)
; CursorPosition = 92
; FirstLine = 61
; EnableXP
; Executable = asm.exe
; DisableDebugger
; EnableUnicode

кстати, есть ещё инструмент (вдруг кто-то не знает?) "pbOptimizer", который хорошо чистит код и уменьшает размер выходного exe.

Отредактировано bizdon (12.09.2021 07:16:42)

0

17

bizdon

pbOptimizer

что год назад я не придал значения, что сейчас, попробовал использовать, получил тот же код в оригинале, даже не понимаю что он оптимизирует, хоть бы автор написал, кроме версий и непонятных обновлений ничего нет.

Интересно, можно ли код Си компилировать сторонним компилятором, то есть например выложить в репозиторий Linux, чтобы он был собран? В коде есть строки "integer PB_FreeLibraries();" и таких полста, что говорит о наличии каких-то готовых объектов, которые используется в коде и без них не соберётся, а префикс "PB_" может указывать о принадлежности файлов к PureBasic, то есть фактически PureBasic транслирует код в Си только ради оптимизации, но ни разу не для возможности использовать отдельно от PureBasic.

Отредактировано AZJIO (12.09.2021 14:41:13)

0

18

AZJIO написал(а):

попробовал использовать, получил тот же код в оригинале

Вероятно имелось в виду что исключается неиспользуемый код в частности неиспользуемые процедуры. Если весь код используется, нечего оптимизировать.
Для Си в стороннем оптимизаторе нет необходимости, т. к. компилятор прекрасно оптимизирует. Здесь я показывал пример того во что компилируется код Что за ошибка?

AZJIO написал(а):

Интересно, можно ли код Си компилировать сторонним компилятором, то есть например выложить в репозиторий Linux, чтобы он был собран?

Выложить-то можно, но в коде используются статические библиотеки без которых ничего не соберется.

AZJIO написал(а):

то есть фактически PureBasic транслирует код в Си только ради оптимизации

Не только. Еще для поддержки новых платформ таких как Mac M1, малина и др. с ARM процессором. Также возможно появление версий для Windows ARM, (планшетов и нетбуков с виндой и ARM процессором).

0

19

AZJIO написал(а):

Интересно, можно ли код Си компилировать сторонним компилятором, то есть например выложить в репозиторий Linux, чтобы он был собран? В коде есть строки "integer PB_FreeLibraries();" и таких полста, что говорит о наличии каких-то готовых объектов, которые используется в коде и без них не соберётся, а префикс "PB_" может указывать о принадлежности файлов к PureBasic, то есть фактически PureBasic транслирует код в Си только ради оптимизации, но ни разу не для возможности использовать отдельно от PureBasi

Все процедуры самого PB - в файлах lib. По идее, подключив нужные библиотеки, скомпилировать можно.

0

20

pbOptimizer "сжимает" ( у меня:) выходной файл раза в 1,5-2 за счёт удаления мусора. Настройки там есть, примерно видно что оптимизируется.
http://i.prntscr.com/xXON7CDwRKuZbPmXekOmzw.png
https://disk.yandex.ru/d/BYzUVpbYECR0Mw
на старших версиях PB5.7х выходной exe получается как на версиях 4.хх. Если использовать чистый winapi, то, конечно, сжатия не будет.

0


Вы здесь » PureBasic - форум » OffTop » PureBasic 6.00