Размышления о Bool
· 2 минут чтения
Во многих языках есть тип bool. Я думаю что если бы все эти языки от него отказались в пользу скажем integer было бы проще жить. В том числе самим языкам.
LUA
> 1 == 1
true
> if 1 == 1 then
>> print 'ok'
>> end
ok
> if 1 then
>> print 'ok'
>> end
ok
> if 1 == true then
>> print 'ok'
>> else print 'fail'
>> end
fail
>
> if 0 then print('ok') end
ok
то есть видно что
- в выражениях по месту имеется неявное
приведение
number
кbool
(и оно странное –0
означаетfalse
). - явное же использование
number
иbool
дает неверный результат (отличный от неявного)
Python
>>> if 2: print('ok')
...
ok
>>> if True: print('ok')
...
ok
>>> if 2 == True: print('ok')
...
>>>
- Поведение совпадает с ожидаемым только
если
number
равен1
- В условных выражениях вычисление
bool
в Python совпадает с традиционным
С++
#include <iostream>
int main(void) {
std::cout << "2 == true...";
if (2 == true)
std::cout << "ok\n";
else
std::cout << "failed\n";
std::cout << (true == 2) << "\n";
}
C++ ведет себя так же как python. Но дополнительно имеет
интересный артефакт: true == 2
, true
, false
вводом-выводом как числа, а не bool
.
Теперь о хранении:
- В скриптовых языках любое значение хранится в некоей структуре, описывающей скаляр
- В наиболее распространенных языках Python, PHP, JS, итп
sizeof
структуры описывающей скаляр с интом и структуры описывающей скаляр сbool
не имеют различий - В языках вроде C++ часто пользуются
sizeof(bool) == sizeof(int)
, поскольку обычный процессор наиболее эффективно работает именно с этимsizeof
.
Итого
- Большинство языков, включающих в себя
bool
имеют две реализацииbool
- контекстную (выражения внутриif
,for
итп) и основную (прямая работа сbool
). - Поведения реализаций
bool
различаются зачастую даже в рамках одного языка. - Если упор делается на эффективность (скорость) кода, то обычно
выставляют
sizeof(bool) == sizeof(int)
. - В скриптовых языках правило
sizeof(bool) == sizeof(int)
выполняется практически всегда (не встречал обратного случая).
Вывод: Внедрение bool
в языки в большинстве случаев сделано непонятно
с какой целью. Профитов это внедрение не принесло, зато вот разглядывая
код на JS, Python, Perl итп, работающий с сериализацией и bool
вижу
огромное количество кода, написанного только ради поддержки этого самого
bool
. Выкидывание bool
из проекта как правило дает уменьшение
размера кодовой базы и увеличение быстродействия.