[Powered by Google Translate] [Недела 7] [Дејвид Џ Malan - Универзитетот Харвард] [Ова е CS50. - CS50.TV] Во ред. Добредојде назад. Ова е CS50, а тоа е почеток на недела 7. Неколку малку известувања: Pset5 сега е во тек, или наскоро ќе биде, и дозволете ми да кажам, сосема искрено, тоа не имаат тенденција да биде меѓу повеќе предизвик на проблемот поставува курсот, па дозволете ми да споменам тоа сега така што оваа недела повеќе од кога и да не чека до, да речеме, во средата вечерта или четвртокот навечер да се нурне внатре Ова е дефинитивно една интересна pset. Сметаме дека тоа е забавно. Ако навистина го добие целосно точни, а потоа може да предизвика т.н. Биг одбор, ќе имаат можност да натпревар wits со некои од персоналот на курсот а некои од своите соученици. Што Големата одбор е еднаш имаш магија-Проверка на работење, ќе бидете во можност да одат на cs50.net по водење на команда, чисто се одлучат, а потоа износот на време и износот на RAM и повеќе што сте го користеле во вашата институција ќе бидат изложени тука на почетната страница на курсот. Ќе забележите дека целиот куп на овие луѓе тука се наведени како персонал бидејќи во текот на викендот, вработените мислев дека ќе биде забавно да се обидат да настигнали едни со други. Така сфаќаат дека целта овде не е да настигнали на персоналот. Дури и јас сум само тука во број 13. Чисто да се одлучат во, но тоа е можност да се види само колку малку RAM меморија и како неколку процесорот секунди можете да го користите vis-a-vis некои од своите соученици. И јас ќе признаам дека Кевин Мајкл Шмид, моментално во број 1 позиција како еден од TFS, ова е имплементација дека ние не се јавите можно со оглед на тоа тој е користење на речиси 0 RAM и речиси 0 секунди за вчитување. Па ние ќе се грижи за Кевин офлајн. [Смеа] Постојат одредени вештини кои Кевин е ставање на тест тука. Една од работите што мислевме дека би го сторила премногу е сега CS50x е една недела во тек, а вие момци се исто толку дел од овој експеримент како оние студенти се. Ние ги праша како дел од нивната pset0, кои на сличен начин беше да поднесе Скреч проект од интерес за нив - игра, интерактивна парче на уметноста, анимација, или слично, - 1 - до 2-минутна видео, ако тие би сакале, велејќи здраво на светот и кои се тие всушност се. Мислев дека ќе го споделам со вас само неколку од видеата кои се поднесени досега бидејќи за нас, за вработените во најмала рака, тоа навистина е возбудливо и инспиративна да ги види овие луѓе од целиот свет - сите земји низ светот - подесување, на сите нешта, за компјутерски науки разбира на интернет, дали тоа е затоа што тие сакаат да ги продолжат своите сопствени студии, тие сакаат да ги преземе своите кариери во нова насока, тие сакаат да ги пополнат празнините во нивните знаење, па така некои од истите причини дека вие момци можеби биле тука. Па јас ви даде една таква студент тука. Вие би можеле да се подигне на обемот само малку. Еве една од 1-минута поднесоци нашите студентот. Здраво, свет. Јас сум студент на индустриски инженеринг тука во Малага, Шпанија. Јас сум возбуден околу оваа онлајн курс бидејќи сакам компјутерски науки, јас навистина, и јас навистина го цениме дека ќе добијам да го истражуваат. И фактот дека можам да научам иста сите вас момци прават но наместо да биде во Харвард Јас сум во Малага, колку страшно е тоа? Па, јас сум Фернандо, а тоа е CS50. Види вас момци. [Смеа] Друга клип ние се допаѓаат, ќе најдете дека англискиот овој господин не е толку силна. Тоа изгледа како тој го имаше машина преведени, па преводи самите се малку несовршени, но ова беше една од нашите омилени досега, како и. [♪ ♪] Здраво, свет. [Зборува на јапонски] [Морам да го поздрават на јапонски, бидејќи мојот англиски јазик е многу несигурни.] [Имам дадено на пораката до вас од градот Гифу, Јапонија.] [Можам да бидам студент за прв пат во 20 години, како што може да се види.] [Јас сум многу благодарен на Универзитетот Харвард, кој ми даде оваа можност и edx.] [Golf е гитара и мојот омилен нешто работи.] [Смеа] [♪ ♪] [Зошто мислите дека јас се обидував да присуствува на cs50x.] [Универзитетот Харвард, тоа е мојот копнеж.] [Особено ако сум далеку присуство живее во Јапонија.] [Сакав да се обиде веднаш свесни за постоењето на таков edx кога.] [Не мислите така да не се однесуваат на возраста на учење I.] [Cs50 е мојот копнеж. Моето име е Kazu, и ова е cs50.] [♪ ♪] [аплауз и навива] Друг омилен наш беше овој поднесок тука од некого. [♪ ♪] [Malan] Google ја ако не сте запознаени со овој мем. А потоа на крај, неколку други кои добија испратени дека можеби победи симпатична награда. [Студентите] Aww! >> [Malan] Ние ќе мора да го слуша. Ова е краток, така слушам внимателно. [Жена претседател] Што е вашето име? >> Louie. [Жена претседател] Што е ова? >> [Кикоти] CS50. [Смеа] [Malan] Тој два не се, иако. Еве ќе одиме, последниот. Моето име е Louie, и ова е CS50. [Смеа] Ова тогаш е CS50x. Ви благодариме на сите оние од вас додека по должината дома кои се причестиме досега. Денес, можеме да заклучиме нашата дискусија на структури на податоци, барем некои од најосновните, а потоа ќе продолжиме нашиот разговор за HTML и веб програмирање. Всушност, ние ги поминал последните некои седум недели гледајќи во основите на програмирање - алгоритми, структури на податоци, и слично - и Ц, како што може да го доживеале досега, не е секогаш повеќето достапни на јазиците со која треба да се имплементираат некои од тие идеи. И така почнувајќи од оваа недела и следната недела, а потоа следново, ние конечно ќе можат да се транзиција од Ц, кој е општо познато како мошне ниско ниво јазик, да работи на повисоко ниво, меѓу нив и PHP, JavaScript, и слично, кои можеме да видиме ќе се осврне на истиот лекции кои научиле во текот на изминатите неколку недели, но вие ќе најдете дека прогласувањето работи како низи и хаш маси и пребарување и подредување стана многу полесно бидејќи јазици самите ќе почнат да го користат ќе стане помоќна. Но, прво, на барање на дрвјата. Тоа е многу чест овие денови да треба да се компресира информации. Во она контекст вие би сакале да се компресира некој вид на дигитални информации? Да. >> [Студент] Кога ви треба да го испрати преку Интернет. Да, кога ќе сакате да испратите нешто во текот на веб. Ако сакате да ја преземете голема датотеката, таа е идеална ако некој на другиот крај има компресирана таа датотека користејќи ZIP формат или нешто слично така што праќаш помалку битови од инаку би можеле да се пренесе. Па, како да се компресира информации? Сето тоа се сведува на користење на помалку бити отколку што се бара од стандардните. Но, ова е вид на чудна работа, бидејќи се сетам недели 0 и 1 кога ние разговаравме за ASCII и бинарни и ние разговаравме за ASCII особено како користење на 8 битови да претставуваат букви од азбуката така што буквата А е претставена со 65, мали букви во е број 97, и сепак ќе претставуваат 65 или 97, ако не користите 7 или 8 бита. Но, се фати е дека постојат некои букви во англиска латиница кои не се толку популарни како и сите други. Z не е сето тоа популарни, П не е сето она што популарни, но А и Е се супер популарен. А сепак за сите овие писма, по дифолт светот го користи истиот број на битови, само 8. Затоа, не ќе беше попаметно ако наместо користење 8 битови за секоја буква, дури и на повеќето ретко се користат како П и Z, Што ако ние се користи помалку бити за А и Е и С и најпопуларните букви и се користи повеќе битови за помалку популарни букви, Идејата е оптимизирате ајде за заеднички случај, која е тема во компјутерската наука се обидува да се оптимизира она што ќе се случи најмногу и да потрошат малку повеќе време, малку повеќе простор на она што, да, може да се случи но не мора толку често. Значи, да земеме за пример. Да претпоставиме дека сакаме да се кодираат информации прилично ефикасно. Можеби сте пораснале знаејќи малку нешто за Morse code, и шансите се не сте знаеле вистинскиот код, но може да се сети дека тоа е барем оваа серија на точки и цртички. Ова е прилично ефикасни кодирање, и известување дека од најпопуларните писмо - на пример, Е - користи најкус на сигнализација. Morse code е за сите биип-биип-биип-биип-биип-биип и одржување тонови или за кратки периоди на време или долги периоди на време. Е, како означува со точка, е супер краток ѕвонче, само ѕвонче, и дека ќе претставува Д Спротивно на тоа, Т ќе биде подолг ѕвонче, како ѕвонче [продолжува звук] и дека ќе претставува Т Но, тоа е сè уште прилично краток, бидејќи, од друга страна, ако се погледне на Z, да го изразат Z ќе одат ѕвонче, слушнете [повеќе звук], бип, бип [пократок звук]. Така, тоа е повеќе, бидејќи тоа е поретко. Но gotcha тука е дека Morse code е малку недостатоци со тоа што не е веднаш decodable. На пример, да претпоставиме дека ќе слушнете за некои крајот на жица ѕвонче [кратко], ѕвонче [долго]. Што порака не сум само добивате? А точка и цртичка. Што значи дека претставуваат? [Студент] А >> [Malan] Можеби. Таа, исто така може да биде Е проследено со Т Со други зборови, Morse code, и покрај тоа што Нотингем овој принцип на оптимизирање на аголот случај, тоа не се позајмуваат на непосредна decodability. Тоа е, човекот кој е слушање или добивањето на овие точки и цртички има некако да дознаам каде паузи се меѓу букви, бидејќи ако не знаете од каде тие паузи се, може да се збуни за ЕТ или обратно. Така што можете да направите? Во Morse code може да се само пауза помеѓу секоја од буквите. Но задржувањето е вид на спротивни на целата поента на забрзување работите. Па што ако наместо ние излезе со код каде немаше оваа лоша ситуација каде Е е префикс, на пример, на А - со други зборови, дали би можеле да бидете сигурни дека моделите се уште кратко за популарни букви додека за помалку популарни букви, но нема можно конфузија? Еден човек по име Хафман години измислил оваа шема се нарекува Хафман кодирање кои, всушност, Нотингем една од структури на податоци што сум поминал малку време зборуваме за минатата недела, дека на дрвјата, бинарни дрва конкретно - бинарен дрво што значи дека нема повеќе од 2 деца. Таа има можеби левата дете, можеби право дете, и тоа е тоа. Значи да претпоставиме само за доброто на дискусијата што некој сака да испрати порака што личи ова. Тоа е целосна глупост, но тоа е составен од Како, BS, CS, ДС, и Ес. И ако навистина смета на сите на Како, BS, CS, ДС, и Es а потоа се делат со вкупниот број на букви, оваа мала шема тука вели дека 45% од буквите се Ес, 20% се, 10% BS, и така натаму. Значи со други зборови, да се претпостави дека Цитираниот текст не само некои пораката што сакате да ја пратите. Се случува да биде глупости само така можеме да го користиме како неколку букви што е можно, но тоа е навистина случај дека Е останува најпопуларен, и Б и Ц се најмалку популарни, барем од овие 5 букви од азбуката. Па како можеме да одиме за кои доаѓаат со кодирање, бинарни кодирање, модел на 0-ти и 1S за секоја од овие писма во таков начин што Е е краток модел и можеби Б и Ц се малку повеќе модели, повторно, идејата е во тоа што ние сакаме да го користите помалку битови поголемиот дел од времето и повеќе битови само еднаш во некое време. Според Хафман кодирање, можете да креирате шумски дрвја. Има вид на приказната тука што вклучува дрвја и процесот на градење на нив. Ајде да започне. Предлагам да започнете со оваа шума, така да се каже, на 5 дрвја, од кои секоја е прилично глупаво дрво. Дрвото се состои од само еден јазол, како што се претставени овде од страна на кругот. Така што секоја од овие работи може да биде struct C и во внатрешноста на struct Ц може да биде плови претставува фреквенција брои а потоа можеби знак претставуваат писмото. Значи мислам на овие јазли како само секој стар C struct но, за сега, повисоко ниво. Ова е шума од 5 дрвја, секоја од кои имаат само еден јазол. Што Хафман предложи е дека ние започнуваме да се комбинираат тие дрвја кои имаат најмалиот фреквенција точки во малку поголем дрва поврзувајќи ги со нова root јазол. Значи меѓу буквите тука, забележите дека за погодност Сум ги подредени од лево кон десно, иако тоа не е строго неопходно, и информации дека најмалиот јазли моментално 10% и 10%. Значи Хафман предложи дека ние се спојат тие 2 најмалиот јазли во нова дрво со воведување на нов родител јазол, а потоа му даде на родител лево дете и право дете каде што B е произволно лево и Ц е произволно право. А потоа Хафман дополнително предложи Ајде сега само мислам на левата дете во една од овие дрва секогаш како што се претставени од 0 и право дете секогаш како што се претставени од страна на број 1. Тоа не е важно дали сте ги флип толку долго како што се доследни. Така, сега имаме четири дрвја во оваа шума. И велам четири затоа сега дрвото од лево - и тоа не е толку многу на дрво, во смисла дека расте овој начин, тоа е повеќе како семејство дрво каде сега 0,2 е вид на родител на две деца - забележи дека во тој родител ние сме подготвени 0.2. Додадовме на фреквенцијата точки на две деца и со оглед на нов јазол вкупната сума. Па сега ние само го повтори овој процес. Најди двете најмалиот јазли, а потоа им се придружат во нова дрво а потоа се повторува процесот понатаму. Токму сега имаме неколку кандидати, 20%, 15%, и уште 20%. Во овој случај, ние мора да се разбие вратоврска. Ние можеме да го направи тоа произволно. Ние само треба да го направи тоа постојано. Во овој случај, јас произволно ќе одам со оној на левата страна, и јас сега се логирате на 20% и 15% да ми даде нов родител вика 35%, чија лева дете е 0, чие право дете е 1, а сега имаме само три дрва во шумата. Вие можеби може да се види таму каде што тоа се случува. Ако се повторува оваа уште неколку пати, ние ќе треба да имаат само едно поголемо дрво, сите чиишто рабови се означени со 0-ти и 1S. Да го направат тоа повторно. 35% е коренот дека дрвото. 20% и 45%, па ние ќе да се логирате на 35% и 20%. Сега имаме ова дрво тука. Ние додаваме тие заедно, имаме 55%. Сега има само две дрва во шумата. Ние го правиме ова една конечна време, и се надевам математички сите фреквенции додадете до бидејќи тие треба бидејќи ние ги пресметуваат од се-Go за да додадете до 100%. И сега имаме едно дрво. Значи ова е Хафман кодирање дрво. Тој вид на требаше време да одам таму вербално, но реалноста е со за телефонска линија или со рекурзивен функција, може да се изгради ова нешто многу брзо. Така, сега имаме еден нов јазол, и сите овие внатрешни јазли се malloc'd, веројатно, на патот. Па сега на врвот на ова дрво имаме 100%, но сега забележите имаме патека од оваа нова пра-пра-пра-баба или дедо на сите пра-пра-пра-внуци сите на патот на дното, на сите лисја. Она што се случува да се направи сега е да предложи дека со цел да го претставува буквата E, ние едноставно ќе го користи бројот 1. Зошто? Затоа што ако ние напречни ова дрво од последниот корен до лист познат како E, ние ја следиме само еден раб, десниот раб, и тоа е означен разбира во горниот десен 1. Значи импликација тука за Хафман беше дека кодирање Е во бинарен само ќе биде 1. И тоа е прилично проклето ефикасен. Не може да навистина се добие било помало од тоа. Спротивно на тоа, ќе биде претставен, ако го следат логиката, од она што шема на битови наместо неа? 01. Па да се дојде до, ние започнуваме во коренот и одиме лево, а потоа одиме право, што значи дека следеше 0, а потоа 1. Значи ние ја претставува буквата А со моделот 0 и 1. И сега забележите веќе имаме сопственост на непосредна decodability што немавме во Morse code. Иако и двете од овие модели се прилично краток - Е е 1 малку, А е 2 парчиња - забележите дека тие не можат да се мешаат една или од друга страна, бидејќи ако видите 1 тоа е мора да биде Е, ако видите 0, тогаш од 1 тоа е очигледно мора да биде А Слично на тоа, она што е D? 001. Што е Ц? 0001. И она што е Б? 0000. И повторно, поради тоа што сите писма ние се грижиме за се на лисја и никој од нив не се вид на посредници во патеката од коренот на лист, Нема ризик од погрешно да се комбинираат различни кодни 2 букви " бидејќи сите овие малку обрасци се детерминистички. 0000 секогаш ќе биде Б Нема јазол некаде помеѓу кои може да се збуни една буква за другите. Значи она што е импликација тука? Од најпопуларните писмо - во овој случај е - има добивано и најкраткиот кодирање, А има добивано следниот најкус кодирање, и Б и Ц, кои веќе се знаевме од се-Go беа вид на најмалку популарна на 10% фреквенција секој, тие имаат добивано и најдолго кодирање. И така што тоа значи сега е дека ако сакате да испрати порака дека е компресирана преку интернет или во е-маил или слично, наместо користење на стандардни ASCII, можете да испратите Хафман кодирана порака при што ако сакате да ги пратите на буквата E, ќе испрати само еден малку. Ако сакате да испратите А, ви испратиме 2 бита, 01, наместо испраќање на 8 бита проследено со уште 8 битови по што следи уште 8 бита и така натаму. Но, постои gotcha тука. Тоа не е доволно само да се изгради ова дрво, а потоа започнете со испраќање од Алис да Боб пократок малку модел, низа од ASCII, бидејќи Алиса исто така, треба да го извести Боб на она што ако Боб ќе биде во можност да го прочитате нејзиниот компресирана порака? [Нечујни студент одговор] >> Што е тоа? [Нечујни студент одговор] >> Од она што дрвото е. Или уште поконкретно, она што оние енкодирања кои се, особено бидејќи во текот на оваа приказна ние направивме пресуда повик во еден момент. Запомнете дека моравме да изберете произволно помеѓу 2 различни 20% јазли? Значи, тоа не е случај дека Боб, примачот, само да се реконструираат дрво по своја бидејќи тој можеби ќе создаде дрво некогаш толку малку поинаку од Алис. Покрај тоа, Боб дури и не знаат што оригиналната порака е бидејќи единственото нешто Алис е го испрати, се разбира, е компресирана порака. Па се фати со компресија како ова е дека, да, Алис може да се спаси едночудо на битови со испраќање 1 за Е и 01 за А и така натаму, но таа, исто така, треба да го извести Боб што мапирање е помеѓу буквите и делови затоа што тие не можат јасно да се потпираат само на ASCII повеќе ако не сте го користите ASCII. Па таа може или да го испрати на дрвото некако - напишете го долу, чувајте го како бинарни податоци или нешто слично - или само го испрати малку измамник лист, една датотека Excel, која покажува мапирање. Па на ефикасноста на компресија навистина се претпоставува дека пораките што сте испраќање се прилично големи, барем средни, бидејќи ако сте испраќање на супер кратки пораки, ако само сакате да ја пратите пораката лошо, кој се случува да биде еден збор може да се пишува тука, Б-А-Д, ти си веројатно ќе се користи помалку бити, но што се фати е ако вие исто така треба да ги информира Боб што дрвото е или она што оние енкодирања кои се, си оди за да најверојатно ги надминуваат сите заштеди на постоење на компримиран работи кои треба да почне. Па тоа всушност може да биде случај дека ако се обидете компресирање дури и со нешто како zip или формати на датотеки може да биде запознаен со - прилично мали датотеки, па дури и празни датотеки - понекогаш овие датотеки може да добие поголеми и не помали. Но реално, што се случува само за мали датотека големини, па тоа не се случува да се направи гигабајт фајл да биде 2 гигабајти; ние навистина зборуваме бајти или само неколку килобајти. Некои програми како ZIP се доволно паметни да сфатат дека, "Ти одиш да поминуваат повеќе битови компресирање на тоа." "Дозволете ми да не се мачам компресирање тоа за тебе." Значи ова е само еден начин, тогаш за компресирање на текст формат. Ние би можеле да спроведат вакво нешто во C. На пример, тука е како да претставуваат јазол во ова дрво каде што имаме знак за симбол, лебдечки вредност за фреквенција, и како што видовме со другите наши структури на податоци, 2 покажувачи, 1 налево дете, 1 на десно, или од која може да биде NULL, но ако не, тоа се однесува на левата дете и право дете. Значи ова е тогаш Хафман кодирање, и тоа е еден начин на кој можете да се обратите за компресирање на информации, а тоа е секако една од најпознатите лесно да се имплементираат во контекст на, да речеме, структури на податоци минатата недела, иако дури и повеќе софистицирани алгоритми постојат што може да се направи дури и повеќе софистицирани мутации на вашите податоци. Било какви прашања, тогаш на дрва, бинарни дрва, или компресија на текстот? [Студент] Дали има некои нејаснотии, како ако [недоловим] поделена на 01, потоа 011 ќе биде двосмислена, нели? [Недоловим] >> Добро прашање. Двосмисленост. Дозволете ми да резимираме со повикување на оваа слика овде. Бидејќи на ликовите сте компресирање, претставите на, по дефиниција на овој алгоритам секогаш остануваат лисја, никогаш не случајно ќе се користи истата шема на битови за префиксот на повеќе букви. Значи со други зборови, ти си загрижен, тоа звучи како, на двосмисленоста произлегуваат при што 001 може да биде почеток на Б или почетокот на C или нешто слично. Но, тоа не може да биде случај, бидејќи известување дека сите букви од азбуката ние сме кодирање се на лисја. Двосмисленоста само може да се појават, како и во случај на Morse code, Ако, на пример, Ц беше некаде по должината на патеката од коренот до Б [Студент] Десен. Значи во тој случај, велат дека има 2 лисја. >> Велат дека има - велат дека повторно. [Студент] велат дека има 2 лисја, F и G, а потоа G - >> Океј. Но, тоа не може. А сама по себе не може да има лисја F и G, бидејќи тие писма F и G се ќе биде остава некаде лево од Б или право на E. Па по дефиниција, тие мора да бидат лисја. Инаку, ти си точно во право, ние не го реши проблемот што Morse code соочува. Добро прашање. Други прашања? Во ред. Овој поим на битови, излегува имавме моќ сите заедно дека не сум всушност се користи кога станува збор за манипулирање со овие 0-ти и 1S. Ги прашавме за тоа на еден од најраните проблем групи: имено, како да одите за конвертирање на големи во мали букви, или обратно? Или, поконкретно, една од оние првите psets праша колку битови се вие ​​всушност треба да флип со цел да се промени во мали букви a или обратно? Еве еден брз потсетник на она што 65 и 97 изгледа како во бинарна. И дури и ако тоа прашање е вид на избледени во вашата меморија, можете да видите повторно тука дека колку битови ќе треба да се flipped за промена на капиталот А во мали букви а? Само еден. Тие само се разликуваат во едно место, третиот малку од лево. Каде што има 010, малку е има 011. Така некако, ние треба само да биде во можност да флип дека малку, и потоа ќе можеме да профитираат или мали букви. Ние го направивме тоа во минатото од страна всушност користење ако условите и проверка дали писмото е меѓу капиталот А и капитал Z, тогаш излези како А - а + 26 или нешто слично. Најверојатно беше на аритметички промена на буквите од азбуката. Но што ако ние може само да флип дека еден малку? Како можете да се обратите за преземање вреди еден бајт на битови, толку 8 битови како 01.000.001 и 01.100.001? Ако сте имале овие модели на битови, како можеме да одиме за менување на само една од нив? Што ако ние се воведе во жолта тука оваа друга шема на битови? Ако јас се направи целата жолта стринг 0-ти освен за еден малку што сакате да го промените и тогаш јас се воведе нов оператор познат како оператор bitwise - bitwise во смисла дека тоа функционира на индивидуалните битови, а не на целиот бајт или четири бајти сите одеднаш. Оваа вертикална лента таму во жолто укажува на тоа дека што ако го земеме застапеност на капитал и bitwise ИЛИ го со жолто низа од битови? Со други зборови, се сетам на нашата дискусија на Булова изрази во Скреч, а потоа во В Вршење на Булова или значи дека за да биде вистина, или првото нешто мора да биде вистина или втората работа треба да биде точно или тие и двете имаат за да биде вистина, а потоа како резултат на излез е самата вистина. Во овој случај тука, она што го добиваме ако се земе 0 "или" ед со 0? Лажни или лажни? Тоа е уште лажни, па мали а останува како што се очекуваше. Што ако наместо да правиме 1 или 0? Ова сега останува 1, но се забележи она што е за да се случи тука. Ако почнеме со капитал А и ние продолжуваме да "или" своите индивидуални парчиња како што го правиш тука, 0 или жолти една ни го дава она што тука долу? Ова ни дава 1. Всушност, да претпоставиме ние не знаеме што големи верзија на мала една всушност беше. Ајде да одиме направите тоа. Дозволете ми да се помести ова Врати се ваму. Да го направите ова повторно. 0 или 0 ми дава 0. 1 или 0 ми дава 1. 0 или 1 ми дава 1. 0 или 0 ми дава 0. Следниот е 0, следниот е 0, следниот е 0. 1 или 0 ми дава 1. И така дури и ако ние не знаеме однапред што мали букви во е, едноставно со "или" ИНГ со овој модел на битови кои сме презентирани овде во жолта, можете да мали букви капитал А од нервира тоа малку. Ние се користи овој израз недели: нервира малку. Како да вие всушност го направите тоа програмски? Можете да го користите она што обично се нарекува маска, низа од битови, дека во овој случај само така се случува да изгледа вака број тука, а потоа вие "или" тоа заедно со користење на овој нов Ц оператор, не | |, можете да користите еден | а вие всушност ќе добиете овој одговор тука, бидејќи зошто? Ова е 1s место, 2s место, 4s, 8s, 16s, 32s. Значи излегува дека ако се земе голема буква А и bitwise ИЛИ го со број 32, бидејќи број 32, кога ќе се погледне во него како битови, изгледа вака, тоа значи дека можете да флип малку дека вие всушност сакате. И слично - а ние ќе се погледне во кодот во само еден миг - Претпоставувам дека ние сакаме да одиме на друга насока. Како да одите од мали еден во главниот град на А? Која малку треба да се промени? Тоа е истиот. Ние сакаме да се смени третиот малку од 1 до 0. И како да се обратите за тоа? Како да ја исклучите малку? Со што шема на битови би можеле да го исклучите малку? Што ако ние сортирање на инвертен маската? А пред тоа, ние го направи целиот жолта маска 0-ти освен за еден малку сакавме да го вклучите, што ако овој пат, ние се направи целата маска 1s освен малку што сакаме да го исклучите а потоа го користите она оператор? Што ако ние "и" работи? Ајде да ги разгледаме. Ако ние сега флип на ова, претпоставувам дека повторно ќе се создаде маска тоа е 1s освен за еден малку што сакам да го исклучите а потоа, наместо "или" белиот броеви до врвот со жолта броеви долу тука, што ако јас наместо "и" нив заедно? Таа се вика bitwise и. Логично, тоа е истото како Булова и. Ова ми дава 0 и 1 е 0. Значи лажни и вистински е лажна. Вистински и точно е точно. И тука е магија: Вистински и лажни сега е неточно, па ние сме исклучени дека малку. И сега остатокот од приказната е малку јасна. Затоа што остатокот од маската е 1s, тоа не е важно она што бројките се во бела боја. Кога вие "и" нешто со вистина, вие нема да се промени својата вредност. Ако тоа е вистина, тој ќе остане вистина. Ако тоа беше лажна, тој ќе остане лажни. Но магија се случува кога ќе се земе нешто што е вистина и тогаш "и" со лажни. Ова има ефект на исклучување што малку. Па малку криптичната таму. Да, всушност се погледне во некои код, што всушност може да изгледа дури и повеќе криптичната, но, ајде да ги разгледаме тука во tolower. Ако гледам во tolower, одејќи од град А во мали букви А, ајде да видиме како да ја имплементираат оваа програма. Еве главниот, и тоа не е преземање какви било командната линија аргументи. Јас сум прогласување на карактерот c за писмото што корисникот ќе напишеш внатре Јас тогаш се користи запознаени направи додека јамка само да бидете сигурни дека корисникот дефинитивно ми дава капитал или Б или В .. Z, па и тие ми даде нешто помеѓу А и Ш И сега што правам тука? Јас сум "или" ИНГ со 0x20, но тоа е всушност иста како - и ние ќе се вратам на ова во моментов - 32. Значи, повторно, 32 е овој модел на битови тука. Зошто знаеме ова? Само помислете назад кон недела 0. Ова е 1s место, 2s место, 4s, 8s, 16s, 32s место. Значи ова жолта бројот се случува да биде 32. Јас тогаш може да се земе писмото како знак тука, bitwise "или" со буквално бројот 32, и она што можам да добијам назад? Мали верзија на тој знак. Пред малку, иако, јас изразена тоа во различни база нотација. Што ова претставува? >> [Студент] Хексадецимално. [Malan] Ова се случува да ја претставува хексадецимално. Ние не сме разговарале за хексадецимален сите дека многу, но тоа е всушност пригоден во случаи како овој. Иако тоа изгледа повеќе сложени и иако изгледа како 20, а не 32, излегува дека хексадецимален е всушност супер удобен нотација бидејќи во хексадецимален секој цифрен по 0x - и ова не значи ништо; ова е само човечките конвенција која се вели тука доаѓа хексадецимален број - секоја од овие цифри, 2 и тогаш 0, самите може да се претстави со точно 4 бита. Значи, ако го правиме тоа, дозволете ми да се отвори уредувач на текст тука - чудно Автоматско комплетирање - ако се направи малку текст едитор тука, бројот 0x20 значи тука е 4 бита, тука е уште 4 бита. Ајде да го направите најдесната 4 бита во прв план. 0 кога претставен со 4 битови е она? Супер лесно. Само сите 0-ти. Значи 4 битови како 0-ти. Како да се претставуваат 2? Тоа е време, бидејќи ние го направи ова, но тоа е 0100. Значи ова е 1s место, ова е 2s место, и тогаш тоа не е важно што другите места се. Со други зборови, во хексадецимално може да се каже 0x20, но ако потоа размислуваат за она што е 2 и како се застапени во бинарни, што е 0 и како се застапени во бинарни, одговорите на тие прашања се ова и ова, соодветно. Значи 0x20 случува репрезент на овој модел од 8 бита, која е токму маска што сакавме. Значи ова е за момент само интелектуална вежба, но реалноста е во кодот е обично повеќе заеднички да пишуваат константи се допаѓа ова во хексадецимално затоа што тогаш на програмерот може релативно лесно, дури и ако тоа бара некои хартија и молив, дознаам што тој образец на битови е затоа што не само можат да ги изразат 0-ти и 1S обично во код. Вие не може да тргне 00.010 и така натаму. Мора да изберете децимална или хексадецимален или octal или други нотации. Повеќето луѓе имаат тенденција да ги собереш хексадецимален едноставно така што секоја цифра претставува 4 бита и можете да го направите ова брзо математика. И јас ќе бран мојата рака во toupper, што е речиси исто, изгледа речиси идентични. Toupper се случува да се користи не или оператор, туку овој човек и df. Што значи df претставуваат? df? Некој? >> [Студент] 255. 255? Не 255. Тоа ќе биде ff. Ние ќе ја напушти оваа една како малку вежбање. Но ако одите од 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, а потоа она што доаѓа после 9? Ние сме вид на од децимални цифри, но во хексадецимална она што доаѓа после 9? [Студент] а. >> Значи, б, в, г. Можете да дознаам од таму што шема на битови г всушност претставува. И ако го направите математика, ќе видиме дека маската ќе заврши добивање назад е идентична со ова. Ова е ѓ, сите 1s, и ова е г. Значи df претставува дека маската. Во ред. И на крај, да не се направат работите звук супер, супер технички, но претпоставувам сакавме да се напише програма која го прави ова. Дозволете ми да оди напред и да се направи бинарни, кој е на програмата во датотека наречена binary.c. И сега дозволете ми да се кандидира бинарни и ми даде не-негативен број. Да почнеме лесно и тип во 0. Ова сега е програма со која отпечатоци од цел број во бинарен застапеност. Значи, ако јас ја играат оваа игра повторно и тип во само 1, јас треба да добие 32-битен застапеност на 1. Ако го направам тоа повторно со 2, јас треба да добие тоа. Ако го направам 7, јас треба да добие неколку 1s на крајот и така натаму. Излегува можев да се спомене тоа затоа што со bitwise операции всушност може да направи една друга работа, како и. Можете да ја креирате овие маски динамично. Фрлите поглед на оваа последна пример вклучуваат bitwise операции. Тука е првиот дел од кодот, го извести корисникот за голем број, и инсистира на тоа дека ќе ми даде не-негативен број. Значи тоа е вид на старата школа нешта. Но, тука е нешто што е вид на интересно. Како можам да се обратите за печатење на број во бинарен? Јас прв iterate од она на што? Што е со големина на int обично, барем во апаратот? >> [Студент] 4. Тоа е 4. Значи 4 * 8 е 32-1 е 31. Значи, ако јас сум почнуваат да се брои од 31, што претставува, што се испоставува, само концептуално, 31 битна или највисок ред малку, што е овој човек овде, а ова ќе биде малку 0. Значи ова е малку 01 ... малку 31. Значи она што е овој код правиш? Забележите ова за телефонска линија, иако тоа изгледа криптичната, е само процесирањето од 31 до 0. Тоа е тоа. Значи интересен дел сега мора да биде во овие 5 линии. Забележете дека во оваа линија сум за прогласување на променлива наречена маска да бидат во согласност со нашата приказна од овие жолта броеви. И тогаш што е ова тоа? Ова е уште еден bitwise оператор не сум видел, најверојатно. Тоа е лево смена оператор. Овој оператор го прави ова. Тука е број 1, а ако не јас лево смена, лево смена, што мислите дека има ефект на тоа за таа личност 1? Буквално ја менува завршена. Значи, ако бројот 1 е она што го имате на левата и ќе почнете со иницијализацијата јас до 31, Што е тоа што ќе правите? Тоа се случува да се земе овој број 1 и тоа префрлат 31 места во текот тука. И затоа што очигледно нема други бројки зад неа, по дифолт ќе биде заменет со 0-ти. Па ќе почнете да излегува со број 1, што секако изгледа вака - и дозволете ми да го нацрта тоа овде во центарот. А потоа како да ја префрлат работи на лево, овој човек суштина оди на овој начин. Но штом ќе го направите тоа, 0 добива исполнет внатре Ако го смениме по втор пат, таа оди на овој начин, а друг 0 ​​добива исполнет внатре Можете да го смениме повторно, а потоа уште 0 добива исполнет внатре Значи, ако го направите ова работа од 1 << i 31 места, ќе заврши добивање маска која е 32 карактери долго, најлева од кои едната е 1, сите на остатокот од кои се 0. И што излезе, како настрана, менувањето на бројот на лево вака исто така, случајно, а понекогаш погодно, има ефект на тоа што до тој број? >> [Студент] Удвојување неа. Удвојување на тоа, бидејќи секоја од колоните - на 1s место, 2s место, 4s место, 8s место, 16s место - they're сите удвојување како да одиш на лево. Или подобро, кога ќе се префрлат на 1s ви се случува да се заокружи удвојување на вредноста на бројот. Можете да заврши прави интересни трансформации на цифри со менувањето што во текот на овој начин од страна на силите на 2. Па, како го прави ова работа? Ова тогаш ми дава маска, која е сè 0-ти освен за 1 во точно место каде што го сакаат тоа, а потоа овој израз, кој е украден од toupper.c, е едноставно велејќи земе бројот n дека корисникот ја внеле во, "И" со што маска, и она што ви се случува да се добие? Сте ќе добие 1 ако има 1 во таа маскирани локација, или си оди за да се добие 0 ако не е. И така сите на оваа програма е ефикасно да е има еден циклус, и тоа создава маска со 1 ваму, а потоа 1 ваму, а потоа 1 овде, и тоа го користи овој bitwise и трик е да се каже дали има 1 бит во влез на корисникот тука? Дали има 1 бит во влез на корисникот тука? И ако е така, буквално печати 1, друго печати 0. Ние го правиме ова со ints само затоа што тоа е причината зошто ние сме прави 32 бита, наместо на 8, но она што го воведе тогаш е тоа bitwise И, ова bitwise ИЛИ, и ова лево смена оператор, кои не се често страшно корисни, но тоа се покажува дека тие може да биде. Всушност, ако сте во ситуација да претставуваат нешто како низа на Booleans само за да претставуваат вистински или лажни, да претпоставиме дека сака да ги пратите на тоа дали или не една соба полна со 300 ученици е присутна, може да прогласи низа од големината 300 од тип bool така што ќе добие 300 bools, и можете да го поставите секој да важи ако некој е тука и лажни поинаку. Зошто е тоа застапеност во таа податочна структура неефикасна? Што е лошо за дизајн на таа податочна структура, низа на 300 bools? Што е bool, всушност, под хаубата? Ова, исто така, е нешто што не може да биде запознаен. Излегува постои bool. Запомни ние вид на создадени дека со cs50.h датотека, која се вклучува стандардни bool. Ц е вид на нем, иако, кога станува збор за bool. Тоа го користи 8 битови да претставуваат секоја bool, што е сосема непотребното бидејќи очигледно, колку битови се што треба да претставуваат bool? Само 1. Значи излегува дека ако сега имаат способност со bitwise оператори да манипулира со индивидуални битови дури и во знак, дури и во еден бајт, излегува дека може да го намали меморија треба да претставува нешто глупаво како што посетеност стилизирана податочна структура со фактор од 8. Наместо да се користи осум битови да претставуваат вистински или лажни, вие буквално може да се користи еден со користење на еден бајт за секои осум студенти во класата и Вклучувам 0-1 индивидуалните битови со помош на овие видови на ниско ниво трикови. Тоа навистина се стави крај на енергија. Дали постојат било какви прашања во врска со bitwise операции? Да. >> [Студент] Дали има ексклузивно или оператор? Да. Таму е ексклузивен или операторот што личи ова, ^, морковот симбол, што значи само првото нешто или втората работа може да биде 1 за излез да биде 1. Исто така постои и не ~, која ќе ви овозможи да инвертен од 0 до 1 или обратно, како и. И таму е исто така право смена оператор, >>, што е спротивно на една видовме. Во ред. Да се ​​работи сега на повисоко ниво. Почнавме со зборувам за текстот, а потоа компресирање и застапување на текст со помалку број на битови; ние разговаравме малку за тоа како ние сега може да почне манипулирање работи на ниво bitwise. Ајде сега враќање до 10.000 метри на застапеност на посложени работи како графика. Тука имаме знамето на Германија, тука имаме една од Франција. Овие можат да бидат застапени во формати на датотеки може да знам - GIFs, на пример. Ако некогаш сте виделе слика на интернет што завршува на. GIF, ова е размена графички формат. Овие две знамиња тука вид на се подложни на компресија за она што можеби очигледна причина? >> [Нечујни студент одговор] Има многу на повторување, нели? Со цел да се испрати знаме на Германија, мислат на тоа како на сликата на екранот назад во вашиот гребење дена. Може да се потсетиме дека има индивидуални пиксели или точки што компонира сликата. Има цела низа на црни точки и уште цела низа на црни точки. Има еден куп на редови на црни точки, кои би можеле да видат дали ние навистина зумира, Слично како кога ние zoomed во на лицето на Rob во Photoshop. Штом добивме подлабоко и подлабоко и подлабоко во сликата, го започна гледањето на pixelation, сите квадрати кои сочинуваат окото во тој случај. Истиот договор тука. Ако ние zoomed во доста, ќе видите поединечни точки. Па, ова е вид на губење на битови. Ако една третина од знамето е црна и една третина од знамето е жолта и така натаму, зошто не можеме некако компресира ова знаме? Па дури и на француски знаме може да биде компресирана иако моделот е малку поинаква. Излегува датотеката GIF формат е lossless компресија формат, што значи дека може да се слика како германски знаме тука, можете да фрлаат многу од нејзините делови без жртвување квалитет. Ова е во контраст со нешто како JPEG слики, со кои повеќето од нас веројатно повеќе запознаени. Фејсбук слики и Фликр фотографии и слично се скоро секогаш зачувана како JPEG слики, кога тие се подигнати, но JPEG слики е внесува загуби - Внесува загуби - формат при што ќе се фрлаат битови но вие исто така фрлаат квалитет. И така, ако се компресира слики со Photoshop или да ги испратите на Facebook или да ги преземе за навистина crappy телефон, знаеш дека таа слика ќе почне да се многу splotchy и pixelated, и тоа е затоа што таа е компресирана од страна на компјутер или телефон од буквално фрлање информации далеку. Но, GIF е неверојатно во тоа што можете да го користите помалку битови отколку што би стандардно без губење на какви било информации. И тоа во суштина го прави тоа како што следува. Наместо продавница во датотека како BMP ќе се RGB трокреветни за црно, црно, црно, црно, црна, црна, црна, црна, црна, црна, црна, црна и така натаму, Наместо тоа, формат GIF се случува да се каже, "Црно" а потоа, "Повторете го овој 100 пати", или нешто слично. "Црно, повторете го овој 100 пати, црна, повторете го овој 100 пати ..." "Жолта, повторете го овој 100 пати." И затоа таа се сеќава, во суштина, најлева пиксели а потоа енкодира некако поимот повторувајќи дека пиксели повторно и повторно. Значи GIFs, тогаш може да се компресира, без губење на какви било информации. Но, ако сте имале да се погоди, ако тоа е алгоритам што GIFs употреба, кои од овие знамиња, иако тие изгледаат идентични по големина, ќе биде помала кога зачувани на дискот како GIF? >> [Студент] Германија. Германија ќе биде помал? Зошто? [Студент] Бидејќи ти го повтори многу, многу пати хоризонтално а потоа се повторува некое друго време. >> Токму така. Бидејќи луѓето кои измислиле GIF само вид на произволно одлучи дека повторувањето ќе бидат балон хоризонтално и не странично. Има многу повеќе повторување странично тука во германски знаме отколку во француското знаме. Значи, ако ние всушност се отвори папка на мојот хард диск кој има овие GIFs, вие всушност може да се види дека германската знаме тука е 2 килобајти и францускиот е 4 килобајти. Се случува да биде случајно што една е двапати повеќе од другите, но тоа е во фактот случај дека францускиот знаме е многу поголем. Иако ние зборуваме тука за графика, исти идеи може да се применува не работи како знамиња, но сликите кои се малку посложени. Ако се земе слика на едно јаболко, сигурно има голем број на повторувања таму, па ние некако да се запамети дека стандардната позадина е син , а не како на десната слика сугерира, треба да се потсетиме на бојата на секоја пиксел во сликата. Значи можеме да фрли битови далеку таму, без губење на информации. Јаболко уште изгледа исто. Во овој пример овде, можеби ќе видиме што се случува во филмот. Овие претставуваат старата школа филм ленти при што во првите сликата има имате Р.В. возење минатото една куќа и едно дрво. И како што ван вози минатото од лево кон десно, што очигледно не се менува? Куќата не се случува секаде, и дрвото не се случува никаде. Единственото нешто што се движи е ван во овој случај. Па како позадина Непроменети сугерира, што можете да направите во филмовите е сличен само фрлаат информации кои не се менува помеѓу рамки. Ова е општо позната како interframe компресија при што доколку оваа рамка изгледа речиси идентични со нив, нека не се мачат чување на дискот било од идентични информации на овие средно рамки, ајде да го користат само клучни рамки еднаш во некое време што всушност чува информациите redundantly само како малку здрав разум се провери. Спротивно на тоа, друг пристап кон компресирање на видео во оваа втора и пониски пример тука, каде наместо продавница 30 слики, зошто не само чува 15 кадри во секунда наместо неа? Наместо филм вид на тече убаво, совршено, тоа може да изгледа како да е пелтечење малку, малку старата школа, но нето-ефектот ќе биде да се користи далеку помалку битови од инаку би можеле да бидат потребни. Значи, каде што го прави ова, тогаш ни остави? Тоа беше малку настрана од тоа каде на друго место можете да одите со компресија. За повеќе информации за тоа, се класа како CS175 тука. Еве уште еден пример во рамките видео. Ако пчелата е единственото нешто се движи, навистина може да се фрлаат информации во оние средината рамки бидејќи цвет и небото и листови не се менува. Но, ајде сега сметаат дека едно последно нешто. Во следните 5 минути напушти Ц зад засекогаш во лекција? Да. Не во psets, иако. Последно приказна за C и тогаш дојде до многу секси работи вклучувајќи HTML и веб и Woo-Hoo. Во ред. Еве ќе одиме. Тоа е мотивација. Излегува сето ова време кога ние сме биле пишување програми трчаме ѕвекот. И ѕвекот, што рековме, бидејќи првата недела доста, потребно изворниот код и го претвора во објектниот код. Таа ги зема C и се конвертира во 0-ти и 1S. Јас сум вид на се лаже за вас за неколку недели, бидејќи тоа не е толку едноставно како што. Има многу повеќе се случува под хаубата кога ќе ја стартувате програмата како ѕвекот. Всушност, процесот на изготвување програма навистина може да се сумира, како што може да се сети од видео на Rob за компајлери, во овие 4 чекори: претходна обработка, составувањето себе, монтажа и поврзување. Но, ние во класата, а повеќето луѓе во светот обично се сумираат сите овие чекори како само "составувањето." Но ако почнеме со изворен код, како таков, се сеќавам ова е можеби наједноставниот C програма ние сум напишал досега, да се потсетиме дека кога Составувач тој завршува гледа како оваа. Но, таму е всушност една преодна чекор, и тие чекори се како што следува. Прво, тука е тоа нешто во самиот врв на овој и повеќето од нашите програми, # Include Што значи # Include не за нас? Тоа доста копии и пасти за содржината на stdio.h во мојот датотека, па зошто да не? Зошто е гајле за содржината на stdio.h? Што е таму на интерес? Printf прогласување, нејзиниот прототип, така што на компајлерот потоа знае што мислам кога ќе се спомене оваа функција printf. Па чекор 1 во составувањето е пред-обработка, при што програма како ѕвекот или некој помошник програма која ѕвекот доаѓа со чита кодот врвот до дното, лево кон десно, и во секое време го гледа # симбол проследено со клучни зборови како вклучуваат, врши таа работа, копирање и вметнување во овој случај stdio.h во вашето досие. Тоа е чекор 1. Тогаш имате многу поголеми Ц датотека, бидејќи на огромниот копија, ставете работа што е едноставно се случи. Чекор 2 сега е составувањето. Но излегува составувањето зема изворниот код што изгледа вака и се претвора во нешто што личи ова, која за оние кои се запознаени се вика? >> [Студент] собрание. >> Собранието јазик. Ова е всушност нешто ако се CS61 ќе се нурне во во повеќе детали. Ова е само за како блиски, како можете да добиете за пишување на 0-ти и 1S себе но пишувањето работи на таков начин што сè уште го прави барем малку смисла. Овие се машина инструкции, и ако дојдете до главната функција овде, забележите дека постои овој притисни настава, се движат настава, одземе настава, повик настава, и така натаму. Кога ќе го слушнете дека вашиот компјутер има Интел внатре, имате CPU Intel во вашиот Mac или PC, што значи тоа? А процесорот доаѓа вграден со компании како Intel разбирање одредени инструкции. Тие немаат идеја што функции како swap се или главни се по себе, но тие не знаат што многу ниско ниво инструкции како да собира, притисни, се движат, јавете се, и така натаму се. Па кога ќе ги собере C кодот во асемблер јазикот, Вашиот многу лесен изглед кодот е претворена во нешто што личи ова, кои буквално се движи бајти или 4 бајти околу во мали единици во и надвор од процесорот. Но, конечно, кога ѕвекот е подготвен да ја искористам оваа застапеност на вашата програма во 0-ти и 1S, тогаш чекор наречен монтажа случува, и ова повторно сите се случува во трепкање на окото кога работите ѕвекот. Започнуваме тука, тоа излези на датотека како оваа, а потоа се конвертира овие 0-ти и 1S. И ако сакате да се врати во одреден момент, а всушност ја гледаат оваа во акција, ако одам во hello1.c--ова е еден од првите програми ние погледна - Нормално ние ќе собере со ѕвекот hello1.c и тоа ќе ни даде a.out. Ако пак ти наместо да го даде-S знаме, она што ќе добиете е hello1.s и всушност ќе се види на асемблер јазикот. Јас го правам тоа за многу краток програма, но ако се вратиме за трка или реставрирана или било која програма што сум напишал и само од љубопитност сакате да видите што тоа всушност изгледа, она што е, всушност, се хранат во процесорот, можете да го користите-S знаме со ѕвекот. Но, тогаш на крај, има уште еден gotcha. Еве 0-ти и 1S кои претставуваат мојата имплементација на здраво, свет. Но јас се користи некој друг функција во мојата програма. Значи, иако процесот е земам hello.c, станува компајлирана во асемблерски код, а потоа станува собраа во 0-ти и 1S, само 0-ти и 1S кои се outputted во овој момент во времето се оние кои се резултат од мојот код. Но, лицето кое го напишал printf, тие состави нивниот код пред 20 години и тоа е сега инсталиран некаде на апаратот, па ние некако треба да го спои неговиот или нејзиниот 0-ти и 1S со мојот 0-ти и 1S, и дека нè доведува до 4 и последниот чекор на составувањето, познат како поврзува. Така, на левата страна имаме иста слика како пред: hello.c станува асемблерски код станува 0-ти и 1S. Но, се сеќавам дека јас се користи стандардот I / O библиотека во мојот код, а тоа значи дека некаде на компјутер постои датотека наречена stdio.c или барем Составувач верзија од него затоа што некој пред неколку години Составувач stdio.c во асемблерски код, а потоа и целиот куп на 0-ти и 1S. Тоа е она што е познат како статична или динамична библиотека. Тоа е некои датотеки седи некаде во апаратот. Но, на крај, морам да земам 0-ти и 1S и таа личност 0-ти и 1S и некако ги поврзат заедно, буквално се комбинираат овие 0-ти и 1S во еден фајл наречен a.out или hello1 или што и јас го повикував мојот програма така што крајниот резултат ги има сите на 1S и 0-ти кои треба да компонира мојата програма. Значи сето ова време овој семестар, кога сте биле со ѕвекот па дури и повеќе неодамна работи се направи со цел да се кандидира ѕвекот, сите овие чекори се случува вид на моментално но многу намерно. И така, ако продолжи по компјутерски науки, имено CS61, ова е слој кој ќе продолжи да лупам назад исклучување има зборуваме за ефикасност, безбедност импликации, и слично на овие пониско ниво детали. Но, со тоа, ние сме за да ја напушти Ц зад себе. Ајде да одиме напред и да ни го одземе 5-минутна пауза сега, и кога ќе се вратиме: Интернет. Во ред. Ние сме назад. Сега почнуваме нашиот изглед не само во HTML, бидејќи, како што ќе видиме, HTML е всушност прилично едноставна но навистина во веб програмирање поопшто, вмрежување поопшто, и како сите овие технологии доаѓаат заедно за да ни овозможи да се создаде многу повеќе софистицирани програми на врвот на Интернет од досега ние сме биле во можност да во овие црни и бели прозорци. Всушност, во овој момент во семестар, иако ние ќе потроши релативно помалку време на PHP, HTML, CSS, JavaScript, SQL и повеќе, повеќето студенти не завршуваат прави конечниот проекти кои се веб-базирани бидејќи, како што ќе видиме, позадина сега го имате во C е многу применливи за овие повисоко ниво јазици. И како што почнам да размислувам за твојот последен проект, кои, слично како Проблем Постави 0, каде што беа охрабрени да се направи повеќето ништо од интерес за вас во нула, конечниот проект е вашата шанса да се земе вашата новооткриената знаење и такт со C или PHP или JavaScript или слично надвор за центрифугирање и да се создаде своја сопствена парче софтвер за светот да види. И да семе сте со идеи, знаете дека можете да се упатат тука, projects.cs50.net. Секоја година, ние ги дели идеи од факултет и кадар и студентски групи на кампусот само да ги достават своите идеи за интересни нешта што може да се решат со компјутери, користење на веб-сајтови, користење на софтвер. Значи, ако сте се борат да излезе со идеја за свој, со сите средства се движите низ идеи таму од оваа година и минатата. Тоа е совршено во ред да се справи со еден проект кој е решени порано. Видовме многу апликации за гледање на статусот на перење на кампусот, многу апликации за навигацијата низ јадење салата мени, многу апликации за навигацијата низ разбира каталог и слично. И навистина, во иднина предавање и во иднина семинари, ние ќе ве запознаам со некои јавно достапни API-јата, комерцијално достапни како и тука на располагање од CS50 на кампусот, така што ќе имаат пристап до податоци а потоа да го направите интересни работи со него. Па повеќе за конечниот проекти во неколку дена, кога ние порака на спецификација, но сега за сега, знам дека можете да работите соло или со еден или двајца пријатели на повеќето секој проект од интерес за вас. Интернет. Да одите напред и се повлече од вашиот лаптоп, ќе одат на facebook.com за прв пат, што не ме неодамна, и притиснете Enter. Што точно се случува? Кога ќе притиснете ентер на вашиот компјутер, еден куп чекори започне вид на магично се случува. Така да овде на лево, веб сервер, како Фејсбук е тука на десната страна, и некако го користите овој јазик наречен HTTP, Хипертекст трансфер протокол. HTTP не е програмски јазик. Тоа е повеќе од протокол. Тоа е збир на конвенции кои веб прелистувачи и веб сервери се користи кога intercommunicating. И што тоа значи е како што следува. Слично како во реалниот свет, имаме овие конвенции каде што ако се исполнат некои човечки, за прв пат, ако не ти пречи humoring ме тука, Јас може да дојде до вас, да речеме, "Здраво, моето име е Давид." >> Здраво, Дејвид. Моето име е Семи. "Здраво, Дејвид. Моето име е Sammy". Така, сега имаме само ангажирани во овој вид на глупо човечки протокол каде што започнаа на протоколот, Семи одговори, ние сме потресен раце, и на трансакцијата е завршена. HTTP е многу слични во духот. Кога вашиот веб прелистувач барања www.facebook.com, она што вашиот интернет пребарувач е навистина прави е проширување на страна, така да се каже, до серверот и тоа е тоа испраќање на порака. И дека пораката е обично нешто слично се - што сакаш да се добие? - ме на почетната страница, која е обично означено со една црта на крајот од URL-то. И само да знаете кој јазик зборувам, јас прелистувачот идам да ти кажам дека јас зборувам HTTP верзија 1.1, А исто така и за добра мерка, јас ќе одам да ви кажам дека на домаќинот дека сакам на почетната страница на е facebook.com. Вообичаено, веб прелистувач, непознат за вас, човечки, испраќа оваа порака од Интернет, кога едноставно внесете www.facebook.com, Внесете, во вашиот интернет пребарувач. И она што не Фејсбук одговори со? Тоа одговара со некои слични изглед криптичната детали, но исто така многу повеќе. Дозволете ми да оди напред кон главната страница на Фејсбук овде. Ова е екран кој повеќето од нас веројатно никогаш види дали ме за сите на време, но ова е навистина нивната почетна страница. Ако го правиме тоа во Хром, забележите дека можете да се повлече до овие мали контекстните менија. Користење на Хром, без разлика дали на Mac OS, Windows, Linux, или слично, ако Контрола клик или лев клик, обично може да се повлече до менито што личи ова, каде што неколку опции чекаат, од кои едната е View Page Source. Можете исто така да обично се дојде до овие работи со одење на менито View и ѕиркаа наоколу. На пример, тука под View, инвеститорот е иста работа. Одам да се оди напред и да се погледне Види Страна код. Што ќе се види е HTML дека Марк има напишано претставуваат facebook.com. Тоа е комплетен хаос тука, но ние ќе се види дека тоа го прави малку повеќе смисла пред долго. Но, постојат некои модели тука. Дозволете ми да дојдете до нешто како ова. Ова е тешко за човекот да читаат, но забележите дека има овој модел на аголни загради со клучни зборови како опција, клучни зборови како вредност, некои цитира стрингови. Ова е местото каде, кога сте се регистрираа за прв пат, утврдени она што ти го раѓање година е. Дека опаѓачкото мени на раѓање години е некако кодирани тука во овој јазик наречен HTML, HyperText Markup Language. Со други зборови, кога вашиот прелистувач бара одредена веб страница, што зборува оваа конвенција наречен HTTP. Но, она што не facebook.com одговори на тоа барање? Тоа одговара со некои од овие криптичната пораки, како што ќе видиме во еден момент. Но, повеќето од нејзиниот одговор во форма на HTML, HyperText Markup Language. Тоа е вистински јазикот на кој веб-страница е напишано. И што е веб прелистувач навистина е тогаш, по приемот на нешто што личи ова, чита врвот до дното, лево кон десно, и во секое време го гледа еден од овие аголни загради проследено со клучни зборови како опција, тоа покажува дека маркап јазик во соодветен начин. Во овој случај, тоа ќе се прикаже опаѓачкото мени години. Но, повторно, ова е комплетен хаос да се погледне. Ова не е затоа Фејсбук програмери манифестираат 0 од 5 за стил, на пример. Тоа е затоа што повеќето од код кој тие пишуваат е, всушност, напишана убаво, и коментира, убаво вовлечен, и слично, но се разбира машини, компјутери, интернет прелистувачи навистина не ти е гајле дали вашиот код е добро стилизирана. И всушност, тоа е сосема непотребното да погоди копчето Tab сите оние пати и да се стави коментари во текот на целата вашиот код и да го изберат навистина описни променлива имиња затоа што ако на прелистувачот не се грижи, сите што го правиш на крајот на денот се трошат бајти. Значи испаѓа она што повеќето веб-сајтови не е иако изворниот код за facebook.com, за cs50.net и сите овие други веб-сајтови на Интернет обично се добро напишани и добро коментираше и убаво вовлечени и слично, обично пред сајт е ставена излез на интернет, го кодот е minified, при што на HTML и CSS - нешто што ние наскоро ќе видите - на JavaScript код ние наскоро ќе видите е компресирана, при што долго променлива имиња стане X и Y и Z, и сето тоа празни места што го прави сè што изгледа толку читлива се сите фрлен, затоа што ако мислите дека за тоа на овој начин, Фејсбук добива една милијарда страница хитови на ден - нешто лудо како тоа - па што ако програмер само за да бидат во анален хит на просторот бар една екстра време само за да алинеја некои линија код некогаш толку многу? Што е импликација ако Фејсбук зачувува дека празни места во сите бајти тие испрати назад до луѓето на интернет? Притискање на тастерот space еднаш ви дава дополнителна бајт во вашето досие. И ако една милијарда луѓе потоа да продолжи да го симнете Главна страница тој ден, колку повеќе податоци ви пренесуваат преку интернет? А гигабајт без добра причина. И готово, за многу веб-сајтови ова не е толку скалабилни прашање, но за Фејсбук, за Google, за некои од најпопуларните веб-сајтови има голем поттик финансиски да се направи вашиот код изгледа хаос така што ќе се користи како неколку бајти што е можно во прилог на, тогаш тоа компресирање користење на нешто како Zip, алгоритам наречен gzip, дека прелистувачот прави за вас автоматски. Но ова е страшно. Ние никогаш нема да научат нешто за веб-сајтови на други луѓе и како да се дизајнира веб страни ако ние треба да се погледне во тоа како оваа. Па за среќа, прелистувачи како Chrome и IE и Firefox овие денови обично доаѓаат со вграден инвеститорот алатки. Всушност, ако одам надолу за да го Увид елемент или ако одам да ја видите, програмери, и да одат во развојни алатки експлицитно, овој прозорец во долниот дел на мојот екран сега се појавува. Тоа е малку застрашувачки на прв, бидејќи има многу непознати јазичиња тука, но ако јас кликнете на елементи по целиот пат во долниот лев, Chrome е очигледно прилично паметни. Таа знае како да се интерпретираат сите на овој код. И уште па што Хром не е тоа чисти сите на HTML Фејсбук. Иако не е празно таму, не е вовлекување таму, сега се забележи дека можам да почнат да се движите оваа веб страница сè повеќе и повеќе хиерархиски. Излегува дека секоја веб страница напишани на јазик наречен HTML5 треба да започне со тоа, овој DOCTYPE декларација, така да се каже: Тоа е вид на светлина и сива таму, но тоа е првата линија од кодот во оваа датотека, и дека само му кажува на пребарувачот, "Еј, тука доаѓа некои HTML5. Еве доаѓа на веб страницата." Првиот отворен заградата зад тоа се случува да биде тоа нешто, отворена заграда HTML таг, и тогаш да се нурне во подлабок - овие стрели се сосема бесмислено; тие се само за доброто претставување, тие не се всушност во датотеката - забележи дека во внатрешноста на HTML таг Фејсбук, нешто што започнува со отворен заградата а потоа има збор се нарекува таг. Значи внатре во тагот HTML е очигледно главата таг и телото таг. Внатрешноста на главата таг сега е целата збрка на Facebook бидејќи тие имаат многу метаподатоци и други работи за маркетинг и рекламирање. Но, ако ги движите надолу, надолу, надолу, надолу, ајде да видиме каде е. Тука е. Ова е барем малку познато. Насловот на почетната страница на Фејсбук, ако некогаш се погледне во јазичето во вашиот насловната лента, е Добредојдовте на Facebook - се најавите, се пријавите или Дознај повеќе. Тоа е она што ќе видите во насловната лента Хром, и тоа е тоа како е претставен во кодот. Ако ние го игнорираме сè друго во главата, поголемиот дел од цревата на веб-страница се во телото, и излегува дека кодот на Фејсбук ќе изгледа посложен од повеќето работи што ќе пишувам првично само затоа што беше изградена во текот на годините, но има едночудо скрипта тагови, JavaScript код, што го прави веб-сајтот многу интерактивни: види статус надградби моментално користење на јазици како JavaScript. Има нешто што се нарекува div, што е поделбата на една страница. Но, пред да се дојде до таа детали, ајде да се обидеме да одзумирате и гледам поедноставен верзија на Фејсбук 1.0, така да се каже. Тука е здраво, светот на веб страници. Вели дека DOCTYPE декларација во самиот врв која е малку различен од сè друго. Ништо друго не се пишува во веб страница, се случува да се започне со за задебелени букви. Повторно, приказната е иста: Здраво, запирка, почнат да прават овој храбар, тогаш светот добива печатено со задебелени букви, а тоа значи запре печатењето ова со задебелени букви. Дозволете ми да оди напред и да ја спаси мојата датотека, се врати на Хром, ќе зумирате само така можеме да видиме подобро, и повторно, и ќе видите дека светот е сега со задебелени букви. На интернет е за сите хиперлинкови, па ајде да одиме напред и да го направите ова: мојот омилен веб-сајт е, да речеме, youtube.com. Спаси, ја превчитате. Во ред. Има неколку проблеми, сега покрај одвратност на веб страната. 1, јас сум прилично сигурен дека јас хит Внесете тука. И го сторив. Јас не само притиснете ентер, јас исто така вовлечен, практикуваат она што ние сме биле проповеда за стил, но мојата е веднаш до светот. Значи, зошто е ова? Прелистувачи само го направи она што им каже да го стори. Не сум изјави на прелистувачот, "Break линии. Insert став скрши тука." Така на прелистувачот, тоа не е важно дали јас хит Врати 30 пати, сè уште нема да ја ставам веднаш до светот. Она што навистина треба да направите тука е да се каже нешто како
, вметнете ред. И всушност, на ред е вид на чудно нешто затоа што навистина не може да почне да се врти на друга линија, а потоа направи нешто, а потоа престане да се движи во нова линија. Тоа е вид на атомски операција. Можете или го прават тоа или не. Вие хит Enter или не. Значи br е малку поинаква ознака, и така јас треба да се најде на двете отворени и затворете го сите одеднаш. Синтаксата за тоа е тоа. Технички, можете да направите нешто како ова во некои верзии на HTML, но ова е само глупаво, бидејќи нема причина да се започне и да престане нешто ако наместо да го прават тоа сите одеднаш. Сфатат дека HTML5 не строго да бара оваа коса црта, па ќе видите учебници и онлајн ресурси кои не го имаат, но за добра мерка, да се практикуваат на симетрија што видовме досега. Ова значи дека таг е и отворени и затворени. Па сега дозволете ми да ја спаси мојата датотека, врати овде. Океј, па тоа е почнуваат да изгледаат подобро, освен Веб знам е вид на кликање, а сепак YouTube тука не чини да доведе до ништо. Тоа е затоа што иако изгледа како линк, интернет пребарувач не знае дека по себе, па морам да кажам прелистувачот дека ова е линк. На начин да го направите ова е да се користи сидро таг: и дозволете ми да се помести ова на нова линија само, така што е малку повеќе може да се чита, и јас ќе се намали големината на фонтот. Јас се направи уште? Не постојат ќе биде оваа дихотомија. Овој таг, сидро таг, навистина се атрибут, со кој се менува своето однесување, а вредноста на тој атрибут е очигледно рачно YouTube е. Но забележите дихотомија е дека само затоа што тоа е рачно сте ќе, тоа не значи дека треба да биде збор кој сте нагласувајќи и правење на линкот. Напротив, тоа може да биде нешто како ова. Значи морам да кажам престане да прави овој збор линк со користење на блиски сидро таг. Забележиш јас не го правам тоа. 1, тоа само ќе биде губење на време на сите и тоа не е неопходно. За да го затворите тагот, можете само се спомене името на тагот повторно. Вие не се споменуваат на атрибути. Па ајде спаси, врати се назад. Океј, Voila, сега тоа е сино и линк. Ако јас кликнете на неа, јас всушност не одат на YouTube. Значи иако мојата веб страница не е на интернет, тоа е најмалку HTML, и ако им дозволиме на интернет израмни, ние всушност ќе заврши тука на youtube.com. И јас да се вратиш назад и тука е мојата веб-страница. Но забележите ова. Ако некогаш сте добиле спам или phishing, сега имате можност по само пет минути да го стори истото. Ние можеме да оди тука и направи нешто како www.badguy.com или што и површни веб-сајт е, а потоа може да се каже провери вашата PayPal сметка. [Смеа] И сега тоа се случува да одат на badguy.com, што јас не одам да кликнете на затоа што немаат идеја каде тоа води. [Смеа] Но, ние сега имаат способност да всушност завршуваат таму. Значи ние сме навистина само почетна да ја изгребат површината. Ние не сме програмирање по себе, ние сме пишување Селектирај јазик. Но штом ќе коло од нашиот речник во HTML, ние ќе се воведе PHP, вистински програмски јазик што ќе ни овозможи да генерираат HTML автоматски генерира CSS автоматски, така што можеме да започнеме во средата за спроведување на, да речеме, нашите сопствени пребарувач и многу повеќе. Но повеќе за тоа во неколку дена. Ние ќе се видиме тогаш. [CS50.TV]