PureBasic - 完美的跨平台和原生开发语言
原生、简单、快速、跨平台,而且相当强大的编程语言?它不存在吗?不,它存在。它就是 PureBasic!
为什么是 BASIC?为什么写这篇文章?
不。我不是 BASIC 的拥护者。我使用过 C#、Java、C++ 等十多种主流编程语言。
我不认为 PureBasic 比所有这些语言都好。
PureBasic 不是最好的编程语言。对于编写 Windows 应用程序,C# 比 PB 更方便、更强大。Python 和 Java 在跨平台开发方面更胜一筹,尤其是因为它们不需要在许多操作系统上编译成平台相关的可执行文件格式。
但是,如果您想编写不需要第三方 DLL 和平台的原生应用程序,或者需要原生且跨平台的应用程序,您就不能使用 C#、Java、Python。您可以使用 Delphi、一些 C++ 实现以及其他一些语言。而且,**PureBasic 是最适合大多数原生用途的。真的。**
同样,**我不是在 CodeProject 上宣传商业产品的垃圾邮件发送者**。我不为 PB 的作者工作。PB 已经是一种相当流行的语言。我只是帮助您明确哪种语言最适合您的用途。
为什么是原生且无第三方?为什么不是 .NET、JVM?
在什么情况下需要原生和独立于第三方的开发?
- 安装程序开发。 安装程序不应该需要第三方平台。同时,强烈不希望要求几个重达几 MB 的第三方 DLL。
- SFX 压缩包开发。
- CD 壳程序开发。
- 驱动程序开发。 如果驱动程序需要 .NET、JVM 或高级第三方库,它将无法工作。
- 广告软件和“合法广告软件”(带有必要的许可协议)。 广告软件应该占用很少的 CPU 时间、内存和磁盘空间,并且不应该需要第三方平台。
- 游戏开发。 这需要高性能。MS.NET 或 JVM 是不好的选择。
- 以及其他需要高性能和轻量级的软件。
- 以及用于实验未记录的 libx、黑客攻击等“临时”软件编写。 用于此目的的工具应该快速、原生且简单。
为什么不是 Pure C/C++、Delphi、C++ Builder?
MessageBox(Str(2 + Int("2")));
intvar = Int("2");
intvar2 = 2 + intvar;
strvar = Str(intvar);
MessageBox(strvar);
// WARNING: compile in Unicode
#include <Windows.h>
#include <tchar.h>
#include <sstream>
#include <string>
// #pragma comment(lib, "user32.lib") --- for MessageBox, required if lib not added in the compiler options
using namespace std;
int main()
{
int intvar;
wistringstream s(_T("2"));
s >> intvar;
wostringstream ss;
ss << 2 + intvar;
wstring strvar = ss.str();
MessageBox(0, strvar.c_str(), _T(""), MB_OK);
return 0;
}
您需要学习和编写更多内容才能获得相同的结果。
Delphi 和 C++ Builder 难度不是很大。但它们是付费的(而且非常昂贵),并且会生成相当大的 EXE 文件。此外,Delphi 长期以来一直被用作恶意软件创建工具——现在很少有杀毒软件会怀疑 Delphi EXE 文件是恶意软件。
PureBasic:编译器
PB 设计用于 Windows、Linux、Mac OS 和 Amiga OS 开发。有 x86 和 x64 版本。
PB 通过平台指定的编译器版本编译为平台相关的二进制格式(Windows 中为 EXE)。
PB 编译器首先将 PB 代码转换为 FASM 代码,然后由 FASM 编译器编译该代码,FASM 编译器提供了出色的性能和内联 FASM 使用的可能性。
PB 编译器创建一个轻量级(2 KB 及以上)、完全原生的 EXE 文件,仅需要 msvcrt.dll
和 WinAPI(DependencyWalker 屏幕截图)
msvcrt.dll 在 Win 2000 及更高版本中预装。
PureBasic:标准库
PB 的标准库包含许多具有不同“跨平台性”级别的函数(请参阅文档)。
例如,它包含用于使用以下内容的函数:
- BMP、JPEG、JPEG2000、PNG、TGA、TIFF 格式
- Scintilla(代码编辑控件)
- SQLite、PostgreSQL、ODBC 数据库
- Ogre 3D 引擎(!)它允许您处理 2D 和 3D 图形。Ogre 库集成到 PureBasic 中。
您还可以使用许多原生操作系统 API 函数和接口,例如 Windows 上的 WinAPI 和 Linux 上的 GDK/GTK。
PureBasic:范式和语法
PB 支持命令式和过程式范式。
PB 官方目前不支持完全面向对象范式。在 PB 5.20+(2014 年 7 月 23 日)中,您可以使用模块,类似于 VB 6.0 / VBA 中的模块或 C# / VB.NET 中的静态类。您还可以使用“技巧”例如http://forum.purebasic.com/english/viewtopic.php?f=12&t=61126来模仿您应用程序中的 OOP。
在 PB 中,您不必实现主类或 C++ 中的入口点 main()。您可以像许多脚本语言一样,从头到尾在编辑器中编写代码。这对于“临时”和“实验性”应用程序(请参阅为什么是原生且无第三方?为什么不是 .NET、JVM?)非常有用。
注释
Code() ; Comment as in the asm
变量
Explicit integer 变量定义:
x.i
Explicit integer 变量定义和初始化:
x.i = 5
Explicit integer 变量定义和使用:
x.i
x = 5
y.i
y = x * 2 ; 10
Explicit string 变量定义(通过 2 种方式!)和使用:
str1.s = "Lorem" ; 1 way
str2$ = "ipsum" ; 2 way
str3$ = str1 + " " + str2$ ; Lorem ipsum
固定长度字符串:
str1.s{5}
str1 = "Lorem ipsum" ; Lorem
str2${5}
str2$ = "Lorem ipsum" ; Lorem
; Other variable types see in documentation.
隐式变量定义
x = 5
y = 2 * x ; 10
变量转换
整数转字符串及反向转换
x = 5
str$ = Str(x)
x = 5 + Val(str$) ; 10
双精度数转字符串及反向转换
x.d = 3.2
str$ = StrD(x)
x = 2.5 + ValD(str$) ; 5.7
双精度数转字符串(不带末尾的 0)
x.d = 3.2
str$ = StrD(x) ; 3.2000000000
str$ = Trim(str$, "0") ; 3.2
常量
#x = 1
#y = "2"
#z = 3.14
枚举
Enumeration
#x ; 0
#y ; 1
#z ; 2
EndEnumeration
扩展语法
Enumeration [<constant> [Step <constant>]]
#Constant1
#Constant2 [= <constant>]
#Constant3
...
EndEnumeration
控制台界面
OpenConsole()
Print("Hello world!")
Input() ; wait for key or input a value
调试时控制台界面
Debug "It will be printed in the debug output window"
流程
Procedure MsgBox(text$)
MessageRequester("", text$)
EndProcedure
MsgBox("Hello World")
带有值返回
Procedure$ InputBox(text$)
ProcedureReturn InputRequester("", text$, "")
EndProcedure
name$ = InputBox("Print your name")
MessageRequester("", name$)
EXE 中的数据
此功能类似于许多其他编程语言中的资源。但它不是标准的 Windows 资源,无法被 ResHacker 或其他资源查看器读取。
数值数据
Restore NumData
Read.l A
Read.l B
MessageRequester("", Str(A))
MessageRequester("", Str(B))
DataSection
NumData:
Data.l 1, 2
EndDataSection
字符串数据
Restore NumData
Read$ A$
Read$ B$
MessageRequester("", A$ + B$)
DataSection
NumData:
Data$ "Hello ", "world"
EndDataSection
文本文件内容
Restore File1
Read.s File1Data$
MessageRequester("", File1Data$)
DataSection
File1:
IncludeBinary "file.txt"
EndDataSection
待续...
PureBasic:IDE
PureBasic IDE 非常简单
……但功能强大
代码区域(折叠)
PureBasic:GUI
在 PureBasic 中,您可以通过 5 种方式创建 GUI
- 仅使用 PB 的标准跨平台 GUI 库。最简单的方法。
- 仅使用原生操作系统 API。例如,WinAPI 允许您创建极小的可执行文件,有时可以访问操作系统的特殊功能。最困难且不总是合理的方法。
- 在需要时结合使用 PB 的标准跨平台 GUI 库和操作系统 API。大多数情况下的首选方法。
- 使用 PB 的标准跨平台 3D GUI 库。它使用 3D 引擎绘制类似游戏的 GUI,有点像 Microsoft .NET 中的 WPF :)游戏和 3D 图形开发的优选方法。
- 使用基于方法 1、2、4 或结合几种方法的第三方 GUI 库。迂回的方法,取决于库的质量。
方法 1 - 标准跨平台 GUI 库
Enumeration
#btn1
EndEnumeration
OpenWindow(#PB_Any, 10, 50, 400, 200, "Lorem ipsum", #PB_Window_SystemMenu)
ButtonGadget(#btn1, 10, 10, 100, 25, "Button 1", 0)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
GadgetID = EventGadget()
If GadgetID = #btn1
MessageRequester("", "Button 1 clicked!")
EndIf
EndIf
Until Event = #PB_Event_CloseWindow


方法 2 - 原生操作系统 API
PB 中一个简单(或不那么简单?:))的 WinAPI GUI 程序
; If you want to use in GUI not only latin characters, compile it in Unicode!
; Warning: exe size - it's very, very small!
Declare.l WndProc(hWnd, Msg, wParam, lParam) ; declare Window events callback
; Global vars
WindowClass.s = "WndClass1"
; Initialize Window Class
wc.WNDCLASSEX
wc\cbSize = SizeOf(WNDCLASSEX)
wc\hbrBackground = #COLOR_WINDOW
wc\hCursor = LoadCursor_(0, #IDC_ARROW)
wc\lpfnWndProc = @WndProc()
wc\lpszClassName = @WindowClass
; register Window Class
If RegisterClassEx_(@wc) = 0
MessageBox_(hWnd, "Can't register main window class.", "", #MB_ICONERROR)
End
EndIf
; create window
hWnd = CreateWindowEx_(0, WindowClass, "Lorem ipsum", #WS_SYSMENU, 10, 50, 400, 200, 0, 0, 0, 0)
If hWnd = 0
MessageBox_(hWnd, "Can't create main window.", "", #MB_ICONERROR)
End
EndIf
; create button and set it's font
hButton1 = CreateWindowEx_(0, "Button", "Button 1", #WS_CHILD | #WS_VISIBLE, 10, 10, 100, 25, hWnd, 0, 0, 0)
SendMessage_(hButton1, #WM_SETFONT, GetStockObject_(#DEFAULT_GUI_FONT), 1)
; show window
ShowWindow_(hWnd, #SW_SHOWDEFAULT)
UpdateWindow_(hWndMain)
; messages handling loop
While GetMessage_(msg.MSG, #Null, 0, 0 )
TranslateMessage_(msg)
DispatchMessage_(msg)
Wend
; window events callback
Procedure.l WndProc(hWnd, Msg, wParam, lParam)
Shared hButton1
Select Msg
Case #WM_COMMAND
If hButton1 = lParam
MessageBox_(hWnd, "Button 1 clicked!", "", #MB_OK)
EndIf
Case #WM_CLOSE
DestroyWindow_(hWnd)
Case #WM_DESTROY
PostQuitMessage_(0) : Result = 0
Default
Result = DefWindowProc_(hWnd, Msg, wParam, lParam)
EndSelect
ProcedureReturn Result
EndProcedure
PureBasic:第三方库
PureBasic:社区和文档
http://www.purebasic.fr/english/(英语)
http://forums.purebasic.com/german/(德语)
http://www.purebasic.fr/french/(法语)
http://purebasic.info/phpBB3ex/index.php(俄语)
http://www.cyberforum.ru/pure-basic/(俄语)
http://purebasic.ucoz.ru/forum(俄语)
http://www.purebasic.cn/forum.php(中文)
文档、教程、代码示例
http://www.purebasic.com/documentation/
http://purearea.net/pb/CodeArchiv/CodeArchiv.html
http://pure-basic.narod.ru/(俄语)
http://purebasic.info/Chapters/index.html(俄语)
http://purebasic.ucoz.com/(俄语)
另类 PB 概述文章