Bulov tip podataka

S Vikipedije, slobodne enciklopedije

U računarskoj nauci, Bulov tip podataka je tip podataka, koji ima dve vrednosti (obično označene kao tačno i netačno). On pokazuje istinitosnu vrednost logike i Bulove algebre. Dobio je ime po Džordžu Bulu, koji je prvi definisao algebarski sistem logike sredinom devetnaestog veka. Logički tip podataka je pre svega povezan sa uslovnim izjavama, koje omogućavaju različite akcije i koje menjaju kontrolu toka u zavisnosti od toga da li programski naveden logički uslov ima vrednost tačno ili netačno. To je specijalan slučaj logičkog tipa podataka; logika ne mora uvek da bude Bulova.

Opšte[uredi | uredi izvor]

Kod programskih jezika koji imaju ugrađen Bulov tip podataka, npr. kod Paskala i Jave, operatori poređenja kao što su > i se obično definišu tako da vraćaju Bulovu vrednost. Uslovne i iterativne komande mogu biti definisane tako da testiraju Bulove vrednosne izraze.

Jezici bez eksplicitnog Bulovog tipa podataka, kao S90 i Common Lisp, i dalje predstavljaju istinitosne vrednosti nekim drugim tipovima podataka. Lisp koristi praznu listu za netačno, i bilo koju drugu vrednost za tačno. S koristi intidžer tip, tamo gde su poredbeni izrazi kao i > j i gde su logički izrazi povezani sa && i || definisani tako da imaju vrednost 1 ako je izraz tačan, a 0 ako je netačan, dok delovi testova if, while, for, itd, tretiraju bilo koju vrednost koja nije nula kao tačnu.[1][2] Zaista, Bulova promenljiva se može smatrati (i biti implementirana) kao numerička promenljiva sa jednom binarnom cifrom (bitom), koja može čuvati samo dve vrednosti. Važno je napomenuti da je implementacija bulovih tipova u računarima najverovatnije predstavljena kao cela reč, pre nego kao bit; ovo je uglavnom zbog načina prenosa blokova informacija.

Većina programskih jezika, čak i oni koje nemaju eksplicitan Bulov tip, imaju podršku za Bulove algebarske operacije kao što su konjunkcija (AND, &, *), disjunkcija (OR, |, +), ekvivalencija (EQV, =, ==) , ekskluzivna ili ne ekvivalencija (XOR, NEQV, ^, !=) i negacija (NOT, ~, !).

U nekim jezicima, kao što su Rubi, Smalltalk, i Alisa "tačne" i "netačne" vrednosti pripadaju izdvojenim klasama—npr True i False, tako da ne postoji jedan Bulov "tip".

U SQL, koji koristi trovrednosnu logiku za eksplicitna poređenja i zbog svog posebnog tretmana Nula, bulov tip podataka (uveden u SQL:1999) je definisan tako da obuhvata više od dve istinitosne vrednosti, tako da SQL'ovi "bulovi tipovi" mogu sačuvati sve logičke vrednosti koje proizilaze iz procene predikata u SQL. Kolona Bulovih tipova može se ograničiti i na samo TRUE i FALSE.

ALGOL i gradnja u bulovom tipu[uredi | uredi izvor]

Jedan od prvih programskih jezika koji je obezbedio eksplicitan bulov tip podataka bio je Algol 60(1960) sa vrednostima tačno i netačno i logičkim operatorima koji su označeni simbolima '' (i), '' (ili), '' (implicira), '' (ekvivalentno), and '' (ne). Usled ograničenja na ulaznim uređajima i na kodiranju znakova na mnogim računarima tog vremena, većina kompajlera je imala drugačije prikaze za mnogo operatora, kao na primer AND ili 'AND'.

Ovaj pristup bulovim kao ugrađenim (ili primitivnim ili na drugi način unapred definisanim) tipom podataka je usvojen od strane mnogih programskih jezika kasnije stvorenih, kao što su Simula 67 (1967), Algol 68 (1970),[3] Paskal (1970), Ada (1980), Java (1995), i S # (2000), između ostalih.

Fortran[uredi | uredi izvor]

Prva verzija FORTRANA (1957) i njegov naslednik FORTRAN II (1958) nisu imali logičke vrednosti ili operacije; čak i uslovna izjava IF je uzimala aritmetički izraz i bila smeštena u jednu od tri lokacije u skladu sa svojim znakom; vidi aritmetik IF. FORTRAN IV (1962) je sledio primer ALGOLA 60 obezbeđivanjem Bulovog tipa podataka (LOGICAL), literala istine (.TRUE. i .FALSE.), bulovih operatora poređenja (.EQ., .GT., itd.), kao i logičkih operatora (.NOT., .AND., .OR., .XOR., .EQV.). U FORMAT izjavama, posebni kontrolni simbol ("L") je predviđen za analizu ili formatiranje logičkih vrednosti.[4]

Lisp i Scheme[uredi | uredi izvor]

Lisp jezik (1958) nikada nije imao ugrađen u Bulov tip podataka. Umesto toga, uslovne konstrukcije poput cond su logičnu vrednost "false" predstavljali kao praznu listu (), koja je definisana da bude ista kao i specijalni atom nil ili NIL; dok je bilo koji drugi Ѕ-izraz tumačen kao "tačan". Olakšavajuće je to što je, većina modernih dijalekata Lisp-a predefinisala atom t tako da ima vrednost t, pa tako mogu koristiti t kao mnemonički zapis za "tačno".

Ovaj pristup ("svaka vrednost može da se koristi kao bulova vrednost") je zadržan u većini Lisp dijalektata (Common Lisp, Scheme, Emacs Lisp), i slični modeli su usvojeni od strane mnogih skript jezika, čak i od onih koji imaju jasan Bulov tip ili Bulovu vrednost; ipak koje vrednosti se tumače kao "netačne" i koje su "tačne" varira od jezika do jezika. U Šemi, na primer, "netačna" vrednost je atom različit od prazne liste, pa se on kasnije tumači kao "tačan".

Paskal Ada, i Haskel[uredi | uredi izvor]

Jezik Paskal (1970) je uveo koncept programski definisanih enumerisanih tipova. Ugrađeni Boolean tip podataka je zatim obezbeđen kao prethodno definisani enumerisani tip sa vrednostima FALSE i TRUE. Po definiciji, sva poređenja, logički operatori, i uslovne izjave primenjuju se i / ili daju Boolean vrednosti. Inače, Boolean tip je imao sve objekte koji su na raspolaganju enumerisanim tipovima u celini - kao što su naređivanje i indeksiranje. S druge strane, za konverzaciju između Boolean tipa i intidžera (ili bilo kojih drugih tipova) i dalje je potrebno eksplicitno testiranje ili poziv funkcije, kao u Algolu 60. Ovaj pristup ("Bulov tip je enumerisani tip") je usvojen od strane većine kasnijih jezika koji imaju enumerisane tipove, kao što su Modula, Ada i Haskel.

C, C++, Objective-C, AWK[uredi | uredi izvor]

Prve implementacije na S jeziku (1972) nisu imale Bulov tip, i do današnjeg dana Bulove vrednosti su obično predstavljene kao celi brojevi (int) u S programima. Operatori poređenja (>, ==, itd) su definisani tako da vraćaju celobrojne (int) vrednosti, bilo kao 0 (za netačno) ili 1 (za tačno). Logički operatori (&&, ||, !, itd) i izjave koje proveravaju uslov (if, while) usvajaju nulu kao netačno, a sve ostale vrednosti kao tačno.

Nakon što su enumerisani tipovi (enumi) dodati u ANSI verziju S (1989), mnogi S programeri su navikli da na taj način definišu svoje Bulove tipove, zbog čitljivosti. Međutim, enumerisani tipovi su ekvivalentni celim brojevima prema jezičkim standardima; tako da efektivna sličnost između Bulovih tipova i celih brojeva i dalje važi za S programe.

Standardni S (od S99) daje tip, pod nazivom _Bool. Uključivanjem zaglavlja stdbool.h postalo je moguće koristiti intuitivnije ime bool i konstante true i false. Jezik garantuje da će bilo koje dve tačne vrednosti uporediti jednako (što je bilo nemoguće postići pre uvođenja ovog tipa). Bulove vrednosti se i dalje ponašaju kao celi brojevi, mogu se čuvati u celobrojnim varijablama, i koristiti bilo gde gde su celi brojevi validni, uključujući i u indeksiranju, aritmetici, raščlanjivanju i formatiranju. Ovaj pristup ("Bulove vrednosti su samo celi brojevi") je zadržan u svim kasnijim S verzijama.

C++ ima poseban Bulov tip podataka bool, ali sa automatskom konverzijom iz skalarnih i pokazivačkih vrednosti koje su veoma slične onima iz S. Ovaj pristup je usvojen od strane mnogih kasnijih jezika, naročito od strane nekih skriptovanih poput AWK.

Objective-C takođe ima poseban Bulov tip podataka BOOL, sa mogućim vrednostima YES ili NO, ekvivalentim sa tačno ili netačno.[5] Pored toga, u komplajerima Objektivnog S moguće je koristiti S-ov _Bool tip ( jer Objektivni S je podskup S).

Perl[uredi | uredi izvor]

U Perlu, nema Bulovog tipa podataka. Umesto toga, bilo koja vrednost može da se ponaša kao Bulova u bulovom kontekstu (uslov if ili while izjave, argument && ili ||, itd). Broj 0, niske "0" i "", prazna lista (), i posebna vrednost undef smatraju se netačnim.[6] Sve ostalo je tačno.

Pajton, Rubi, i JavaSkript[uredi | uredi izvor]

U Pajtonu od 2.3 verzije i starije, postoji bool tip koja je podklasa int -a, standardnog celobrojnog tipa.[7] Ima dve moguće vrednosti: True i False, koje su "specijalne verzije" brojeva 1 i 0 i ponašaju se kao i u aritmetičkom kontekstu. Pored toga, numerička vrednost nule (intidžer ili razlomak), nulta vrednost (None), prazna niska i prazni kontejneri (tj liste, skupovi, itd) se smatraju netačnim; sve ostale vrednosti se smatraju tačnim po difoltu.[8] Klase mogu definisati kako će njihove instance biti tretirane u Bulovom kontekstu kroz poseban metod __nonzero__ (Pajton 2) ili __bool__ (Pajton 3). Za kontejnere, __len__ (posebna metoda za određivanje dužine kontejnera) se koristi ako eksplicitni Bulov metod konverzije nije definisan.

U Rubi, s druge strane, samo nil (Rubijeva nulta vrednost) i poseban false objekat su "netačni", sve ostalo (uključujući i ceo broj 0 i prazne nizove) je "tačno".

U JavaSkriptu, prazna niska (""), null, undefined, NaN, +0, −0 i false[9] se ponekad nazivaju "falsy", i njihovi komplementi "truthy", da istakne razliku između strogo proverenih tipova i prisiljenih bulovih tipova.[10] Jezici kao što je PHP takođe koriste ovaj pristup.

SQL[uredi | uredi izvor]

SQL: 1999 je uveo Bulov tip podataka kao opcioni oblik (T031). Kada je ograničen NOT NULL ograničenjem, SQL BOOLEAN se ponašao kao i bulovni tip u drugim jezicima. U SQL-u bulov tip je nullable tip po difoltu kao i sve ostale vrste SQL podataka, što znači da isto tako može imati posebnu nultu vrednost. Iako standardni SQL definiše tri literala za bulov tip: TRUE, FALSE i UNKNOWN, takođe se kaže da se NULL BOOLEAN i UNKNOWN "mogu koristiti naizmenično da označe potpuno istu stvar".[11][12] To je dovelo do nekih kontroverzi, jer identifikacioni subjekti UNKNOWN su ekvivalentni pravilima poređenja za NULL. Tačnije UNKNOWN = UNKNOWN nije TRUE nego UNKNOWN/NULL.[13] Godine 2012. nekoliko velikih SQL sistema implementiralo je funkciju T031.[14] PostgreSQL je izuzetak, iako ne sprovodi u UNKNOWN literal..; NULL može da se koristi.[15]

Vidi još[uredi | uredi izvor]

Reference[uredi | uredi izvor]

  1. ^ Kernighan, Brian W; Ritchie, Dennis M (1978). The C Programming Language (1st izd.). Englewood Cliffs, NJ: Prentice Hall. str. 41. ISBN 978-0-13-110163-0. 
  2. ^ Plauger, PJ; Brodie, Jim (1992) [1989]. ANSI and ISO Standard C Programmer's reference. Microsoft Press. str. 86—93. ISBN 978-1-55615-359-4. 
  3. ^ „Report on the Algorithmic Language ALGOL 68, Section 10.2.2.” (PDF). 1968. Arhivirano iz originala (PDF) 17. 07. 2012. g. Pristupljeno 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”. Pristupljeno 10. 9. 2013. 
  7. ^ Van Rossum, Guido (3. 4. 2002). „PEP 285 -- Adding a bool type”. Pristupljeno 15. 5. 2013. 
  8. ^ „Expressions”. Python v3.3.2 documentation. Pristupljeno 15. 5. 2013. 
  9. ^ „ECMAScript Language Specification” (PDF). str. 43. Arhivirano iz originala (PDF) 12. 04. 2015. g. Pristupljeno 14. 11. 2015. 
  10. ^ „The Elements of JavaScript Style”. Douglas Crockford. Pristupljeno 5. 3. 2011. 
  11. ^ C. Date (2011). SQL and Relational Theory: How to Write Accurate SQL Code. O'Reilly Media, Inc. str. 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. str. 197. ISBN 978-0-321-26359-9. 
  14. ^ Troels Arvin, Survey of BOOLEAN data type implementation
  15. ^ PostgreSQL: Documentation: 9.5: Boolean Type