بيوربيزك م د خ ل ا ل ى ل غ ة بلس+ الس ي بق وة أ كتب و س رعة األسمبل ي apple ع ب د ا ل ه ا د ي ج ع ف ر @nodekits
مدخل الى لغة بيور بيزك أ كتب بق وة الس ي بلس+ و س رعة األسمبل ي PureBasic - The Perfect Cross-Platform & Native Development Language 1
Abdelhadi @nodekits.. م سلم جزائري طالب سنة أولى جامعي تخص ص علوم حاسب م هتم بالتصميم و برمجة التطبيقات ] سطح املكتب/الويب ]. أهديه الى.. ش ر كة ص خر (عسى أن تص ل التحية) / م جم ع حس وب و مواقع الك تب الع ربية. 2
مقدمة الى Purebasic لiiغة ب -ي ور ب --ي ز ك Purebasic أو اخiiتصارا ب PB هiiي لiiغة بiiرمiiجية و بiiيئة تiiطويiiريiiة مiiتكامiiلة تiiقوم عiiلى أسiiiiii س لiiغة Basic قiiامiiت بiiتطويiiرهiiا و تiiصميمها شiiركiiة fantaisie software لiiتكون عiiابiiرة لiiلمنصات و تiiدعiiم نii ظم الiiiتشغيل: الiiiويiiiندوز و لiiiينوكiiiس بiiiمعياريiiiة bit-32/64 اضiiiافiiiة الiiiى نiiiظام املiiiاكiiiنتوش كiiiما أنiiiها أتiiiاحiiiت نiiiسخة مفتوحة املصدر قديمة نسبيا (النسخة 4) لنظام Amiga أيضا! عادة ما ي شار الى رمز اللغة بحرف Z أو قديما بالبرغي. صيغ ملفات اللغة: pb.pbi.pbf,.pbp,.pbv تiiم تiiصميم الiiلغة فiiي أواخiiر الiiتسعينات عiiلى نiiظام AmigaOS و أول اصiiدار عiiام لiiلغة Purebasic شiiiiiii م ل نiiii سخة ويiiiiندوز كiiiiان فiiiiي 17 ديiiiiسمبر 2000. و يiiiiتم تحiiiiديiiiiثها بiiiiاسiiiiتمرار مiiiiنذ ذلiiiiك الiiiiحني. و تiiiiعتمد الiiiiلغة عiiiiند اقiتنائiك عiلى نiسخة مiنها لiترخiيص (مiدى الiحياة) أو مiا يiعرف ب Model" "LifeTime License و كiما ورد من موقعهم أن هناك أشخاصا مازال لديهم حق الوصول للتحديث منذ عام :) 1998 اسiتطاعiت لiغة بiيوربiيزك لi م و اسiتنباط جiميع خiصائiص الiلغات األخiرى و تiوظiيفها كiقوة لiغة الiسي و الiجافiا و الزاروس.. و أيiضا C# و صiiiiiiii غ ر و سiرعiة و ح جiم مiلفاتiها الiتنفيذيiة كiأنiك تiكتب بiلغة التجiميع ( Assembly ) و سiهولiتها( Syntax ) كiالiبايiثون و الiروبiي كiما يiمكنك بiناء ألiعاب ثiالثiية األبiعاد بiاسiتخدام DirectX و غiيرهiا من مشغالت األلعاب زيادة الى بناء برامج تعمل على نواة النظام Driver).(Kernel Mode لتقول لك اجماال : أكتب بخ واص جميع اللغات.. بلغة واحدة.. و.. سطر واحد.. *يمكنك تحميل نسخة تجريبية من املوقع الرسمي لديهم. 3
ملا كل هذا التميز! ما الجديد فيها لiغة Purebasic ليسiت لiغة بiرمiجة عiاديiة فiقد سiبق أن بiرمiجت تiطبيقات عiديiدة مسiتعمال لiغات مiختلفة كiالiسي و الزاروس و أوتويت Autoit لذلك أ درك تماما قيمة هته اللغة و مستقبلها الشاسع. بiiطبع الiiحال بiiيوربiiيزك ليسiiت أحiiسن لiiغة ف C# أوسiiع مiiنها فiiي بiiناء تiiطبيقات الiiويiiندوز و الiiبايiiثون و الiiجافiiا فiiiiي تiiiiعد د املiiiiنصات لiiiiكن أن تجiiiiد لiiiiغة طiiiiبيعية + ال تiiiiحتاج الiiiiى طiiiiرف ثiiiiالiiiiث (dll's) + مiiiiتعددة املiiiiنصات + و سريعة العمل و خفيفة حجم + برمجة Kernel Driver فذاك ش يستحق الثناء. و لiiiiتبسيط أكiiiiثر: تiiiiولiiii د تiiiiطبيقات طiiiiبيعية Development) (Native مسiiiiتقلة ال تiiiiحتاج الiiiiى طiiiiرف ثiiiiالiiiiث أو مiiكتبات خiiارجiiية مiiثل لiiغات NET. الiiتي تii لزمiiك بتحiiميل مiiكتبات اضiiافiiية.. أو الiiجافiiا بمفسiiرهiiا VM و كiiما أن شiiiفرة بiiiرمiiiجية واحiiiدة تiiiدعiiiم جiiiميع املiiiنصات األخiiiرى (Cross-Platform). و يiiiمكنك اسiiiتدراج شiiiفرات لiiiغة التجiiميع (األسiiمبلي) بiiكل ي سiiر و سiiهولiiة.. inline asm كiiما أنiiك قiiادر عiiلى تiiطويiiر و بiiرمiiجة مiii تحكمات لiiوحiiة األردوينو.Arduino جميل جدا لكن أين السهولة في العمل لiنأخiذ مiثاال بiسيطا تiميزت لiغة ++C/C بiصعوبiتها عiند الiتعلم و خiصوصiا عiند اسiتخدام الiواجiهات الiرسiومiية (GUI) فكانت ت لزمك باستعمال شيئني : - 1 اما استعمال أوامر النظام و ملحقاته OS API ك WinApi32 و GDK/GTK على لينوكس. - 2 أو استعمال برامج و مكتبات خارجية م كلفة و ص عبة ك.. QT الخ. أما PB s فسهولة أخرى سنعرفه الحقا. املترجم Compiler ل PB s مii ترجiم لiغة بiيوربiيزك صiiiiiiiii م م لiيدعiم جiميع أصiناف املiنصات بiمختلف املiعالiجات:,x86,x86-64 PowerPC و 680x0 تiiiتم أول تiiiرجiiiمة لiiiلملف بتجiiiميعه و تiiiحويiiiله مiiiن صiiiيغة PB الiiiى شiiiفرات أسiiiمبلي (نiiiوع (Fasm ثiiiم يiiiقوم مiiiترجiiiم األسiمبلي بiتحويiلها بiشفرات مii ض من ة الiى مiلف تiنفيذي EXEs بحجiم صiغير جiدا (light-weight) يiصل الiى ٢ كيلوبايت. يستدعي على الويندوز ملف msvcrt.dll في حالة استخدامك مللحقاته.API 4
مكتبة PB s القياسية و لنغوص أكثر ضمن اللغة تستند بيوربيزك على مكتبات قياسية تحوي وظائف كثيرة لالستخدام كمثال: - صيغ.BMP JPEG JPEG2000 PNG TGA TIFF - م حرر/م تحكم الشفرات البرمجية.Scintilla - قواعد البيانات بجميع أنواعها.SQLite, PostgreSQL, ODBC محiiiiرك ألiiiiعاب مiiiii ض م ن داخiiiiل الiiiiلغة Ogre 3D engine يiiiiمكنك انiiiiشاء رسiiiiومiiiiات ثiiiiنائiiiiية و ثiiiiالثiiiiية األبiiiiعاد و اعتماد بشكل غير رسمي ملحرك.Irrlicht Engine مكتبة DirectX املرفقة بالبيئة.. الخ. - - بناء الجمل Syntax بiناء الجiمل و اجiراءاتiها فiي بiيوربiيزك سهiل لiلم بتدئiني و سiريiع لiلمتقدمiني و غiير مiكلف. تiتشابiه مiع بiعض صiيغ فيجوال بيسك كما تم تطويرها في النسخة 5.20 لتدعم بذلك البرمجة الكائنية OOP لنلق نظرة حول شفرات اللغة: #التعليقات - Comments Code() ; Comment as in the asm #املتغيرات - Variables انشاء م تغير رقمي صحيح و تعريفه حيث أن i تعني كلمة.Intger x.i x.i = 5 الستعمال املعامالت الحسابية بني املتغيرات.. x.i x = 5 y.i y = x * 2 ; 10 5
لتعريف متغيرات نصي ة يمكننا ذلك بطريقتني: نستعمل الحرف (s) أو ($) str1.s = "Abdelhadi" str2$ = "nodekits" ; 1 way ; 2 way str3$ = str1 + " " + str2$ ; Abdelhadi nodekits يمكن تحديد قيمة املتغير و تثبيته: str1.s{5} #الثوابت - Constants #x = 1 #y = "2" #z = 3.14 #العداد - Enumerations Enumeration #x ; 0 #y ; 1 #z ; 2 EndEnumeration #نافذة طرفية - Interface Console OpenConsole() Print("Hello world!") Input() ; wait for key or input a value 6
#نافذة املنق ح - interface Debug-time console تiiفيد فiiي تiiنقيح بiiعض املiiشاكiiل و األخiiطاء الiiتي ضiiiiiiiiii من مiiشاريiiعك بii د ل تiiرجiiمتها كiiل ها و تiiعطيك الiiوقiiت الiiحقيقي للتنفيذ.. Debug "It will be printed in the debug output window" #االجراءات - Procedures Procedure MsgBox(text$) MessageRequester("", text$) EndProcedure MsgBox("Hello World") و الرجاع قيمة متغير داخل اال جراء: Procedure$ InputBox(text$) ProcedureReturn InputRequester("", text$, "") EndProcedure name$ = InputBox("Print your name") MessageRequester("", name$) #التوجيه بلغة التجميع inline asm مiiن جiiمالiiيات الiiلغة أتiiاحiiت اسiiتعمال شiiفرات لiiغة التجiiميع ) أوامiiر األسiiمبلر x86) و تiiوضiiيفها ضiiمن بiiرمiiجياتiiك عiiiiبر املiiiiنصات مiiiiباشiiiiرة بiiiiاملiiiiتغيرات أو املiiiiؤشiiiiرات تiiii فيد األسiiiiiiii مبلي بiiiiشكل كiiiiبير ان كiiiiان لiiiiديiiiiك مشiiiiروع يسiiiiتهلك أجiiزاءا كiiبيرة مiiن الiiذاكiiرة بiiامiiكانiiك اسiiتعمال شiiفرات أسiiمبلي لتسiiريiiع املiiهم ة و األد اء ألنiiها تiiترجiiم مiiباشiiرة الiiى لغة اآللة. عiiiiiلى الiiiiiويiiiiiندوز و لiiiiiينوكiiiiiس بiiiiiيوربiiiiiيزك تسiiiiiتعمل األسiiiiiمبلر (http://flatassembler.net) Fasm و فiiiiiي نiiiiiظام املiاكiنتوش تسiتخدم األسiمبلر (http://yasm.tortall.net) Yasm كiما يiمكنك االسiتعانiة بiاملسiتندات و الiوثiائiق التي يقدمها كلتا املوقعني. من أجل تفعيل التوجيه علينا وضع الوسمني في البداية و النهاية ليتعرف عليهما املترجم. 7
- EnableASM : بداية التوجيه و تبليغ املترجم. - DisableASM : نهاية التوجيه.. السiتخدام صiحيح لiألوامiر عiلينا تiعريiف املiتغيرات أو املiؤشiرات قiبل اسiتعمالiهما ضiمن الiتعليمات و ان اسiتعملت ال (module) يجب كتابة اسمه بحروف صغير هكذا ] module_name. ]. مثال: MOV ebx, ll_mylabel... MyLabel:.. مالحظات.. - األخiطاء الiتي تظهiر فiي الiتوجiيه تiابiعة لiألسiمبلر و لiيس لiلبيوربiيزك قiم بiمراجiعة الخiطأ و اسiتخدم الiتوثiيقات املرفقة. 1- ال يمكن استعمال الكلمات املفتاحية لألسمبلر keywords خارج التوجيه ضمن أسماء.Lable 2- معالجات x86 ت ستعمل الكلمات املحجوزة ك : eax edx ecx الى آخره من املفاتيح. -3 مiiiiiiiiiiiiiiiiiiعiالiiiiiiiiiiiiiiiiiiجiات x64 تiسiiiiiiiiiiiiiiiiiiتiعiمiل الiiiiiiiiiiiiiiiiiiكiلiمiات xmm2 xmm1 xmm0 r9 r8 rdx rcx rax.. xmm3 الى آخره من املفاتيح. 4- عiلى الiويiندوز فiقط: مiلف املiساعiدة help-file) (ASM يiمكن تحiميله عiلى الiرابiط الiتالiي و قiم بiنقل مiلف 'ASM.HLP الiiiى املجiiiلد فiiiي الiiiبيوربiiiيزك '/Help لiiiيمكنك االسiiiتعانiiiة بiiiالiiiنقر عiiiلى الiiiكلمة املiiiحجوز و الiiiضغط على الزر F1 الظهار تفاصيله. 5- لiiiلعودة مiiiباشiiiرة الiiiى املسجiiiiii ل eax أو rax) فiiiي مiiiعماريiiiة x64) اسiiiتعمل فiiiقط ProcedureReturn بدون أي عبارة أخرى. أمثلة: Procedure Test(*Pointer, Variable)! MOV dword [p.p_pointer], 20! MOV dword [p.v_variable], 30 Debug *Pointer Debug Variable EndProcedure Procedure.l MyTest() MOV eax, 45 ProcedureReturn ; The returned value will be 45 EndProcedure 8
#البيانات في امللفات التنفيذية EXE عiادة عiند بiناء تiطبيقات ذو واجiهة رسiومiية يiمكن لiلقراصiنة اسiتخدام بiرامiج تiقوم بiفك التجiميع و تiعرض بiيانiات األخير ك 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 9
نظرة حول البيئة التطويرية IDE يiأتiي مiع الiلغة بiيئة تiطويiريiة مiتكامiلة النiشاء مiشاريiع بiرمiجية كiبيرة تiحوي هiذه املحiررات عiلى خiصائiص كiبيرة مiiiثل تiiiنقيح الiiiش فرات الiiiبرمiiiجية و ادارة املiiiشاريiiiع و تiiiصنيفها بiiiيئة بiiiيوربiiiيزك بiiiسيطة جiiiدا و غiiiير مiiiعقدة تiiiميزت بiiسهولiiتها الiiكبيرة فiiي ادارة خiiصائiiص املحiiرر و خiiيارات االكiiمال الiiتلقائiiي تحiiريiiر األلiiوان تiiخصيص املiiترجiiم التنقيح التلقائي الى جانب توثيق اللغة بالضغط على زر.. F1 لنلق نظرة : ) الصور من النسخة 4 القديمة) 10
الكمال العبارة اضغط زر.. TAB في محررات أخرى تستعمل زر مسافة يمكنك تخصيصها في االعدادات. خاصية طي الش فرات و تقليصها.. لتقليل حجم األسطر. 11
12
انشاء الواجهات الرسومية GUI في لغة بيورك بيزك يمكنك انشاء واجهات رسومية بخمسة طرق: - 1 باستخدام املكتبة األصلية ضمن PB فقط و متعددة املنصات.. (الطريقة األسهل). - 2 باستخدام OS API كما ذكرنا سابقا هذه الطريقة تمكنك من الت حكم بالنظام ب شكل ك ام ل مع ص غر حجم امللف. - 3 الجمع بني 1 و 2 ان كنت تحتاج ذلك.. (الوسيلة املفضلة في معظم الحاالت). - 4 استخدام محرك 3D للتصميم و الر سم و تطوير ألعاب ثالثية األبعاد تشبه الى حد ما WPF في الدوت نت NET... ) الوسيلة املنصوح بها لتطوير ألعاب ). 3D - 5 استعمال الط ر ق 1 و 2 و.. 4 (وسيلة جميلة لكن تعتمد على حالة املكتبات). #الطريقة 1: استخدام املكتبة األصلية.. واجهة رسومية بسيطة.. نافذة واحدة و نافذة متعددة.. MessageRequester("Message Box", "Hello World ) ; 4.5 KB Enumeration #btn1 EndEnumeration OpenWindow(#PB_Any, 10, 50, 400, 200, "Abdelhadi nodekits, #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 13
هذه أسهل طريقة لكتابة واجهة رسومية بشكل يدوي على بمكتبة بيوربيزك يمكنك االستعانة بمصمم واجهات سريع جدا و فع ال ) Deigner ) Visual لتفعيله تجده في القائمة العلوية أو يمكنك أيضا استعمال محرر آخر يدعى ب.. PureFORM editor بعد تصميمك للبرنامج يعطيك خاصية نسخ كود التصميم لتستخدمه على البيئة التطويرية.. 14
.. في األخير كل الس بل م تاحة لتنش برنامجك بكل ارتياحية و سهولة.. #الطريقة 2: استخدام أدوات النظام.. باستعمال OS API تدعى على الويندوز WinAPI (في النسخة 10 ت غ ير اسمها). نافذة بسيطة بسطر واحد.. حجم امللف التنفيذي ال يصد ق KB 2.0 MessageBox_(0, "Hello World", "Message Box", 0) ; 2.0 KB نوافذ متعددة.. ; 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) 15
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, Abdelhadi Nodekits", #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 16
البرمجة الكائنية OOP مطور بيوربيزك سابقا fred أكد أنه لن يدعم أبدا البرمجة الكائنية لكن بعد بلوغ عدد كبير من مستخدمي اللغة أ جبرت على دعمها للبرمجة الكائنية مما القت استخداما كبيرا بني املطورين. راجع الرابط. استخدام مكتبات الطرف الثالث - Third-party تحوي مكتبة بيوربيزك على مكتبات كبيرة مفتوحة املصدر تجدها على الرابط : http://pbosl.purearea.net كiiiما يiiiمكنك تiiiزيiiiني واجiiiهاتiiiك الiiiرسiiiومiiiية عiiiبر مiiiكونiiiات ProGUI يiiiعطيك أكiiiثر 100 مiiiلف DLL مiiiع مسiiiتندات و توثيقات لتخصيصها بشكل أكبر كما يتوفر الويب على ستايالت skins بأشكال مختلفة. املالحق و التوثيقات جدول بسيط معر ب يوضح أنواع املتغيرات.. 17
# املنتديات.. - 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.mybb.ru (الروسية) - 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.ru (الروسية) - http://mirashic.narod.ru (الروسية) - http://purebasic.ucoz.com (الروسية) (ر بما بعض املواقع توقفت استعن بموقع األرشيف (archive.org املراجع املوقع الرسمي للغة بيوربيزك purebasic.com The Perfect Cross-Platform.. etc CodeProject موقع ويكيبيديا.. Purebasic - - - 18
أتمنى في األخير أن يعجبكم هذا املدخل املختصر للغة ربما اصراري على تعلمها و عدم وجود أي تعريف بها على الويب العربي ألزمني كتابة هذا الكتي ب البسيط.. أرجوا من اهلل أن يكتب أجره في ميزان حسناتنا. دعواتكم لنا بظهر الغيب.. أخوكم عبدالهادي. Abdelhadi @nodekits االميل: nodekits@gmail.com 19