Размышления о Bool

Во многих языках есть тип 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

то есть видно что

  1. в выражениях по месту имеется неявное приведение number к bool (и оно странное – 0 означает false).
  2. явное же использование number и bool дает неверный результат (отличный от неявного)

Python

>>> if 2: print('ok')
... 
ok
>>> if True: print('ok')
... 
ok
>>> if 2 == True: print('ok')
... 
>>>
  1. Поведение совпадает с ожидаемым только если number равен 1
  2. В условных выражениях вычисление 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.

Теперь о хранении:

  1. В скриптовых языках любое значение хранится в некоей структуре, описывающей скаляр
  2. В наиболее распространенных языках Python, PHP, JS, итп sizeof структуры описывающей скаляр с интом и структуры описывающей скаляр с bool не имеют различий
  3. В языках вроде C++ часто пользуются sizeof(bool) == sizeof(int), поскольку обычный процессор наиболее эффективно работает именно с этим sizeof.

Итого

  1. Большинство языков, включающих в себя bool имеют две реализации bool - контекстную (выражения внутри if, for итп) и основную (прямая работа с bool).
  2. Поведения реализаций bool различаются зачастую даже в рамках одного языка.
  3. Если упор делается на эффективность (скорость) кода, то обычно выставляют sizeof(bool) == sizeof(int).
  4. В скриптовых языках правило sizeof(bool) == sizeof(int) выполняется практически всегда (не встречал обратного случая).

Вывод: Внедрение bool в языки в большинстве случаев сделано непонятно с какой целью. Профитов это внедрение не принесло, зато вот разглядывая код на JS, Python, Perl итп, работающий с сериализацией и bool вижу огромное количество кода, написанного только ради поддержки этого самого bool. Выкидывание bool из проекта как правило дает уменьшение размера кодовой базы и увеличение быстродействия.