[Powered by Google Translate] [Týden 7] [David J. Malan - Harvard University] [To je CS50. - CS50.TV] Dobrá. Vítejte zpět. To je CS50, a to je začátek 7. týdnu. Pár malých oznámení: Pset5 V současné době probíhá, nebo brzy bude, a dovolte mi říci, zcela upřímně, to se mají tendenci být mezi náročnější předmětu je problémové soubory, tak mi dovolte zmínit se tak, že tento týden více než kdy jindy nemusíte čekat, až, řekněme, ve středu v noci nebo ve čtvrtek v noci do toho ponořit dovnitř To je určitě zajímavá Pset. Myslíme si, že je to legrace. Pokud jste skutečně si to naprosto správné a pak může napadnout tzv. Big Board, budete mít možnost důvtipu s některými předmětu zaměstnanců a některé z vašich spolužáků. Co Big Board je je jednou máte pravopisu práci, budete moci jít do cs50.net po spuštění příkazu, čistě přihlásíte, a pak se množství času a množství paměti RAM a více které jste použili ve vaší implementaci budou vystaveny zde na hřišti domovské stránce. Určitě jste si všimli, že celá parta z těchto lidí zde jsou uvedeny jako zaměstnanci od přes víkend, personál si myslel, že by bylo zábavné se snažit předčit každého jiný. Takže si uvědomit, že cílem zde není překonat zaměstnance. I já jsem tu jen na číslo 13. Čistě přihlásíte, ale je to příležitost vidět, jak málo RAM a jak málo CPU sekund můžete použít vis-a-vis některé z vašich spolužáků. A musím přiznat, že Kevin Michael Schmid, v současné době v počtu 1 pozici jako jeden z TFS, toto je implementace, který nazýváme není možné vzhledem k tomu, že je použití téměř 0 RAM a téměř 0 sekund pro nakládku. Takže my se postaráme o režimu offline Kevin. [Smích] Existují určité dovednosti, které Kevin je uvedení do testu zde. Jedna z věcí, které jsme si mysleli bychom taky je nyní CS50x je týden v pokroku, a vy jste stejně část tohoto experimentu jako ti studenti jsou. Požádali jsme je jako součást jejich pset0, který byl podobně předložit Scratch projekt z úroků, které jim - hra, interaktivní umělecké dílo, animace, nebo jako - 1 - až 2-minutové video, v případě, že chcete, zdravit světa a kdo vlastně jsou. Myslel jsem, že bych se s vámi podělit jen pár videí, které byly předloženy tak daleko protože pro nás, na personálu alespoň, to opravdu bylo vzrušující a inspirující vidět tyto lidi z celého světa - zemích po celém světě - ladění, všech věcí, do kurzu počítačové vědy na internetu, ať už je to proto, že chtějí pokračovat jejich vlastní studia, chtějí, aby svou kariéru v novém směru, chtějí doplnit mezery v jejich vlastních znalostí, takže některé ze stejných důvodů, které jste možná byli tady. Tak jsem vám jednu takovou studenta zde. Dalo by se zvýšit objem jen trochu. Zde je jeden z našich studentů 1-minutových podání. Hello, world. Jsem student průmyslového inženýrství zde ve španělské Malaze. Jsem nadšen tomto on-line kurzu, protože mám rád informatiku, jsem opravdu, a já jsem opravdu oceňuji, že jsem si prozkoumat to. A skutečnost, že mohu učit všude stejné z vás dělat ale místo toho, aby v Harvardu jsem v Malaze, jak úžasné je, že? No, já jsem Fernando, a to je CS50. Uvidíme. [Smích] Další klip jsme především rádi, zjistíte, že tento pán je angličtina není tak silný. Vypadá to, že nechal stroje přeloženy, takže překlady jsou samy trochu nedokonalé, ale to byl jeden z našich oblíbených dosud stejně. [♪ ♪] Hello, world. [Mluví v japonštině] [Musím pozdravit v japonštině, protože moje angličtina je velmi nespolehlivý.] [Dal jsem zprávu na vás z města Gifu, Japonsko.] [I může být student poprvé za 20 let, jak je vidět.] [Jsem velmi vděčný Harvardovy univerzity, kdo mi dal tuto příležitost a EDX.] [Golf je kytara a moje nejoblíbenější věc běží.] [Smích] [♪ ♪] [Proč myslíš, že jsem se snažil, aby se zúčastnil cs50x.] [Harvard University, to je moje touha.] [Zvlášť když jsem vzdálená přítomnost žil v Japonsku.] [Chtěl jsem se pokusit okamžitě informováni o existenci takového EDX kdy.] [Nemyslíš, takže nemusíte souvisí s věkem učení I.] [Cs50 je moje touha. Mé jméno je Kazu, a to je cs50.] [♪ ♪] [potlesk a jásot] Dalším favoritem z nás je toto tvrzení tady od někoho. [♪ ♪] [Malan] Google je, pokud jste obeznámeni s tímto meme. A pak konečně, pár dalších, které dostal přidaných že snad vyhrát rozkošný cenu. [Studenti] Aww! >> [Malan] Budeme se muset poslouchat. To je krátký, tak poslouchejte pozorně. [Samice reproduktor] Jak se jmenujete? >> Louie. [Samice reproduktor] Co je to? >> [Chichotání] CS50. [Smích] [Malan] On udělal dvě trvá, ačkoli. Tady to máme, posledním. Mé jméno je Louie, a to je CS50. [Smích] To je pak CS50x. Děkujeme všem těm z vás, zatímco po spolu doma kteří byli podílí tak daleko. Dnes, jsme došli k závěru naši diskuzi o datových struktur, alespoň některé z nejzákladnějších, a pak budeme pokračovat v rozhovoru o HTML a webového programování. Opravdu, jsme strávili na minulost někteří sedm týden se podíváme na základy programování - algoritmy, datové struktury, a podobně - a C, jak jste si možná zažili tak daleko, není nutně nejdostupnější jazyků s nimiž se realizovat některé z těchto myšlenek. A tak začíná tento týden a příští týden a pak následující, budeme konečně moci přechodu z C, který je obecně známé jako poměrně nízké úrovně jazyka, k věcem vyšší úroveň, mezi nimi PHP, JavaScript, a podobně, které uvidíme čerpat stejné lekce, které jsme se naučili během posledních několika týdnů, ale zjistíte, že prohlášení věci jako pole a hash tabulky a vyhledávání a třídění se tak mnohem jednodušší, protože jazyky sám začneme používat bude silnější. Ale nejdřív, aplikace stromů. Je to velmi časté v těchto dnech muset komprimovat informace. V jakém kontextu by chcete komprimovat nějakou digitálních informací? Jo. >> [Student] Když potřebujete jej poslat přes web. Jo, když budete chtít něco poslat přes web. Pokud si chcete stáhnout velký soubor, je to ideální, pokud někdo na druhém konci stlačila, že soubor pomocí ZIP formátu nebo něco takového takže posíláte méně bitů, než by jinak mohly být přenášeny. Tak jak se vám komprimovat informace? To vše se scvrkává na použití méně bitů, než jsou požadovány ve výchozím nastavení. Ale to je trochu divná věc, protože si vzpomenu na týdny 0 a 1 když jsme si povídali o ASCII a binární a mluvili jsme o ASCII, zejména as pomocí 8 bitů pro reprezentaci písmena abecedy tak, že písmeno představuje 65, malá je číslo 97, a jakkoli si představují 65 nebo 97, používáte 7 nebo 8 bitů. Ale úlovek je, že tam jsou některé dopisy v anglické abecedě že nejsou tak populární jako ostatní. Z není všechno, že populární, Q není všechno, že populární, ale i E jsou super populární. A přesto všechny tyto dopisy, ve výchozím nastavení svět používá stejný počet bitů, jen 8. Takže nebylo by to byl chytřejší, pokud místo pomocí 8 bitů pro každé písmeno, i ty občas používá jako Q a Z, Co když jsme použili méně bitů pro A a E a S a nejpopulárnějších písmena a používá více bitů pro méně populární dopisy, bytí nápadu pojďme optimalizace pro společné věci, což je téma v informatice, že se snaží optimalizovat co se bude dít nejvíce a strávit trochu více času, trochu více prostoru na věci, které, jo, se může stát ale ne nutně tak často. Tak pojďme vzít příklad. Předpokládejme, že chceme zakódovat informace poměrně efektivně. Možná jste vyrostli věděl něco o Morseově abecedě, a statistiky jste neznali skutečný kód, ale můžete připomenout, že je to alespoň z této série teček a čárek. Jedná se o poměrně efektivní kódování, a upozornění, že nejoblíbenější písmeno - například, E - používá nejkratší pípnutí. Morseova abeceda je o píp-píp-píp-píp-píp-píp a držení tónů buď na krátkou dobu nebo delší dobu. E, jako označováno tečkou, je super krátké pípnutí, jen pípnutí, a které by představovaly E. Naproti tomu by T je delší pípnutí, jako pípnutí [prodlužuje zvuk], a které by představovaly T. Ale to je ještě docela krátký, protože, na rozdíl od, když se podíváte na Z, vyjádřit Z bys jít píp, píp [déle zvuk], píp, píp [kratší zvuk]. Takže je to déle, protože je to méně časté. Ale mám tě je, že Morseova abeceda je poněkud chybný v tom, že to není okamžitě dekódovatelný. Předpokládejme například, že jste slyšeli o nějakém konci drátu pípnutí [short], pípnutí [dlouho]. Co zprávu jsem pouze přijímat? Dot a pomlčka. Co to představuje? [Student] A. >> [Malan] Možná. Mohlo by to také být E a T. Jinými slovy, morseovka, i když to využívá tohoto principu optimalizace rohový případ, to se nehodí k okamžitému decodability. To znamená, že člověk, který je sluchově nebo přijímá tyto tečky a čárky musí nějak zjistit, kde přestávky jsou mezi písmeny, protože pokud nevíte, kde tyto přestávky jsou, můžete zaměnit za ET a naopak. Takže to, co můžete dělat? V Morseově abecedě byste mohl jen pauza mezi každým z písmen. Ale zastavil se trochu v rozporu s celou bodu urychlení věci. Takže co když místo toho jsme přišli s kódem, kde nebylo tak špatné situaci kde E je prefix, například, v - jinými slovy, pokud bychom mohli ujistit, že vzory jsou stále krátká pro populární dopisy dlouho na méně populární dopisy, ale není tu žádný možný zmatek? Muž jménem Huffman lety vymyslel tento program nazvaný Huffmanovo kódování skutečně leverages jeden z datových struktur jsme strávili trochu času povídáním o minulý týden, že stromů, binární stromy konkrétně - binární strom znamená, že nemá žádné více než 2 děti. To má možná na levé dítě, možná pravý dítě, a to je vše. Takže předpokládám, jen kvůli diskuse, že někdo chce poslat zprávu , která vypadá takto. Je to úplný nesmysl, ale to je složeno z As, Bs, Cs, Ds, a Es. A pokud jste skutečně počítat všechny As, Bs, Cs, Ds, a Es a pak se rozdělí na celkovém počtu písmen, tento malý graf zde říká, že 45% z písmen jsou Es, 20% jsou As, 10% B, a tak dále. Takže jinými slovy, předpokládáme, že řetězec v uvozovkách, že je to jen nějaký zprávu, kterou chcete poslat. Stává se, že je to nesmysl jen tak můžeme použít jako několik písmen, jako je to možné, ale je to opravdu pravda, že E je stále nejpopulárnější, a B a C jsou nejméně populární, alespoň z těchto 5 písmen abecedy. Takže, jak můžeme jít o přichází s kódováním, binární kódování, vzor 0 a 1 pro každou z těchto písmen takovým způsobem, že E je krátký vzor a možná B a C jsou mírně delší vzory, znovu, myšlenka je, že chceme použít méně bitů většinu času a více bitů pouze jednou za čas. Podle Huffman kódování, můžete vytvořit les stromů. Je tu jakási linie příběhu, tady to zahrnuje stromy a také procesu budování je. Pojďme začít. Navrhuji, že začnete s tímto lesem, abych tak řekl, z 5 stromů, z nichž každý je pěkně hloupé strom. Strom je složen z jen jednoho uzlu, jak je zde reprezentována kruhem. Takže každý z těchto věcí by mohlo být struct C a uvnitř struct C může být float reprezentovat frekvence počet a pak možná char reprezentovat dopis. Takže myslíte, že z těchto uzlů jako jen nějaký starý struct C, ale pro teď, vyšší úroveň. To je les 5 stromů, každý, kdo mají pouze jeden uzel. Co Huffman navrhovaná je, že začneme kombinovat ty stromy které mají nejmenší frekvence se počítá do mírně větších stromů připojením s novým kořenového uzlu. Takže mezi písmeny, zjistíte, že pro pohodlí jsem seřazena je zleva doprava, i když to není nezbytně nutné, a všimněte si, že nejmenší uzly jsou v současné době 10% a 10%. Takže Huffman navrhl, aby jsme sloučit tyto 2 nejmenší uzly do nového stromu zavedením nového nadřazený uzel, a pak dát, že rodiče si levé dítě a pravé dítě kde B je libovolně vlevo a C je libovolně vpravo. A pak Huffman dále navrhuje, aby Pojďme nyní si myslím, že na levém dítěte v jednom z těchto stromů vždy být reprezentován 0 a právo dítě vždy tak, že představuje číslo 1. Nezáleží na tom, jestli jste překlopit je tak dlouho, jak jste konzistentní. Takže teď máme čtyři stromy v lese. A já říkat čtyři, protože nyní strom v levé - a to ani ne tak strom v tom smyslu, že roste takhle, je to spíš jako rodokmen, kde nyní 0,2 je něco jako rodiče dvou dětí - Všimněte si, že v tomto rodiče jsme vypracován 0,2. Přidali jsme frekvenční počty dvou dětí a vzhledem k nový uzel celková částka. Takže teď jsme prostě tento proces zopakovat. Najděte dva nejmenší uzly a pak se k nim připojil do nového stromu a pak opakujte postup další. Právě teď máme několik kandidátů, 20%, 15%, a dalších 20%. V tomto případě, musíme přetrhnout. Můžeme to udělat libovolně. Měli bychom to udělat důsledně. V tomto případě, budu libovolně jít s jeden na levé straně, a já jsem teď sloučit 20% a 15%, aby mi dal novou rodiče s názvem 35%, jehož levý dítě je 0, jejíž právo dítě je 1, a nyní máme jen tři stromy v lese. Můžete snad vidět, kde to bude. Pokud bychom opakovat pár vícekrát, budeme mít jen jeden větší strom, jehož všechny hrany jsou označeny 0s a 1s. Pojďme udělat to znovu. 35% je tento strom je root. 20% a 45%, takže budeme sloučit 35% a 20%. Nyní máme tento strom tady. Přidáme ty spolu, máme 55%. Teď je tu jen dva stromy v lese. Děláme tento jeden čas finále, a doufejme, že matematicky všechny frekvence sečíst protože by, protože jsme vypočítána je z get-go přidat až 100%. A teď máme jeden strom. Tak to je Huffmanovo kódování strom. Je to druh chvíli trvalo, než se tam dostat verbálně, ale realita je s pro smyčce nebo s rekurzivní funkcí, můžete postavit tuto věc pěkně rychle. Takže teď máme jeden nový uzel, a všechny tyto vnitřních uzlů byly malloc'd, Lze předpokládat, že na cestě. Takže teď v horní části tohoto stromu jsme 100%, ale teď všimnete máme cestu z této nové pra-pra-pra-prarodič na všechny pra-pra-velký-vnuci úplně na dně, aby všechny listy. Co budeme dělat teď, je navrhnout, aby v zájmu reprezentovat písmeno E, budeme využívat pouze číslo 1. Proč? Vzhledem k tomu, když se procházet tento strom z konečné kořene dolů ke křídlu známé jako E, sledujeme jen jednu hranu, na pravém okraji, a že je označen samozřejmě na vpravo nahoře 1. Takže implikace zde Huffman bylo, že E je kódování v binárním musí být jen 1. A to je zatraceně účinný. Nemůžu dostat nějakou menší než. Naopak, se bude zastoupen, pokud budete postupovat podle logiky, podle toho, co vzor bitů místo? 01. Takže dostat se do, začneme u kořene a jdeme doleva a pak jít rovnou, což znamená, že následoval 0 a pak 1. Tak jsme zastupuje písmeno se vzorem 0 a 1. A teď všimnete už máme vlastnost bezprostřední decodability že jsme neměli v Morseově abecedě. I přesto, že oba tyto vzory jsou dost krátké - E je 1 bit, je 2 bity - Všimněte si, že nemohou být zaměněny jedno nebo druhé, protože když vidíte 1 to musí být E, pokud vidíte 0, pak 1 je to zřejmě to být A. Podobně, co je D? 001. Co je to C? 0001. A co je B? 0000. A opět, protože všechny dopisy, které jsme se starají o jsou na listí a žádný z nich jsou trochu prostředníků na cestě od kořene k listu, tam žádné riziko sjednocovat různé 2 písmena "kódování protože všichni těchto bitových vzorů jsou deterministické. 0000 bude vždy B. Tam je žádný uzel někde mezi, které by vás mohly zaměnit jeden dopis pro druhé. Takže to, co je implikace tady? Nejoblíbenější písmeno - v tomto případě E - dostal nejkratší kódování, Dostal další nejkratší kódování, a B a C, které jsme již znali z get-go byly druhu nejméně oblíbený při 10% frekvenci každého, oni dostali nejdelší kódování. A tak to, co to znamená je, že teď, pokud chcete odeslat zprávu, která je komprimovaný přes internet nebo v e-mailu nebo podobně, spíše než používat standardní ASCII, můžete poslat Huffmanova kódovanou zprávu přičemž pokud chcete poslat písmeno E, odešlete jen jeden bit. Pokud chcete poslat, pošlete 2 bity, 01, namísto posílání 8 bitů následovalo dalších 8 bitů následuje dalších 8 bitů a tak dále. Ale je tu mám tě tady. Nestačí jen postavit ten strom a pak začít posílat od Alice k Bobovi kratší bit vzor, ​​řetězec z ASCII, protože Alice má také informovat Boba toho, co pokud Bob je bude moci přečíst její komprimovaný zprávu? [Neslyšitelné Student odpověď] >> Co je to? [Neslyšitelné Student odpověď] >> Z toho, co je strom. Nebo dokonce více specificky, co tyto kódování jsou, zejména proto, že v tomto příběhu jsme si udělali úsudek hovoru na jednom místě. Pamatujte si, že jsme museli vybrat libovolně mezi 2 různými 20% uzlů? Takže to není pravda, že Bob, příjemce, může jen rekonstruovat strom na jeho vlastní protože možná vytvoří strom někdy tak trochu jinak od Alice. Navíc, Bob ani neví, co původní zpráva protože jediné, co je Alice pošle jej, samozřejmě, je na stlačený zprávu. Takže úlovek s kompresí, jako je to, že, ano, může Alice ušetřit spoustu kousků vysláním 1 pro E a 01 pro, a tak dále, ale má také informovat Boba, co je mapování mezi písmeny a bity protože je nelze jednoznačně spoléhat se pouze na ASCII už, jestli jsme nepoužíváte ASCII. Takže ona může buď poslat mu strom nějak - napsat to, uložit jako binární data nebo něco takového - nebo stačí poslat mu trochu tahák, soubor aplikace Excel, která zobrazuje mapování. Takže účinnost komprese opravdu předpokládá, že zprávy, které posíláte jsou dost velké, alespoň střední, protože pokud posíláte super krátkou zprávu, pokud si jen chcete odeslat zprávu BAD, který se stane být slovo, které může znamenat zde, B-A-D, budete pravděpodobně používat méně bitů, ale úlovek je, pokud máte také informovat Boba, co je strom nebo co ty kódování jsou, budete zřejmě převáží všechny úspory mít komprimované věci začít. Takže to může být skutečně pravda, že pokud se pokusíte komprese dokonce s něčím, jako je zip nebo souboru formátů, které by mohly být obeznámeni s - pěkný malé soubory, dokonce i prázdné soubory - Někdy tyto soubory by mohly získat větší a ne menší. Ale realisticky, že se stane pouze pro malé velikosti souborů, takže to nebude dělat gigabyte být soubor 2 GB; jsme opravdu mluvíme bajtů nebo jen pár kB. Některé programy, jako je zip jsou dost chytří na to, aby si uvědomili, že, "Budeš trávit více bitů komprese to." "Dovolte mi, abych neobtěžoval kompresi to pro vás vůbec." Takže to je jen jeden způsob, jak pak kompresi formát textu. Mohli bychom zavést něco takového v C. Například, je, jak se může představovat uzel v tomto stromu kde máme char pro symbol, plovoucí hodnotu pro frekvenci, a jak jsme viděli s našimi ostatními datovými strukturami, 2 ukazovátka, 1 k levé dítě, 1 vpravo, z nichž každý může být NULL, ale pokud ne, to se odkazuje na levé dítě a pravé dítě. Tak tohle je tedy Huffmanovo kódování, a to je jeden způsob, jak můžete jít o komprimaci informace, a to je jistě jeden z nejvíce snadno implementovat v rámci, řekněme, minulý týden datových struktur, ačkoli ještě více sofistikované algoritmy existují , které mohou udělat ještě sofistikovanější mutace vašich dat. Jakékoli otázky, pak na stromech, binární stromy, nebo komprese textu? [Student] Je tam nějaká dvojznačnost, jako když [neslyšitelné] rozdělit do 01, pak 011 by být nejednoznačné, že jo? [Neslyšitelné] >> Dobrá otázka. Nejednoznačnost. Dovolte mi shrnout odkazem na obrázku zde. Protože znaky, které jsou komprese, reprezentace, podle definice tohoto algoritmu vždy zůstávají listy, nikdy omylem používají stejný vzor bitů pro předponu několika písmen. Takže jinými slovy, máte obavy, že to zní jako, nejasnost vyplývající přičemž 001 by mohla být začátkem B nebo začátkem C nebo něco takového. Ale to nemůže být případ, protože si všimněte, že všechny písmena abecedy jsme kódování jsou na listy. Dvojznačnost může vzniknout, jako je tomu v případě morseovkou, pokud například C byl někde na cestě od kořene k B. [Student] Právo. Takže v tomto případě, říkají má 2 listy. >> Say má - Řekni to ještě jednou. [Student] Řekni má 2 listy, F a G, a pak G - >> Okay. Ale to nemůže. Sám nemohl mít listy F a G, protože ty dopisy F a G by samy o sobě nechává někde nalevo B nebo právo E. Takže definice, musí být listy. Jinak, máš naprostou pravdu, jsme nevyřešili problém, který Morse code čelí. Dobrá otázka. Další otázky? Dobrá. Tento pojem bitů, se ukázalo, že jsme měli moc celou dobu, že jsme skutečně používána když to přišlo k manipulaci s těmito 0s a 1s. Zeptali jsme se o tom na jednom z prvních problémových souborů: to, jak se vám jít o konverzi velká na malá písmena nebo naopak? Anebo, což je konkrétně, jeden z těch prvních psets zeptal kolik bitů se vlastně musí vyletět s cílem změnit na malá písmena a nebo naopak? Zde je rychlá připomínka toho, co 65 a 97 vypadají jako v binárním formátu. A to iv případě, že tato otázka je druh vybledl v paměti, je vidět opět zde, že to, kolik bitů musí být převrácené změnit kapitál na malá písmena? Jen jeden. Liší se pouze v jednom místě, třetí bit zleva. Vzhledem k tomu, má 010, trochu má 011. Tak nějak, musíme prostě být schopen otočit ten kousek, a pak můžeme využít nebo malá písmena. Udělali jsme to v minulosti skutečně používáte-li podmínky a kontrolovat, zda je dopis od hlavního A a kapitálu Z, pak výstupy, jako je - + 26, nebo něco takového. Pravděpodobně jste udělal aritmetický změnu písmeny abecedy. Ale co když jsme mohli otočit, že jediný kousek? Jak jsi mohl jít o přijetí jednoho bajtu je v hodnotě bitů, takže 8 bitů jako 01000001 a 01100001? Pokud jste měli ty vzory kousků, jak můžeme jít o změnu jen jeden z nich? Co když jsme se představit ve žluté zde tento jiný vzor bitů? Pokud udělám celé žluté řetězec 0s kromě jednoho kousku, který chci změnit a pak jsem zavést nový operátor známý jako operátor bitového - Bitové operace v tom smyslu, že se působí na jednotlivé bity, ne na celý byte nebo čtyři bajty všechny najednou. Tato vertikální pruh tam ve žlutém naznačuje, že to, co, pokud budeme mít zastoupení kapitálu A a bitový součet je se žlutým sekvence bitů? Jinými slovy, že zpět do naší diskusi logických výrazů v Scratch a pak v C. Dělat logickou nebo znamená, že je to pravda, buď první věc, kterou musí být pravda nebo druhá věc musí být pravda, nebo oba mají být pravda, a pak výsledný výstup je sám o sobě pravdivý. V tomto případě zde, co dostaneme, vezmeme-li 0 "nebo" ed s 0? Nepravdivé nebo falešné? Je to stále false, takže malá zůstane podle očekávání. Co když místo toho děláme 1 nebo 0? To nyní zůstává 1, ale všimněte si, co to asi stane tady. Pokud začneme s kapitálem A a budeme i nadále ", nebo" jeho jednotlivé bity jako my tady děláme, 0 nebo žlutý nám dává to, co tady dole? To nám dává 1. Ve skutečnosti, že jsme nevěděli, co velká verze málo vlastně byl. Pojďme udělat. Dovolte mi, abych přesunout zpátky sem. Pojďme to udělat znovu. 0 nebo 0 mi dává 0. 1 nebo 0 mi dává 1. 0 nebo 1 mi dává 1. 0 nebo 0 mi dává 0. Další je 0, další je 0, další je 0. 1 nebo 0 mi dává 1. A tak, i když jsme nevěděli předem, co malá je, jednoduše "nebo" čísla s tímto vzorem bitů, které jsme zde prezentovaných ve žluté, můžete malá písmena na kapitál tím, že proletí, že trochu. Použili jsme tento výraz týdny: obracející trochu. Jak se vlastně děláte, že programově? Můžete použít to, co se obecně nazývá masku, sekvence bitů, že v tomto případě jen tak se stane, aby vypadal jako toto číslo zde, a pak ", nebo" to společně pomocí této nové C operátora, ne | |, můžete použít single | a ty by skutečně stáhni zde odpověď, protože proč? To je 1s místo, 2s místo, 4S, 8s, 16s, 32s. Tak to dopadá, že pokud budete mít velké písmeno a bitové operace OR je s celočíselným 32, protože integer 32, když se podíváte na to, jak bitů, vypadá to, to znamená, že můžete převrátit trochu, že jste vlastně chcete. A podobně - a budeme se podívat na kód za chvíli - Předpokládejme, že chceme jít opačným směrem. Jak se vám jít z malých písmen od A do kapitálu A? Který bit se musí změnit? Je to ten samý. Chceme změnit ten třetí kousek od 1 do 0. A jak bychom mohli jít asi dělá? Jak jsme vypnout trochu? S tím, co vzor bitů můžeme vypnout trochu? Co když třídíme invertního masky? Vzhledem k tomu, než jsme se celý žlutý masky 0s s výjimkou jednoho bitu jsme chtěli zapnout, co když to čas, uděláme celou masky 1s kromě bitu, který chceme vypnout a pak použít co operátor? Co když my "a" věci? Pojďme se podívat. Pokud bychom nyní otočit na to, předpokládat, že opět jsem vytvořit masku, která je všechno 1s s výjimkou jednoho kousku, který chci vypnout a pak spíše než "nebo" bílé Čísla až nahoru s žlutými čísly tady dole, Co kdybych místo "a" dohromady? Říká se tomu bitové a. Logicky, je to totéž, jako logický a. To mi dává 0 a 1 je 0. Takže false a true je false. Pravdivé a pravda je pravda. A tady je magie: True a false je nyní false, takže jsme vypnutý ten kousek. A teď zbytek příběhu je poněkud jednoduchá. Vzhledem k tomu, zbytek masky je 1s, nezáleží na tom, co ta čísla jsou v bílé barvě. Když "a" něco s pravdou, nebudete měnit jeho hodnotu. Pokud je to pravda, bude to i nadále platí. Pokud to bylo nepravdivé, zůstane false. Ale kouzlo se stane, když budete mít něco, co byla pravda a potom "a" to se false. To má za následek vypnutí ten kousek. Tak trochu záhadný tam. Pojďme skutečně podívat na nějaký kód, který by mohl ve skutečnosti vypadají ještě více mystický, ale pojďme se podívat zde na tolower. Když se podívám na ToLower, jít od hlavního města na malá písmena, Podívejme se, jak bychom mohli realizovat tento program. Tady je hlavní, a to nebere žádné argumenty příkazového řádku. Já jsem se prohlašuje, že znak c na dopisu, který uživatel bude psát dovnitř Pak jsem použít známé cíl, zatímco smyčka jen ujistit, že uživatel určitě mi dává kapitál nebo B nebo C. .. Z, takže se mi něco mezi a Z. A teď, co tady dělám? Mi "nebo" ing. to s 0x20, ale že je vlastně stejný jako - a vrátíme se to v okamžiku - 32. Takže znovu, 32 je tento vzor bitů zde. Proč to víme? Jen si vzpomeňte na týden 0. To je 1s místo, 2s místo, 4S, 8s, 16s, 32s místo. Takže to žluté číslo se stane být 32. Pak mohu vzít dopis, jako char tady, bitové "nebo" to se doslova počtem 32, a co se dostanu zpátky? Malá verze, char. Před chvílí, když jsem to vyjádřil v jiném základním zápisu. Co to znamenalo? >> [Student] Hexadecimální. [Malan] To se stává představují hexadecimální. Nemluvili jsme o tom hexadecimální tak moc, ale je to vlastně výhodné v případech, jako je tento. I když to vypadá složitější, a to i když to vypadá, jako 20 a ne 32, ukázalo se, že hexadecimální je vlastně výborný pohodlné notace protože v šestnáctkové soustavě každé číslice po 0x - a to znamená, nic; to je jen lidská konvence, které říká, že tady je hexadecimální číslo - každý z těchto číslic, 2 a potom 0, samy o sobě mohou být reprezentovány s přesně 4 bity. Takže pokud to uděláme, dovolte mi, abych otevřít v textovém editoru zde - divné autocomplete - pokud budeme dělat trochu textový editor tady, číslo 0x20 znamená, tady je 4 bity, tady je další 4 bity. Pojďme udělat nejpravější 4 bity jako první. 0 když reprezentovaný s 4 bity je to, co? Super snadné. Prostě všechno 0s. Takže 4 bity jako 0s. Jak si představují 2? Je to dlouho, co jsme to udělali, ale je to 0100. Takže je 1s místo, to je místo 2s, a pak nezáleží na tom, co jsou ostatní místa jsou. Jinými slovy, v šestnáctkové soustavě dalo by se říct 0x20, ale pokud si pak přemýšlet o tom, co je 2 a jak je reprezentována v binární, co je 0 a jak je reprezentována v binární, odpovědi na tyto otázky jsou tohle a tohle, resp. Takže 0x20 stane reprezentovat tento vzor 8 bitů, což je přesně to maska, která jsme chtěli. Tak to je pro tuto chvíli jen intelektuální cvičení, ale realita je v kódu je to obvykle více obyčejné psaní konstanty, jako je tento v šestnáctkové soustavě, protože pak programátor může relativně snadno, i když to vyžaduje nějaký papír a tužku, zjistit, co ten vzor bitů je protože nemůžete jen vyjádřit 0s a 1s obvykle v kódu. Nemůžete jít 00010 a tak dále. Můžete si vybrat desítkové nebo hexadecimální nebo osmičkové nebo jiné zápisy. Většina lidí má tendenci vybírat hexadecimální jednoduše tak, že se každá číslice představuje 4 bity a můžete udělat rychlý matematiku. A já budu mávat ruku na toupper, což je téměř stejná, vypadá téměř totožné. Toupper stane používat ne nebo provozovatele, ale spíše ten chlap a DF. Co df představují? df? Každý, kdo? >> [Student] 255. 255? Není 255. To by bylo ff. Necháme tuhle jako malý výkon. Ale když jdete od 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 a potom, co bude po 9? Jsme trochu ven desetinných míst, ale v šestnáctkové soustavě, co přijde po 9? [Student]. >> Tak, b, c, d. Můžete přijít odtamtud, co vzor bitů d skutečnosti představuje. A pokud bychom si to spočítejte, uvidíme, že maska ​​můžete nakonec dostat zpět, je totožný s to. To je f, vše 1s, a to je d. Takže df představuje tu masku. Dobrá. A konečně, ne aby věci zvuk super, super technický, ale, že bychom chtěli napsat program, který to dělá. Nech mě jít dál a dělat binární, což je program, v souboru s názvem binary.c. A teď mi dovolte běžet binární a dej mi non-záporné celé číslo. Začněme jednoduše a zadejte 0. To je nyní program, který vytiskne čísla do jeho binární reprezentace. Takže když jsem hrát tuto hru znovu a zadejte pouze 1, měl bych dostat 32-bitovou reprezentaci 1. Pokud se mi to znovu 2, bych měl dostat, že. Pokud se mi 7, měl bych dostat několik 1s na konci, a tak dále. Ukázalo se, že jsem se zmínil, protože s bitové operace můžete skutečně udělat jednu věc stejně. Můžete si vytvořit tyto masky dynamicky. Podívejte se na tento jeden poslední příklad zahrnující bitové operace. Zde je první část kódu, aby uživatel zadal číslo, a trvá na tom, že bys mi non-záporné celé číslo. Takže to je trochu old school věci. Ale tady je něco, co je docela zajímavé. Jak mám jít o tisku číslo v binární? Poprvé jsem iterovat z čeho k čemu? Co je velikost int typicky, alespoň v přístroji? >> [Student] 4. Je to 4. Takže 4 * 8 je 32 - 1 je 31. Takže když jsem začal počítat od 31, který představuje, jak se ukazuje, jen koncepčně, 31. bit nebo nejvyšší bit je, což je ten chlap tady, vzhledem k tomu, to bude bit 0. Tak tohle je trochu ... 01 bit 31. Takže to, co je tento kód dělá? Všimněte si, to pro smyčce, i když to vypadá tajemná, je jen iterace od 31 až do 0. To je všechno. Takže zajímavá část nyní musí být v těchto 5 řádků zde. Všimněte si, že v této řadě jsem se prohlašuje, že proměnná s názvem masky být v souladu s naší příběhem těchto žlutých čísel. A pak, co je to děláš? To je další bitový operátor jsme neviděli, s největší pravděpodobností. Je to posun doleva operátor. Tento operátor to dělá. Zde je číslo 1, a pokud to uděláte i vlevo posun, posun doleva, co si myslíte, že má za následek dělá, že jednotlivé 1? Doslova posunem nad. Takže pokud číslo 1 je to, co budete mít na levé straně a začnete inicializaci i do 31, Co je to, že bude dělat? Bude to trvat toto číslo 1 a posunout ji 31 ​​míst tady. A protože je zřejmě žádné další číslice za ní, které budou automaticky nahrazeny 0s. Takže budete začít s číslem 1, což samozřejmě vypadá takhle - a dovolte mi, abych nakreslit to tady v centru. A pak, jak si posunout věci vlevo, ten chlap v podstatě jde touto cestou. Ale jakmile to uděláte, dostane 0 vyplněna Pokud posunete ji podruhé, to jde takhle a další 0 dostane vyplněna Můžete posunout ho znovu a pak ještě dostane 0 vyplněna Takže pokud si tuto věc 1 << i 31 míst, můžete nakonec dostat masku že je 32 znaků, vlevo z nichž jeden je 1, všechny ostatní, které jsou 0. A ukázalo se, jak stranou, přesunem číslo vlevo takhle také shodou okolností, a někdy pohodlně, má za následek, dělá co toto číslo? >> [Student] Zdvojení ji. Zdvojnásobení, protože každý ze sloupců - 1s místo, 2s místo, 4s místo, 8s místo, 16s místo - Jsou v všude zdvojnásobení as you go vlevo. Nebo spíš, když posunete 1s budete skončit zdvojnásobit hodnotu čísla. Můžete skončit dělat zajímavé proměny číslic tím, že přesouvá vše nad tímto způsobem mocninou 2. Takže jak to funguje? To pak dává mi masku, která je všechno 0s výjimkou 1 v přesně místo, kde chci to, a pak tento výraz, který je ukraden z toupper.c, jednoduše říká se číslo n, že uživatel zadaný v, "A" je s tou maskou, a to, co se vám dostane? Budeš se dostat 1, pokud je to 1 v tomto maskované místě, nebo se chystáte dostat 0, pokud tam není. A tak všechno tento program efektivně je, že má smyčku, a vytváří masku s 1 sem, pak se 1 sem, pak 1 nad zde, a používá tuto bitovou a trik říct, je, že 1 bit v uživatelském vstupu zde? Je tu 1 bit v uživatelském vstupu zde? A pokud ano, doslova tisknout 1, jinak tisku 0. Děláme to s ints jen proto, že je to důvod, proč to děláme 32 bitů místo 8, ale to, co jsme zavedli pak je to bitové operace AND, to bitový OR, a tento posun doleva operátor, které nejsou často strašně užitečné, ale ukázalo se, že mohou být. Ve skutečnosti, pokud jste měli reprezentovat něco jako pole Booleans Jen zastupovat true nebo false, že jste chtěl sledovat, zda místnost plná 300 studentů je přítomen, můžete deklarovat pole o velikosti 300 typu bool, takže budete mít 300 bools, a můžete nastavit každý na hodnotu true, pokud je někdo tady a jinak false. Proč je to, že reprezentace v tomto datové struktury neefektivní? Co je špatného na tom, navrhování tohoto datové struktury, pole o 300 bools? Co je bool, ve skutečnosti, pod kapotou? To je také něco, co nemusí být obeznámeni. Ukazuje se, že není bool. Nezapomeňte jsme trochu vytvořili, že se cs50.h souboru, který sám o sobě obsahuje standardní Bool. C je druh němý, i když, pokud jde o bool. Používá 8 bitů představují každý bool, která je zcela nehospodárné protože samozřejmě, kolik bitů se musíte reprezentovat bool? Jen 1. Tak se ukazuje, že pokud máte nyní možnost s operátory bitové manipulovat jednotlivými bity iv char, dokonce v jednom bajtu, se ukáže, že by mohla snížit paměť potřebnou k zastupování něco hloupého jako ten studium stylizovaný datové struktury podle faktorem 8. Místo toho, aby pomocí osmi bitů pro reprezentaci true nebo false, můžete doslova použít jednu pomocí jednoho bajtu pro každých osm studentů ve třídě a přepínání 0-1 jednotlivých bitů pomocí těchto druhů low-level triků. To opravdu ukončit energie. Jsou nějaké otázky ohledně bitové operace? Jo. >> [Student] Je tu exkluzivní nebo provozovatel? Ano. Tam je exkluzivní nebo operátor, který vypadá takto, ^, mrkev symbol, což znamená, že pouze první věc, nebo ta druhá věc, může být 1 pro výstup bude 1. Je zde také není, ~, který umožní k inverzi 0 na 1 nebo naopak, tak. A je tu také posunutí vpravo operátor, >>, což je opakem jsme viděli. Dobrá. Pojďme se věci nyní na vyšší úroveň. Začali jsme tím, že mluví o textu a pak jej zkomprimovat a představující textu s menším počtem čísel bitů; jsme si povídali trochu o tom, jak můžeme nyní začít manipulaci věci na úrovni bitové. Pojďme se nyní přiblížit zpět 10.000 stop s reprezentací složitějších věcí, jako grafiku. Zde máme pod vlajkou Německa, tady máme jednu z Francie. Tyto by mohly být reprezentovány ve formátech možná víte - Gify, například. Pokud jste někdy viděli obraz na webu, která končí v gif., To je výměnný grafický formát. Tyto dvě vlajky zde jakési propůjčit komprese pro co možná zjevného důvodu? >> [Neslyšitelné Student odpověď] Je tu spousta opakování, ne? Pro odeslání německé vlajky, myslet na to, jak je obraz na obrazovce zpět ve vašem Scratch dnů. Můžete připomenout, že jednotlivé pixely nebo tečky, které tvoří obraz. Existuje celá řada černých teček a další celý řádek černých teček. Je tu parta z řad černých teček, které jsme mohli vidět, pokud jsme opravdu zvětšovat, moc rád, když jsme se přiblížili na tváři Robyho ve Photoshopu. Jakmile jsme se dostali hlouběji a hlouběji a hlouběji do obrazu, jste začali vidět pixelaci, všech čtverců, které složených jeho pohled v tomto případě. Stejná dohoda zde. Pokud bychom přiblížení docela dost, měli byste vidět jednotlivé body. No, to je trochu odpadu bitů. Pokud třetiny vlajky je černý a třetina vlajky je žlutý a tak dále, proč nemůžeme nějak zkomprimovat tento příznak? A dokonce i francouzská vlajka může být komprimován, i když vzor je trochu jiný. Ukázalo se, že GIF formát souboru je bezztrátový formát komprese, což znamená, že si můžete vzít obrázek jako německou vlajkou tady, můžete zahodit spoustu svých bitů bez ztráty kvality. Toto je v kontrastu k něčemu, jako je JPEG, , s níž většina z nás pravděpodobně známější. Facebook fotografie a Flickr fotky a podobné jsou téměř vždy uloženy jako JPEG když jste nahrát oni, ale JPEG je ztrátová - ztrátová - formát, kdy se vám zahodit bitů ale také vyhodit kvalitu. A tak pokud jste kompresi fotografií ve Photoshopu nebo je odešlete na Facebook nebo si je na opravdu mizerný telefon, víte, že obraz začíná být velmi skvrnami a pixelated, a to proto, že je to je stlačen na počítači nebo telefonu doslova házet informací pryč. Ale GIF je úžasná v tom, že můžete použít méně bitů, než to by mohlo ve výchozím nastavení bez ztráty jakékoli informace. A to v podstatě tak činí takto. Spíše než obchod v souboru jako BMP by RGB triple pro černou, černá, černá, černá, černá, černá, černá, černá, černá, černá, černá, černá a tak dále, spíše, formát GIF se říct, "Black," a pak, "Opakujte tento postup 100 krát," nebo něco takového. "Black, opakujte tento 100 krát, černé, opakujte tento 100 krát ..." "Žlutá, opakujte tento 100 krát." A tak, že si pamatuje, v podstatě, vlevo pixel a potom kóduje nějak pojem opakování, že pixel znovu a znovu. Takže GIF pak může stlačit sami bez ztráty jakékoli informace. Ale pokud jste měl hádat, jestli je to algoritmus, který Gify použití, které z těchto příznaků, i když vypadají totožné ve velikosti, bude menší, když uloží na disk jako GIF? >> [Student] Německo. Německo bude menší? Proč? [Studentských] Protože si to zopakovat mnohokrát horizontálně a potom opakujte jindy. Přesně >>. Vzhledem k tomu, že lidé, kteří vymysleli GIF tak nějak svévolně rozhodl že opakování budou prosazovány horizontálně a příčně. Je tu mnohem víc opakování příčně zde v německou vlajkou než francouzskou vlajkou. Takže pokud jsme skutečně otevřít složku na mém pevném disku, který má tato GIF, můžete skutečně vidět, že německá vlajka je zde 2 KB a francouzské jeden je 4 KB. To se stane, že náhodou, že jeden je dvakrát druhý, ale je to ve skutečnosti pravda, že francouzská vlajka je mnohem větší. I když mluvíme tu o grafice, stejné myšlenky se vztahují na ne věci, jako je vlajka, ale obrazy, které jsou trochu složitější. Pokud budete mít obraz jablka, určitě je tu spousta duplikace tam, takže jsme mohli nějak si uvědomit, že výchozí pozadí je modrá a nikoli, jak pravá obrázek naznačuje, mít na paměti, barvu každého jednotlivého pixelu v obrázku. Takže můžeme hodit bity dál se bez ztráty informací. Jablko stále vypadá stejně. V tomto příkladu zde, můžete vidět, co se stane ve filmu. Ty představují staré filmové škole kotouče který spočívá v horním obrázku tam máte RV jízdu kolem domu a strom. A jako van projíždí kolem zleva doprava, co očividně nemění? Dům se nikam, a strom se nikam. Jediná věc, která se pohybuje, je dodávka v tomto případě. Tak jako pozadí Beze změn naznačuje, co můžete udělat ve filmech Stejně tak se prostě zahodit informace, které se nemění v mezi snímky. To je obecně známé jako komprese interframe přičemž v případě, že rám vypadá téměř totožný s tímto jeden, Pojďme neobtěžoval ukládání na disk některý z shodných informací na těchto přechodných snímků, pojďme používat pouze klíčové snímky jednou za čas že skutečně tyto informace uchovávat redundantně, stejně jako trochu rozumu kontrolu. Naproti tomu jiný přístup k kompresi videa je v tomto druhém a nižší například zde, kde spíše než obchod 30 snímků, proč si prostě uložit 15 snímků za sekundu místo? Spíše než film druhu proudění krásně, dokonale, by to mohlo vypadat, že to koktání trochu, trochu stará škola, ale výsledný efekt bude používat mnohem méně bitů, než by jinak byly zapotřebí. Tak kde to potom nás opustil? To byl trochu stranou, kde jinde můžete jít s kompresí. Pro více o tom, vzít třídu jako CS175 zde. Zde je další příklad ve videu. Pokud Včela je jediná věc, stěhování, můžete opravdu vyhodit informace v těchto středních rámů protože květiny a nebe a listy se nemění. Ale pojďme se teď zvážit jednu věc. V dalších 5 minut necháme C za sebou navždy v přednášce? Ano. Ne na psets, ačkoli. Poslední příběh o C a pak se dostaneme k velmi sexy věci zahrnující HTML a Web a woo-hoo. Dobrá. Jdeme na to. To je motivace. Ukázalo se, že celou tu dobu, kdy jsme byli psaní programů jsme běží řinčet. A zvonění, jsme řekli, protože první týden skoro, má zdrojový kód a převádí ji do objektového kódu. To trvá C a převádí ji do 0s a 1s. Jsem trochu lhal vám na pár týdnů, protože to není tak jednoduché, jak to zní. Je tu mnohem více děje pod pokličku při spuštění programu, jako je Clang. Ve skutečnosti, může proces sestavování programu opravdu shrnout, jak si můžete stáhnout z videa Robertův na kompilátory, do těchto 4 kroků: pre-zpracování, sestavování sám, montáž a propojení. Ale my ve třídě a většina lidí na světě obvykle shrnout všechny tyto kroky jak jen "kompilace." Ale když začneme se zdrojovým kódem, jako je tento, připomínají to je snad nejjednodušší program v jazyce C psali jsme tak daleko, připomněl, že při kompilaci to skončí vypadá takhle. Ale je to vlastně mezistupeň, a tyto kroky jsou následující. První z nich je to, co na samém vrcholu tohoto a většiny našich programů, # Include Co # include se pro nás? To do značné míry kopíruje a pasty na obsah stdio.h do mého souboru, takže proč? Proč se mám starat o obsahu stdio.h? Co je tam zájmu? Printf je prohlášení, jeho prototyp, takže kompilátor pak ví, co mám na mysli Když jsem zmínil tuto funkci printf. Takže krok 1 v sestavování je pre-zpracování, přičemž program, jako Clang nebo některé pomocný program, který je dodáván s zvonění čte kód top dolů, zleva doprava, a kdykoliv to vidí symbol # následuje klíčové slovo, jako patří, provádí tuto operaci, kopírování a vkládání v tomto případě stdio.h do souboru. To je krok 1. Pak budete mít mnohem větší C soubor, protože obrovské kopie, vložte práce, která se právě stalo. Krok 2 nyní je kompilace. Ale ukázalo se, kompilaci toho zdrojový kód, který vypadá takto a stáčí se do něčeho, co vypadá jako to, které pro ty, kteří znají, se nazývá? >> [Student] shromáždění. >> Assembler. To je vlastně něco, pokud budete mít CS61 budete potápět do podrobněji. To je asi tak blízko, jak se můžete dostat do psaní 0s a 1s sami ale psaní věci takovým způsobem, že stále ještě alespoň trochu smysl. Jedná se o strojové instrukce, a když se posouvat dolů k hlavní funkci zde, Všimněte si, že tam je to tlak návod, přesunout výuku, odčítání instrukce, volání instrukce, a tak dále. Když slyšíte, že váš počítač má Intel Inside, máte procesor Intel v počítači Mac nebo PC, co to znamená? CPU přijde postavený společností, jako je Intel pochopení určitých pokynů. Nemají ponětí, co funguje jako odkládací prostor jsou nebo hlavní jsou samy o sobě, ale oni to vědí, co velmi nízké úrovni návod jako sčítání, odčítání, tlačit, pohybovat, zavolejte, a tak dále, jsou. Takže při kompilaci C kód do assembleru, Vaše velmi uživatelsky příjemný pohledný kód je převeden do něčeho, co vypadá jako to, že doslova pohybuje bajtů nebo 4 bajty kolem těchto malých jednotek do a ze CPU. Ale nakonec, když zvonění je připraven převzít tuto reprezentaci vašeho programu do 0 a 1, pak krok nazývá montáž stane, a to opět všechno se děje v mrknutí oka při spuštění řinčet. Začneme tady, výstup soubor, jako je tento, a pak ji převede na tyto 0s a 1s. A chcete-li se vrátit na nějakém místě a skutečně vidět v akci, když jdu do hello1.c--to je jedna z prvních programů, podívali jsme se na - normálně bychom sestavit to s Clang hello1.c a to by nám a.out. Pokud naopak místo toho dát mu-S vlajkou, co dostanete, je hello1.s a budete skutečně vidět jazyk symbolických instrukcí. Dělám to pro velmi krátkém programu, ale pokud jdete zpět Scramble nebo obnovit nebo jakýkoliv program, co jste napsali a jen ze zvědavosti Chcete vidět, jak to vlastně vypadá, co je skutečně přivádí do CPU, můžete používat-S vlajkou s Clang. Ale pak konečně, je tu ještě jeden mám tě. Zde jsou 0s a 1s, že reprezentovat svou realizaci Hello, world. Ale jsem někoho jiného, ​​funkci v mém programu. Takže i když byl proces beru hello.c, se dostane zkompilován assembleru, a pak to dostane spojitelné do 0s a 1s, pouze 0s a 1s, které jsou na výstupu v tomto okamžiku jsou ty, které vyplývají z mého kódu. Ale ten, kdo psal printf, že sestavují svůj kód před 20 lety a je to nyní instalovány někde na zařízení, tak jsme si nějak sloučit jeho nebo její 0s a 1s s mým 0s a 1s, a to nás přivádí k 4. a poslední krok při sestavování, známý jako propojení. Takže na levé straně máme přesně stejný obraz jako předtím: hello.c se kód assembleru se stává 0s a 1s. Ale vzpomínám, že jsem použil standardní I / O knihovnu v mém kódu, a to znamená, že někde v počítači existuje soubor s názvem stdio.c nebo alespoň přeložená verze této smlouvy, protože někdo před několika lety sestavují stdio.c do assembleru a pak celá parta 0s a 1s. To je to, co je známo jako statické nebo dynamické knihovně. Je to nějaký soubor sedí někde v přístroji. Ale konečně, musím vzít svou 0s a 1s a ta osoba je 0s a 1s a nějak je spojit, doslova kombinovat ty 0s a 1s do jednoho souboru s názvem a.out nebo hello1 nebo co jsem volal můj program tak, že konečný výsledek má všechny 0 a 1, která by měla skládají svůj program. Takže celou tu dobu tento semestr, kdy jste používali řinčet a ještě nedávno spuštěných aby ke spuštění řinčet, všechny tyto kroky byly děje druh jednorázově, ale velmi uvážlivě. A tak, pokud budete pokračovat na v oblasti počítačové vědy, a to CS61, je to vrstva, která budete pokračovat odtrhněte vystoupit mluví o účinnosti, bezpečnosti důsledky, a jako z těchto nižších úrovní detailů. Ale s tím, že jsme na odchodu C za sebou. Pojďme dál a vzít naše 5-minut přestávku teď, a když se vrátíme zpět: Internet. Dobrá. Jsme zpět. Nyní začneme náš pohled nejen na HTML, protože, jak uvidíte, HTML sám o sobě je vlastně docela jednoduchá ale opravdu na webové programování obecně, síťové obecněji, a jak všechny tyto technologie se spojily které nám umožní vytvořit mnohem sofistikovanější programy na vrcholu internetu než doposud jsme byli schopni v těchto černé a bílé oken. Opravdu, v tomto bodě v semestru, i když jsme se vydávají relativně méně času na PHP, HTML, CSS, JavaScript, SQL a další, většina studentů si nakonec dělá konečné projekty, které jsou on-line protože jak uvidíte, pozadí nyní máte v C je velmi na tyto vyšší úrovně jazyků. A jak jste začít přemýšlet o svém konečném projektu, která, podobně jako problému Set 0, kde byli povzbuzeni si dělat většinu něco zajímavého, aby vás v Scratch, konečný projekt je vaše příležitost, aby své nově nabyté znalosti a důvtipný s C nebo PHP nebo Javascript nebo jako z pro rotaci a vytvořit si svůj vlastní kus softwaru pro svět vidět. A na osivo, jste s nápady, vím, že se můžete vydat zde, projects.cs50.net. Každý rok jsme vyžádat nápady z fakulty a zaměstnance a studentské skupiny na akademické půdě Jen, aby předložily své nápady na zajímavé věci, které by mohly být řešeny pomocí počítače, používání stránek, pomocí softwaru. Takže pokud jste snaží přijít s nápadem na vlastní, by všechny prostředky procházet myšlenkami tam od letošního roku a poslední. To je naprosto v pořádku, aby řešení projektu, která byla vyřešena před. Viděli jsme mnoho aplikací k vidění stavu prádla na akademické půdě, mnoho aplikací pro navigaci v jídelně nabídky, mnoho aplikací pro navigaci v kurzu katalog a podobně. A skutečně, v budoucnu přednášku a v budoucích seminářů, Představíme vám nějaké veřejně dostupné API, a to jak komerčně dostupné stejně jako zde k dispozici od CS50 na akademické půdě, takže máte přístup k datům a pak může dělat zajímavé věci s ním. Takže více o závěrečných prací v několika dnech, kdy jsme se uvolnit specifikaci, ale teď, víte, že můžete pracovat sólo, nebo s jedním nebo dvěma přáteli na téměř jakýkoli projekt, které vás zajímají. Internet. Budete pokračovat a vytáhnout notebook, můžete jít do facebook.com poprvé, to, že v poslední době přihlášen, a stiskněte klávesu Enter. Co přesně se stalo? Pokud stisknete klávesu Enter na počítači, celá parta kroků kdo druh magicky děje. Takže jste tady vlevo, webového serveru, jako je Facebook, je zde vpravo, a nějak jste pomocí tohoto jazyka s názvem HTTP, Hypertext Transfer Protocol. HTTP není programovací jazyk. Je to více o protokolu. Je to soubor konvencí, které webové prohlížeče a webové servery používají při vzájemném spojení. A co to znamená, je následující. Stejně jako v reálném světě, máme tyto konvence kde když potkáte nějakou člověka poprvé, pokud vám nevadí, že humoring mě tady, I může přijít k vám, říct: "Ahoj, mé jméno je David." >> Ahoj, David. Mé jméno je Sammy. "Ahoj, David. Jmenuji se Sammy." Takže teď jsme právě zapojeni do tohoto druhu hloupé lidské protokolu , kde jsem inicioval protokol, Sammy reagoval, jsme potřásl rukou, a transakce je kompletní. HTTP je velmi podobný v duchu. Když vaše požadavky webového prohlížeče www.facebook.com, co váš prohlížeč je skutečně dělá rozšiřuje svou ruku, abych tak řekl, na serveru a je to zasláním zprávy. A ta zpráva je obvykle něco jako dostat - co chceš dostat? - abych domovská stránka, která je obvykle označován jedním lomítkem na konci adresy URL. A abyste věděli, jakým jazykem mluvím, jsem prohlížeč jsem ti to říct že mluvím HTTP verze 1.1, A také pro správnou míru, já ti to říct, že hostitel, že chci na domovskou stránku je facebook.com. Typicky, webový prohlížeč, unbeknownst pro vás, člověka, zasílá tuto zprávu přes Internet, kdy stačí napsat www.facebook.com, Zadejte, do svého prohlížeče. A co se Facebook reagovat? Reaguje s některými podobně vypadajících kryptických podrobností, ale také mnoho dalších. Nechte mě jít napřed na domovskou stránku Facebooku je zde. Toto je obrazovka, že většina z nás asi nikdy vidět, pokud si pobyt přihlášen celou dobu, ale je to opravdu jejich domovská stránka. Pokud to uděláme v Chrome, zjistíte, že můžete vytáhnout tyto malé kontextové menu. Pomocí Chrome, ať už na Mac OS, Windows, Linux, nebo jako, Pokud ovládáte tlačítkem nebo klikněte levým tlačítkem, můžete obvykle vytáhnout menu, které vypadá jako to, kde několik možností čekají, z nichž jedna je View Page Source. Můžete se také obvykle dostávají na tyto věci tím, že půjdete do nabídky Zobrazit a šťourat. Například, tady pod View, Developer je totéž. Chystám se jít dopředu a podívat se na Source View Page. Co uvidíte, je HTML, které Mark napsal reprezentovat facebook.com. Je to naprostý zmatek tady, ale uvidíme, že to dělá trochu větší smysl, než dlouhé. Ale tam jsou některé vzory zde. Dovolte mi, abych přejděte dolů nacpat takhle. To je těžké pro člověka číst, ale všimněte si, že tam je tento vzor Lomené závorky s klíčovými slovy jako možnost, klíčová slova, jako je hodnota, některé řetězce v uvozovkách. To je místo, kde, když jste se zaregistrovali pro úplně první čas, stanovené, jaké jsou vaše rok narození je. To drop-down menu vrozených let je nějak zakódován zde v tomto jazyce s názvem HTML, HyperText Markup Language. Jinými slovy, když se prohlížeč požaduje webovou stránku, mluví této úmluvy s názvem HTTP. Ale co se facebook.com odpovídají tomuto požadavku se? Reaguje s některými z těchto kryptických zpráv, jak uvidíme za chvíli. Ale většina z jeho odpovědi je ve formě HTML, HyperText Markup Language. To je skutečný jazyk, ve kterém je zapsán webové stránky. A co webový prohlížeč opravdu pak je, po obdržení něčeho, co vypadá jako to, čte se shora dolů, zleva doprava, a kdykoliv to vidí jeden z těchto Lomené závorky následuje klíčové slovo, jako je možnost, zobrazí se tento značkovací jazyk v odpovídajícím způsobem. V tomto případě, by se zobrazit drop-down menu let. Ale znovu, to je kompletní nepořádek na pohled. To není proto, že Facebook vývojáři najevo 0 pro 5 pro styl, například. To je proto, že většina kódu, který se napsat, ve skutečnosti, písemné krásně, velmi dobře okomentován, pěkně členité, a podobně, ale samozřejmě strojů, počítačů, prohlížeče opravdu kašlu zda je váš kód je dobře stylu. A ve skutečnosti, je to naprosto nehospodárné zasáhnout klávesy TAB všechny ty časy, a dát připomínky v průběhu celého kódu a zvolit opravdu popisné názvy proměnných protože pokud prohlížeč není jedno, všechno, co děláte na konci dne je plýtvání bajtů. Tak to dopadá, co většina internetových stránek udělat, je, i když zdrojový kód facebook.com, pro cs50.net a všechny z těchto jiných webových stránek na internetu jsou obvykle dobře napsaný a dobře komentované a pěkně členité a podobně, obvykle předtím, než je webová stránka, na internetu, je minified kód, přičemž HTML a CSS - něco jiného budeme brzy vidět - kód JavaScript budeme brzy vidět je komprimován, přičemž dlouhé názvy proměnných se X a Y a Z, a všechny tyto mezery, která dělá všechno vypadat tak čitelný je všechno vyhodit, protože pokud si myslíte, že o tom tímto způsobem, Facebook dostane miliardy stránky narazí na den - něco šílené takového - tak co, pokud programátor jen pro anální hit mezerník navíc jeden čas jen odrážky nějaký řádek kódu stále ještě mnohem víc? Co je to implikace, pokud Facebook zachová mezery ve všech bajtů pošlou zpět k lidem na internetu? V ťukání do mezerníku, jakmile vám dává další bajt v souboru. A pokud miliarda lidí a pak pokračujte ke stažení domovskou stránku ten den, kolik víc dat jste přenášena přes internet? Gigabyte bezdůvodně. A poskytnuta, pro mnoho webových stránek to není tak škálovatelné problém, ale pro Facebook, pro Google, pro některé z nejoblíbenějších internetových stránek je tu velká motivace finančně, aby váš kód vypadat jako nepořádek tak, že používáte jako několika bajtů jak je to možné vedle pak stlačovat to používat něco jako zip, algoritmus nazvaný gzip, že prohlížeč pro vás dělá automaticky. Ale to je hrozné. Nikdy se dozvědět něco o internetové stránky jiných lidí a jak navrhnout webové stránky pokud máme na to dívat takhle. Takže naštěstí, prohlížeče jako Chrome a IE a Firefox v těchto dnech obvykle přicházejí s vestavěným-in vývojářských nástrojů. Ve skutečnosti, když půjdu sem, zkontrolujte Element, nebo jestli jsem jít do View, Developer, a přejděte na Developer Tools explicitně, toto okno v dolní části mé obrazovce nyní vyskočí. Je to trochu zastrašující na první, protože je tu spousta neznámých karet tady, ale když jsem klikněte na prvky celou cestu vlevo dole, Chrome je zřejmě docela chytrý. To umí interpretovat všechny tohoto kódu. A tak to, co dělá, je Chrome vyčistí všechny HTML Facebooku je. I když tam to není mezera tam, že to není odsazení tam, Nyní si, že mohu začít navigovat tuto webovou stránku a to tím spíše hierarchicky. Ukazuje se, že každá webová stránka napsána v jazyce s názvem HTML5 by měla začít s tím, tento DOCTYPE deklarace, abych tak řekl: Je to druh světla a šedé tam, ale to je úplně první řádek kódu v tomto souboru, a že právě říká prohlížeči, "Hej, tady je nějaký HTML5. Zde přichází webovou stránku." První otevřené držák za který se stane být tato věc, otevřený držák HTML tag, a pak když jsem ponořit hlouběji - tyto šipky jsou zcela bezvýznamné; oni jsou jen pro prezentaci boží, ve skutečnosti nejsou v souboru - všimnout, že uvnitř HTML tag Facebooku je, cokoliv, co začíná s otevřeným držákem a pak se slovo se nazývá tag. Takže uvnitř HTML tag je zřejmě hlavou tag a tělo tag. Uvnitř hlavy tagu je nyní celý bordel na Facebook protože mají spoustu metadat a dalších věcí pro marketing a reklamu. Ale když jsme se posunout dolů, dolů, dolů, dolů, pojďme zjistit, kde to je. Tady to je. Tohle je alespoň trochu obeznámen. Název domovské stránce Facebooku je, pokud jste někdy podíváte na kartě ve vašem záhlaví, Je Vítejte na Facebooku - Přihlásit, Registrace nebo Dozvědět se více. To je to, co byste viděli v záhlaví prohlížeče Chrome, a to je, jak to je reprezentováno v kódu. Pomineme-li vše ostatní v hlavě, většina z vnitřností webové stránky jsou v těle, a ukazuje se, že Facebook je kód bude vypadat složitější než většina věcí, budeme psát zpočátku jen proto, že je to bylo postavené v průběhu let, ale je tu spousta script, JavaScript kód, že dělá webové stránky velmi interaktivní: vidět aktualizace stavu okamžitě pomocí jazyků, jako je JavaScript. Je tu něco, co nazývá div, který je rozdělení stránky. Ale dříve, než se dostaneme k této informaci, pojďme se pokusit oddálit a podívat se na jednodušší verzi Facebook 1.0, abych tak řekl. Zde je hello, world webových stránek. To má tu deklaraci DOCTYPE na samém vrcholu který je trochu odlišný od všeho ostatního. Nic jiného jsme psát na webové stránky se chystá začít s pro tučné. Opět, příběh je stejný: ahoj, čárka, začít dělat to tučné, pak svět dostane vytištěny tučně, a to znamená, přestat tisknout to tučně. Nech mě jít napřed a zachránit soubor, přejděte zpět na Chrome, budu přiblížit jen tak můžeme vidět lépe, a znovu, a uvidíte, že svět je dnes tučně. Web je o hypertextové odkazy, tak pojďme do toho a to: můj oblíbený web je, řekněme, youtube.com. Uložit, znovu. Dobře. Je tu pár problémů nyní jsou kromě ošklivost na internetových stránkách. 1, jsem si docela jistý, že jsem Enter zde. A já jsem to udělal. Já jen Enter, jsem také členité, procvičování toho, co jsme se kázal o stylu, ale moje je hned vedle světa. Tak proč je to tak? Prohlížeče jen to, co řeknete, aby dělali. Neřekl jsem prohlížeč, "zlomové linie, zde. Vložte bod zlomit tady." Takže prohlížeči, nezáleží na tom, jestli jsem trefil Return 30 krát, je to stále bude dát své právo vedle světě. Co jsem opravdu musíte udělat, je zde říci něco jako
, vložit konec řádku. A vlastně, konec řádku, je trochu divný věci protože nemůžete skutečně začít stěhování do jiného řádku, pak něco, a pak se zastaví stěhování na nový řádek. Je to trochu atomická operace. Buď to, nebo ne. Stisknete klávesu Enter, nebo nemáte. Takže br je trochu jiný tag, a tak musím nějak jak se otvírají a zavírají ji najednou. Syntaxe pro které je tento. Technicky, jsi to mohl udělat něco takového v některých verzích HTML, ale to je jen hloupé, protože není žádný důvod ke spuštění a zastavení něco pokud můžete, místo toho to všechno najednou. Uvědomte si, že HTML5 není striktně vyžadují tuto lomítko, takže uvidíte učebnice a on-line zdrojů, které nemají to, ale pro jistotu pojďme cvičit symetrii, že jsme viděli doposud. To znamená, že značka je jak otevírat a zavírat. Tak teď se mi zachránit můj soubor, jděte sem. Dobře, takže to začíná vypadat lépe, s výjimkou webu vím, je trochu kliknout, a přesto youtube zde nezdá se, že vést k ničemu. To proto, že i když to vypadá jako odkaz, prohlížeč neví, že samo o sobě, tak musím říct prohlížeči, že toto je odkaz. Cesta k tomu je použít kotevní tag: a dovolte mi, abych přesunout to na nový řádek jen tak, že je to trochu srozumitelnější, a já zmenšit velikost písma. Jsem hotová? Ne Tam to bude tato dichotomie. Tento tag, kotva tag, skutečně se atribut, které mění své chování, a hodnota tohoto atributu je zřejmě YouTube URL. Ale všimněte si dichotomii je to jen proto, že je to URL budete, to neznamená, že musí být slovo, které jste podtržení a dělat odkaz. Spíše, to může být něco takového. Takže musím říct, že přestat dělat toto slovo hypertextový odkaz pomocí úzké kotevní značku. Všimněte si, já to nedělám. 1, by to být jen ztráta každého času a to není nutné. Chcete-li zavřít tag, stačí uvést jméno tagu znovu. Nemusíte zmínit některé z atributů. Takže pojďme zachránit to, vrátit. Dobře, voila, teď je to modré a hypertextovými odkazy. Pokud jsem na něj, já vlastně dělat jít na YouTube. Takže i když moje webová stránka není na internetu, je to přinejmenším HTML, a pokud necháme Internet dohnat, bychom skutečně skončit tady na youtube.com. A můžu jít zpět a tady je moje webová stránka. Ale nevšiml. Pokud jste někdy dostali spam nebo phishing, Nyní máte možnost po pouhých pět minut, aby učinili totéž. Můžeme jít sem a udělat něco jako www.badguy.com nebo co útržkovité web je, a pak si můžete říct ověřit PayPal účet. [Smích] A teď to jít na badguy.com, které nebudu klikat na protože nemám ponětí, kde to vede. [Smích] Ale nyní máme možnost skutečně skončí tam. Takže jsme opravdu teprve začíná, abyste nepoškrábali povrch. Nejsme programování sobě, budeme psát značkovací jazyk. Ale jakmile jsme se završují náš slovník ve formátu HTML, budeme zavádět PHP, skutečný programovací jazyk že nám umožní generovat HTML automaticky, generovat CSS automaticky, takže můžeme začít ve středu realizovat, řekněme, naše vlastní vyhledávač a další. Ale o tom více v pár dnech. Uvidíme pak. [CS50.TV]