[Powered by Google Translate] [Седмица 7]
[Дейвид Дж. Малан - Харвардския университет
[Това е CS50. - CS50.TV]
Добре. Добре дошъл. Това е CS50, и това е началото на седмица 7.
Няколко малки обяви:
Pset5 сега е в прогрес, или скоро ще бъде,
и нека ти кажа, честно казано, това не са склонни да бъдат сред по-голямо предизвикателство
на проблемни комплекти на курса, така че нека да говорим за това сега
така че тази седмица повече от всякога не чакайте, докато, да речем, сряда вечер
или в четвъртък вечер, за да се гмуркат.
Това определено е интересен pset. Смятаме, че е забавно.
Ако действително го получите напълно коректна и тогава може да оспори така наречения Голям съвет,
ще имате възможност да съответстват на акъла с някои от служителите на курса
и някои от съучениците си.
The Big съвет е, след като сте си проверка на правописа работа,
ще можете да отидете на cs50.net след изпълнение на команда,
чисто изберат, а след това сумата на времето и размера на RAM и повече
, които сте използвали във вашата изпълнение ще бъдат изложени тук на началната страница на курса.
Ще забележите, че цял куп от тези хора тук са изброени в броя на персонала
тъй като през уикенда, на персонала, че ще е забавно да се опитват да надминат един друг.
Така че осъзнават, че целта тук не е да надмине персонал.
Дори и аз съм тук само номер 13.
Чисто изберат, но това е възможност да се види колко малко RAM
и колко малко CPU секунди можете да използвате по отношение на някои от съучениците си.
>> И аз ще призная, че Кевин Майкъл Шмид,
в момента номер 1 позиция като една от TFS,
това е за изпълнение, че ние не наричаме възможно
като се има предвид, че той използва почти 0 RAM и почти на 0 секунди за зареждане.
Така че ние ще се погрижим на офлайн Кевин. [Смях]
Има определени умения, които Кевин поставя на изпитание тук.
Едно от нещата, ние решихме да направим сега е CS50x е една седмица е в ход,
и вие сте толкова част от този експеримент, тъй като тези ученици са.
Сме ги попита част на тяхната pset0, което е подобно представят проект Scratch
от интерес за тях - игра, интерактивно произведение на изкуството, анимация или нещо подобно -
1 - 2 минути видео, ако те биха искали, казва здравей на света и които са в действителност.
Реших да споделя с вас само няколко от клиповете, които са подадени до този момент
, защото за нас, на персонала, най-малко, това наистина е вълнуващо
и вдъхновяващо да видим тези хора от всички краища на света - страни по целия свят -
настройка, на всички неща, на курс по компютърни науки в интернет,
дали това е, защото те искат да продължат своите изследвания,
те искат да продължат кариерата си в нова посока,
искат да попълни пропуските в собствените си знания,
така че някои от същите причини, поради които вие може би са били тук.
>> Така че аз ви дам един такъв студент тук. Можете да увеличите силата на звука само малко.
Тук е един от нашия студентски 1 минута становища.
Здравей, свят. Аз съм студент на индустриалния инженеринг в Малага, Испания.
Аз съм развълнуван за този онлайн курс, защото аз обичам компютърните науки, наистина,
и аз наистина оценявам, че съм се да го изследват.
А фактът, че мога да науча всички от вас, момчета
но вместо да е в Харвард съм в Малага, колко страхотно е това?
Е, аз съм Фернандо, и това е CS50. Ще се видим.
[Смях] друг клип, особено харесва, вие ще откриете, че английският този господин не е толкова силна.
Изглежда, че той е машина за превод, така че самите преводи са доста несъвършени,
но това е един от любимите ни до този момент, както и.
[♪ ♪]
Здравей, свят. [Говори на японски]
[I трябва да се поздравяват на японски, защото английският ми е много ненадеждни.]
[I предадох послание към вас от град Гифу, Япония.]
[I може да бъде ученик за първи път от 20 години насам, както може да се види.]
[Аз съм много благодарен на Харвардския университет, който ми даде тази възможност и EDX.]
[Голфът е на китара и ми любимото нещо.] [Смях]
[♪ ♪]
[Защо мислиш, че се опитва да присъства на cs50x.]
[Харвардския университет, това е моят копнеж.]
[Особено ако съм далечен присъствие е живял в Япония.]
[Исках да опитам незабавно наясно за съществуването на такава EDX кога.]
Не смятате ли, така че не е свързана с възрастта на обучение I.]
[Cs50 е моят копнеж. Моето име е Kazu, и това е cs50.]
[♪ ♪] [аплодисменти и окуражителни]
Друг любим наш е това твърдение тук от някого.
[♪ ♪] [Малан] Google го, ако не сте запознати с този мем.
>> И накрая, няколко други, които има публикувани, че може би спечели очарователни награда.
[Студенти] Ооо! >> Малан Ще трябва да слуша. Това е кратък, така че слушайте внимателно.
[Женски говорител] Какво е вашето име? >> Луи.
[Женски говорител] Какво е това? >> [Смее] CS50. [Смях]
Малан] Той не отнема, все пак.
Ето, на последния.
Моето име е Луи, и това е CS50.
[Смях] Тогава това е CS50x.
Благодаря на всички онези от вас, а след заедно у дома
, които са били вземаме до този момент.
Днес можем да заключим, нашата дискусия на структурите от данни,
поне някои от най-фундаменталните
и след това ние продължаваме разговора ни за HTML и уеб програмиране.
Всъщност, ние сме прекара последните около седем седмици, в основите на програмирането -
алгоритми, структури от данни, и други подобни -
и C, както може би сте имали до този момент,
не е непременно най-достъпни на езици
, с които да се приложат някои от тези идеи.
И така започва тази седмица и следващата седмица и след това по-долу,
ние най-накрая ще бъде в състояние да преход от C, която е известна като доста ниско ниво на езика,
на по-високо ниво, сред тях PHP, JavaScript и други подобни неща,
, които ще видим разчита на едни и същи уроци, които сме научили през последните няколко седмици,
но вие ще откриете, че обявяването на неща като масиви и хеш-таблици и търсене и сортиране
стане много по-лесно, защото самите езици, ще започнете да използвате
ще стане по-силен.
Но първо, прилагането на дърветата.
Това е много често тези дни да се наложи да компресирате информация.
В какъв контекст би искате да компресирате някакъв вид цифрова информация?
>> Да. >> [Ученик] Когато трябва да го изпратят в уеб.
Да, когато искате да изпратите нещо в уеб.
Ако искате да си изтеглите голям файл, той е идеален, ако някой на другия край
този файл е компресиран с помощта на цип формат или нещо подобно
, така че сте изпращане на по-малко битове, отколкото иначе биха могли да бъдат предадени.
Е, как да компресирате информация?
Всичко се свежда до използването на по-малко битове, отколкото се изисква по подразбиране.
Но това е вид на нещо любопитно, защото мисля, обратно до седмица 0 и 1
, когато говорихме за ASCII и бинарни и ние говорихме за ASCII по-специално
като използва 8 бита, за да представляват букви от азбуката
така че буквата А е представена от 65 малки, а е номер 97,
и колкото и да сте на 65 или 97, вие използвате 7 или 8 бита.
Но уловът е, че има някои букви в английската азбука
, които не са толкова популярни, тъй като другите.
Z не е всичко, което популярен, Q не е толкова популярен, но А и Е са супер популярни.
И все пак за всички тези писма, по подразбиране света използва и същ брой битове, само на 8.
Така че, не би ли било РАЗУМНИ ако вместо 8 бита за всяка буква,
дори и най-рядко използват като Q и Z,
какво би станало, ако ние използвахме по-малко битове за А и Е и S и най-популярните писма
и се използва повече битове за по-малко популярни писма,
идеята е оптимизиране нека общия случай,
, което е тема по компютърни науки се опитва да оптимизира какво ще се случи най-
и да прекара малко повече време, малко повече пространство за неща, които, да, може да се случи
но не е задължително, както често.
Така че нека да вземем един пример.
>> Да предположим, че искаме да се кодират информация доста ефективно.
Може да са израснали знае нещо за морзовата азбука,
и шансовете са, че не знаеш действителният код,
но можете да си спомните, че това е най-малко тази поредица от точки и тирета.
Това е доста ефективни кодиране и забележете, че най-популярната писмо - например, E -
използва кратки звукови сигнала.
Морзовата азбука е всичко за бип-бип-бип-бип-бип-бип и провеждане тонове
или за кратки периоди от време или дълги периоди от време.
Е, както е обозначен с точката, е супер кратък звуков сигнал, а само звуков сигнал, който ще представлява E.
От друга страна, T ще бъде по-дълъг звуков сигнал, както и звуков сигнал [удължава звук],
и това ще представлява T.
Но това все още е доста кратко, защото, за разлика от това, ако се вгледате в Z,
да изразят Z ще отиде звуков сигнал, звуков сигнал [дълъг звук], звуков сигнал, звуков сигнал [кратък звук].
Така че е по-дълъг, защото това е по-малко разпространена.
Но нещо, за което тук е, че морзовата азбука е малко недостатъци
в това, че не е веднага decodable.
Например, да предположим, че ще чуете за някои края на телта сигнал [кратко], звуков сигнал [дълго].
Какво послание просто да получат? Точка и тире. Какво значи това?
[Ученик] А. >> Малан Може би.
Тя може да бъде E, следвана от T.
С други думи, морзовата азбука, въпреки че използва този принцип за оптимизиране на ъгъла случай,
тя не се поддава за незабавна decodability.
Това означава, че човек, който е чуване или получаването на тези точки и тирета
трябва по някакъв начин да разбера къде почивките между буквите,
, защото ако не знаете, когато тези прекъсвания са, може да се обърка A за ET или обратното.
>> И така, какво може да направи? Морзовата азбука бихте могли просто пауза между всяка една от буквите.
Но пауза е вид противоречи на цялата идея за ускоряване на нещата.
И какво ще стане, ако вместо това дойде с код, където не е имало тази лоша ситуация
където Е е префикс, например, от А -
с други думи, ако можем да се уверите, че моделите са все още за популярните букви
дълго за по-малко популярни писма, но че няма възможност за объркване?
Един човек от името на Хъфман преди години е измислил тази схема, наречена Huffman кодиране
че всъщност лостове един от структури от данни, които сме прекарали малко време да говори за
миналата седмица, че на дървета, двоични дървета конкретно -
двоичен смисъла дърво, което има не повече от 2 деца.
Това може би е ляв дете, може би право дете, и това е всичко.
Така че предполагам, само за целите на дискусията, че някой иска да изпрати послание
което прилича на това. Това е пълна глупост, но е съставен от Както, BS, CS, DS, и Ес.
И ако действително разчита на Както, BS, CS, DS, и Es
и след това се разделят на общия брой на писма,
тази малка диаграма тук се казва, че 45% от писмата Es, 20% са толкова,
10% BS, и така нататък.
С други думи, да предположим, че цитиран низ
е просто някакво съобщение, което искате да изпратите.
Това се случва в глупост просто така можем да използваме колкото се може по-малко букви, колкото е възможно,
но това е наистина случай, че E остава най-популярният,
и Б и В са най-популярни, най-малко от тези пет букви от азбуката.
Така че как можем да идва с кодирането,
двоично кодиране, модел на 0s и 1s за всеки един от тези писма
по такъв начин, че Е е кратък модел и може би B и C са малко по-дълги модели,
отново, като идеята е, че искаме да използваме по-малко битове голямата част от времето
и повече битове само от време на време.
Според Huffman кодиране, можете да създадете гора от дървета.
Има вид на една история линия, която включва дървета, а също и процеса на изграждането им.
Нека да започнем.
>> Аз предлагам да започнете с тази гора, така да се каже, на пет дървета,
всяка от които е доста глупаво дърво.
Дървото се състои от само един възел, както е представена тук от кръга.
Така че всеки от тези неща може да бъде структурата C
и вътре в структурата C може да бъде с плаваща запетая, представляващ честотата
и тогава може би знак, представляващ писмо.
Така че мисля, че на тези възли просто някакъв стар структура на C, но за сега, по-високо ниво.
Това е гора на 5 дървета, всеки от които имат само един възел.
Какво Хъфман предложения е, че ние започваме да комбинирате тези дървета
, които имат най-малкия брой честотни в малко по-големи дървета
чрез свързването им с нов възел корен.
Така че сред буквите тук, забележете, че за удобство съм ги подредени от ляво на дясно,
въпреки че не е строго необходимо, и забележете, че най-малките възли
в момента са 10% и 10%.
Така Хъфман предложи да се слеят тези две най-малки възли в нова дърво
чрез въвеждане на нов възел майка и след това, че майка ляв дете и право дете
където B е произволно наляво и C е произволно правото.
И тогава Хъфман предложи нека сега просто мисля, че на лявата дете
в един от тези дървета винаги да бъде представляван от 0
и правото дете винаги да бъде представляван от номер 1.
>> Това няма значение, ако ги обърнете така, докато сте в съответствие.
Така че сега имаме четири дървета в тази гора.
И аз казвам, четири, защото сега дърво в ляво -
и това не е толкова дърво в смисъл, че тя расте по този начин,
това е по-скоро като родословно дърво, където сега е 0.2 е нещо като майка на две деца -
забележите, че в този родител сме привлечени 0.2.
Сме добавили честотните разчита на две деца и като се има предвид нов възел общата сума.
Така че сега ние трябва само да повторите този процес.
Намерете двете най-малки възли и след това се присъединят към тях в нова дърво
и след това повторете този процес.
Точно сега имаме няколко кандидати, 20%, 15%, а други 20%.
В този случай, ние трябва да се прекъсне вратовръзка. Можем да го направим произволно.
Ние просто трябва да го направя последователно.
В този случай, аз ще произволно отида с една от ляво,
и аз сега се слеят 20% и 15%, за да ми даде нова майка, наречена 35%,
, чиято лява детето е 0, чието право дете е 1, а сега имаме само три дървета в гората.
Може би когато това се случва.
Ако ние повтаряме това още няколко пъти, отиваме да има само една по-голяма дърво,
всички, чиито краища са обозначени с 0s и 1s.
Нека го направим отново.
35% е корена на това дърво. Съответно 20% и 45%, така че отиваме да се слеят на 35% и 20%.
Сега имаме това дърво тук. Ние добавяме заедно, ние имаме 55%.
Сега има само две дървета в гората.
Ние правим това за последен път, и се надяваме, математически всички честоти
защото те трябва, тъй като ние ги изчислява от самото начало да добавите до 100%.
И сега имаме едно дърво.
Така че това е Huffman кодиране дърво.
Вид отне известно време да стигнем до там устно, но реалността е с контур
с рекурсивна функция, можете да се изгради това нещо доста бързо.
Така че сега имаме един нов възел, и всички тези вътрешни възли са malloc'd,
Предполага се, че по протежение на пътя.
Така че сега най-отгоре на това дърво имаме 100%, но сега забележите имаме път
от тази нова велика-пра-пра-дядо на пра-пра-пра-внуци
по целия път в долната част на листата.
>> Това, което ще правим сега, е да предложи с цел да представляват E писмо,
ние просто ще използвате номер 1. Защо?
Защото, ако се пресече това дърво от крайната корен листа, известен като Е,
ние следваме само един ръб, в десния край, и това е обозначено на курс в горния десен 1.
Така косвено тук за Хъфман е, че кодиране E в двоичен да бъде само 1.
И това е доста ефективна. Наистина не може да получи по-малък от този.
В замяна на това ще бъдат представени, ако следваме логиката,
от какъв модел на битовете, вместо? 01.
Така че, за да стигнем до, ние започваме в основата и отиди наляво и след това да отидем право,
което означава, че 0 и 1.
Така че ние трябва да представлява буквата А с модела 0 и 1.
И сега забележите, ние вече имаме собственост на незабавно decodability
че не сме в Морзовата азбука.
Въпреки че и двете от тези модели са доста кратък - E е 1 бит, A е 2 бита -
забележите, че те не могат да бъдат объркани едната или другата,
защото, ако видите едно тя трябва да бъде Е, ако видите 0, тогава един очевидно трябва да бъде A.
По същия начин, какво е D? 001.
Какво е C? 0001.
И какво е Б? 0000.
И отново, защото всички на буквите Ние се грижим за листата
и нито една от тях не са вид на посредниците по пътя от корена до листо,
няма риск от conflating различни кодировки две писма
защото всички тези битови модели са детерминистични.
0000 ще бъде винаги Б.
Не е възел някъде по средата, който може да обърка една буква за другия.
Така че това, което е отражение тук?
>> Най-популярната е намерила писмо - в този случай E - най-краткия кодиране,
А е намерила следващия най-нисък кодиране,
и B и C, които ние вече знаеше от самото начало са вид на най-малко популярните
на честота 10% всяка, те са придобили най-дългата кодиране.
И така, какво означава това сега е, че ако искате да изпратите съобщение, което е компресиран
през Интернет или в имейл или подобни,
, а в сравнение с използването на стандартен ASCII, можете да изпратите Хъфман кодирано съобщение
, при която, ако искате да изпратите електронно писмо, вие изпращате само едно малко.
Ако искате да изпратите А, вие изпращате два бита, 01, вместо да изпращате 8 бита
последвано от още 8 бита, последвани от още 8 бита и т.н..
Но има нещо, за което тук.
Това не е достатъчно просто да се изгради това дърво и след това започнете да изпращате от Алис на Боб
по-краткия малко модел, низ от ASCII,
защото Алис също трябва да информира Боб от това, което
ако Боб ще бъде в състояние да четат сгъстен съобщение?
[Чува студент отговор] >> Какво е това?
[Чува отговор студент] >> От какво дърво е.
Или още по-точно, какви са тези кодировки,
особено след като по време на тази история ние направихме отсъжда в една точка.
Не забравяйте, че ние трябваше да вземем произволно между две различни 20% възли?
Така че това не е случай, че получателя, Боб, може просто да се реконструира дърво по негова собствена
защото може би той ще създаде дървото все така по малко по-различен от Алис.
Освен това, Боб не знам какво е оригиналното съобщение
защото единственото нещо, Алис е да го изпрати, разбира се, е компресиран съобщение.
>> Така улов с компресия като това е, че, да, Алис може да спаси един куп бита
чрез изпращане на един E и 01 за А и така нататък,
но тя също трябва да информира Боб какво картографиране е между букви и бита
, защото те не могат ясно да разчитат само на ASCII повече, ако не използвате ASCII.
Така че тя може да го изпрати на дървото някак си -
го напиша, да я съхранява като двоични данни или нещо подобно -
или просто да му изпрати малко лист измама, Excel файл, който показва преобразувания.
Така че ефективността на компресия наистина предполага, че съобщенията, които изпращате
са доста големи, най-малко средни,
защото ако сте изпращане супер кратко съобщение,
ако просто искате да изпратите съобщението BAD, който се случва да бъде дума, която може да пише тук,
Б-А-D, вие вероятно ще използвате по-малко битове,
но уловът е, ако вие също трябва да информира Боб какво дърво е
или какви са тези кодировки, вие вероятно ще надхвърлят всички спестявания
компресирани неща да започнем с това.
Така че това всъщност може да бъде случай, че ако се опитате компресиране
дори с нещо като цип или файлови формати могат да бъдат запознати с
доста малки файлове, дори и празни файлове -
понякога тези файлове може да получи по-големи и не по-малък.
Но реалистично, това се случва само за малки размери на файла,
така че няма да гигабайт файл е 2 гигабайта;
ние наистина говорим байта или само няколко килобайта.
>> Някои програми като цип са достатъчно умни, за да осъзнаят, че,
"Ти започваш да се харчат повече битове компресиране на това."
"Позволете ми да не се притеснява да го компресирате за вас изобщо."
Така че това е само един начин на компресиране текстов формат.
Ние може да приложи нещо подобно в C.
Например, тук е как бихме могли да представляват възел в това дърво
където имаме Чар за символа, плаваща стойност на честотата,
и като сме виждали с други структури от данни, 2 указатели,
1 до лявата дете, 1 отдясно, всяка от които може да бъде нула,
но ако не, то се отнася до лявата детето и право дете.
Така че това е Huffman кодиране, и това е един начин, по който можете да отидете за компресиране на информацията,
и със сигурност това е един от най-лесни за изпълнение
в контекста на, да речем, от миналата седмица структури от данни,
въпреки че съществуват още по-усъвършенствани алгоритми
който може да направи още по-сложни мутации на вашите данни.
Всички въпроси по дърветата, двоични дървета, или компресия на текст?
[Ученик] Има известна неяснота, като, ако се чува] сплит в 01,
след това 011 ще бъде двусмислено, нали?
[Недоловим] >> Добър въпрос. Неяснота.
Нека да обобщим, като се позовава на тази снимка тук.
Защото знаците, които компресиране, представителства на
по дефиниция на този алгоритъм винаги остават на листата,
случайно никога няма да използват един и същ модел на битовете за префикса на множество писма.
С други думи, вие сте загрижени, това звучи като, неяснота, произтичащи
, при която 001 може да бъде началото на Б или началото на C или нещо подобно.
Но това не може да бъде така, защото забележете, че всички букви от азбуката ни кодиране
са в листата.
>> Неяснота може да възникне само, тъй като в случай на Морзовата азбука,
ако, например, C е някъде по пътя от корена до Б.
[Ученик] Точно така. Така че в този случай, да речем А има два листа. >> Кажа - Кажи, че отново.
[Ученик] Кажи А има два листа, F и G, а след това G - >> Добре. Но той не може.
А сам по себе си не може да има листа F и G, защото тези писма F и G
да бъдат себе си оставя някъде в ляво на Б или правото на Е.ОН
Така че, по дефиниция, те трябва да бъдат листата.
В противен случай, вие сте точно така, ние не сме решили проблема, че морзовата азбука е изправен.
Добър въпрос. Други въпроси? Добре.
Тази представа за бита, оказва се, сме имали власт, всички заедно, че ние не сме действително се използва
, когато той дойде да манипулира тези 0s и 1s.
Питаме за това на един от най-ранните комплекти проблемни:
а именно, как да отида за конвертиране на главни букви в малки или обратното?
Или, по-конкретно, попита един от първите psets
колко бита всъщност трябва да се обърнете, за да променят в малки една или обратното?
Ето един бърз напомняне на 65 и 97 изглеждат в двоичен.
И дори ако този въпрос е някак избледнели в паметта си,
можете да видите отново тук, че колко бита трябва да бъде обърната
да промените капитал в малки? Само един.
>> Те се различават само на едно място, третото малко от ляво.
Като има предвид, че има 010, малко има 011.
Така че по някакъв начин, ние трябва просто да бъде в състояние да обърне тази част,
и тогава ще можем да се възползва или малки букви.
Ние сме направили в миналото от реално използване, ако условията
и проверка дали писмото е между капитала А и капитал Z,
тогава изходи като А - A + 26 или нещо подобно.
Може би направил аритметична промяна на буквите от азбуката.
Но какво би станало, ако можехме да просто флип, че едно малко?
Как може да стане като един байт на бита, така че 8 бита като 01000001 и 01100001?
Ако сте имали тези модели на бита, как можем да променя само един от тях?
Какво ще стане, ако въведем в жълто тук друг модел на бита?
Ако успея цели жълти 0s струнни, с изключение на най-малко, че искам да променя
и тогава ще се въведе нов оператор, известен като оператор на побитови -
Побитови в смисъл, че тя работи на отделни битове,
не на цял един байт или четири байта всички наведнъж.
Тази вертикална лента в жълто подсказва, че какво ще стане, ако вземем представителство на капитала
и побитово ИЛИ с жълта последователност от битове?
С други думи, да се връщат към нашата дискусия на булеви изрази в Scratch и след това в C.
>> Правейки Boolean или означава, че за да е истина, било първото нещо, което трябва да бъде вярно
или Второто нещо, което трябва да бъде вярно или двамата трябва да бъде вярно,
и след това в резултат на изход само по себе си е вярно.
В този случай, какво ще се получи, ако вземем 0 "или" с 0? Невярна или невярно?
Тя все още е фалшива, така че малката остава, както се очаква.
Какво ще стане, ако вместо да правим 1 или 0?
Това сега остава една, но забележете, какво има да се случи тук.
Ако започнем с капитал А и ние продължаваме да "или" отделни битове, което правим тук,
0 или жълт ни дава това, което тук? Това ни дава един.
В действителност, да предположим, че ние не знаем какво главна версия на малко всъщност беше.
Да отидем да направите това. Позволете ми да се движат обратно тук.
Нека го направим отново. 0 или 0 ми дава 0.
1 или 0 ми дава 1.
0 или 1 ми дава 1.
0 или 0 ми дава 0. Следващото е 0, другия е 0, следващата е 0.
1 или 0 ми дава 1.
И така, дори и ако ние не знаехме предварително какво малки бе,
просто с "или" ING А с този модел на битовете, че сме представени тук в жълто,
можете да малки букви на капитала чрез обръщане на тази част.
Ние използвахме този израз седмици преди: обръщане малко.
Откъде всъщност програмно?
Можете да използвате това, което обикновено се нарича маска, последователност от битове,
че в този случай просто така се случва тук да изглежда като този брой,
и след това "или" заедно с използване на този нов оператор C,
не | |, се използва единен | и вие всъщност ще получите този отговор тук, защото защо?
Това е на 1s, 2s място, 4S, 8s, 16, 32S.
Така се оказва, че ако вземете една главна буква А и побитово ИЛИ с цяло число 32
защото цялото число 32, когато гледат на него като бита, прилича на това,
това означава, че можеш да въртиш малко, че наистина искате.
И по същия начин - и ние ще разгледаме код само за миг -
Предполагам, че искаме да отидем в другата посока.
>> Как да отида от малки към капитала? Което малко трябва да се промени?
Това е една и съща.
Ние искаме да променим тази трета малко от 1 на 0.
И как бихме могли да направим това?
Как да изключите малко? С какъв модел на бита бихме могли да изключите малко?
Какво ще стане, ако ние някак обърнете маска?
Като има предвид, че и преди, ние направихме цялата жълта маска 0s
с изключение на най-малко исках да включите,
какво ще стане, ако този път, ние правим цялата 1s маска, с изключение на случаите, за малко, че ние искаме да изключите
и след това да използвате това, което оператор?
Какво ще стане, ако ние "и" неща? Нека да разгледаме.
Ако сега се обърнете към това, да предположим, че отново създам маска, това е всичко 1s
с изключение на най-малко, че искате да изключите
и след това, а не "или" бели номера отгоре с жълти номера тук,
какво ще стане, ако аз "и" те заедно? Тя се нарича побитово.
Логично, това е едно и също нещо като Булев.
Това ми дава 0 и 1 е 0. Толкова фалшиви и истински е фалшива.
Вярно е и вярно е вярно.
И тук е магията: вярно и невярно е фалшива, така че сте изключили тази част.
И сега Останалата част от историята е малко по-лесно.
Тъй като останалата част от маската е 1s, че няма значение какви цифри са в бяло.
Когато вие "и" нещо вярно, не започваш да промените стойността му.
Ако това е вярно, то ще остане вярно. Ако тя е фалшива, тя ще остане фалшива.
>> Но магията се случва, когато правите нещо, което е вярно
и след това "и" с фалшиви.
Това има ефект на изключване, че малко.
Така малко загадъчен.
Нека действително изглежда в някакъв код, който може в действителност да изглежда още по-загадъчен,
но нека да разгледаме тук в tolower.
Ако гледам в tolower, ще капитал в малки,
нека да видим как бихме могли да изпълнява тази програма.
Тук е основната, и то не е като всички аргументи от командния ред.
Аз съм за обявяване на характер в писмо, че потребителят ще въведете инча
След това използвайте позната правя, докато контур просто се уверете, че потребителят определено ми дава капитала на
или B или C. .. Z, така че те ми дават нещо средно между А и Z.
И сега какво правя тук?
Аз съм "или" този с 0x20, но това всъщност е същото като -
и ще се върна на това в момента - 32.
Така че, отново 32 е този модел на бита тук. Защо знаем това?
Просто мисля, обратно до седмица 0.
Това е на 1s, 2s място, 4s, 8s, 16, 32s място.
Така че този жълт номер се случва да бъде 32.
Аз мога да взема писмо като Чар тук, побитово "или" с буквално номер 32,
и какво да се върна? Малката версия на тази Чар.
Преди малко обаче, изрази това в различна базова нотация.
Какво е това? >> [Студент в шестнадесетичен вид.
[Малан] Това се случва, да представлява шестнадесетично.
Ние не сме говорили за шестнадесетичен всички, че много,
но всъщност е удобна в случаи като този.
>> Въпреки че изглежда по-сложна и макар и да прилича на 20, а не 32,
се оказва, че шестнадесетичен всъщност е супер удобно нотация
защото в шестнадесетичен всяка цифра след 0x - и това не означава нищо;
това е просто човек конвенция, която казва, че тук идва шестнадесетично число -
всяка една от тези цифри, две и след това 0, сами по себе си могат да бъдат представени
с точно 4 бита.
Така че, ако ние не направим това, нека се отвори текстов редактор тук - странно функция за автоматично довършване -
ако ние не направим малко текстов редактор, броят 0x20 означава тук е 4 бита, ето още 4 бита.
Нека да направим първо най-десните 4 бита.
0, когато е представена с 4 бита е какво? Super лесно. Просто 0s.
Така четири бита като 0s.
Как да ви представлява две? Той е бил известно време, тъй като ние направихме това, но това е 0100.
Така че това е 1s място, това е 2s място, и поради това не е от значение това, което другите места са.
С други думи, в шестнадесетичен може да се каже, 0x20,
но ако след това мислят за това, което е два и как се представени в двоичен,
каква е 0 и как се представени в двоичен
Отговорите на тези въпроси са това и това.
Така 0x20 случва да представлява този модел на 8 бита,
което е точно маска, която искахме.
Така че това е за момента само интелектуално упражнение,
но реалността е в кода това е обикновено по-често да пишат константи като този
в шестнадесетичен, защото тогава програмист може да се осъществи сравнително лесно,
дори и ако тя изисква някаква хартия и молив, да разбера какво е този модел на битовете
защото не можете просто да изразят 0s и 1s обикновено в кода.
Не можеш да отидеш 00010 и така нататък.
>> Вие трябва да изберете след десетичната запетая или шестнадесетична или осмична или други означения.
Повечето хора са склонни да вземем шестнадесетичен просто така, че всяка цифра представлява четири бита
и можете да направите това бързо математика.
И аз ще махна с ръка в toupper, което е почти същото, то изглежда почти идентичен.
Toupper се случва да използвате или оператор, а по-скоро този човек и DF.
Какво ге? DF? Някой? >> [Ученик] 255.
255? Не 255. Това би било и сл.
Ще оставим това като малко упражнения.
Но ако отидеш от 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 и тогава това, което идва след 9?
Ние сме от десетични цифри, но в шестнадесетичен това, което идва след 9?
[Ученик]. >> Така че, а, б, в, г.
Можете да разберете от какъв модел на бита г всъщност представлява.
И ако правим по математика, ще видим, че маската, която в крайна сметка се връща, е идентичен с този.
Това е, всички 1s, и това е г. Така DF представлява тази маска. Добре.
И накрая, за да не направим нещата звук супер, супер технически,
но да предположим, ние искахме да се напише програма, която прави това.
Нека отида напред и да направи двоичен, която е програма, в един файл, наречен binary.c.
А сега нека тичаме двоичен и ми дай неотрицателно цяло число.
Нека започнем лесно и тип 0.
Това сега е програма, която отпечатва цяло число в двоичен представителство си.
Така че, ако аз играя тази игра отново и въведете само един, аз трябва да получат 32-битово представяне на един.
Ако го направя това отново с два, аз трябва да взема.
Ако го направя 7, трябва да вземем няколко 1s в края и така нататък.
Оказва се, че Споменавам това, защото с побитови операции
можете да правите нещо друго, както добре.
Можете да създадете тези маски динамично.
Обърнете внимание на този последен пример, включващ побитови операции.
Тук е първата част на кода, подкани потребителя за редица
и той настоява, че ми даде неотрицателно цяло число.
Така че това е нещо от старата школа неща.
Но тук е нещо, което е нещо интересно.
>> Как да отида за отпечатване на броя в двоичен?
За първи път от какво превъртите до каква?
Какъв е размера на вътр обикновено, най-малко в уреда? >> [Ученик] 4.
Това е 4. Така 4 * 8 е 32 - 1 е 31.
Така че, ако аз съм започват да текат от 31, която представлява, се оказва,
само концептуално, 31 малко или най-малко ред, което е този човек тук,
като има предвид, че това ще бъде бит 0.
Така че това е малко 01 ... малко 31.
И така, какво е този код?
Забележете, това за цикъл, дори и да изглежда загадъчен, е просто итерации от 31 надолу до 0. Това е всичко.
Така интересната част сега трябва да бъде в тези пет линии.
Забележете, че в този ред съм за обявяване на променлива наречена маска
да бъдат в съответствие с нашата история от тези жълти номера.
И тогава какво е това?
Това е друг побитови оператора, не сме виждали преди, най-вероятно.
Това е левия оператор промяна.
Този оператор прави това.
Тук е номер 1, и ако мога да олевяване, олевяване,
какво смятате ли, че има ефект за правене, че индивидуалната 1?
Буквално го насочва.
Така че, ако номер 1 е това, което имате в ляво и да започнете и инициализиране до 31,
това, което е, че смяташ да правиш? Това ще отнеме този номер 1 и смени 31 места тук.
И тъй като очевидно няма други цифри, стоящи зад него,
тези по подразбиране ще бъде заменен с 0s.
Така че ще започнем с номер 1, което разбира се изглежда по този начин -
и ме остави да го привлече над тук, в центъра.
И след това като ти смени нещата в ляво, този човек по същество върви по този начин.
Но веднага след като го направи, ще постъпят 0 инча
Ако го смени за втори път, тя върви по този начин, а друг ще постъпят 0 инча
>> Го смени отново и после още една 0 ще постъпят.
Така че, ако се направи това нещо на 1 << 31 места, в крайна сметка получаване маска
, което е 32 знака, най-лявата една от които е 1,
на останалата част от които са 0.
И се оказва, като освен, прехвърляне на номер на ляво по този начин
също така случайно, а понякога и удобно,
има ефект на прави това, което на този номер? >> [Ученик] удвояване.
Удвояването, защото всяка от колоните - 1s, 2s, 4s място,
8s, 16 място - ñ това са всички удвояване, като отидеш в ляво.
Или по-скоро, когато прехвърли 1s сте в крайна сметка ще удвояване на стойността на числото.
Можете да се окажете прави интересни трансформации на цифри
чрез пренасочване на всичко по този начин от правомощията на две.
Е, как става тази работа?
След това ми дава маска, това е всичко 0s, с изключение на 1 точно на мястото, аз го искам,
и след това този израз, който е откраднат от toupper.c,
просто се казва вземи числото N, че потребителят въвели в
"И" с тази маска, и какво ли ще се получи?
Вие ще получите 1, ако има едно, че маскирани място,
или започваш да се получи 0, ако няма.
И така, всичко това програмата не е ефективно, че има една линия,
и това създава маска с 1 тук, след това 1 тук, след това 1 тук,
и използва тази побитово и хитрост, за да се каже, има един малко по въвеждане на потребителя е тук?
>> Има един малко по въвеждане на потребителя е тук? И ако е така, буквално отпечатате 1, в противен отпечатате 0.
Правим това с цели числа, просто защото това е защо правим 32 бита вместо 8,
но това, което ние въведохме тогава е това побитови и това побитово ИЛИ
и това левия оператор на смени, които често не са ужасно полезни,
но се оказва, че може да бъде.
В действителност, ако ви се налага да представлява нещо като масив от Булев
тъкмо за да представи вярно или невярно, да предположим, че искаш да следите дали има или няма
една стая, пълна на 300 студенти е налице,
може да декларира масив с размер 300 на типа булев, така че да получите 300 bools
и можете да зададете да е истина, ако някой е тук и лъжа в противен случай.
Защо е това представителство в структурата, че данните неефективна?
Какво лошо за дизайна на тези данни структура, масив от 300 bools?
Какво, всъщност, е булев под предния капак?
Това също е нещо, което не могат да бъдат запознати.
Оказва се, че не е булев.
Не забравяйте, ние вид, създаден с cs50.h файл,
което от своя страна включва стандартна булев.
C е нещо тъпо, все пак, когато става въпрос за булев.
Той използва 8 бита да представлява всеки булев, което е напълно разточителство
защото очевидно, колко бита ти трябва да представлява булев? Само 1.
Така се оказва, че ако сега има възможност с побитовите оператори
да манипулират отделните битове дори в Чар, дори и в един байт,
се оказва, че може да намали памет, се изисква да представлява нещо глупаво
като че посещаемостта оформена структура на данните с фактор от 8.
Вместо да се използват осем бита да представлява вярно или невярно, може буквално да използвате един
с помощта на един байт за всеки осем ученици в клас
и превключване от 0 до 1, индивидуални бита с помощта на тези видове ниско ниво трикове.
Това сложи край на енергията. Има ли някакви въпроси относно побитовите операции?
>> Да. >> [Ученик] Има изключителна или оператор?
Да. Има изключителна или оператор, който изглежда така, ^, моркови символ,
което означава, че само първото нещо, или второто нещо, което може да бъде един за изхода, за да бъде едно.
Има също така не ~, която ще ви позволи да се обръща от 0 до 1 или обратно, както и
И има право смени оператора, >>, която е противоположна на тази, която видяхме.
Добре. Нека вземем нещата сега по-високо ниво.
Ние започнахме да говорим за текст и след това да го компресирате
и представлява текста с по-малко от битове;
малко говорихме за това как да започнете да манипулира нещата на ниво побитови.
Нека сега я увеличите обратно до 10,000 фута представителство
на по-сложни неща, като графики.
Тук имаме флага на Германия, тук имаме един от Франция.
Те могат да бъдат представени в файлови формати, които биха могли да знаят - GIF файлове, например.
Ако някога сте виждали изображение в мрежата, който завършва инча GIF,
това е обмен графичен формат.
Тези две знамена вид на се поддават на натиск
за това, което може би очевидна причина? >> Чува студент отговор]
Има много на повторение, нали?
За да изпратите флага на Германия, мисля, че това е изображението на екрана
резервно в Scratch ден.
Може да се припомни, че отделните пиксели или точки, които съставят дадено изображение.
>> Има цял ред на черни точки и друг ред на черни точки.
Има куп реда на черни точки, които бихме могли да се види дали наистина увеличени,
много обичам, когато ние увеличени в лицето на Роб в Photoshop.
Веднага след като имаме по-дълбоко и по-дълбоко и по-дълбоко в образа,
сте започнали се вижда пикселизация, всички площади, които са съставени очите му в този случай.
Една и съща сделка. Ако увеличени в доста, вие ще видите отделни точки.
Е, това е вид на отпадъци от бита.
Ако една трета от знамето е черно и 1/3 на знамето е жълто и т.н.,
защо не можем по някакъв начин да компресирате този флаг?
И дори да бъдат компресирани под френски флаг, въпреки че моделът е малко по-различно.
Оказва се, файла GIF формат е формат за компресиране без загуби,
което означава, че можете да вземете изображение като германски флаг,
можете да изхвърлите много от неговите бита, без да се жертва качеството.
Това е в контраст с нещо подобно на JPEG,
, с които повечето от нас вероятно са по-запознати.
Facebook снимки и Flickr снимки и други подобни
почти винаги се запазват като JPEG файлове, когато те се качили,
но на JPEG е загуба - загуба - формат, чрез която можете да изхвърлите бита
но също така хвърлят качество.
И ако е така да компресирате снимките си с Photoshop или да ги качите на Facebook
или да ги вземе наистина креп телефон,
знаете, че картината започва да става много размазано и пикселизирани,
и това е така, защото той е компресиран с компютър или телефон
като буквално хвърляне информация.
Но GIF е удивително в това, че той може да използва по-малко битове, отколкото може по подразбиране
, без да губи каквато и да било информация.
>> И по същество прави по следния начин.
Вместо магазин във файл, като BMP за RGB тройна черен, черен, черен, черен,
черно, черно, черно, черно, черно, черно и т.н.,
по-скоро, GIF формат ще каже, "Black"
и след това, "Повторете това 100 пъти", или нещо подобно.
"Black, повторете това 100 пъти, черни, повторете това 100 пъти ..."
"Жълтата, повторете тази 100 пъти."
И така си спомня, по същество, най-лявата пиксел
и след това кодира по някакъв начин понятието отново и отново повтарям, че пиксел.
Така GIF файлове могат да се компресират, без да губи каквато и да било информация.
Но ако трябваше да се досетите, ако това е алгоритъм, който Gifs употреба,
кои от тези флагове, макар и да изглеждат еднакви по размер,
ще бъде по-малък, когато се записва на диск като GIF? >> Студент Германия.
Германия ще бъде по-малък? Защо?
[Студентски] Защото ти го повтарят много, много пъти хоризонтално
и след това се повтаря друг път. >> Точно така.
Защото хората, които са измислили GIF просто вид на произволно реши
че повторението ще бъдат възприети хоризонтално, а не странично.
Има много по-повторение странично в германски флаг, в сравнение с френското знаме.
Така че, ако ние всъщност отвори папка на твърдия си диск, който има тези GIF файлове,
всъщност можете да видите, че германски флаг тук е 2 килобайта и френски е 4 килобайта.
Случва се да е съвпадение, че човек е два пъти по друга,
но това е в действителност случай, че френското знаме е много по-голям.
>> Въпреки, че ние говорим тук за графика, едни и същи идеи могат да кандидатстват за
не са неща като знамена, но снимки, които са малко по-сложни.
Ако правите снимка на ябълка, със сигурност има много дублиране,
така че бихме могли по някакъв начин да се помни, че по подразбиране е син фон
а не, както дясната картина подсказва,
трябва да се помни цвета на всеки един пиксел в тази картина.
Така че ние може да хвърли бита далеч там без загуба на информация.
Apple все още изглежда по същия начин.
В този пример тук, можете да видите какво се случва в един филм.
Те представляват олд-скуул филм макари като в горния образ там
имате RV шофиране покрай една къща и дърво.
И, че ван кара миналото от ляво на дясно, което очевидно не се променя?
Къщата не се случва навсякъде, и дървото не е да ходя никъде.
Единственото нещо, което се движи, е ван в този случай.
Така че, като фон Непроменен подсказва, какво можете да направите във филмите
по подобен начин е просто да изхвърлите информация, която не се променя между кадрите.
Това обикновено е известен като компресия interframe
, чрез който ако тази рамка изглежда почти идентичен с този,
нека не се притеснява съхраняване на диск на идентична информация
на тези междинни кадри, нека да използвате ключови кадри само от време на време
че всъщност съхраняване на тази информация досадно като малко здрав разум проверите.
>> От друга страна, друг подход за компресиране на видео е в тази секунда и по-ниско пример тук,
отколкото магазин 30 кадъра, защо не просто да съхранява до 15 кадъра в секунда, а?
Вместо филм вид на течаща прекрасно, перфектно,
тя може да изглежда, като че ли е заекването малко, малко по-старото училище,
но нетният ефект ще бъде да се използва много по-малко битове, отколкото иначе биха могли да се окажат необходими.
Така, откъде идва това ни остави?
Това беше малко настрана от къде другаде можете да отидете с компресия.
За повече информация по този въпрос, да вземе клас като CS175 тук.
Ето още един пример в рамките на видео.
Ако пчелата е единственото нещо, което се движи,
наистина можете да изхвърлите информация в тези средни рамки
защото цветето и небето и листа, които не се променят.
Но нека сега разгледаме едно последно нещо.
В следващите 5 минути ние ще оставим C зад завинаги в лекция? Да. Не в psets, все пак.
Последно история за C и след това да стигнем до много секси неща
участието на HTML и уеб и уо-хо. Добре.
Ето ни. Това е мотивацията.
Оказва се, през цялото това време, когато ние сме били писане на програми, които се изпълняват звъня.
И звъня, казахме, тъй като първата седмица почти, взема изходния код
и го преобразува в обектен код.
Това отнема C и я превръща в 0s и 1s.
Съм вид лъжа в продължение на няколко седмици, тъй като тя не е чак толкова просто като това.
>> Има много по-става под капака, когато стартирате програма като звъня.
В действителност, процесът на съставянето на програмата, наистина може да се обобщи
, тъй като можете да си спомните от видео Роб върху компилатори,
в тези четири стъпки: предварителна обработка, самото съставяне, монтаж и свързване.
Но ние в клас и повечето хора в света обикновено се обобщи всички тези стъпки
просто като "компилиране.
Но ако започнем с изходния код като този, припомни, това е може би най-простият C програма
сме написали до този момент, припомни, че когато са съставени в крайна сметка изглеждам така.
Но всъщност е междинна стъпка, и тези стъпки са както следва.
На първо място е това нещо в самото начало на този и повечето от нашите програми,
# Включват
Какво # включват направи за нас?
Почти копия и пасти съдържанието на stdio.h в досието ми, така че защо?
Защо да ми пука за съдържанието на stdio.h? Какво има там на интереси?
ФОРМАТ декларация, негов прототип, така че компилаторът знае какво имам предвид
когато спомена тази функция ФОРМАТ.
Така стъпка 1 при съставянето на предварителна обработка, при която програма като звъня
или някаква помощна програма, която звъня идва с чете вашия код горе до долу,
ляво на дясно, и всеки път, когато го вижда # символ, последван от ключова дума, като включват,
той извършва тази операция, копиране и вмъкване в този случай stdio.h във Вашия файл.
Това е стъпка 1.
След това имате много по-голям файл, защото на огромно копие, паста работа, която просто се случи.
>> Стъпка 2 сега е компилиране.
Но се оказва, съставянето отнема изходен код, който изглежда по този начин
и тя се превръща в нещо, което прилича на това,
които за тези, запознати се нарича? >> Студент събрание. >> Събрание език.
Това всъщност е нещо, ако сте приели CS61 ще се потопите в по-подробно.
Това е точно толкова близо, колкото можете да получите за писане 0s и 1s себе си
но писането на нещата по такъв начин, че все още прави поне малко смисъл.
Това са машинни инструкции, и ако ние превъртете надолу до основната функция,
забележите, че има този натиск инструкция, преместете инструктаж, изважда инструкция,
обадете инструкция, и така нататък.
Когато чуете, че компютърът ви е Intel Inside,
имате CPU Intel във вашия Mac или PC, какво означава това?
CPU идва построен от компании като Intel разбиране на определени инструкции.
Те нямат представа какви са функции като суап или основната сам по себе си,
но те знаят това, което много ниско ниво инструкции като добави, изваждане, бута,
се движат, обадете се, и така нататък.
Така че, когато компилирате C код в асемблер,
много удобен за потребителя изглеждащ код се превръща в нещо, което прилича на това,
, които буквално се движи байта или 4 байта около в такива малки единици и на процесора.
Но накрая, когато звъня е готова да предприеме тази представяне на програмата си
в 0s и 1s, а след това се случи стъпка сглобяване,
и отново всичко се случва в миг на око, при движение звъня.
Ние започваме тук, да подава файл, като това, и след това го превръща в тези 0s и 1s.
А ако искате да се върнете в някакъв момент и действително да видим това в действие,
ако отида в hello1.c-това е една от първите програми, ще погледна -
обикновено бихме съставят с звъня hello1.c и това ще ни даде a.out.
Ако за разлика от теб, вместо да го дам-S знаме, което ще получите е hello1.s
и ще видите асемблер.
>> Правя това за много кратко програма, но ако се върнем за Scramble
или да възстанови или някоя програма, което сте написали и просто от любопитство
искате да видите какво всъщност изглежда, какво всъщност се хранят в процесора,
можете да използвате, че S знаме с звъня.
Но тогава накрая, има още едно нещо, за което.
Тук са 0s и 1s, които представляват изпълнението ми на Здравей, свят.
Но аз използваната функция на някой друг в моята програма.
Така че, въпреки че този процес е да взема hello.c,
той получава съставени в код събрание, и той ще се сглобяват в 0s и 1s,
само 0s и 1s, които са изведени в този момент във времето
са тези, които са резултат от моя код.
Но човекът, който е написал ФОРМАТ, те съставила своя код преди 20 години
и това е вече инсталиран някъде на уреда,
така че ние трябва по някакъв начин да се слеят си 0s и 1s с 0s и 1s,
и това ни води към 4-та и последната стъпка от съставянето, известен като свързване.
Така че на лявата страна имаме точно същата картина, както и преди:
hello.c става събрание код става 0s и 1s.
Но припомни, че използва стандартната I / O библиотека в моя код,
и това означава, че някъде в компютъра има файл, наречен stdio.c
или най-малко събраната версия от него, защото някой преди няколко години
съставен stdio.c събрание код и след това цял куп 0s и 1s.
Това е, което е известно като статична или динамична библиотека.
Това е някакъв файл, седи някъде в уреда.
>> Но накрая, аз трябва да си взема 0s и 1s и това лице 0s и 1s
и по някакъв начин ги свързват заедно, буквално се комбинират тези 0s и 1s
в един-единствен файл, наречен a.out или hello1 или каквото се обадих на моя програма
, така че крайният резултат да има всички 1s и 0s, които трябва да съставят програмата ми.
Така че през цялото това време този семестър, когато сте използвали звъня
и дори по-скоро работи прави, за да тече звъня,
всички тези стъпки се случва нещо мигновено, но много внимателно.
И така, ако продължават по компютърни науки, а именно CS61,
това е слоят, че ще продължи да кори обратно от там
говорим за ефективност, сигурността последици, подобни на тези по-ниски детайли ниво.
Но с това, ние сме на път да напусне C зад.
Да вървим напред и ни вземат 5-минутна почивка,
и когато се върнем в интернет.
Добре. Ние сме обратно.
Сега ние започваме нашия поглед не само в HTML, защото, както ще видим,
HTML сама по себе си е всъщност доста проста
но наистина уеб програмиране, изграждане на мрежи в по-общ план,
и как всички тези технологии се събират
да ни позволи да създадем много по-сложни програми на върха на интернет
от този момент ние сме били в състояние в тези черни и бели прозорци.
Всъщност, в този момент в семестър, въпреки че ние ще прекара сравнително по-малко време
PHP, HTML, CSS, JavaScript, SQL и повече,
повечето студенти се окажете прави окончателни проекти, които са уеб-базирани
защото, както ще видите, на фона сега в C
е много приложим към тези по-високо ниво език.
>> И като започнете да мислите за своя окончателен проект,
, които много прилича Проблем Set 0, където сте били насърчавани
да се направи почти всичко от интерес за вас Scratch
окончателния проект е вашата възможност да споделяш знания и разбирам с C
или PHP или JavaScript или нещо подобно за въртене
и да създадете свой собствен парче от софтуер, за света, за да се види.
И да ви семена с идеи, знаете, че можете да се отправите тук, projects.cs50.net.
Всяка година ние склоняването идеи от преподаватели и служители и студентски групи на територията на колежа
само за да представят своите идеи за интересни неща, които биха могли да бъдат решени с помощта на компютри,
използвате уеб сайтове, чрез използване на софтуер.
Така че, ако сте се борят да излезе с една идея на собствения си,
по всякакъв начин да преминете през тези идеи от тази година и миналата.
Това е съвършено добре да се справи с проект, който е разгледан преди.
Виждали сме много приложения за разглеждане на статута на прането на територията на колежа,
много приложения за навигация в менюто за трапезарията,
много приложения за навигация каталог на курсовете и други подобни.
И наистина, в бъдеще лекция и в бъдещи семинари,
ние ще ви запозная с някои публично достъпни APIs, както предлагат на пазара
както и тук на разположение от CS50 на територията на колежа, така че да имат достъп до данните
и след това могат да правят интересни неща с него.
Така че повече относно окончателните проекти в рамките на няколко дни, когато ние пускаме спецификацията,
но за сега, знаете, че можете да работите соло или с един или двама приятели
по-голямата всеки проект от интерес за вас.
Интернет.
Ти върви напред и извади лаптопа си, да отидете на facebook.com за първи път,
които не са влезли в наскоро, и натиснете Enter. Какво точно се случва?
>> Когато натиснете Enter на вашия компютър, цял куп от стъпки
започне нещо като магически случва.
Така че тук от ляво, уеб сървър като Facebook е тук, в дясно,
и някак използвате този език, наречен HTTP, Hypertext Transfer Protocol.
HTTP не е език за програмиране. Това е повече протокол.
Това е набор от конвенции, уеб браузъри и уеб сървъри използват, когато вътрешен.
И какво означава това е, както следва:
Голяма както в реалния свят, ние имаме тези конвенции
където, ако отговарят на някои човек за първи път, ако нямате нищо против да ме humoring тук,
Може да дойда до вас, да речем, "Здравейте, моето име е Дейвид. >> Здравей, Дейвид. Моето име е Сами.
"Здравейте, Дейвид. Моето име е Сами."
Така че сега ние току-що са ангажирани в този вид глупаво човешко протокол
където съм започнала протокол, Сами е отговорил,
сме здрависал и сделката е завършена.
HTTP е много подобен по дух.
Когато вашите искания уеб браузъра www.facebook.com
това, което е наистина прави вашия браузър разширява своята страна, така да се каже,
към сървъра и да го изпратите съобщение.
И това послание е обикновено нещо подобно се - какво искате да получите -
ме на началната страница, която обикновено се обозначава с една наклонена черта в края на URL.
И само да знаеш какъв език говоря, браузъра ще ви кажа
че аз говоря HTTP версия 1.1,
А също и за добра мярка, аз ще ви кажа, че хостът, че искам началната страница на
е facebook.com.
Обикновено, уеб браузър, без знанието на човека,
изпраща това съобщение в интернет, когато просто въведете www.facebook.com,
>> Въведете във вашия браузър.
И какво означава Facebook отговори?
Той реагира с някои подобни изглеждащи загадъчни подробности, но също така и още много други.
Нека вървим напред към началната страница на Facebook.
Това е екран, който вероятно никога повечето от нас Ако останеш влезете в профила си през цялото време,
но това наистина е началната страница.
Ако правим това в Chrome, забележите, че можете да дръпнете тези малки контекстни менюта.
С помощта на Chrome, Mac OS, Windows, Linux, или нещо подобно,
Ако можете да контролирате клик или ляв клик, обикновено можете да дръпнете меню, което прилича на това,
където се очакват няколко възможности, една от които е View Page Source.
Можете също така обикновено се стигне до тези неща, като отидете на менюто "Изглед" и ровя.
Например, тук под View, Проект е едно и също нещо.
Отивам да вървим напред и да разгледаме Преглед на изходния код на страницата.
Това, което ще видите, е HTML, че Марк е написана, за да представляват facebook.com.
Това е пълна каша тук, но ще видим, че това прави малко повече смисъл, не след дълго.
Но има някои модели тук. Нека превъртете надолу до неща като това.
Това е трудно за един човек да чете, но забележите, че има този модел на ъглови скоби
с ключови думи като опция, ключови думи като стойност, някои низове в кавички.
Това е мястото, където, когато сте се регистрирали за първи път, е посочено каква е вашата година на раждане.
Това падащото меню на раждане година по някакъв начин е кодирана тук
в този език, наречен HTML, Hypertext Markup Language.
С други думи, когато вашия браузър поиска дадена уеб страница,
говори тази конвенция, наречен HTTP.
Но какво означава facebook.com отговарят на това искане?
>> Отговаря с някои от тези шифрограми, както ще видим след малко.
Но по-голямата част от отговора си под формата на HTML, Hypertext Markup Language.
Това е действителната езика, на който е написан уеб страница.
И какво уеб браузър наистина тогава е при получаване на нещо, което прилича на това,
чете отгоре надолу, отляво надясно, и по всяко време тя вижда един от тези ъглови скоби
последвано от ключова дума, като опция, той показва, че Markup Language по подходящ начин.
В този случай, тя ще покаже падащото меню на година.
Но отново, това е пълна каша, да погледнете.
Това не е така, защото разработчиците на Facebook прояви 0 за 5 стил, например.
Това е така, защото повечето от кода, който те пишат е, всъщност, написана красиво,
и коментира, добре разчленен, и други подобни,
но разбира машини, компютри, браузъри наистина не им пука
дали кода е добре оформена.
И в действителност, това е напълно разточителство да натиснете клавиша Tab всички онези моменти
и да постави коментари през цялата кода си и да изберат наистина описателни имена на променливи
защото, ако браузъра не се интересува, всичко, което правим в края на деня се губи байта.
>> Така се оказва, това, което повечето сайтове е, макар че изходния код за facebook.com,
cs50.net и всички тези други уебсайтове в интернет
обикновено са добре написани и коментирани и добре разчленена и други подобни,
обикновено преди сайт е в Интернет, кодът се minified,
чрез HTML и CSS - нещо друго, което скоро ще видите -
JavaScript код, ние скоро ще видите, е компресиран,
която дълги имена на променливи стават X и Y и Z,
и на това празно пространство, което прави всичко изглежда толкова четене се изхвърля,
защото, ако мислите за това по този начин, Facebook получава един милиард страница удари ден -
нещо лудо като това - какво би станало, ако един програмист само за да бъде анален
удари бар пространство допълнително време, само за да тире някакъв ред на кода все така много повече?
Какъв е изводът, ако Facebook запазва празно
във всички байта те изпращат хора в Интернет?
Натискането на бар пространство, след като дава допълнително байт във вашия файл.
И ако един милиард души, след което се процедира, за да изтеглите начална страница, която ден,
колко повече данни са предадени по Интернет?
Гигабайт без основателна причина.
И се отпуска, за много сайтове това не е такъв мащабируема въпрос,
но за Facebook, Google, за някои от най-популярните сайтове
има голям стимул да направи финансово код изглежда бъркотия
така че, който използвате за няколко байта, като е възможно в допълнение след това да го компресирате
нещо като цип, алгоритъм, наречен компресия,
че браузърът автоматично прави за вас. Но това е ужасно.
Ние никога няма да научат нищо за уебсайтове на други хора и как да проектирате уеб страници
ако трябва да гледам на него като тази.
>> Така че, за щастие, браузъри като Chrome и IE и Firefox тези дни
обикновено идват с вградени инструменти за разработчици.
В действителност, ако сляза тук, за да инспектира елемент или ако отида Изглед, разработчици,
и отидете на Инструменти за разработчици изрично,
сега се появи този прозорец в долната част на екрана си.
Това е малко смущаваща на първо, защото тук има много на непознати раздели,
но ако кликнете върху елементи по целия път в долния ляв,
Chrome очевидно е доста умен. Той знае как да тълкува всичко на този кодекс.
И така, какво Chrome е почиства всички HTML Facebook.
Въпреки че там не е празно там, не е вдлъбнатина там,
забележите, че вече може да започне да се движите тази уеб страница по-йерархично.
Оказва се, че всяка уеб страница, написана на език, наречен HTML5 трябва да започне с това,
тази DOCTYPE декларация, така да се каже: <! DOCTYPE HTML>
Това е нещо на светлина и сив там, но това е най-горния ред код в този файл,
и че просто казва на браузъра, "Хей, тук идва някои HTML5. Тук идва уеб страница".
Първият отворен скоба отвъд, че се случва да бъде това нещо, отворена скоба HTML тагове,
и след това, ако се гмурна още по-дълбоко - тези стрелки са напълно безсмислени;
те са просто заради презентацията, те не са всъщност в досието -
забележите, че вътрешността на HTML тагове Facebook, нещо, което започва с отворена скоба
и след това има една дума се нарича таг.
Вътре етикет на HTML е очевидно главата етикет и етикет на тялото.
Вътре в главата маркер сега е цялата бъркотия за Facebook
защото те имат много на метаданни и други неща за маркетинг и реклама.
>> Но ако ние превъртете надолу, надолу, надолу, надолу, нека да видим къде е. Ето го.
Това е поне малко по-запознати.
Заглавието на началната страница на Facebook, ако някога ви се погледнете в раздела в заглавната лента,
Добре дошли в Facebook Вход Вход или да научат повече.
Това е това, което ще видите в заглавната лента на Chrome,
и това е начина, по който е представена в кода.
Ако пренебрегнем всичко останало в главата, повечето от смелостта на уеб страница в тялото,
и се оказва, че ще изглежда по-сложен код Facebook
от повечето неща, които първоначално ще пиша, само защото тя е била построена през годините,
но има един куп скрипт тагове, JavaScript код,
, което прави много интерактивен уебсайт:
виждат статуси мигновено с помощта на езици като JavaScript.
Има нещо, наречено дивизия, която е подразделение на страницата.
Но преди да стигнем до тази подробност, нека се опитаме да я увеличите
и погледнете по-опростена версия на Facebook 1.0, така да се каже.
Тук е Здравей, свят на уеб страници.
Тя е, че DOCTYPE декларация на самия връх
, което е малко по-различна от всичко останало.
Нищо друго не пишем в уеб страница ще започне с <! с изключение на тази линия има
и с изключение на нещо, наречено коментари в HTML.
Но за по-голямата си част, всичко в една уеб страница е отворена скоба, ключова дума, в близост скоба.
>> В този случай можете да видите най-простите на уеб страници възможни.
HTML тагове съдържа глава етикет и съдържа орган маркер,
но забележите, че има тази идея за пускане и спиране на тагове.
Това е началото тагове за HTML, това е тясно тагове или краен маркер.
Забележете, че те са нещо на противоположностите, в смисъл, че затварящия етикет или етикет на края
това наклонена черта вътре в себе си.
В същото време, има отварящия таг на главата и затварящия етикет на главата тук.
>> Има открита заглавие и затварящия етикет заглавие тук.
Фактът, че съм поставил заглавието на една линия, чисто произволно.
Тя просто изглеждаше като тя би се вписал добре на един ред, така че не се притеснява да удря въведете няколко пъти.
Междувременно, тялото, което направих, тире, само за да бъде все така ясен.
Забележете, че HTML е доста тъп език.
В действителност, в деня преди имаше WYSIWYG редактори
и Microsoft Word, където може да се каже: "Направи това смело, правят този курсив"
вие всъщност ще въведете малки команди в есетата на 20 + години
с което бихте казали "Започнете да правите този текст получер Спрете този текст получер".
"Започнете да правите този текст курсив. Спрете да прави този текст курсив.
>> Ето какво е HTML или какъвто и да е език за маркиране.
Тази първа етикет казва: "Хей, браузър. Тук идва малко HTML.
Следващата етикет казва: "Хей, браузър. Тук идва на главата, заглавието на моята уеб страница".
"Хей, браузър. Тук идва титлата."
И тогава тук, "Хей, браузър Това е за титлата."
Така че това е, как браузърът знае, да не се показва повече знаци, отколкото Здравейте, света
в заглавната лента.
В същото време, това се казва, "Това е за главата."
Това казва: "Тук идва тялото Ето самото тяло." - Буквално думите Здравей, свят.
И това казва тук, "Това е за тялото. Това е за HTML.
Така че браузърите са доста тъп.
Те току-що прочетох тези неща горе до долу, от ляво на дясно, и правя точно това, което им се казва да се направи.
Нека тук всъщност малък пример.
Нека ме отвори най-простият от програми на моя Mac, а именно TextEdit.
На Windows, можете да използвате notepad.exe.
Но това е всичко, което трябва да започнете да печелите уеб страници.
Отивам да вървим напред и просто да копирате и поставите този код в този файл.
Отивам да вървим напред и да го запишете на компютъра си,
и аз ще да запазите този hello.html,
и сега е кръстен файл hello.html.
Ето това е на десктопа си.
Да отида в браузъра и изтеглете файла в браузъра.
И готово, тук е моят първи уеб страница.
Забележете, че заглавието на раздела е здравей, свят по заглавието,
и забележете, че Здравей, свят е тялото на моята уеб страница,
уо-хо, аз съм в интернет.
>> Аз наистина не съм, нали, защото този файл не е в интернет.
Това се случва да бъде на местно моя твърд диск в този конкретен път.
Но идеята е същата. Всичко, което сега трябва е уеб сървър, към която да го качите.
Но първо нека действително се въведе малко по-голяма сложност и малко повече стилизация.
Това е прост, ако е скучно, уеб страница.
Оказва се, че и други видове етикети, които можем да използваме.
Например, тук в жълто въведохме два нови етикети.
Ние няма да играят много с тези днес, но забележите, че връзката маркер
някак си изглежда по-различно от всичко останало.
Връзката маркер отнема това, което се наричат ​​атрибути,
и атрибут е нещо, което променя поведението на етикет.
В този случай това не е най-добрият избор на имена, връзка, защото това е нещо безсмислено,
но тази връзка етикет казва по същество, включва файл наречена styles.css вътрешността на моята уеб страница.
Можете да мислите за направи аналогия с C # включват директива.
Styles.css се позовава на съвсем различен език, че няма да играят с днес,
но това е за естетика: размери на шрифтове, цветове, подплънки, отстъпите, маржове,
и всичко на този вид естетика на детайлност.
Междувременно маркера на скрипта е функционално сходни,
а по-скоро, отколкото са CSS, този език, той включва друг език, JavaScript.
С други думи, с тези две тагове в крайна сметка ще бъде в състояние да напиша собствена уеб страница
но също така и издърпайте код, който аз или някой друг е написал
, така че да може да стои на раменете на другите хора, ние можем да практикуват добър дизайн,
факторинг от общ кодекс.
Ако имам 10 различни уеб страници, това означава, че някои от моите естетика
могат да бъдат отразени, като много прилича # включват в отделен файл.
Така че ние сме стигнат до там.
Но нека всъщност първо правя нещо по-интересно с този файл.
>> Отново, това е просто TextEdit. Аз не съм технически в интернет все още, но ние ще стигнем до там.
Аз бих искал да направя Здравей, свят малко по-смели, отколкото е.
Така че, здравей, нека да каже произволно за смели.
Отново, историята е една и съща: Здравейте, запетая, започнете да правите това смело,
тогава светът става отпечатана с удебелен шрифт, а това означава спре да печата с удебелен шрифт.
Позволете ми да отида напред и да запишете файла ми, за да се върнете към Chrome, ще се увеличат само за да можем да го видя по-добре,
и презареди, и ще видите, че светът сега е с удебелен шрифт.
Уеб е всичко за хипервръзки, така че нека да вървим напред и да направите това:
любимият ми сайт е, да речем, youtube.com.
Запиши, презареди. Добре. Има няколко проблеми в момента, освен hideousness на сайта.
1, аз съм сигурен, че аз удари Въведете тук. И аз го направих.
Засегнати не само Enter, аз също отстъп, практикуват това, което проповядват за стил,
но ми е в непосредствена близост до света.
Така че, защо е това? Браузъри само това, което ви казвам тях да направят.
Не съм казал на браузъра, "Break линии тук Поставете абзац тук."
Така браузъра, това няма значение, ако аз хит Върни 30 пъти,
тя все още ще да си сложа в непосредствена близост до световно.
Това, което наистина трябва да се направи тук е да се каже нещо като , вмъкнете нов ред.
>> И действително, нов ред е вид странно нещо
, защото наистина не може да започне да се движи в друга линия, а след това направи нещо,
и след това да спрат да се движат на нов ред. Това е вид на атомна операция.
Или го направи, или не. Удари Въведете или не.
Така ДВУСТАЕН е малко по-различен маркер, така че аз трябва да сортирате както на открито и го затворете
всички наведнъж.
Синтаксисът за това е това.
Технически, бихте могли да направите нещо подобно в някои версии на HTML,
но това е просто глупаво, защото няма причина да се започне и да се спре нещо
ако може вместо това да направи всичко наведнъж.
Осъзнайте, че HTML5 не изискват това стриктно наклонена черта,
така че ще видите учебници и онлайн ресурси, които не разполагат с него,
но за добра мярка да практикуват симетрия, която сме виждали до този момент.
Това означава, че етикет е едновременно отваря и затваря.
Така че сега, нека ме спаси моето досие, се върна тук.
Добре, така че започва да изглежда по-добре, с изключение на уеб Знам вид кликване,
и все пак YouTube тук изглежда не води до нищо.
Това е така, защото дори и да изглежда като връзка, браузърът не знае, че сам по себе си,
така че трябва да каже на браузъра, че това е връзка.
>> Начин да направите това е да се използва етикет за котва:
<A HREF за хипер база, което е по стария начин училище каже връзка,
= "Http://www.youtube.com">
и ме остави да се премести на нов ред просто така, че е малко по-разбираеми,
и аз ще се свие размера на шрифта.
Съм направил? Има ще бъде тази дихотомия.
Този таг, котва маркер, наистина взема атрибут,
, което променя поведението си, и стойността на този атрибут е очевидно URL на YouTube.
Но забележете дихотомия е, че само защото това е URL, ти започваш да се
това не означава, че трябва да бъде дума, която сте подчертаване и връзка.
Напротив, това може да бъде нещо подобно.
Така че аз трябва да кажа да спреш тази дума хипервръзка чрез използване на затварящия етикет котва.
Забележете, аз не правя това.
1, това ще бъде само губене на времето на всички и не е необходимо.
>> За да затворите етикет, можете само да спомена името на етикет.
Вие не говорим за някой от атрибутите.
Така че нека с изключение на това, че се върна. Добре, готово, сега е синьо и хипервръзка.
Ако щракнете върху него, аз всъщност отидете в YouTube.
Така че дори и моята уеб страница не е в Интернет, той е най-малко HTML,
и ако оставим Интернет настигне, ние всъщност ще свърши тук, в youtube.com.
И аз мога да се върна и тук е моята уеб страница. Но забележете това.
Ако някога сте придобили спам или фишинг атака,
сега имате възможност след само пет минути, за да направи същото.
Да отидете тук и да направим нещо като www.badguy.com
или каквото и непълни сайт е, и тогава може да се каже потвърдите вашата PayPal сметка.
[Смях] И сега това е да отида да badguy.com, което аз няма да кликнете върху
защото нямам представа къде води. [Смях]
>> Но сега имаме възможността да свърши там.
Така че ние сме наистина едва сега започват да надраскат повърхността.
Ние не сме програмиране сама по себе си, пишем език за маркиране.
Но веднага след като около нашия речник в HTML,
ще представим PHP, действително език за програмиране
която ще ни позволи да генерира HTML автоматично генерира CSS автоматично,
, така че можем да започнем в сряда за изпълнение, да речем,
собствена търсачка и др.
Но повече, че в няколко дни. Ще се видим тогава.
>> [CS50.TV]