Форум программистов, компьютерный форум, киберфорум
Наши страницы
Basic
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Catstail
Модератор
24462 / 12398 / 2253
Регистрация: 12.02.2012
Сообщений: 20,127
1

Осваиваю (ем) FreeBasic

15.12.2015, 18:26. Просмотров 3633. Ответов 54
Метки нет (Все метки)

Решил больше не тянуть, а приступить сегодня. Если тема будет актуальна - возможно модераторы раздела ее (тему) как-нибудь оформят.

Итак:

Резоны:

1) полностью свободный мультиплатформенный продукт;
2) люблю Бэйсик (современный, естественно)


Что интересовало в первую очередь:

1) установка и настройка
2) возможности и особенности языка
3) производительность (по ср. с VB6)
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2015, 18:26
Ответы с готовыми решениями:

FreeBASIC
Заметил, что уже имеющиеся на форуме темы в разделах: - QBasic - Visual Basic - VBA - Pure...

FreeBASIC и сети
Здравствуй, форум. Всё дело в том, что есть одни сетевые функции, и для этих функций Я решил...

Графика FreeBasic
Приветствую всех cyber-форумчан!:) Несмотря на наличие графического треда в младшем разделе,...

Немного о FreeBasic
Чаще всего при начальном использовании какого-то языка , люди стараются выбрать простую,...

FreeBasic круги на воде
Очень интересный код имитирующий распространение кругов на воде. Описание алгоритма тут Что меня...

54
Catstail
Модератор
24462 / 12398 / 2253
Регистрация: 12.02.2012
Сообщений: 20,127
15.12.2015, 19:00  [ТС] 2
Приступаю...

Скачал последний релиз компилятора с http://free-basic.ru/download.html (у меня 32-х битная XP, поэтому скачал 32-х битную версию, хотя есть и 64-х битная.
Размер ~ 10Mб

Распаковал упаковку в папку D:\FreeBASIC-1.04.0-win32 (получилось порядка 130 Мб)

Сразу же захотел установить IDE. По рекомендации одного из участников, скачал его отсюда. В упаковке 1.3 Мб
Создал в папке D:\FreeBASIC-1.04.0-win32 подпапку FireFly и распаковал IDE в нее. IDE никакой инсталляции не требует (что приятно). Запустил IDE (FireFly37.exe) и указал путь к 32-х битному компилятору.

Теперь создаем проект... Создается проект типа win32-gui (причем изменить тип не получается). Возможно, это проблема IDE. Но идем дальше. Открывается собственно IDE (см. картнку). Ну, что же... Выглядит совсем неплохо!
0
Миниатюры
Осваиваю (ем) FreeBasic  
Catstail
Модератор
24462 / 12398 / 2253
Регистрация: 12.02.2012
Сообщений: 20,127
15.12.2015, 19:03  [ТС] 3
Хочу, естественно, добавить кнопку на форму. Выбираю закладку Tools... Ого! Палитра впечатляет:
0
Миниатюры
Осваиваю (ем) FreeBasic  
Catstail
Модератор
24462 / 12398 / 2253
Регистрация: 12.02.2012
Сообщений: 20,127
15.12.2015, 19:08  [ТС] 4
Сажаю кнопку на форму. Все просто и естественно. Кстати, и русские буквы поддерживаются. Очень удобно оформлен выбор стиля окна (наличие кнопок минимизации, распахивания и т.п.):
0
Миниатюры
Осваиваю (ем) FreeBasic  
15.12.2015, 19:08
Catstail
Модератор
24462 / 12398 / 2253
Регистрация: 12.02.2012
Сообщений: 20,127
15.12.2015, 19:29  [ТС] 5
Что дальше? Назначение события! Путь естественный - двойной клик по соотв. контролу. Открывается окно кода:

Visual Basic
1
2
3
4
5
6
7
8
9
10
'--------------------------------------------------------------------------------
Function FRMMAIN_COMMAND1_BN_CLICKED ( _
                                     ControlIndex     as Integer, _   ' index in Control Array
                                     hWndForm         as HWnd, _      ' handle of Form
                                     hWndControl      as HWnd, _      ' handle of Control
                                     idButtonControl  as Integer   _  ' identifier of button
                                     ) as Integer
 
   Function = 0   ' change according to your needs
End Function
Все разумно. Кстати, отличие в синтаксисе - ключевое слово Function служит псевдопеременной для возврата значения из функции.

Что теперь? Есть несколько типовых задач, которые я обычно реализую в новой незнакомой среде. Давайте сосчитаем сумму последовательных нечетных от 1 до 2n-1. Она должна быть равна n2. Вот и проверим это.

Пишу, как привык в VB

Visual Basic
1
2
3
4
5
    s%=0
    for i%=1 to 100
        s%=s%+2*i%-1
    next i%
    Print s%
Вы спросите: "а КУДА Print"? Терпение... Пробуем скомпилировать, нажав "кубик" на панели инструментов. И налетаем на ошибку: мои любимые суффиксы (%,&,$ и т.п.) просто так не поддерживаются... Ну что же, опишем переменные:

Visual Basic
1
2
3
4
5
6
7
Dim s as integer
Dim i  as integer
    s=0
    for i=1 to 100
        s=s+2*i-1
    next i
    Print s
А кстати, есть известный "прикол" в VB. Вот такая безобидная запись

Visual Basic
1
Dim s,i as integer
синтаксически корректна, но описывает как integer только i (s получит тип variant). А давайте посмотрим, как на это прореагирует FB. Пробуем и убеждаемся, эта запись просто недопустима. Но зато допустимо вот это:

Visual Basic
1
Dim as integer i,s
Здорово! Теперь код компилируется успешно. Если проект мы назвали Project1, то в подпапке FireFly в папке Projects будет создана папка Project2 (а в ней - куча подпапок, в их числе папа release, где лежит экзешник).
Размер его - всего 75 Кб (достаточно скромно!). Запускаем... и видим:
0
Миниатюры
Осваиваю (ем) FreeBasic  
Catstail
Модератор
24462 / 12398 / 2253
Регистрация: 12.02.2012
Сообщений: 20,127
15.12.2015, 19:42  [ТС] 6
Оказывается, что к приложению автоматически подключается консоль. Занятно. Потом будем разбираться, как ее спрятать или отключить. Кстати, в VB сделать консольное приложение не так-то просто...

Что еще не терпится попробовать? Давайте выведем сумму не на консоль, а в диалоговое окно (Msgbox). Сразу же убеждаемся, что этой функции в FB нет - придется использовать настоящую MessageBox:

Visual Basic
1
2
3
4
5
Dim as Integer s,i 
   For i=1 To 100
       s=s+2*i-1
   Next i
   MessageBox( Null, "S=" + Str(s), "Результат:", MB_OK )
0
Изображения
 
Catstail
Модератор
24462 / 12398 / 2253
Регистрация: 12.02.2012
Сообщений: 20,127
15.12.2015, 19:43  [ТС] 7
Что же... Для пробы - неплохо. Позже продолжим!
0
Quiet Snow
4414 / 1312 / 377
Регистрация: 25.04.2010
Сообщений: 3,402
15.12.2015, 22:15 8
мои любимые суффиксы (%,&,$ и т.п.) просто так не поддерживаются...
Тегов на FB нет.

PureBasic
1
'$Lang: "FBLite"
Но это кастрирует диалект, часть функционала становится недоступной. Для VB-шников
не рекомендую. Сам только под лайтом и пишу, мне главное чтобы видел суффикс строки,
остальные не использую и стараюсь декларить всё в начале проги.

Оказывается, что к приложению автоматически подключается консоль
Это консольное приложение. Т.е. консольное приложение и + мы создаём окно, консоль,
естественно никуда не уходит, т.к. весь вывод идёт в неё. Можно дебажить через неё.

Добавлено через 34 минуты
производительность (по ср. с VB6)
Сам то знаю, что он достаточно быстр(портировал тяжёлый по вычислениям проект свыше 3k строк),
но увидеть тесты будет, конечно, занятно.

Все просто и естественно.
А какой конечный код эта IDE генерирует, код который скармливается непосредственно компилятору?
Хотелось бы взглянуть.
0
Pro_grammer
Модератор
6202 / 2284 / 447
Регистрация: 24.04.2011
Сообщений: 4,067
Записей в блоге: 10
15.12.2015, 22:34 9
Цитата Сообщение от Catstail Посмотреть сообщение
Размер его - всего 75 Кб (достаточно скромно!).
Не то слово.
Поковырялся в исходниках, тихий ужас, кошмар Бейсик программиста
Создается 6 файлов с кодом и тот, к написанию которого мы приложили руку, похоже этот
( Далее был код на 24 000 символов(!), но его не пропустил редактор форума по объему

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
'------------------------------------------------------------------------------
' FORM1 Auto-Generated FireFly Functions
'------------------------------------------------------------------------------
FUNCTION FORM1_Show( BYVAL hWndParent AS HWND, _
                             BYVAL ShowModalFlag AS INTEGER, _
                             BYVAL UserData AS INTEGER = 0 _
                             )  AS HWND
    DIM szClassName     AS zString * MAX_PATH
    DIM wce             AS WndClassEx
    DIM FLY_nLeft       AS INTEGER 
    DIM FLY_nTop        AS INTEGER
    DIM FLY_nWidth      AS INTEGER
    DIM FLY_nHeight     AS INTEGER           
    DIM hWndForm        AS HWND
    DIM IsMDIForm       AS INTEGER
    STATIC IsInitialized  AS INTEGER
    'Determine if the Class already exists. If it does not, then create the class.
     szClassName       = "FORM_PROJECT1_FORM1_CLASS"
    
    wce.cbSize        = SizeOf(wce)
 
    IsInitialized = GetClassInfoEx( App.hInstance, szClassName, VARPTR(wce) )
    
    IF IsInitialized = 0 THEN
        wce.cbSize        = SizeOf(wce)
        wce.STYLE         = CS_VREDRAW OR CS_HREDRAW OR CS_DBLCLKS
        wce.lpfnWndProc   = Cast(WNDPROC, @FORM1_FORMPROCEDURE)
        wce.cbClsExtra    = 0
        wce.cbWndExtra    = 0
        wce.hInstance     = App.hInstance
        wce.hIcon         = LoadIcon( App.hInstance, BYVAL IDI_APPLICATION ) 
        wce.hCursor       = LoadCursor( 0, BYVAL IDC_ARROW )
        wce.hbrBackground = Cast(HBRUSH, COLOR_BTNFACE + 1)
        wce.lpszMenuName  = 0
        wce.lpszClassName = VARPTR( szClassName )
        wce.hIconSm       = LoadIcon( App.hInstance, BYVAL IDI_APPLICATION )
    
        IF RegisterClassEx(VARPTR(wce)) THEN IsInitialized = TRUE         
    END IF  
    
 
    ' // Set the flag if this is an MDI form we are creating
    IsMDIForm = FALSE
 
    ' // Save the optional UserData to be checked in the Form Procedure CREATE message
    App.ReturnValue = UserData
 
    ' Set the size/positioning of the window about to be created
    FLY_nLeft  = afxScaleX(0):  FLY_nTop    = afxScaleY(0)
    FLY_nWidth = afxScaleX(500): FLY_nHeight = afxScaleY(310)
 
    ' Form is to be centered, therefore make the necessary adjustment
    FLY_nLeft = (GetSystemMetrics( SM_CXSCREEN ) - FLY_nWidth) \ 2
    FLY_nTop  = (GetSystemMetrics( SM_CYSCREEN ) - FLY_nHeight) \ 2
 
    ' Create a window using the registered class
    hWndForm = CreateWindowEx( WS_EX_WINDOWEDGE OR WS_EX_CONTROLPARENT _
                                  OR WS_EX_LEFT OR WS_EX_LTRREADING OR WS_EX_RIGHTSCROLLBAR _
                                 , _
                               szClassName, _       ' window class name
                               "Form1", _       ' window caption
                               WS_POPUP OR WS_THICKFRAME OR WS_CAPTION OR WS_SYSMENU _
                                  OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX OR WS_CLIPSIBLINGS _
                                  OR WS_CLIPCHILDREN , _
                               FLY_nLeft, FLY_nTop, FLY_nWidth, FLY_nHeight, _ 
                               hwndParent, _                  ' parent window handle
                               Cast(HMENU, Null), _    ' window menu handle/child identifier
                               App.hInstance, _               ' program instance handle
                               BYVAL Cast(LPVOID,UserData) )                      
    
    IF IsWindow(hWndForm) = 0 THEN 
       FUNCTION = 0: EXIT FUNCTION
    END IF
 
   
    
    
    
    FUNCTION = FLY_DoMessagePump( ShowModalFlag, hWndForm, hWndParent, SW_SHOWNORMAL, IsMDIForm )
 
    
    
END FUNCTION
 
 
 
'------------------------------------------------------------------------------
' Create all child controls for FORM1 
'------------------------------------------------------------------------------
SUB FORM1_CreateControls( BYVAL hWndForm AS HWND ) 
                                                    
   ' All of the child controls for the FORM1 form are
   ' created in this subroutine. This subroutine is called
   ' from the WM_CREATE message of the form.
    
    DIM FLY_zTempString AS zString * MAX_PATH
 
    DIM FLY_hPicture    AS HANDLE
    DIM hWndControl     AS HWND
    DIM FLY_ScrollInfo  AS ScrollInfo
    DIM FLY_TBstring    AS STRING
    DIM FLY_Notify      AS NMHDR    
    DIM FLY_ImageListNormal AS HANDLE, FLY_ImageListDisabled AS HANDLE, FLY_ImageListHot AS HANDLE
 
    DIM FLY_hStatusBar   AS HWND, FLY_hRebar  AS HWND, FLY_hToolBar AS HWND
    DIM FLY_tempInteger  AS INTEGER, FLY_hFont   AS HFONT, FLY_hIcon    AS HICON
    DIM FLY_hMemDC       AS HDC, FLY_ImageIndex  AS INTEGER
    DIM FLY_ClientOffset AS INTEGER  
 
    DIM FLY_RECT         AS Rect  
    DIM FLY_TabRect      AS Rect  
    
    DIM FLY_TCITEM       AS TC_ITEM
    DIM uVersion         AS OSVERSIONINFO
    DIM DateRange(1)     AS SYSTEMTIME
    
         
    DIM ff               AS FLY_DATA Ptr 
    DIM FLY_child        AS FLY_DATA Ptr 
    DIM FLY_parent       AS FLY_DATA Ptr 
 
    FLY_parent = GetProp( hWndForm, "FLY_PTR" )
 
                                  
 
    '------------------------------------------------------------------------------
    ' Create COMMAND1  [CommandButton] control.
    '------------------------------------------------------------------------------
    hWndControl = CreateWindowEx( WS_EX_LEFT OR WS_EX_LTRREADING, _
                                  "Button", _  
                                  "Жми меня!", _ 
                                  WS_CHILD OR WS_VISIBLE OR WS_TABSTOP OR BS_TEXT _
                                  OR BS_PUSHBUTTON OR BS_NOTIFY OR BS_CENTER OR BS_VCENTER _
                                 , _
                                  afxScaleX(128), afxScaleY(FLY_ClientOffset + 184), _
                                  afxScaleX(212), afxScaleY(55), _ 
                                  hWndForm, Cast(HMENU, IDC_FORM1_COMMAND1), _
                                  App.hInstance, BYVAL 0 )
    
    ff = FLY_SetControlData( hWndControl, TRUE, TRUE, _
                      "Tahoma,9,0", 0, FALSE, _
                      FALSE, FALSE, 0, _
                      0, -1, Cast(WNDPROC, @FORM1_CODEPROCEDURE), _
                      "", FALSE )
 
    ' If this control has a ToolTip specified then set it now
    FLY_zTempString = ""
    IF LEN(FLY_zTempString) THEN
       FF_AddToolTip hWndControl, FLY_zTempString, FALSE
    END IF   
 
    ' Set the Tag properties for the Control
    FF_Control_SetTag hWndControl, ""
    FF_Control_SetTag2 hWndControl, ""
     
    HWND_FORM1_COMMAND1 = hWndControl
 
 
 
 
                    
 
    ' Set focus to the lowest control in the Tab Order
    SetFocus HWND_FORM1_COMMAND1    
    
END SUB                                                    
................................... Что то вырезал....................................................
         
         ' Unsublass the Control 
         IF ff THEN
          
             ' Delete the brushes used for this Control 
             IF ff->hBackBrush THEN DeleteObject(Cast(HGDIOBJ, ff->hBackBrush))
             
             FLY_ProcAddress = ff->OldProc 
 
             ' Re-claim the memory used by the type structure
             IF ff THEN HeapFree(GetProcessHeap(), 0, BYVAL Cast(PVOID,ff))
             RemoveProp hWndControl, "FLY_PTR"
             
             ' Remove the properties holding the Tag property strings.
             FLY_tempInteger = Cast(INTEGER,GetProp(hWndControl, "FLY_TAGPROPERTY"))
             IF FLY_tempInteger THEN
                HeapFree GetProcessHeap(), 0, BYVAL Cast(PVOID,FLY_tempInteger)
                RemoveProp hWndControl, "FLY_TAGPROPERTY"
             END IF
             FLY_tempInteger = Cast(INTEGER,GetProp(hWndControl, "FLY_TAGPROPERTY2"))
             IF FLY_tempInteger THEN
                HeapFree GetProcessHeap(), 0, BYVAL Cast(PVOID,FLY_tempInteger)
                RemoveProp hWndControl, "FLY_TAGPROPERTY2"
             END IF
 
             DeleteObject ff->hFont
             
             ' Allow the WM_DESTROY message to be processed by the control.
             SetWindowLongPtr hWndControl, GWLP_WNDPROC, Cast(uInteger,FLY_ProcAddress)
             CallWindowProc Cast(WNDPROC,FLY_ProcAddress), hWndControl, wMsg, wParam, lParam
 
         END IF
         
         FUNCTION = 0: EXIT FUNCTION
      
 
 
 
 
      CASE WM_SETFOCUS                                                          
         ' If this is a TextBox, we check to see if we need to highlight the text.
         IF ff THEN
            IF ff->SelText THEN 
               SendMessage hWndControl, EM_SETSEL, 0, -1
            ELSE
               SendMessage hWndControl, EM_SETSEL, -1, 0
            END IF   
         END IF
         
         ' Store the focus control in the parent form
         ' If this Form is a TabControl child Form then we need to store the CtrlFocus
         ' in the parent of this child Form.
         FLY_nResult = GetWindowLongPtr(GetParent(hWndControl), GWL_STYLE)
         IF (FLY_nResult AND WS_CHILD) = WS_CHILD THEN
            ' must be a TabControl child dialog
            FLY_parent = GetProp(GetParent(GetParent(hWndControl)), "FLY_PTR")
         ELSE   
            FLY_parent = GetProp(GetParent(hWndControl), "FLY_PTR")
         END IF   
         IF FLY_parent THEN FLY_parent->CtrlFocus = hWndControl
        
 
      CASE WM_SIZE, WM_MOVE
         ' Handle any TabControl child pages that are autosize. If the TabControl changes
         ' size then it is caught here. We only need to deal with TabControlChildAutoSize
         ' forms because other forms stay at the fixed size.    
 
       
    END SELECT
       
  
    ' The following case calls each user defined function.
    SELECT CASE wMsg
 
       CASE 0
      
    END SELECT
  
    ' Handle any custom messages if necessary.
 
  
    ' This control is subclassed, therefore we must send all unprocessed messages
    ' to the original window procedure. 
    FUNCTION = CallWindowProc( ff->OldProc, hWndControl, wMsg, wParam, lParam )
 
END FUNCTION
 
 
 
 
'--------------------------------------------------------------------------------
FUNCTION FORM1_COMMAND1_BN_CLICKED ( _
                                   ControlIndex     AS INTEGER, _   ' index in Control Array
                                   hWndForm         AS HWnd, _      ' handle of Form
                                   hWndControl      AS HWnd, _      ' handle of Control
                                   idButtonControl  AS INTEGER   _  ' identifier of button
                                   ) AS INTEGER
MessageBox(0,"","Привет!",MB_OK)
   FUNCTION = 0   ' change according to your needs
END FUNCTION
Собственно из всего моя только 1 строчка
MessageBox(0,"","Привет!",MB_OK)

В остальных 5 файлах код ещё не понятнее и больше...

Так чисто для сравнения, код, который генерируется визуальным редактором (тоже сторонним) PureBasic:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
If OpenWindow(0, 467, 152, 458, 208, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ButtonGadget(0, 110, 95, 220, 45, "Нажми меня!")
 Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = 0
          MessageRequester("Hi","Привет!")
      EndIf
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = 0
        CloseWindow(0)
        Break
      EndIf
  EndSelect
ForEver
EndIf
Эти 20 строчек делают то, что во FB 6 файлов кода! Этот код будет работать и компилироваться не только в Винде, но и в Linux, Mac OS без какой либо переделки.
1
locm
15.12.2015, 22:55
  #10

Не по теме:

Цитата Сообщение от Pro_grammer Посмотреть сообщение
Поковырялся в исходниках
Это плата за "программирование мышкой".

Некоторое время назад, тестировал визуальный редактор форм для PB, чем-то похожий на рассмотренный. С точки зрения "программирования мышкой" все ОК, но пустая форма содержит больше 500 строк кода!

0
vlisp
528 / 501 / 115
Регистрация: 10.08.2015
Сообщений: 1,851
Завершенные тесты: 1
16.12.2015, 00:04 11
Цитата Сообщение от Pro_grammer Посмотреть сообщение
тихий ужас, кошмар Бейсик программиста
Это обыкновенное winapi, то что программист написал бы ручками без IDE. То же самое делают все IDE от лазаря до MS Visual Studio.
2
The trick
Модератор
7746 / 2762 / 771
Регистрация: 22.02.2013
Сообщений: 3,911
Записей в блоге: 77
16.12.2015, 00:07 12
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Эти 20 строчек делают то, что во FB 6 файлов кода! Этот код будет работать и компилироваться не только в Винде, но и в Linux, Mac OS без какой либо переделки.
Ну я думаю во втором случае имеем место с PB рантаймом, а как я вижу FB использует чистый WinAPI. Если раскрыть все эти функции OpenWindow, ButtonGadget, etc. это раздует код точно также. Вроде бы ничего лишнего нет (если учитывать что это сгенерированный код и здесь не полный листинг) - создание окна, обработчик.
Это все мои предположения, т.к. ни того ни другого бейсика не имею. Если бы я делал что-то подобное на C++ или VB6 также бы поступил (имею ввиду программное создание форм, обработчиков исключая рантайм).
1
Pro_grammer
Модератор
6202 / 2284 / 447
Регистрация: 24.04.2011
Сообщений: 4,067
Записей в блоге: 10
16.12.2015, 08:11 13
Цитата Сообщение от The trick Посмотреть сообщение
во втором случае имеем место с PB рантаймом
Экзешник работает самостоятельно, да ты и сам знаешь это, проверял же не раз, когда сравнивали скорость работы VB6 и Пурика.
Цитата Сообщение от The trick Посмотреть сообщение
Если бы я делал что-то подобное на C++ или VB6 также бы поступил (имею ввиду программное создание форм, обработчиков исключая рантайм).
В этом и прелесть Пурика, как представителя Basic - скрывать от программиста тонкости и подробности ОС. Для этого и существует правильный транслятор. Т.е. я написал OpenWindow, а транслятор в листинг Ассемблере подробно всё расписал на API той системы, где я программирую (а не только на Win API). Убиваем 2-х зайцев - простота программирования и кроссплатформенность. Опять же, если мне надо, то я могу тот же код сам и на WIN API написать, точно так же как на С++ к примеру. И будет работать. Т.е. Ни кто не отменяет свободу выбора!
Я уже где то писал, что проще выучить сразу C++, чем тратить время на FB. Все примеры и описания хидеров в любых серьёзных источниках выдаются для Си, т.е. мы должны брать кальку с СИ, переносить на FB делать лишнюю работу и в итоге получить такой же результат + подобный код. В чем смысл, если нет простоты Basic и надо изучать хоть и косвенно С++?

P.s. Справедливости ради надо заметить, что С. Будинов написал либу Window9 - на данный момент в библиотеке уже более 500 функций. Все они чуть менее чем полностью повторяют функционал PureBasic. Т.е. Будинов понял правильность подхода и в результате теперь надо учить не С++, а Пурик Библиотека во многом совместима, примитивные приложения написанные на Пурике можно даже скомпилировать в FB с минимальными переделками.
Но опять же только для Винды, другие ОС не поддерживаются.
Вот тоже окно с кнопкой с ипользованием либы
PureBasic
1
2
3
4
5
6
7
8
9
10
#Include "window9.bi"
Dim As integer hwnd,but,event
hwnd=OpenWindow("1",300,10,100,100)
ButtonGadget(1,10,10,60,30,"button")
 
Do
 event=WaitEvent()
 If event=EventClose Then End
 If event=eventgadget Then MessBox("Сообщение","Это кнопка")
Loop
Осваиваю (ем) FreeBasic


Видите, что оно уже приняло "человеческий вид", стало похоже на нормальный Basic? Где же Ваши тысячи строк "необходимого кода"? Рантайма тоже нет, скажу на всякий случай.Правда, 120 Кб exe, немного больше, чем PB и VB6, но приемлемо.
Спасибо, что есть такие энтузиасты, как Будинов...
2
The trick
Модератор
7746 / 2762 / 771
Регистрация: 22.02.2013
Сообщений: 3,911
Записей в блоге: 77
16.12.2015, 09:11 14
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Экзешник работает самостоятельно, да ты и сам знаешь это, проверял же не раз, когда сравнивали скорость работы VB6 и Пурика.
А я разве где-то утверждал обратное?
Цитата Сообщение от Pro_grammer Посмотреть сообщение
В этом и прелесть Пурика, как представителя Basic - скрывать от программиста тонкости и подробности ОС. Для этого и существует правильный транслятор. Т.е. я написал OpenWindow, а транслятор в листинг Ассемблере подробно всё расписал на API той системы, где я программирую (а не только на Win API).
Ну в случае Catstail'а тот же листинг только не на ассемблере, а на самом бейсике. Как я понял эта IDE заточена только под Windows поэтому спорить о кроссплатформенности тут бессмысленно; код обработчиков идет отдельным файлом (если нет то это уже неудобство). В нашем случае это проблема не FB, а IDE (разработчики IDE, могли бы также сделать переходные функции вроде OpenWindow, которые заменялись в соответствии с платформой). Опять-таки это мои предположения, в соседней теме говорили что для него существует куча либ.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Я уже где то писал, что проще выучить сразу C++, чем тратить время на FB. Все примеры и описания хидеров в любых серьёзных источниках выдаются для Си, т.е. мы должны брать кальку с СИ, переносить на FB делать лишнюю работу и в итоге получить такой же результат + подобный код. В чем смысл, если нет простоты Basic и надо изучать хоть и косвенно С++?
Почему проще? В данном случае ты просто кликаешь по контролу и создается обработчик, тебе ничего не нужно знать о работе ОС, ты просто пишешь обработчик.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Видите, что оно уже приняло "человеческий вид", стало похоже на нормальный Basic? Где же Ваши тысячи строк "необходимого кода"? Рантайма тоже нет, скажу на всякий случай.
Как нет рантайма? Как раз мы тут и наблюдаем рантайм - WinEvent, EventClose. Раскрой все эти функции - получишь тоже самое.
1
Pro_grammer
Модератор
6202 / 2284 / 447
Регистрация: 24.04.2011
Сообщений: 4,067
Записей в блоге: 10
16.12.2015, 09:55 15
Цитата Сообщение от The trick Посмотреть сообщение
В данном случае ты просто кликаешь по контролу и создается обработчик, тебе ничего не нужно знать о работе ОС, ты просто пишешь обработчик.
Я не говорю о конкретном IDE, нет смысла его обсуждать т.к. сегодня есть, а завтра?
А завтра сменили версию FB, поменяли что то в синтаксисе, перестал работать этот IDE, разработчику его стало неинтересно, ну или просто помер.
И опять руками писать все эти килотонны кода, для того, что бы просто кнопку на форму положить? А что бы их написать надо Api OS изучить? А все примеры на Си? А зачем тогда FB?
Нет, я считаю, что если IDE, то он должен быть неотъемлемой частью как в VisualStudio, и т.п. систем. Там я действительно не задумываюсь о банальном коде написания окна с кнопкой, а сосредоточен только на самой программе.
А если руками, как в FB, то упростите все рутинные операции до минимума, иначе это не Basic, а совсем другой язык.

Добавлено через 9 минут
Цитата Сообщение от The trick Посмотреть сообщение
Как нет рантайма? Как раз мы тут и наблюдаем рантайм
В моем понимании это среда окружения, необходимая для выполнения компьютерной программы и доступная во время выполнения компьютерной программы. К примеру для VB6 это MSVBVM60, без которого работать программы написанные в среде VB6 на будут ( твоё видел, но с этим заморачиваться в реалиях не станет никто). У FB и PB такой зависимости нет. Ты же ни считаешь рантаймом системные библиотеки? Иначе тогда все современные программы не работают без них.
0
The trick
Модератор
7746 / 2762 / 771
Регистрация: 22.02.2013
Сообщений: 3,911
Записей в блоге: 77
16.12.2015, 09:59 16
Цитата Сообщение от Pro_grammer Посмотреть сообщение
И опять руками писать все эти килотонны кода, для того, что бы просто кнопку на форму положить?
Так для этого есть библиотеки, ты же сам писал про либу Window9. Используй их. Повторюсь это проблема IDE, если кто-нибудь выпустит IDE со статическими либами (если FB поддерживает статическую линковку) то и проблемы "километрового кода" не будет, она будет уже просто скомпилирована, при чем для каждой ОС.

Добавлено через 2 минуты
Цитата Сообщение от Pro_grammer Посмотреть сообщение
В моем понимании это среда окружения, необходимая для выполнения компьютерной программы и доступная во время выполнения компьютерной программы. К примеру для VB6 это MSVBVM60, без которого работать программы написанные в среде VB6 на будут ( твоё видел, но с этим заморачиваться в реалиях не станет никто). У FB и PB такой зависимости нет. Ты же ни считаешь рантаймом системные библиотеки? Иначе тогда все современные программы не работают без них.
Ну рантайм есть, просто он прилинкован статически, т.е. он находится (частями или полностью) внутри EXE после компиляции.
0
Pro_grammer
Модератор
6202 / 2284 / 447
Регистрация: 24.04.2011
Сообщений: 4,067
Записей в блоге: 10
16.12.2015, 10:09 17
Цитата Сообщение от The trick Посмотреть сообщение
Так для этого есть библиотеки, ты же сам писал про либу Window9.
Библиотеки на уровне официального FB это одно. На уровне гениального одиночки это другое. Как доверять этому языку серьёзный проект, если завтра пропадет Будинов с его либой, ну вот обидится, сотрет все линки ( кстати, исходники уже недоступны).
Да и не Виндовс единым, под Линь нет такой либы, API Linux его я не знаю( как и многие в этой ветке), как быть?

Добавлено через 6 минут
Цитата Сообщение от The trick Посмотреть сообщение
росто он прилинкован статически, т.е. он находится (частями или полностью) внутри EXE после компиляции.
Так можно сказать про все исполняемые файлы.
К примеру в Делфи exe 350 - 500 Кб, С++ 50 Кб, в PB та же функциональность 5 Кб. Ну и у кого что там прилинковано? Где файл, который ни чего к себе не прилинковал?
0
The trick
Модератор
7746 / 2762 / 771
Регистрация: 22.02.2013
Сообщений: 3,911
Записей в блоге: 77
16.12.2015, 11:40 18
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Библиотеки на уровне официального FB это одно. На уровне гениального одиночки это другое. Как доверять этому языку серьёзный проект, если завтра пропадет Будинов с его либой, ну вот обидится, сотрет все линки ( кстати, исходники уже недоступны).
Так можно сказать о любом расширении, хотя многие ими пользуются. Тоже можно сказать о COM и ActiveX.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Да и не Виндовс единым, под Линь нет такой либы, API Linux его я не знаю( как и многие в этой ветке), как быть?
Либо искать кроссплатформенные библиотеки, либо их писать самому. Если существует какая-либо кроссплатформенная IDE под FB то это будет решено на уровне деректив компиляции я так думаю. Данная IDE только для Windows, поэтому она и генерирует такой код. Для всех версий Windows этот код будет работать без проблем. Если хочешь писать под Linux ищи соответствующую IDE с соответствующими библиотеками. В PB конечно более удобно сделано, не спорю, а то что это все стандартные библиотеки это еще большой плюс.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Так можно сказать про все исполняемые файлы.
Нет.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
К примеру в Делфи exe 350 - 500 Кб, С++ 50 Кб, в PB та же функциональность 5 Кб.
А при другом функционале PB может иметь бОльший объем.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ну и у кого что там прилинковано? Где файл, который ни чего к себе не прилинковал?
А ты думаешь 5кб это мало для такого кода? Ты видимо полагаешь что у тебя exe начинает работать с первой инструкции в исходном коде? Скинь EXE, я тебе покажу где там что прилинковано. Создать окно и обработать кнопку можно и в 1 кб уместить я думаю.
0
eugene4
12 / 4 / 0
Регистрация: 15.11.2015
Сообщений: 56
16.12.2015, 12:37 19
Понимаю, что не по теме,
но ни могу не поздравить и не поблагодарить уважаемого Catstail с отчетом по проделанной работе!

Надоедать присутствием не стану...
0
Pro_grammer
Модератор
6202 / 2284 / 447
Регистрация: 24.04.2011
Сообщений: 4,067
Записей в блоге: 10
16.12.2015, 13:35 20
Цитата Сообщение от The trick Посмотреть сообщение
Создать окно и обработать кнопку можно и в 1 кб уместить я думаю.
Можно, FASM умещает. Если поколдовать с линковкой то и Пурик уместит. Но кому это надо?
Но твои рассуждения о "прилинковке" в исполняемый файл ни как не совпадают с моими понятиями о рантайме.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
В моем понимании это среда окружения, необходимая для выполнения компьютерной программы и доступная во время выполнения компьютерной программы. К примеру для VB6 это MSVBVM60
Все компиляторы используют либы системы, это естественно, но не все требуют постоянного присутствия не системных библиотек, типа MSVBVM60. Или к примеру GCC - компиляция C/C++, там этих либ наберётся ни один мегабайт! Вот это рантайм.

Но и снова разговор ни о том. Разговор о том, что FreeBasic для программирования современных приложений крайне неудобен "из коробки". Без неких сторонних либ, которые держатся на голом энтузиазме, написать что то сложное очень трудно, порог вхождения начинающего программиста высок и сопоставим с изучением C++.
Видимо от сюда и его низкая популярность в среде обучающих Бейсиков, несмотря на его бесплатность и открытость.
0
16.12.2015, 13:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2015, 13:35

Задача на графику в FreeBASIC
Помогите с задача по графике в FreeBASIC Построить совокупность n равных отрезков, центры которых...

FreeBasic. MyFbFramework + VisualFBEditor
Начал новый фреймворк для FreeBasic: MyFbFramework И редактор для него: VisualFBEditor Файлы...

Синтаксические особенности FreeBasic
По совету Stabud создаю тему, в которой будем обсуждать семантику и синтаксис диалекта FreeBasic....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru