Var & Dim - что лучше?

Предыдущая тема Следующая тема Перейти вниз

Var & Dim - что лучше?

Сообщение  Vadim Weinberg в Вс Окт 17, 2010 12:38 am

Помогите разобраться с Dim и новым (с 0.17 версии) Var.

Такое впечатление, что Var - Это усечённый Dim но более "благозвучный" или "модный"(из Pascal).
Может есть скрытые приемущества в использовании Var.

Я выяснил, что
VAR.BAS
Код:

Var a =10
Print a
Sleep
DIM.BAS
Код:

Dim As Integer a =10
Print a
Sleep
делают одно и то-же. Создают одинаковый .ASM файл, но с Dim немного быстрее,
что вполне понятно, т.к. Компилятору не надо разбираться:
"А кто это у нас такой 'a'? Кем он хочет стать? Может он хочет стать String'ом или Longint'ом?
Да нет, 'a' хочет стать 10. Скромнинко так. Можно конечно Byte'ом или Short'ом сделать, ну да ладно,
пускай будет Integer'ом!"

ОДНАКО!
Создаю дав совершенно сумашедших файла:
VAR1.BAS
Код:

Var a1=666
Var a2=666
Var a3=666
............
Var a1000=666
DIM1.BAS
Код:

Dim As Integer a1=666
Dim As Integer a2=666
Dim As Integer a3=666
.............
Dim As Integer a1000=666
VAR1.BAS ассемблируется (наверно правильный термин) в 1,4 раза быстрее.
Может потому, что DIM1.BAS примерно в 1,7 раза больше. 24895 байт по сравнению с 13895 у VAR1.BAS.

Вобщем, стоит ли использовать Var? И когда?

P.S. В VB.NET Var нет.

Vadim Weinberg

Сообщения : 18
Дата регистрации : 2010-07-08
Возраст : 52
Откуда : СПб

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Var & Dim - что лучше?

Сообщение  VerhoLom в Пн Окт 18, 2010 1:51 pm

ФБ сам по себе - это транслятор вв Ассемблер (ГАС) - потому термин правильный!
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Var & Dim - что лучше?

Сообщение  electrik в Вт Окт 19, 2010 11:27 pm

по ассемблеровскому листингу, получается одинаково.
по мне, надо объявлять явные типы переменным:
dim a as single
dim b as integer.
просто, в var'ах, потом можно запутаться, хотя, можно смотреть на число туда запиханное.
конечно, такая конструкция проассемблируется одинаково:
dim c as integer = 0
Var c  = Cast(Integer, 0)
по логике, var выглядит логичней, переменная = такому то типу с таким-то значением.,
а вот поповоду скорости компиляции, ну если нужно компилить 50 мегабайтный проект, и скорость важна, тут я даже не эксперементировал, что быстрее компилится var или dim. точно скажу, что в бинарнике переменные такого типа одинаковы.
я пользуюсь dim'ом, так вродь привычней.
хотя для понимания кода, можно dim использовать для массивов и строк, а вар для числовых переменных.
только совет, если все-же хотите пользоваться вар, приводите его к явному типу.
Var c = Cast(Integer, 0)
var pMyy = cast(integer ptr,0)
по поводу нулей, вы спросите:
а нафиг мне обнулять переменную, лишние затраты.
скажу по секрету, если вы создаете переменную при помощи dim, и не присваиваете ей значение, компилятор FreeBasic сам ее обнуляет.
dim q as integer
print q
выведет 0
кстати, в c или c++ так не прокатит, там программер сам должен обнулять, если ему надо.
там создаешь переменную, и в ней может быть мусор.
зачем так сделано во FreeBasic.
я думаю, защита от дурака, чтоб проблем лишних не было.
даже, если в нутри функции создаешь массив, он все-равно обнуляется.
я когда-то писал что это не так, вот недавно проверил, действительно обнуляется.
так, что если вы создаете массив в нутри функции, скажем в 64 кб, при каждом запуске функции, массив обнуляется, а потом только начинает работать функция.
можно не расстраиваться, это конечно замедляет работу, но на современных машинах- это мало заметно. разработчики FreeBasic, оптимизировали обнуление через ассемблер команды
rep lotsd

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Var & Dim - что лучше?

Сообщение  VerhoLom в Сб Окт 23, 2010 1:53 pm

Я думаю, что ВАР был добавлен для того, чтобы любители бейсика, (такого, как он был много лет назад alien ), могли не объявлять типы переменных - когда-то это была распространенная практика pig pig pig . Да и в большинстве книг по Си bom (тех времен) приводятся примеры интерпретаторов бейсика именно как безтипового языка... Sleep

А явно объявлять типы переменных - это просто хороший стиль программирования flower (я бы сказал - профессиональный). Very Happy study study study
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Var & Dim - что лучше?

Сообщение  Vadim Weinberg в Вс Окт 24, 2010 3:40 am

electrik пишет:
скажу по секрету, если вы создаете переменную при помощи dim, и не присваиваете ей значение, компилятор FreeBasic сам ее обнуляет.
dim q as integer
print q
выведет 0
кстати, в c или c++ так не прокатит, там программер сам должен обнулять, если ему надо.
там создаешь переменную, и в ней может быть мусор.
зачем так сделано во FreeBasic.
я думаю, защита от дурака, чтоб проблем лишних не было.
Согласен, во всех возможных случаях, при создании переменных/массивов надо сразу присваивать значения.
electrik пишет:
зачем так сделано во FreeBasic.
я думаю, защита от дурака, чтоб проблем лишних не было.
Может быть поэтому компилятор FB обзывают "неоптимизирующим".
Не делать бы принудительных обнулений - работал бы быстрее. Но надо защищаться от дурака. Значит - тормозим.

Vadim Weinberg

Сообщения : 18
Дата регистрации : 2010-07-08
Возраст : 52
Откуда : СПб

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Var & Dim - что лучше?

Сообщение  Vadim Weinberg в Вс Окт 24, 2010 3:50 am

VerhoLom пишет:Я думаю, что ВАР был добавлен для того, чтобы любители бейсика, (такого, как он был много лет назад alien ), могли не объявлять типы переменных - когда-то это была распространенная практика pig pig pig . Да и в большинстве книг по Си bom (тех времен) приводятся примеры интерпретаторов бейсика именно как безтипового языка... Sleep

Не отмыться Бейску от безтиповости ранних версий.
Это клеймо навсегда. А жалко.
Не думаю, что разработчиков FB на РЕТРО потянуло.

Vadim Weinberg

Сообщения : 18
Дата регистрации : 2010-07-08
Возраст : 52
Откуда : СПб

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Var & Dim - что лучше?

Сообщение  Vadim Weinberg в Вс Окт 24, 2010 4:01 am

В FreeBASIC-0.21.1-source, в каталоге \tests\dim\ есть три файла: AUTO_VAR.BAS, AUTO_VAR1.BAS и AUTO_VAR2.BAS.

В первом Var используется как в HELP’e, ни чего нового.

А вот два других интереснее. Но, сами программы это не примеры, это тесты. В смысле стиля программирования - просто ужас! Трёхэтажные include объединяют десяток файлов, в которых разбросаны описания структур и функций. Наконец всё окончательно добивают многочисленные Define. То есть, эти программы для проверки способности компилятора.

Оказалось, что Var можно использовать для инициализации элементов структуры, для запуска конструктора(-ров) класса и ещё для чего-то, чего я не понял.

I. ИНИЦИАЛИЗАЦИЯ ЭЛЕМЕНТОВ СТРУКТУРЫ.

Код:

Type T1
   one As Byte
   two As Integer
   three As UInteger
End Type
.
Print "one", "two", "three"   'ЧТОБЫ ПОНЯТНЕЕ ОТОБРАЖАЛОСЬ НА ЭКРАНЕ

Var f1 = Type<T1>( 6 )
Print f1.one, f1.two, f1.three

Var f2 = Type<T1>( 6, 33 )
Print f2.one, f2.two, f2.three

Var f3 = Type<T1>( 6, 33, 222 )
Print f3.one, f3.two, f3.three

'Var f4 = type<bar>( , , 222 )   'А ТАК НЕ ПОЛУЧАЕТСЯ…
Sleep

Ошибка будет и в следующем случае:

Код:

Type T1
   one As Byte=1
   two As Integer
End Type

Var f1 = Type<T1>( 6 )

error 89: No matching overloaded function, T1.constructor() in 'Var f1 = Type<T1>( 6 )

Вроде как T1.constructor() уже сработал, если элемент был определён в структуре.

На мой взгляд, удобный инструмент. Можно использовать. Примерно как Dim для инициализации массивов Dim a(3) as Integer => {1,3,7}, но с некоторыми ограничениями.

II. ЗАПУСК КОНСТРУКТОРА (КОНСТРУКТОРОВ).

Код:

Type T2
   one As Integer
   Declare Constructor()
   Declare Constructor(As Integer)
End Type

Constructor T2()
one = 111
End Constructor

Constructor T2( i As Integer )
one = i
End Constructor
'ПОКА ВСЁ ПОНЯТНО.

Var f1 = T2
Print f1.one   'СРАБОТАЛ КОНСТРУКТОР БЕЗ ПАРАМЕТРОВ.

Dim f2 As T2
Print f2.one   'ТОТ ЖЕ РЕЗУЛЬТАТ С ИСПОЛЬЗОВАНИЕМ Dim’a.

Var f3 = T2(222)
Print f3.one   'СРАБОТАЛ ВТОРОЙ ВАРИАНТ КОНСТРУКТОРА.

Var f4 = Type<T2>(222)
Print f4.one   'АНАЛОГИЧНО ПРЕДЫДУЩЕМУ.
Sleep

Можно ещё сложнее:

Код:

Type T2
   one As Integer
   two As String*40
   Declare Constructor()
   Declare Constructor(As Integer)
   Declare Constructor(As Integer, As Integer)
End Type

Constructor T2()
one = 111
two = "Constructor()"
End Constructor

Constructor T2( i As Integer )
one = i
two = "Constructor(As Integer)"
End Constructor

Constructor T2( i As Integer, ii As Integer )
one = i*ii
two = "Constructor(As Integer, As Integer)"
End Constructor

Var f5 = T2
Print f5.one, f5.two

Var f7 = T2(222)
Print f7.one, f7.two

Var f8 = Type<T2>(666)   'ЕСЛИ В СТРУКТУРЕ ЕСТЬ КОНСТРУКТОР (Class) – ВЫЗЫВАЕТ КОНСТРУКТОР.
'А ЕСЛИ НЕТ КОНСТРУКТОРА  - ТАКАЯ ЗАПИСЬ ИНИЦИАЛИЗИРУЕТ ЭЛЕМЕНТ СТРУКТУРЫ.
Print f8.one, f8.two

Var f88 = Type<T2>(666,1000)
Print f88.one, f88.two

Var f888 = T2(666,1000)
Print f888.one,f888.two

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

III. НЕ ПОНЯЛ ЗАЧЕМ, НЕ ПОНЯЛ КАК, НО РАБОТАЕТ.

Код:

Type MyType
    Declare Constructor (x As Integer, y As Integer)
    m_x As Integer
    m_y As Integer
End Type

Constructor MyType (x As Integer, y As Integer)
    m_x = x
    m_y = y
End Constructor

Function CreateTest () As MyType
    Return MyType(10, 20)
End Function

Var  mt1 = CreateTest()
Print mt1.m_x, mt1.m_y
Sleep

Где такое можно использовать – не представляю.'confused'

Странно, что об этом ни слова в HELP’e, хотя компилятор на такое тестируют.

Vadim Weinberg

Сообщения : 18
Дата регистрации : 2010-07-08
Возраст : 52
Откуда : СПб

Посмотреть профиль

Вернуться к началу Перейти вниз

Добавление Dim & Var

Сообщение  Vadim Weinberg в Вт Окт 26, 2010 4:29 am

Оператор Dim можно использовать для инициализации элементов структуры. (В HELP'e есть)
Код:

Type decart
    x As Double
    y As Integer
End Type

'МОЖНО ИНИЦИАЛИЗИРОВАТЬ НЕ ВСЕ ПЕРЕМЕННЫЕ СТРУКТУРЫ
Dim pixel(0 To 2) As decart => {(1.1, 1), (33)}

For i As Integer=0 To 2
   ? pixel(i).x, pixel(i).y
Next

' МОЖНО ДАЖЕ ТАК. (НЕ МАССИВ).
Dim dot As decart => (2.2,44)
? dot.x,dot.y
Sleep
Если переменным структуры заранее присваивать значения - будет ошибка.
Код:

'В ЭТОМ СЛУЧАЕ , КАК И Var, БУДЕТ ОШИБКА. (ТОЛЬКО КОД ОШИБКИ ДРУГОЙ).
Type female
   breast As Integer=90
   waist As Integer
   hip As Integer
End Type
Dim Masha As female => (90,60,90)
Таким образом, Var существенно отличается от Dim только способностью запускать конструкторы классов.
Все остальные "способности" операторов - пересекаются.
Похоже, чего то не доделали с этим Var, вот он и болтается ненужный.

Vadim Weinberg

Сообщения : 18
Дата регистрации : 2010-07-08
Возраст : 52
Откуда : СПб

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Var & Dim - что лучше?

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения