Булов тип података

Из Википедије, слободне енциклопедије
Иди на навигацију Иди на претрагу

У рачунарској науци, Булов тип података је тип података, који има две вредности (обично означене као тачно и нетачно). Он показује истинитосну вредност логике и Булове алгебре. Добио је име по Џорџу Булу, који је први дефинисао алгебарски систем логике средином деветнаестог века. Логички тип података је пре свега повезан са условним изјавама, које омогућавају различите акције и које мењају контролу тока у зависности од тога да ли програмски наведен логички услов има вредност тачно или нетачно. То је специјалан случај логичког типа података; логика не мора увек да буде Булова.

Опште[уреди]

Код програмских језика који имају уграђен Булов тип података, нпр. код Паскала и Јаве, оператори поређења као што су > и се обично дефинишу тако да враћају Булову вредност. Условне и итеративне команде могу бити дефинисане тако да тестирају Булове вредносне изразе.

Језици без експлицитног Буловог типа података, као С90 и Common Lisp, и даље представљају истинитосне вредности неким другим типовима података. Lisp користи празну листу за нетачно, и било коју другу вредност за тачно. С користи интиџер тип, тамо где су поредбени изрази као i > j и где су логички изрази повезани са && и || дефинисани тако да имају вредност 1 ако је израз тачан, а 0 ако је нетачан, док делови тестова if, while, for, итд, третирају било коју вредност која није нула као тачну.[1][2] Заиста, Булова променљива се може сматрати (и бити имплементирана) као нумеричка променљива са једном бинарном цифром (битом), која може чувати само две вредности. Важно је напоменути да је имплементација булових типова у рачунарима највероватније представљена као цела реч, пре него као бит; ово је углавном због начина преноса блокова информација.

Већина програмских језика, чак и они које немају експлицитан Булов тип, имају подршку за Булове алгебарске операције као што су конјункција (AND, &, *), дисјункција (OR, |, +), еквиваленција (EQV, =, ==) , ексклузивна или не еквиваленција (XOR, NEQV, ^, !=) и негација (NOT, ~, !).

У неким језицима, као што су Руби, Smalltalk, и Алиса "тачне" и "нетачне" вредности припадају издвојеним класама—нпр True и False, тако да не постоји један Булов "тип".

У SQL, који користи тро-вредносну логику за експлицитна поређења и због свог посебног третмана Нула, булов тип података (уведен у SQL:1999) је дефинисан тако да обухвата више од две истинитосне вредности, тако да SQL'ови "булови типови" могу сачувати све логичке вредности које произилазе из процене предиката у SQL. Колона Булових типова може се ограничити и на само TRUE и FALSE.

АЛГОЛ и градња у буловом типу[уреди]

Један од првих програмских језика који је обезбедио експлицитан булов тип података био је Алгол 60(1960) са вредностима тачно и нетачно и логичким операторима који су означени симболима '' (и), '' (или), '' (имплицира), '' (еквивалентно), and '' (не). Услед ограничења на улазним уређајима и на кодирању знакова на многим рачунарима тог времена, већина компајлера је имала другачије приказе за много оператора, као на пример AND или 'AND'.

Овај приступ буловим као уграђеним (или примитивним или на други начин унапред дефинисаним) типом података је усвојен од стране многих програмских језика касније створених, као што су Симула 67 (1967), Алгол 68 (1970),[3] Паскал (1970), Ада (1980), Јава (1995), и С # (2000), између осталих.

Фортран[уреди]

Прва верзија ФОРТРАНА (1957) и његов наследник ФОРТРАН II (1958) нису имали логичке вредности или операције; чак и условна изјава IF је узимала аритметички израз и била смештена у једну од три локације у складу са својим знаком; види аритметик IF. ФОРТРАН IV (1962) је следио пример АЛГОЛА 60 обезбеђивањем Буловог типа података (LOGICAL), литерала истине (.TRUE. и .FALSE.), булових оператора поређења (.EQ., .GT., итд.), као и логичких оператора (.NOT., .AND., .OR., .XOR., .EQV.). У FORMAT изјавама, посебни контролни симбол ("L") је предвиђен за анализу или форматирање логичких вредности.[4]

Lisp и Scheme[уреди]

Lisp језик (1958) никада није имао уграђен у Булов тип података. Уместо тога, условне конструкције попут cond су логичну вредност "false" представљали као празну листу (), која је дефинисана да буде иста као и специјални атом nil или NIL; док је било који други Ѕ-израз тумачен као "тачан". Олакшавајуће је то што је, већина модерних дијалеката Lisp-а предефинисала атом t тако да има вредност t, па тако могу користити t као мнемонички запис за "тачно".

Овај приступ ("свака вредност може да се користи као булова вредност") је задржан у већини Lisp дијалектата (Common Lisp, Scheme, Emacs Lisp), и слични модели су усвојени од стране многих скрипт језика, чак и од оних који имају јасан Булов тип или Булову вредност; ипак које вредности се тумаче као "нетачне" и које су "тачне" варира од језика до језика. У Шеми, на пример, "нетачна" вредност је атом различит од празне листе, па се он касније тумачи као "тачан".

Пасцал Ада, и Хаскел[уреди]

Језик Паскал (1970) је увео концепт програмски дефинисаних енумерисаних типова. Уграђени Boolean тип података је затим обезбеђен као претходно дефинисани енумерисани тип са вредностима FALSE и TRUE. По дефиницији, сва поређења, логички оператори, и условне изјаве примењују се и / или дају Boolean вредности. Иначе, Boolean тип је имао све објекте који су на располагању енумерисаним типовима у целини - као што су наређивање и индексирање. С друге стране, за конверзацију између Boolean типа и интиџера (или било којих других типова) и даље је потребно експлицитно тестирање или позив функције, као у Алголу 60. Овај приступ ("Булов тип је енумерисани тип") је усвојен од стране већине каснијих језика који имају енумерисане типове, као што су Модула, Ада и Хаскел.

C, C++, Objective-C, AWK[уреди]

Прве имплементације на С језику (1972) нису имале Булов тип, и до данашњег дана Булове вредности су обично представљене као цели бројеви (int) у С програмима. Оператори поређења (>, ==, итд) су дефинисани тако да враћају целобројне (int) вредности, било као 0 (за нетачно) или 1 (за тачно). Логички оператори (&&, ||, !, итд) и изјаве које проверавају услов (if, while) усвајају нулу као нетачно, а све остале вредности као тачно.

Након што су енумерисани типови (enumи) додати у ANSI верзију С (1989), многи С програмери су навикли да на тај начин дефинишу своје Булове типове, због читљивости. Међутим, енумерисани типови су еквивалентни целим бројевима према језичким стандардима; тако да ефективна сличност између Булових типова и целих бројева и даље важи за С програме.

Стандардни С (од С99) даје тип, под називом _Bool. Укључивањем заглавља stdbool.h постало је могуће користити интуитивније име bool и константе true и false. Језик гарантује да ће било које две тачне вредности упоредити једнако (што је било немогуће постићи пре увођења овог типа). Булове вредности се и даље понашају као цели бројеви, могу се чувати у целобројним варијаблама, и користити било где где су цели бројеви валидни, укључујући и у индексирању, аритметици, рашчлањивању и форматирању. Овај приступ ("Булове вредности су само цели бројеви") је задржан у свим каснијим С верзијама.

C++ има посебан Булов тип података bool, али са аутоматском конверзијом из скаларних и показивачких вредности које су веома сличне онима из С. Овај приступ је усвојен од стране многих каснијих језика, нарочито од стране неких скриптованих попут AWK.

Objective-C такође има посебан Булов тип података BOOL, са могућим вредностима YES или NO, еквивалентим са тачно или нетачно.[5] Поред тога, у комплајерима Објективног С могуће је користити С-ов _Bool тип ( јер Објективни С је подскуп С).

Перл[уреди]

У Перлу, нема Буловог типа података. Уместо тога, било која вредност може да се понаша као Булова у буловом контексту (услов if или while изјаве, аргумент && или ||, итд). Број 0, ниске "0" и "", празна листа (), и посебна вредност undef сматрају се нетачним.[6] Све остало је тачно.

Пајтон, Руби, и ЈаваСкрипт[уреди]

У Пајтону од 2.3 верзије и старије, постоји bool тип која је подкласа int -а, стандардног целобројног типа.[7] Има две могуће вредности: True и False, које су "специјалне верзије" бројева 1 и 0 и понашају се као и у аритметичком контексту. Поред тога, нумеричка вредност нуле (интиџер или разломак), нулта вредност (None), празна ниска и празни контејнери (тј листе, скупови, итд) се сматрају нетачним; све остале вредности се сматрају тачним по дифолту.[8] Класе могу дефинисати како ће њихове инстанце бити третиране у Буловом контексту кроз посебан метод __nonzero__ (Пајтон 2) или __bool__ (Пајтон 3). За контејнере, __len__ (посебна метода за одређивање дужине контејнера) се користи ако експлицитни Булов метод конверзије није дефинисан.

У Руби, с друге стране, само nil (Рубијева нулта вредност) и посебан false објекат су "нетачни", све остало (укључујући и цео број 0 и празне низове) је "тачно".

У ЈаваСкрипту, празна ниска (""), null, undefined, NaN, +0, −0 и false[9] се понекад називају "falsy", и њихови комплементи "truthy", да истакне разлику између строго проверених типова и присиљених булових типова.[10] Језици као што је PHP такође користе овај приступ.

SQL[уреди]

SQL: 1999 је увео Булов тип података као опциони облик (Т031). Када је ограничен NOT NULL ограничењем, SQL BOOLEAN се понашао као и буловни тип у другим језицима. У SQL-у булов тип је nullable тип по дифолту као и све остале врсте SQL података, што значи да исто тако може имати посебну нулту вредност. Иако стандардни SQL дефинише три литерала за булов тип: TRUE, FALSE и UNKNOWN, такође се каже да се NULL BOOLEAN и UNKNOWN "могу користити наизменично да означе потпуно исту ствар".[11][12] То је довело до неких контроверзи, јер идентификациони субјекти UNKNOWN су еквивалентни правилима поређења за NULL. Тачније UNKNOWN = UNKNOWN није TRUE него UNKNOWN/NULL.[13] Године 2012. неколико великих SQL система имплементирало је функцију Т031.[14] PostgreSQL је изузетак, иако не спроводи у UNKNOWN литерал..; NULL може да се користи.[15]

Види још[уреди]

Референце[уреди]

  1. ^ Kernighan, Brian W; Ritchie, Dennis M (1978). The C Programming Language (1st изд.). Englewood Cliffs, NJ: Prentice Hall. стр. 41. ISBN 0-13-110163-3. 
  2. ^ Plauger, PJ; Brodie, Jim (1992) [1989]. ANSI and ISO Standard C Programmer's reference. Microsoft Press. стр. 86—93. ISBN 1-55615-359-7. 
  3. ^ „Report on the Algorithmic Language ALGOL 68, Section 10.2.2.” (PDF). 1968. Приступљено 24. 12. 2016. 
  4. ^ Digital Equipment Corporation, DECSystem10 FORTRAN IV Programmers Reference Manual. Reprinted in Mathematical Languages Handbook. Online version accessed 2011-11-16.
  5. ^ iOS Developer Library
  6. ^ „perlsyn - Perl Syntax / Truth and Falsehood”. Приступљено 10. 9. 2013. 
  7. ^ Van Rossum, Guido (3. 4. 2002). „PEP 285 -- Adding a bool type”. Приступљено 15. 5. 2013. 
  8. ^ „Expressions”. Python v3.3.2 documentation. Приступљено 15. 5. 2013. 
  9. ^ „ECMAScript Language Specification” (PDF). стр. 43. Архивирано из оригинала (PDF) на датум 12. 04. 2015. Приступљено 14. 11. 2015. 
  10. ^ „The Elements of JavaScript Style”. Douglas Crockford. Приступљено 5. 3. 2011. 
  11. ^ C. Date (2011). SQL and Relational Theory: How to Write Accurate SQL Code. O'Reilly Media, Inc. стр. 83. ISBN 978-1-4493-1640-2. 
  12. ^ ISO/IEC 9075-2:2011 §4.5
  13. ^ Prigmore, Martyn (2007). Introduction to Databases With Web Applications. Pearson Education Canada. стр. 197. ISBN 978-0-321-26359-9. 
  14. ^ Troels Arvin, Survey of BOOLEAN data type implementation
  15. ^ PostgreSQL: Documentation: 9.5: Boolean Type