[Powered by Google Translate] [Неделя 7]
[David J. Малан - Гарвардский университет]
[Это CS50. - CS50.TV]
Хорошо. Добро пожаловать обратно. Это CS50, и это начало недели 7.
Два маленьких объявления:
Pset5 В настоящее время ведется или скоро будет,
и позвольте мне сказать, честно говоря, это, как правило, среди более сложной
задачи курса наборов, поэтому позвольте мне говорить об этом сейчас
так что на этой неделе больше, чем когда-либо вы не ждите, пока, скажем, в среду вечером
или в четверг ночью, чтобы погрузиться дюйма
Это, безусловно, интересная PSET. Мы считаем, что это весело.
Если вы действительно получите его полностью правильным и может бросить вызов так называемого Большого совета,
Вы будете иметь возможность соревноваться с некоторыми сотрудниками курса
и некоторые из ваших одноклассников.
Что Большого Совета является один раз у вас есть для проверки орфографии работы,
Вы будете в состоянии пойти в cs50.net после запуска команды,
чисто отказаться, и затем количество времени и объем оперативной памяти и более
, которые вы использовали в своей реализации будут выставлены здесь, на домашней странице курса.
Вы заметите, что целая куча этих людей здесь указаны в качестве сотрудников
так как в минувшие выходные, сотрудники думали, что это было бы интересно стараются перещеголять друг друга.
Так понимаю, что цель здесь не превзойти персонала.
Даже я только здесь, под номером 13.
Чисто выбрать в, но это возможность увидеть, как мало оперативной памяти
и как мало процессора секунд вы можете использовать VIS-A-VIS некоторые из ваших одноклассников.
>> И я признаю, что Kevin Michael Schmid,
В настоящее время номер 1 позицию как одного из ТФ,
Это реализация, которую мы называем не представляется возможным
учитывая, что он использует почти 0 оперативной памяти и почти 0 секунд для загрузки.
Таким образом, мы будем заботиться о форуме Кевин. [Смех]
Есть определенные навыки, Кевин ставит на тест здесь.
Одна из вещей, мы думали, что делать тоже сейчас CS50x является неделе в прогресс,
и вы, ребята, такая же часть этого эксперимента, как те студенты.
Мы спросили их, как часть их pset0, который был так же представить проект к царапинам
представляющим интерес для них - игра, интерактивные произведения искусства, анимации и т.п. -
1 - 2-минутное видео, если они хотели бы, чтобы поздороваться с миром и кто они на самом деле.
Я думал, что я поделюсь с вами всего несколько видео, которые были представлены до сих пор
потому что для нас, в штабе по крайней мере, это действительно была захватывающей
и вдохновляющим, чтобы увидеть этих людей со всего мира - стран по всему миру -
настройке на, всех вещей, на курс информатики в Интернете,
является ли это потому, что они хотят продолжить свое образование,
они хотят взять свою карьеру в новом направлении,
они хотят, чтобы заполнить пробелы в своих знаниях,
поэтому некоторые из тем же причинам, что вы, ребята, возможно, были здесь.
>> Поэтому я приведу вам один такой студент здесь. Вы можете увеличить громкость только немного.
Вот один из 1-минутный наших студентов представлений.
Здравствуй, мир. Я студент промышленного строительства здесь, в Малаге, Испания.
Я очень рад этой онлайн-курс, потому что я люблю информатику, я действительно делаю,
и я действительно ценю, что я получаю, чтобы изучить ее.
И то, что я могу научиться же все вы, ребята,
но вместо того, чтобы в Гарварде я в Малаге, каким удивительным является то, что?
Ну, я Фернандо, и это CS50. См. вас, ребята.
[Смех] Другой клип нам особенно нравится, вы обнаружите, что английское этого господина не так сильно.
Похоже, он его машина переводится, таким образом, переводы сами немного несовершенным,
но это было одним из наших любимых до сих пор, а также.
[♪ ♪]
Здравствуй, мир. [Говорит по-японски]
[Я должен приветствовать на японском языке, потому что мой английский очень ненадежно.]
[Я передал послание к вам из города Гифу, Япония.]
[Я могу быть студентом в первый раз в 20 лет, как это можно видеть.]
[Я очень благодарна Гарвардского университета, который дал мне эту возможность и EDX.]
[Гольф-гитара и моя любимая вещь работает.] [Смех]
[♪ ♪]
[Почему вы думаете, что я пытался принять участие в cs50x.]
[Гарвардского университета, это моя тоска.]
[Особенно, если я далекого присутствия жил в Японии.]
[Я хотел попробовать сразу знают о существовании таких EDX, когда.]
[Не кажется ли вам, чтобы вы не связано с возрастом обучения I.]
[CS50 моя тоска. Меня зовут Kazu, и это CS50.]
[♪ ♪] [аплодисменты и крики]
Другая любимая наша была здесь это представление от кого-то.
[♪ ♪] [Малан] Google, если вы не знакомы с этим мемом.
>> И тогда, наконец, несколько других, которые получили отвечал, что, возможно, выиграть очаровательны награду.
[Студентов] Ой! >> [Малан] Мы должны слушать. Это короткий, так что слушайте внимательно.
[Женщиной-спикером] Как тебя зовут? >> Луи.
[Женщиной-спикером] Что это? >> [Смех] CS50. [Смех]
[Малан] Он двух дублей, однако.
Здесь мы идем, последний.
Меня зовут Луи, и это CS50.
[Смеется] В этом и состоит CS50x.
Спасибо всем тем из вас, следуя вдоль дома
, которые были причащении до сих пор.
Сегодня мы заканчиваем обсуждение структур данных,
по крайней мере некоторые из наиболее фундаментальных,
а потом мы продолжим наш разговор о HTML и веб-программирования.
Действительно, мы провели последние семь недель некоторые, глядя на основы программирования -
алгоритмы, структуры данных и т.п. -
и C, как вы, возможно, испытали до сих пор,
не обязательно является наиболее доступных языков
с которым для реализации некоторых из этих идей.
И так начиная с этой недели и на следующей неделе, а затем следующий,
мы, наконец, быть в состоянии перехода от С, который, как известно, довольно низкого уровня языка,
к вещам более высокого уровня, в том числе PHP, JavaScript, и тому подобное,
что мы увидим опираться на те же уроки, что мы узнали за последние несколько недель,
но вы увидите, что объявление вещей, как массивы и хэш-таблицы и поиск и сортировка
стало гораздо легче, потому что сами языки, мы начнем использования
будет становиться все более мощными.
Но, во-первых, применение деревьев.
Это очень часто в эти дни нужно сжать информацию.
В каком контексте вы хотите сжать некоторые виды цифровой информации?
>> Да. >> [Студент] Если вам нужно, чтобы отправить его через Интернет.
Да, когда вы хотите отправить что-то через Интернет.
Если вы хотите скачать большой файл, он идеально подходит, если кто-то на другом конце
сжал, что файл, используя формат ZIP или что-то вроде того
так что вы посылаете меньше бит, чем могли бы быть переданы.
Итак, как вы сжимать информацию?
Это все сводится к использованию меньшего количества битов, чем требуется по умолчанию.
Но это вроде любопытно, потому что вспомните недель 0 и 1
когда мы говорили о ASCII и бинарные и мы говорили о ASCII, в частности,
как с помощью 8 бит для представления буквы алфавита
так что буква представлена ​​65, нижний регистр число 97,
и тем не менее вы представляете 65 или 97, вы используете 7 или 8 бит.
Но загвоздка в том, что некоторые буквы в английском алфавите
, которые не так популярны, как другие.
Z не все, что популярно, Q не все, что популярно, но А и Е являются супер популярным.
И тем не менее за все эти письма, по умолчанию мире использует такое же количество битов, всего в 8.
Таким образом, не было ли бы умнее, если бы вместо 8 бит для каждого письма,
даже самые редко используемые как Q и ​​Z,
что, если мы использовали меньше бит для А и Е и S и самых популярных букв
и используется больше битов для менее популярных буквы,
Идея в том, оптимизировать давайте для общего случая,
, которая является темой в области компьютерной науки в попытке оптимизировать то, что случится самое
и потратить еще немного времени, немного больше пространства на то, что, да, может произойти
но не обязательно так часто.
Итак, давайте рассмотрим пример.
>> Предположим, что мы хотим, чтобы кодировать информацию достаточно эффективно.
Вы, возможно, выросли зная кое-что о азбуки Морзе,
и вполне вероятно, вы не знаете, фактический код,
но вы, возможно, помните, что это по крайней мере в этой серии точек и тире.
Это довольно эффективное кодирование, и заметили, что самые популярные буквы - например, E -
использует кратчайшие звуковых сигналов.
Азбука Морзе это все о бип-бип-бип-бип-бип-бип и проведение тонах
либо в течение короткого периода времени или длительных периодов времени.
E, так как обозначается точкой, это супер короткий звуковой сигнал, только звуковой сигнал, и что будет представлять E.
В отличие от T будет больше звуковой сигнал, как сигнал [продлевает звук]
и что будет представлять T.
Но это все еще довольно короткой, потому что, наоборот, если вы посмотрите на Z,
чтобы выразить Z вы пойдете бип, бип [больше звука], бип, бип [короткий звук].
Так что это больше, потому что это менее распространено.
Но Гоча здесь является то, что код Морзе немного недостатков
в том, что это не сразу проигрываться.
Например, предположим, что вы слышите на некоторые конце провода звуковой сигнал [короткий], звуковой сигнал [долго].
Какое сообщение я только что получил? Точки и тире. Что это представляете?
[Студент] A. >> [Малан] Может быть.
Это также может быть E последующим T.
Иными словами, азбука Морзе, хотя он использует этот принцип оптимизации угла случае,
оно не поддается непосредственной Декодируемости.
То есть, человек, который слышит или получения этих точек и тире
должен каким-то образом выяснить, где разрывы между буквами,
потому что, если вы не знаете, где эти перерывы, вы можете смешивать для ET или наоборот.
>> Так что же вы делаете? В азбуке Морзе можно просто пауза между каждой из букв.
Но останавливаясь это своего рода счетчик, чтобы весь смысл ускорения вещи.
Так что, если вместо этого мы придумали код, где не было этой плохой ситуации
где E является префиксом, например, из -
Другими словами, если бы мы могли убедиться, что модели по-прежнему короткие для популярной буквы
долго для менее популярных букв, но нет никакой возможной путаницы?
Человек по имени Хаффман лет назад придумали эту схему называют кодирование Хаффмана
что на самом деле использует одну из структур данных, мы провели немного времени на разговоры о
На прошлой неделе, что деревья, бинарные деревья конкретно -
Смысл бинарное дерево, что оно имеет не более 2 детей.
Она, может быть, левая ребенка, может быть, прав ребенка, вот и все.
Итак, пусть только ради обсуждения, что кто-то хочет, чтобы отправить сообщение
который выглядит следующим образом. Это полный бред, но он состоит из As, Bs, Cs, Ds, и Es.
И если вы на самом деле подсчитать все As, Bs, Cs, Ds, и Es
, а затем разделить на общее количество букв,
эта маленькая графика здесь говорится, что 45% из букв Es, 20% As,
10% B, и так далее.
Итак, другими словами, предположим, что кавычки здесь
только некоторые сообщения, которые вы хотите отправить.
Это, оказывается, ерунда просто так мы можем использовать как несколько букв насколько это возможно,
но это действительно так, что E остается самым популярным,
и B и C являются наименее популярными, по крайней мере, из этих 5 букв алфавита.
Так как мы можем идти о придумывают кодирования,
двоичного кодирования, узор из 0 и 1 для каждого из этих букв
таким образом, что E находится в нескольких минутах картины и, возможно, B и C являются чуть больше моделей,
Опять же, идея в том, что мы хотим использовать меньшее количество бит большую часть времени
и более бит только один раз в то время.
По словам кодирование Хаффмана, вы можете создать лес деревьев.
Там вроде сюжетная линия здесь, что включает в себя деревья, а также процесс построения их.
Давайте начнем.
>> Я предлагаю вам начать с этого леса, так сказать, из 5 деревьев,
каждый из которых является довольно глупо дерева.
Дерево состоит из всего одного узла, как представлено здесь кругом.
Таким образом, каждая из этих вещей могут быть структуры C
и внутри структуры C может быть с плавающей точкой представляют подсчете частоты
и тогда, возможно, символ представляет письме.
Так что думаю об этих узлах, как только все старые структуры C, но, на данный момент, более высокий уровень.
Это леса из 5 деревьев, каждое из которых есть только один узел.
Что Хаффман предлагаемая в том, что мы начинаем объединять эти деревья
, которые имеют наименьший рассчитывает частоту в немного больше деревьев
, соединяя их с новым корневым узлом.
Таким образом, среди букв здесь, обратите внимание, что для удобства я сортировал их слева направо,
хотя это не является строго обязательным, и обратите внимание, что наименьшее узлов
В настоящее время 10% и 10%.
Так Хаффман предложил, чтобы мы объединяем эти 2 наименьшее узлов в новое дерево
путем введения нового родительского узла, а затем дать, что родители ребенка левом и правом ребенка
где B произвольно левой и C произвольно право.
А потом Хаффман Кроме того, предлагается Давайте просто думать о левом ребенка
В одном из этих деревьев всегда, как быть представленным на 0
и право ребенка всегда, как быть представленным номером 1.
>> Это не имеет значения, если вы переверните их так долго, как вы последовательны.
Так что теперь у нас есть четыре деревья в этом лесу.
И я говорю четыре, потому что сейчас дерево слева -
и это не так много дерева в том смысле, что он растет таким образом,
это больше похоже на генеалогическое дерево, где сейчас 0,2 является своего рода родитель двух детей -
Отметим, что в родительский что мы нарисовали 0,2.
Мы добавили частоты отсчетов двух детей и с учетом новых узлов общей суммы.
Так что теперь мы просто повторить этот процесс.
Найти два самых маленьких узлов, а затем объединить их в новое дерево
, а затем повторить процесс дальше.
Сейчас у нас есть несколько кандидатов, 20%, 15%, а еще 20%.
В этом случае, мы должны разорвать связь. Мы можем делать это произвольно.
Мы просто должны делать это постоянно.
В этом случае, я буду идти с произвольным один слева,
и я теперь объединить 20% и 15%, чтобы дать мне новых родителей называют 35%,
, левый ребенок 0, чье право ребенка 1, и теперь у нас есть только три дерева в лесу.
Вы, возможно, может видеть, где это происходит.
Если мы повторим это еще пару раз, мы собираемся иметь только одну больше деревьев,
, все ребра которого помечены 0 и 1.
Давайте сделаем это снова.
35% корня, дерева. 20% и 45%, так что мы собираемся объединить 35% и 20%.
Теперь у нас есть это дерево здесь. Мы добавляем их вместе, у нас есть 55%.
Сейчас есть только два дерева в лесу.
Мы делаем это в последний раз, и, надеюсь, математически все частоты складываются
потому что они должны, так как мы вычислили их с самого начала идти, чтобы добавить до 100%.
И теперь у нас есть одно дерево.
Таким образом, это дерево Хаффмана.
Это отчасти потребовалось время, чтобы добраться на словах, но на самом деле с цикла
или с помощью рекурсивной функции, можно построить эту вещь довольно быстро.
Так что теперь у нас есть один новый узел, и все эти внутренние узлы были malloc'd,
Предположительно, на этом пути.
Так что теперь на вершине этого дерева мы имеем 100%, но теперь замечаю у нас есть путь
Из этого нового пра-пра-пра-прародителей ко всем пра-пра-пра-внуки
всю дорогу на дне, чтобы все листья.
>> То, что мы собираемся сделать сейчас, это предложить, что для того, чтобы представлять букву Е,
мы будем просто использовать номер 1. Почему?
Потому что если мы пройдем этот дерева от окончательного корень вниз к листу известный как E,
мы следуем только один край, правый край, и это, конечно, помечены в правом верхнем углу 1.
Таким образом, импликация здесь Хаффман, что кодирование E в двоичном должно быть просто 1.
И это чертовски эффективно. Не могу получить любую меньше, чем это.
С другой стороны, собирается быть представлены, если следовать логике,
тем, что картина бит вместо этого? 01.
Таким образом, чтобы добраться до, мы стартуем из корня и идем налево, а затем мы идем направо,
которая означает, что мы последовали 0, а затем 1.
Таким образом, мы будем представлять письма с рисунком 0 и 1.
А теперь замечаю у нас уже есть свойство непосредственной Декодируемости
что мы не имеем в азбуке Морзе.
Хотя обе эти модели являются довольно короткий - Е 1 бит, составляет 2 бита -
заметите, что они не могут быть спутаны одной или с другой стороны,
потому что, если вы видите в 1 это должно быть E, если вы видите 0, то 1 он, очевидно, должен быть A.
Кроме того, что D? 001.
Что такое C? 0001.
А что такое B? 0000.
И снова, потому что все письма, которые мы заботимся о находимся на листьях
и никто из них являются своего рода посредниками на пути от корня до листа,
нет риска соединяя различные кодировки 2 буквы "
потому что все эти битов являются детерминированными.
0000 всегда будет B.
Там нет узлов где-то посередине, что вы могли спутать одну букву за другой.
Так что же подразумевается здесь?
>> Самый популярный письмо - в этом случае E - получил кратчайшие кодирования,
Получил следующий кратчайшие кодирования,
и B и C, которые мы уже знали с самого начала идти было вида наименее популярным
на 10% частоту каждого, они получили самый длинный кодирования.
И что это означает теперь, что если вы хотите отправить сообщение, которое сжатый
через Интернет или по электронной почте и т.п.,
а не с помощью стандартного ASCII, вы можете отправить Хаффман закодированное сообщение
согласно которому, если вы хотите отправить письмо E, вы посылаете только один бит.
Если вы хотите отправить, вы посылаете 2 битами, 01, вместо отправки 8 бит
затем еще 8 битов следуют еще 8 бит и так далее.
Но есть Гоча здесь.
Это не достаточно просто построить это дерево, а затем начать передачу от Алисы к Бобу
короче битов, строку из ASCII,
потому что Элис также должен сообщить о том, что Боб
если Боб собирается быть в состоянии прочитать ее сжатым сообщение?
[Неразборчиво ответ студента] >> Что это такое?
[Неразборчиво ответ студента] >> Из чего дерево.
Или даже более конкретно, то, что эти кодировки,
тем более, что во время этой истории мы приняли решение вызова в одной точке.
Помните, что мы должны были выбрать произвольно между 2 различными узлами 20%?
Так что это не тот случай, Боб, получатель, может просто восстановить дерево на своем
потому что, возможно, он будет создавать дерево чуть-чуть отличается от Алисы.
Кроме того, Боб даже не знаю, что оригинальное сообщение
поскольку единственное, что Алиса посылает его, конечно, является сжатым сообщении.
>> Таким образом, вылов со сжатием, как это, что, да, Алиса может спасти много битов
путем отправки 1 для E и 01 и так далее,
но она также должна сообщить Бобу, что отображение между буквами и биты
потому что они не могут четко полагаться только на ASCII больше, если мы не используем ASCII.
Таким образом, она может либо отправить его деревом или иначе -
запишите его, хранить его в виде двоичных данных или что-то вроде этого -
или просто послать ему немного шпаргалку, файл Excel, который показывает отображения.
Таким образом, эффективность сжатия действительно предполагает, что сообщения, которые вы отправляете
довольно большой, по крайней мере, среднего,
потому что, если вы отправляете супер короткое сообщение,
если вы просто хотите отправить сообщение БАД, которые, случается, слово, которое мы может означать здесь,
B-A-D, вы, вероятно, будете использовать меньшее количество бит,
но загвоздка в том, если вы также должны сообщить Бобу, что дерево
или то, что эти кодировки, вы будете, вероятно, перевешивают все сбережения
наличия сжатого вещи с самого начала.
Так что это действительно может быть так, что если вы попытаетесь сжатии
даже с чем-то вроде почтовый индекс или форматы файлов вы можете быть знакомы с -
довольно небольшие файлы, даже пустые файлы -
Иногда эти файлы могут получить больше и не меньше.
Но реально, что происходит только для небольших размеров файла,
так что он не собирается делать гигабайт файлов составляет 2 Гб;
Мы действительно говорим байт или просто пару килобайт.
>> Некоторые программы, как почтовый достаточно умны, чтобы понимать, что,
"Вы собираетесь потратить больше битов сжатия этого".
"Пусть меня не беспокоят сжимая его для вас на всех".
Так что это лишь один из способов затем сжать текстовый формат.
Мы могли бы реализовать нечто подобное в C.
Например, вот как мы могли бы представлять собой узел в этом дереве
где у нас есть символ на символ, плавающие значение частоты,
и, как мы видели, с другими нашими структурами данных, 2 указатели,
1 влево ребенка, 1 вправо, любой из которых может быть NULL,
но если нет, это относится к левым ребенка и право ребенка.
Так что же тогда кодирование Хаффмана, и это один из способов, вы можете идти о сжатии информации,
и это, безусловно, одна из наиболее проста в реализации
в контексте, скажем, данные на прошлой неделе структур,
хотя даже более сложные алгоритмы существуют
что можно сделать еще более сложной мутации ваших данных.
Любые вопросы, то на деревья, бинарные деревья, или сжатие текста?
[Студент] Есть некоторая двусмысленность, как если бы [неразборчиво] разделилась на 01,
то 011 будет неоднозначным, так?
[Неразборчиво] >> Хороший вопрос. Неоднозначность.
Позвольте мне вкратце, ссылаясь на это фото здесь.
Потому что символы, которые вы сжимаете, представления,
по определению этого алгоритма всегда остаются листья,
Вы никогда не будете случайно использовать ту же схему бита для префикса несколько букв.
Итак, другими словами, вы озабочены, похоже, двусмысленности, возникающие
которых 001 может быть началом B или C начала или что-то вроде этого.
Но это не может быть так, потому что заметили, что все буквы алфавита мы кодирующих
находятся на листьях.
>> Неоднозначность может возникнуть только, как и в случае с азбукой Морзе,
Если, например, C был где-то на пути от корня до B.
[Студент] Верно. Так что в этом случае, скажем, с 2 листьями. >> Скажите есть - Скажи это еще раз.
[Студент] Скажи имеет 2 листа, F и G, а затем G - >> Хорошо. Но она не может.
Сама по себе не может иметь листья F и G, потому что эти буквы F и G
бы сами быть оставляет где-то слева от B или право E.
Таким образом, по определению, они должны быть листьями.
В противном случае, вы совершенно правы, мы не решили проблему, что код Морзе сталкивается.
Хороший вопрос. Другие вопросы? Хорошо.
Это понятие бита, оказывается, у нас были власти все вместе, что мы фактически не используется
когда речь идет о манипулировании эти 0 и 1.
Мы спросили об этом на одной из первых наборов задачи:
а именно, как вы идете по поводу преобразования прописных и строчных букв, или наоборот?
Или, более конкретно, один из тех первых psets спросил
сколько бит вы на самом деле нужно перевернуть, чтобы изменить в нижний регистр или наоборот?
Вот краткое напоминание того, что 65 и 97 выглядеть в двоичном виде.
И даже если это вопрос вроде был утрачен в вашей памяти,
Вы можете увидеть здесь еще раз, что, сколько бит необходимо перевернуть
изменить капитала в нижний регистр? Только один.
>> Они отличаются только в одном месте, третий бит слева.
В то время как есть 010, мало имеет 011.
Так или иначе, мы должны просто быть в состоянии отразить, что бит,
и мы можем капитализировать или строчные буквы.
Мы сделали это в прошлом, фактически используя, если условия
и проверки, если письмо между капиталом и капиталом Z,
Затем выхода, как - + 26 или что-то вроде этого.
Вы, наверное, сделал арифметическую изменения буквы алфавита.
Но что, если мы могли бы просто переверните, что один бит?
Как вы могли бы идти о принятии стоимость одного байта бит, 8 бит, так как 01000001 01100001 и?
Если у вас эти последовательности битов, как мы можем идти об изменении только одного из них?
Что, если мы введем в желтом вот это другой структуре бита?
Если я сделаю все желтые 0s строки, за исключением одного бита, что я хочу изменить
а потом ввести новый оператор известен как оператор побитового -
Побитовая в том смысле, что она действует на отдельные биты,
не на весь байт или четыре байта все сразу.
Это вертикальная черта там, в желтом предполагает, что то, что если мы возьмем представление капитал
и побитовое ИЛИ его желтой последовательность битов?
Иными словами, думаю, вернемся к нашему обсуждению булевых выражений в царапинам, а затем в C.
>> Делая логический или означает, что, чтобы быть правдой, либо первое, что должно быть истинным
или вторая вещь должна быть истинными или оба они имеют, чтобы быть правдой,
, а затем полученный результат является самой правдой.
В этом случае здесь, что мы получим, если возьмем 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.
И поэтому, даже если мы не знаем заранее, что нижний регистр был,
просто "или" ИНГ с этой картины биты, которые мы представили здесь, в желтых,
Вы можете нижний капитала, щелкая, что немного.
Мы использовали это выражение недель назад: листать немного.
Как вы на самом деле сделать это программно?
Вы можете использовать то, что обычно называют маской, последовательность битов,
что в этом случае происходит просто так, чтобы посмотреть, как этот номер здесь,
и тогда вы "или" это вместе с использованием этого нового оператора C,
Не | |, можно использовать одно |, и вы бы на самом деле получить ответ здесь, потому что зачем?
Это место 1s, 2s место, 4s, 8s, 16s, 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, 16s, 32s место.
Таким образом, это желтый номер, случается, 32.
Затем я могу взять с собой письмо, как символ здесь, побитовое "или" она буквально с числом 32,
и что я вернусь? Строчные версия, что символ.
Минуту назад, хотя, я выразил это в другой записи базы.
Что это представляете? >> [Студент] Шестнадцатеричные.
[Малан] Это происходит представляют шестнадцатеричные.
Мы не говорили о шестнадцатеричном все, что многое,
но на самом деле это удобно в случаях, подобных этому.
>> Даже если это выглядит более сложной и, хотя она выглядит как 20, а не 32,
Оказывается, что шестнадцатеричные на самом деле супер удобные обозначения
потому что в шестнадцатеричной каждой цифры после 0x - и это ничего не значит;
это просто человеческое соглашение, что говорит здесь идет шестнадцатеричное число -
каждая из этих цифр, 2, а затем 0, сами по себе могут быть представлены
ровно с 4 бита.
Так что, если мы сделаем это, позвольте мне открыть текстовый редактор здесь - странное автозаполнения -
если мы немного текстовый редактор здесь, число 0x20 означает, что здесь 4 бит, вот еще 4 бита.
Давайте сделаем правый 4 бита в первую очередь.
0, когда представлены 4 бита это что? Супер просто. Просто все 0s.
Так что 4 бита, как 0s.
Как вы представляете 2? Это было время, так как мы сделали это, но это 0100.
Так что это 1s место, это 2s место, а потом это не имеет значения то, что другие места.
Иными словами, в шестнадцатеричном вы могли бы сказать 0x20,
Но если вы потом думать о том, что 2 и как оно представлено в двоичной,
что такое 0 и как это представлено в двоичной,
Ответы на эти вопросы это и это, соответственно.
Так происходит, 0x20, чтобы представить эту картину из 8 бит,
который как раз и является маской, которую мы хотели.
Так что это на данный момент просто интеллектуальное упражнение,
но на самом деле в коде это обычно чаще писать константы, как это
в шестнадцатеричном, потому что тогда программист может относительно легко,
даже если это требует бумагу и карандаш, выяснить, что это картина бит
потому что вы не можете просто выражать 0 и 1 обычно в коде.
Вы не можете пойти 00010 и так далее.
>> Вы должны выбрать десятичной или шестнадцатеричной или восьмеричной или другие обозначения.
Большинство людей склонны выбирать шестнадцатеричном просто так, чтобы каждая цифра представляет 4 бита
и вы можете сделать это быстро математике.
И я машу рукой в ​​ToUpper, что почти то же самое, он выглядит почти идентично.
ToUpper происходит использовать не или оператор, а этот парень и DF.
Что DF представляют? DF? Любой? >> [Студент] 255.
255? Не 255. Это было бы и далее.
Мы оставим это одно, маленькое упражнение.
Но если вы идете от 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, а затем то, что приходит после 9?
Мы вроде из десятичных цифр, но в шестнадцатеричном, что будет после 9?
[Студент]. >> Так A, B, C, D.
Вы можете выяснить оттуда то, что картина бит D на самом деле представляет.
И если мы делаем математику, мы увидим, что маски в конечном итоге получить обратно идентично этому.
Это F, все 1s, и это г. Так DF заявляет, что маски. Хорошо.
И, наконец, не делать вещей звук супер, супер технических,
но предположим, что мы хотели, чтобы написать программу, которая это делает.
Позвольте мне пойти дальше и сделать бинарный, который представляет собой программу в файле с именем binary.c.
А теперь позвольте мне запустить бинарный и дать мне неотрицательное целое число.
Давайте начнем просто и тип 0.
Это сейчас это программа, которая выводит целое число в двоичном представлении.
Так что, если я играю в эту игру снова и ввести только 1, я должен получить 32-разрядное представление 1.
Если я сделаю это снова 2, я должен получить это.
Если я делаю 7, я должен получить несколько 1s в конце и так далее.
Оказывается, я говорю об этом, потому что с операции побитового
вы реально можете сделать одну вещь, как хорошо.
Вы можете создать эти маски динамически.
Взгляните на этот последний пример с участием битовых операций.
Вот первая часть кода, запрашивает у пользователя число,
и он настаивает на том, что вы даете мне неотрицательное целое число.
Так что это своего рода старое школы.
Но вот то, что вроде интересный.
>> Как я могу идти о печати числа в двоичном?
Я впервые итерации от чего к чему?
Какой размер Int обычно, по крайней мере в прибор? >> [Студент] 4.
Это 4. Таким образом, 4 * 8 32 - 1, 31.
Так что, если я начинаю считать от 31, который представляет, оказывается,
только концептуально, 31-разрядный или высшего порядка бит, что этот парень здесь,
в то время как это будет бит 0.
Так что это бит 01 бит ... 31.
Так что этот код делает?
Обратите внимание, это цикл, даже если он выглядит загадочным, просто перебор с 31 до 0. Вот и все.
Таким образом, самая интересная часть теперь должна быть в этих 5 строк здесь.
Обратите внимание, что в этой линии я объявлении переменной маски
в соответствие с нашей историей этих желтых номеров.
А то, что это делает?
Это еще один оператор побитового мы не видели раньше, скорее всего.
Это оператор левого сдвига.
Этот оператор делает это.
Вот номер 1, и если вы делаете я оставил сдвиг, сдвиг влево,
Что вы думаете, что имеет эффект делает, чтобы, что отдельные 1?
Буквально смещения его.
Таким образом, если число 1 является то, что у вас на левом, и вы начинаете с инициализации я 31,
Что это будет делать? Он собирается взять этот номер 1 и переложить ее 31 мест здесь.
И потому, что тут нет других цифр за ней,
те, по умолчанию будет заменен 0s.
Таким образом, вы начинаете с номером 1, который, конечно, выглядит так -
и позвольте мне сделать это здесь, в центре.
И то, как вы переносите вещи слева, этот парень по существу идет этим путем.
Но как только вы это сделаете, 0 получает заполнены
Если перевести его во второй раз, он идет этим путем и другое 0 получает заполнены
>> Вы переложить ее снова, а затем еще 0 получает заполнены
Так что если вы это сделаете из 1 << I 31 мест, в итоге вы получаете маску
, что составляет 32 символов, левый одним из которых является 1,
Все остальное из которых 0.
А то получается, как в сторону, переходя число слева, как это
Также случайно, а иногда и удобно,
имеет эффект делает то, что на этот номер? >> [Студент] Удвоение его.
Удвоение это, потому что в каждом из столбцов - 1s место, 2s место, 4s место,
8s место, 16s месте - они все удвоения, как вы идете налево.
Или, вернее, когда вы переносите 1s вы будете в конечном итоге удвоить стоимость номера.
Вы можете в конечном итоге делает интересное преобразования цифр
сдвигая все более подобным образом по степеням 2.
Так как же это работает?
Это и дает мне маску, которая все 0s за исключением 1 в точности месте я хочу,
а потом это выражение, которое украли toupper.c,
просто говорит, взять число п, что пользователь ввел в,
»И« что с этой маской, и что вы собираетесь получить?
Вы собираетесь получить 1, если есть 1 в масках, что место,
или вы собираетесь получить 0, если это не так.
И так все это делает программа эффективно это имеет петлю,
и это создает маску с 1 здесь, то 1 здесь, то 1 здесь,
и он использует это побитовое И трюк, чтобы сказать, есть 1 бит на входе пользователей здесь?
>> Есть 1 бит на входе пользователей здесь? И если это так, буквально печатать 1, иначе печать 0.
Мы делаем это с целыми только потому, что именно поэтому мы делаем 32 бит вместо 8,
но то, что мы ввели, то это побитовое И это побитовое ИЛИ,
и этот оператор левого сдвига, который часто не очень полезно,
но оказывается, что они могут быть.
В самом деле, если бы вы были представлять собой нечто вроде массив логических
просто представляют истинное или ложное, предположим, вы хотели, чтобы отслеживать или нет
комнату, полную 300 студентов присутствует,
Вы можете объявить массив размером 300 типа BOOL, так что вы получите 300 Bools,
и вы можете настроить каждый истинно, если кто-то здесь и ложь в противном случае.
Почему это представление в том, что структура данных неэффективна?
Что плохого о дизайне, что структура данных, массив из 300 Bools?
Что такое логический, на самом деле, под капотом?
Это, также, является то, что могут быть не знакомы.
Оказывается, нет BOOL.
Помните, мы как бы создали, что с cs50.h файл,
которая сама по себе включает в себя стандартные BOOL.
С видом немой, хотя, когда дело доходит до BOOL.
Он использует 8 бит для представления каждый логический, который полностью расточительного
потому что очевидно, сколько бит нужно, чтобы представлять логическое? Просто 1.
Вот и получается, что если сейчас у вас есть возможность с операторами побитового
манипулировать отдельными битами даже в символ, даже в один байт,
Оказывается можно уменьшить объем памяти, необходимый для представления глупость
как, что посещаемость стиле структуру данных в 8 раз.
Вместо того чтобы использовать восемь битов представляют истинное или ложное, вы можете буквально использовать один
с помощью одного байта на каждые восемь учеников в классе
и переключения от 0 до 1 отдельные биты с помощью этих видов низким уровнем трюков.
Это действительно положить конец энергии. Есть ли вопросы о битовые операции?
>> Да. >> [Студент] Есть ли исключительные или оператор?
Да. Существует исключительное или оператор, который выглядит так, ^, морковь символ,
, что означает только первое или второе может быть 1 на выходе будет 1.
Существует также нет, ~, которая позволит вам, чтобы инвертировать 0 на 1 или наоборот, а также.
И есть также оператор сдвига вправо, >>, которая является противоположностью той, которую мы видели.
Хорошо. Давайте вещи теперь на более высокий уровень.
Мы начали говорить о тексте, а затем сжать его
и представляет текст с меньшим количеством бит;
Мы немного поговорили о том, как мы можем теперь начать манипуляции вещами на уровне Побитовая.
Давайте теперь масштаб до 10.000 футов, чтобы представление
более сложные вещи, как графика.
Здесь мы имеем флагом Германии, здесь мы имеем одно из Франции.
Они могут быть представлены в форматах, вы знаете - GIF-файлов, например.
Если вы когда-либо видели изображение в Интернете, которые заканчиваются на. GIF,
Это графический формат обмена.
Эти два флага здесь вроде поддаются сжатию
за то, что, возможно, очевидных причин? >> [Неразборчиво ответ студента]
Там очень много повторений, верно?
Для того, чтобы отправить флагом Германии, думать об этом как изображение на экране
обратно в дни Scratch.
Вы могли бы вспомнить, что есть отдельные точки, которые составляют изображение.
>> Там целый ряд черных точек и еще целого ряда черных точек.
Там куча строк черными точками, которые мы могли видеть, если мы действительно увеличено,
многое нравится, когда мы увеличено на лице Роба в Photoshop.
Как только мы получили все глубже и глубже и глубже в изображении,
Вы начали видеть пикселизация, все квадраты, которые состоят глаза в этом случае.
То же здесь дело. Если мы увеличено совсем немного, вы бы увидели отдельных точек.
Ну, это вид отходов бит.
Если треть флаг черного и третьего флага желтый и так далее,
почему мы не можем каким-то образом сжать этот флаг?
И даже французский флаг может быть сжата, хотя картина немного другая.
Оказывается формате GIF файлов формат сжатия без потерь,
которая означает, что вы можете делать снимки, как немецкий флаг здесь,
Вы можете выбросить многие из его битов без ущерба для качества.
Это в отличие от что-то вроде JPEG,
, с которой большинство из нас, вероятно, более знакомы.
Facebook фото и Flickr фотографий и т.п.
Почти всегда сохраняются как изображения в формате JPEG, когда они загружены,
но в формате JPEG является потерями - потерями - формат которого вы выбросили биты
но вы также выбрасывают качества.
И поэтому, если вы сжимать фотографии с Photoshop или загрузить их на Facebook
или взять их на действительно дерьмовый телефон,
Вы знаете, что картина начинает получать очень пятнистым и неровной,
и это потому, что он сжимается с помощью компьютера или телефона
буквально бросали информация от отеля.
Но GIF удивительно в том, что он может использовать меньше бит, чем он может по умолчанию
без потери информации.
>> И она по существу делает это следующим образом.
Вместо того, чтобы хранить в файле, как BMP бы RGB тройной для черного, черного, черного, черного,
черный, черный, черный, черный, черный, черный, черный, черный и так далее,
Скорее всего, формат GIF собирается сказать, "Black"
, а затем "Повторите это 100 раз", или что-то вроде этого.
"Черный повторить это 100 раз, черный, повторить это 100 раз ..."
"Желтый, повторить это 100 раз."
И так он помнит, по сути, левое пикселей
и затем кодирует так или иначе понятие повторял, что пиксель снова и снова.
Так GIF-файлов можно сжать себя без потери информации.
Но если у вас догадаться, если это алгоритм, который ГИФС использования,
какой из этих флагов, даже если они выглядят одинаковыми по размеру,
будет меньше, если сохраняется на диске в формате GIF? >> [Студент] Германия.
Германия будет меньше? Почему?
[Студент] Поскольку Вы повторяете это много, много раз горизонтально
а потом повторить в другой раз. >> Именно так.
Потому что люди, которые изобрели GIF только отчасти произвольно решили
, что повторение будут использованы горизонтально, а не сбоку.
Там очень много больше повторений боков здесь в немецкий флаг, чем в французский флаг.
Таким образом, если мы на самом деле открыть папку на жестком диске, который имеет эти GIF,
Вы можете фактически видеть, что немецкий флаг здесь 2 килобайта и французской составляет 4 килобайта.
Это случается совпадение, что один в два раза больше другого,
но это на самом деле так, что французский флаг гораздо больше.
>> Даже если мы говорим здесь о графике, те же идеи можно применить к
Не такие вещи, как флаги, но образы, которые являются немного более сложными.
Если вы возьмете картину яблоко, безусловно, есть много дублирования там,
, чтобы мы могли как-то помнить, что по умолчанию фон сине
а не, как правая картина предполагает,
должны помнить, цвет каждого пикселя в этой картине.
Таким образом, мы можем бросить бит далеко есть без потери информации.
Яблоко по-прежнему выглядит точно так же.
В этом примере, вы можете увидеть, что происходит в фильме.
Они представляют старой школы кинохроники которого в верхнем изображении есть
у вас есть RV проезжал мимо дома и дерево.
А что ван проезжает мимо слева направо, что, очевидно, не меняется?
Дом никуда не денется, и дерево никуда не денется.
Единственное, что движется является ван в этом случае.
Так как фон без изменений предполагает, что вы можете сделать в кино
Аналогично просто выбросить информацию, которая не меняется между кадрами.
Это, как правило, известные как сжатие межкадрового
согласно которому, если этот кадр выглядит почти идентично этому,
давайте не будем беспокоиться сохранения на диске любого из идентичной информации
на эти промежуточные кадры, давайте использовать только ключевые кадры раз в то время
что на самом деле хранить эту информацию избыточно так же, как немного здравомыслия проверить.
>> В отличие от другой подход к сжатие видео в этом втором и нижней пример здесь,
, где вместо магазина 30 кадров, почему бы вам не просто хранить 15 кадров в секунду вместо?
Вместо того, чтобы фильм вида течет красиво, прекрасно,
это может выглядеть это заикание немного, немного старой школы,
но эффект будет использовать гораздо меньше бит, чем могло бы быть необходимым.
Так где же это тогда нам остается?
Это было немного в стороне от того, где еще вы можете пойти со сжатием.
Более подробную информацию о том, что взять класс как CS175 здесь.
Вот еще один пример в видео.
Если пчела это единственное, что движется,
Вы действительно можете выбросить информации в этих средних кадрах
потому что цветок и небо, и листья не меняется.
Но давайте теперь рассмотрим одну вещь.
В следующие 5 минут мы оставим позади C вечно в лекции? Да. Не в psets, однако.
Последний рассказ о С, а затем мы перейдем к очень сексуальным материалом
с участием HTML и веб-и у-у-ух. Хорошо.
Здесь мы идем. Это мотивация.
Оказывается, все это время, когда мы были написания программ мы запускаем Clang.
И Clang, мы говорили с первой недели в значительной степени, берет исходный код
и преобразует его в объектный код.
Это займет C и преобразует его в 0 и 1.
Я вроде лежал к вам в течение нескольких недель, потому что это не совсем так просто.
>> Там очень много больше происходит под капотом, когда вы запускаете программу, как Clang.
В самом деле, процесс компиляции программы действительно может быть обобщены,
как вы, возможно, помните из видео Роба на компиляторы,
в эти 4 этапа: предварительная обработка, составление себя, сборки и компоновки.
Но у нас в классе, и большинство людей в мире обычно суммировать все эти шаги
как только "компиляции".
Но если мы начнем с исходного кода, как это, напомним это, пожалуй, простейшая программа C
мы написали до сих пор, напомним, что при компиляции он заканчивается в таком виде.
Но там на самом деле промежуточный шаг, и эти шаги заключаются в следующем.
Во-первых, эта вещь на самом верху этого, и большинство наших программ,
# Включить
Что # включить сделать для нас?
Это в значительной степени копирует и вставляет содержимое stdio.h в моем файле, так что почему?
Почему я забочусь о содержании stdio.h? Что там интерес?
Printf в декларации, его прототип, так что компилятор то знает, что я имею в виду
когда я упоминаю эту функцию Printf.
Таким образом, шаг 1 в сборе является предварительной обработки, в результате чего программы, как Clang
или некоторые вспомогательные программы, которая поставляется с Clang читает ваш код сверху вниз,
Слева направо, и в любой момент он видит символ # следует ключевое слово, как включать,
он выполняет эту операцию, копирование и вставка в данном случае stdio.h в ваш файл.
Это шаг 1.
Тогда у вас есть гораздо больше C файл из-за огромного копировать, вставить вакансии, просто так получилось.
>> Шаг 2 Теперь это компиляция.
Но, оказывается компиляция занимает исходный код, который выглядит следующим образом
и превращает его в нечто, что выглядит так,
что для тех, кто знаком называется? >> [Студент] ассамблеи. >> Ассамблеи языке.
На самом деле это что-то, если вы берете CS61 вы будете погружаться в более подробно.
Это почти так же близко, как вы можете получить в письменном 0 и 1 себе
но писать вещи таким образом, что все еще заставляет по крайней мере немного смысла.
Эти машинные инструкции, и если мы прокрутите вниз до основной функцией здесь,
заметите, что этот толчок инструкции, перемещать инструкции, вычесть обучения,
звоните обучения, и так далее.
Когда вы слышите, что ваш компьютер Intel Inside,
у вас процессор Intel в Mac или PC, что это значит?
Процессор встроен такими компаниями, как Intel понимание определенных инструкций.
Они понятия не имеют, что такие функции, как свопа или основной сами по себе,
но они знают, что очень низком уровне инструкций, как сложение, вычитание, толкать,
переместить, позвонить, и так далее,.
Таким образом, при компиляции C код на ассемблере,
ваша очень удобный вид код преобразуется в нечто, что выглядит так,
, что буквально движется байта или 4 байта вокруг в таких небольших подразделений и из CPU.
Но, наконец, когда Clang готов принять это представление своей программы
в 0 и 1, то шаг называется сборка происходит,
и это опять все происходит в мгновение ока при запуске Clang.
Мы начинаем здесь, она выводит файл, как это, а затем преобразует его в эти 0 и 1.
И если вы хотите, чтобы вернуться в какой-то момент и на самом деле увидеть это в действии,
если я иду в hello1.c--это одна из самых первых программ, которые мы посмотрели на -
Обычно мы будем компилировать это с Clang hello1.c и это даст нам a.out.
Если в отличие от вас, а дать ему-S флаг, что вы получите это hello1.s
и вы на самом деле видите на ассемблере.
>> Я делаю это для очень короткой программы, но если вы вернетесь на Scramble
или восстановить или любую программу, вы написали и просто из любопытства
хочу посмотреть, что это на самом деле похоже, что на самом деле кормят в CPU,
Вы можете использовать это-S флаг с Clang.
Но потом, наконец, есть еще один глюк.
Здесь 0 и 1, которые представляют моей реализации Здравствуй, мир.
Но я использовал чужую функцию в моей программе.
Так что, хотя процесс был я беру hello.c,
он компилируется в код сборки, а затем она будет собираться в 0 и 1,
только 0 и 1, которые выводятся на данный момент
те, что в результате моего кода.
Но человек, который написал Printf, они составили свой код 20 лет назад
и она теперь установлен где-то на прибор,
так что мы каким-то образом должны объединить свои 0 и 1 с моими 0 и 1,
и это подводит нас к 4-й и заключительный этап компиляции, известные как ссылки.
Таким образом, на левой стороне у нас есть точно такая же картина, как раньше:
hello.c становится сборки кода становится 0 и 1.
Но помните, что я использовал стандартные библиотеки ввода / вывода в мой код,
и это означает, что где-то на компьютере есть файл под названием stdio.c
или по крайней мере скомпилированные версии их потому, что кто-то несколько лет назад
составлен stdio.c в ассемблерный код, а затем целый букет из 0 и 1.
Это то, что известно как статическая или динамическая библиотека.
Это какой-то файл сидит где-то в прибор.
>> Но, наконец, я должен взять мою 0 и 1, и что человек 0 и 1
и каким-то образом связать их вместе, буквально объединить эти 0 и 1
в единый файл с именем a.out или hello1 или то, что я назвал свою программу
так что конечный результат имеет все 1 и 0, которые должны составить свою программу.
Так что все это время в этом семестре, когда вы используете Clang
и еще недавно запущенных сделать для того, чтобы запустить Clang,
Все эти шаги были происходило рода мгновенно, а совершенно сознательно.
И поэтому, если вы продолжать в информатике, а именно CS61,
это слой, который вы будете продолжать отогните прочь там
говорить об эффективности, безопасности, последствия, и как эти детали нижнего уровня.
Но вместе с тем, мы собирались уходить C позади.
Давайте идти вперед и принимать наш 5-минутный перерыв сейчас,
и когда мы возвращаемся: в интернете.
Хорошо. Мы вернулись.
Сейчас мы начинаем наш взгляд не только на HTML, потому что, как вы увидите,
HTML себя на самом деле довольно проста
но на самом деле на веб-программирования в целом, сети в целом,
и как все эти технологии объединяются
чтобы позволить нам создавать более сложные программы поверх Интернета
чем до сих пор мы смогли в этих черно-белых окон.
Действительно, на данный момент в семестр, хотя мы будем тратить меньше времени относительно
на PHP, HTML, CSS, JavaScript, SQL и больше,
большинство студентов делают в конечном итоге делает окончательные проекты, которые веб-
потому что, как вы увидите, фон теперь у вас есть в C
очень применимы к этим языков высокого уровня.
>> И, как вы начинаете думать о своем окончательном проекте,
который, так же, как вопрос, поставленный 0, где вы были поощрены
делать самому ничего интересного для вас в Scratch,
Окончательный проект это ваша возможность принять ваши новые знания и смекалка с C
или PHP или JavaScript, или как из за спин
и создать свой собственный кусок программного обеспечения для мира, чтобы видеть.
И семя вам идеи, знайте, что вы можете возглавить здесь, projects.cs50.net.
Каждый год мы требовать идей от сотрудников и преподавателей и студенческих групп на территории кампуса
просто представить свои идеи для интересных вещей, которые могут быть решены с помощью компьютеров,
использование веб-сайтов, с помощью программного обеспечения.
Так что, если вы боретесь, чтобы придумать идею самостоятельно,
всеми средствами прокрутки идеи есть с этого года и последний.
Это совершенно нормально для решения проекта, которые были решены раньше.
Мы видели много приложений для видя состояние прачечной на территории кампуса,
многие приложения для навигации по меню столовой,
многие приложения для навигации по каталогу курсов и тому подобное.
И действительно, в будущей лекции и семинары в будущем,
Мы познакомим вас с некоторыми общедоступных API, как коммерчески доступные
а также здесь можно получить CS50 на территории кампуса, так что у вас есть доступ к данным
и может делать интересные вещи с ним.
Так что больше на окончательное проекты в несколько дней, когда мы выпускаем спецификации,
но сейчас, знаю, что вы можете работать в одиночку или с одним или двумя друзьями
на большинстве проектов, представляющих интерес для вас.
Интернет.
Вы идете вперед и вытяните ваш ноутбук, вы идете в facebook.com впервые,
то, что не вошли в последнее время, и нажмите Ввод. Что именно происходит?
>> Когда вы нажмете Enter на вашем компьютере, целую кучу шагов
начать рода волшебным происходит.
Таким образом, вы здесь, на левом, веб-сервер, как Facebook здесь справа,
и как-то вы используете этот язык называется HTTP, протокол передачи гипертекста.
HTTP не является языком программирования. Это скорее протокол.
Он представляет собой набор конвенций, веб-браузеры и веб-серверы используют, когда сообщающиеся.
А что это означает следующее.
Многое, как в реальном мире, у нас есть эти конвенции
где, если вы встретиться с некоторыми человека в первый раз, если вы не возражаете, посмеиваясь меня здесь,
Я мог бы подойти к вам, говорите: "Привет, меня зовут Дэвид». >> Привет, Дэвид. Меня зовут Сэмми.
"Привет, Дэвид. Меня зовут Сэмми".
Так что теперь мы только что занимались такого рода глупые человеческие протокола
где я инициировал протокол, Сэмми ответил,
Мы пожал руку, и сделка будет завершена.
HTTP очень похожи по духу.
Когда ваши запросы веб-браузера www.facebook.com,
что ваш браузер на самом деле делает расширяет свою руку, так сказать,
к серверу и посылает ему сообщение.
И это сообщение, как правило, что-то вроде Get - что вы хотите получить? -
поймите меня главная страница, которая обычно обозначается косой чертой в конце URL-адреса.
И только так вы знаете на каком языке я говорю, я имею в браузере собираюсь рассказать вам,
что я говорю HTTP версии 1.1,
А также для хорошей мерой, я собираюсь рассказать вам, что хозяин, что я хочу на главную страницу
является facebook.com.
Как правило, веб-браузер, незаметно для вас, человека,
посылает это сообщение в Интернете, когда вы просто вводите www.facebook.com,
>> Укажите, в Вашем браузере.
И что Facebook ответит?
Он реагирует с некоторым подобный вид загадочные детали, но и многое другое.
Позвольте мне идти вперед на главную страницу Facebook здесь.
Это экран, что большинство из нас, вероятно, никогда не увидеть, если вы оставаться в системе все время,
но это действительно их домашнюю страницу.
Если мы сделаем это в Chrome, заметили, что вы можете подтянуть эти маленькие контекстные меню.
Использование Chrome, то ли на Mac OS, Windows, Linux и т.п.,
Если вы контролируете мыши или щелкните левой кнопкой мыши, как правило, можно подтянуть меню, которое выглядит так,
где ждут несколько вариантов, один из которых является представление источника страницу.
Вы также можете обычно получают на эти вещи, перейдя в меню Вид и ковыряться.
Например, здесь, под View, разработчика одно и то же.
Я собираюсь идти вперед и смотреть на View Source страницу.
То, что вы видите, HTML, что Марк написал для представления facebook.com.
Это полный бардак, но мы увидим, что это делает немного больше смысла в скором времени.
Но есть некоторые модели здесь. Позвольте мне прокрутите вниз, чтобы вещи, как это.
Это трудно для человека, чтобы читать, но заметил, что есть эта модель угловые скобки
с ключевыми словами, как вариант, ключевые слова, как ценность, некоторые кавычках.
Это где, когда вы зарегистрировались в первый раз, уточнил, что ваше рождение году.
Это выпадающее меню рождения годы как-то закодированы здесь
В этом языке называется HTML, язык гипертекстовой разметки.
Другими словами, когда ваш браузер запрашивает веб-страницу,
она говорит эта конвенция называется HTTP.
Но что же facebook.com ответить на этот запрос?
>> Он реагирует с некоторыми из этих загадочных сообщений, как мы увидим через мгновение.
Но большую часть своего ответа в виде HTML, язык гипертекстовой разметки.
Это фактически язык, на котором веб-страница написана.
И то, что веб-браузер действительно то есть, при получении что-то вроде этого,
читает ее сверху вниз, слева направо, и в любой момент он видит одну из этих угловых скобках
следует ключевое слово, как вариант, он показывает, что язык разметки соответствующим образом.
В этом случае он будет отображать выпадающее меню лет.
Но опять же, это полный бардак на что посмотреть.
Это не потому, что разработчики Facebook проявляются 0, 5 для стиля, например.
Это происходит потому, что большая часть кода, что они пишут, на самом деле, написано красиво,
хорошо прокомментирован, красиво отступом, и тому подобное,
но, конечно, машин, компьютеров, браузеров действительно не наплевать
ли ваш код и стиле.
И в самом деле, это совершенно расточительно ударил клавишу табуляции все те времена
и поставить комментариев в течение всего вашего кода и выбрать действительно описательные имена переменных
потому что, если браузер не волнует, все, что вы делаете в конце рабочего дня тратит байт.
>> Вот и получается, что большинство веб-сайтов сделать, это, даже если исходный код для facebook.com,
для cs50.net и все эти другие сайты в Интернете
, как правило, хорошо написана и хорошо прокомментирован и приятно отступ и т.п.,
Обычно, прежде чем положить сайт в Интернет, код уменьшенная,
которой HTML и CSS - что-то еще, что мы скоро увидим -
Код JavaScript мы скоро увидим сжимается,
которой длинных имен переменных стать X, У и Z,
и все это пробел, который делает все выглядит так читается все это выбрасывать,
потому что, если вы думаете об этом так, Facebook получает млрд обращений к странице в день -
что-то сумасшедший, как что - так что, если программист просто быть анальный
нажмите пробел одно дополнительное время, просто для отступа некоторые строки кода все настолько больше?
Что подразумевается если Facebook сохраняется, что пробелы
Во всех байтов они отправляют обратно в людей в Интернете?
Нажатие клавиши пробела раз дает вам дополнительный байт в файле.
И если миллиарда человек затем перейти к загрузке домашней страницы в тот день,
насколько больше данных вы передаваемых через Интернет?
Gigabyte без уважительной причины.
И эксплуатацию, для многих веб-сайтах, это не такая масштабируемой вопрос,
но для Facebook, для Google, для некоторых из самых популярных веб-сайтов
есть большой стимул финансово чтобы сделать ваш код выглядит как беспорядок
так что вы будете использовать как несколько байт, как возможно в дополнение к затем сжать его
используя что-то вроде молнии, алгоритм, называемый GZIP,
, что браузер автоматически. Но это ужасно.
Мы никогда не узнаем ничего о сайтах других людей, и, как проектировать веб-страниц
если мы должны смотреть на это так.
>> Так что, к счастью, браузеры, такие как 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."
Следующий тег говорит: "Эй, браузером. Вот голова, заголовок моей веб-страницы."
"Эй, браузером. Вот титул".
А потом сюда: "Эй, браузер. Вот именно за титул".
Так что это, как браузер знает, больше не будет отображать больше символов, чем Здравствуй, мир!
В строке заголовка.
Между тем, эта говорит: "Вот и все на голову".
Это говорит: "Вот идет тело Вот реальное тело." - Буквально, слова Hello, World.
И это говорит здесь: "Вот это для тела. Вот именно для HTML."
Так браузеров довольно глупо.
Они только что прочитали этот материал сверху вниз, слева направо, и делать именно то, что они говорят.
Давайте на самом деле сделать небольшой пример.
Позвольте мне открыть простейших программ на моем Mac здесь, а именно TextEdit.
В Windows можно использовать Notepad.exe.
Но это все, что нужно, чтобы начать зарабатывать веб-страниц.
Я собираюсь идти вперед и просто скопировать и вставить этот код в этот файл.
Я собираюсь идти вперед и сохранить его на моем рабочем столе,
и я хочу сохранить это как hello.html,
и теперь файл с именем hello.html.
Вот он на моем рабочем столе.
А теперь позвольте мне перейти в браузере и перетащить файл в браузере.
И вуаля, вот мой самый первый веб-страницы.
Обратите внимание, что названия вкладки Привет, мир в тег заголовка,
и заметьте, что Здравствуй, мир есть тело мое веб-страницы,
и у-у-ух, я в Интернете.
>> Я не действительно, правы, потому что этот файл не в интернете.
Это случается, на мой локальный жесткий диск в данный конкретный путь.
Но идея та же. Все, что нам сейчас нужно, это веб-сервер, к которому, чтобы загрузить его.
Но сначала давайте на самом деле ввести немного более сложный и немного больше стилизации.
Это просто, если скучно, веб-страницы.
Оказывается, есть и другие типы теги мы можем использовать.
Например, здесь, в желтом Я представил 2 новых тегов.
Мы не будем играть много с этим сегодня, но заметил, что ссылка тега
как-то внешне отличается от всего остального.
Ссылка теги берет то, что называют атрибутами,
и атрибутом является то, что изменяет поведение тега.
В данном случае это не лучший выбор имен, ссылки, потому что это отчасти бессмысленно,
но эта ссылка тег говорит, по сути, включает файл под названием styles.css внутри моей веб-странице.
Вы можете думать об этом как аналогичный C # включает в директиве.
Styles.css имеет в виду другого языка вообще, что мы не будем играть с сегодняшнего дня,
но это для эстетики: размеры шрифта, цвета, отступы, отступы, поля
и все такое подробнее эстетики.
Между тем, тег функционально похожи,
Но вместо того, включают CSS, что язык, он включает в себя другой язык, JavaScript.
Итак, другими словами, с этими 2 теги я в конечном итоге будет возможность написать свою собственную веб-страницу
но и тянуть в код, что я или кто-то другой написал
так что мы можем стоять на плечи других людей, мы можем практиковать хороший дизайн,
вынесение общего кода.
Если у меня есть 10 различных веб-страниц, это означает, что некоторые из моих эстетика
можно вынести, очень похож на № включают в отдельный файл.
Таким образом, мы как туда добраться.
Но давайте на самом деле сначала сделать что-то более интересное с этим файлом.
>> Опять же, это только TextEdit. Я технически не в Интернете, но мы доберемся туда.
Я хотел бы сделать Привет, мир немного смелее, чем он есть.
Так что привет, давай сколь угодно говорить для смелых.
Опять же, история та же: Привет, запятая, начать делать это смелый,
тогда мир становится жирным шрифтом, а это значит остановить печать этом жирным шрифтом.
Позвольте мне идти вперед и сохранить свой файл, вернитесь к Chrome, я буду увеличения именно так мы видим это лучше,
и перезагрузить, и вы увидите, что мир сейчас жирным шрифтом.
Веб это все о гиперссылки, так что давайте идти вперед и делать это:
мой любимый сайт, скажем, youtube.com.
Сохранить, перезагрузить. Хорошо. Там есть пара проблем в настоящее время, кроме безобразия на сайте.
1, я уверен, я ударил Введите здесь. И я сделал.
Я не только ударил Enter, я также отступы, практикуя то, что мы проповедовали о стиле,
но мои находится рядом с миром.
Так почему же это? Браузеры только то, что вы говорите им сделать.
Я не сказал браузера, "Break линий здесь. Вставьте абзаца здесь".
Таким образом, браузер, это не имеет значения, если я ударил Возвращение в 30 раз,
он по-прежнему собирается поставить мою рядом с миром.
Что мне действительно нужно сделать, здесь сказать что-то вроде , вставить разрыв строки.
>> А на самом деле, разрыв строки это своего рода странные вещи
потому что вы не можете действительно начать переезд в другой линии, то что-то сделать,
а затем остановить переход на новую строку. Это своего рода атомарные операции.
Вы либо делать это или нет. Вы попали Введите или нет.
Так бр немного иной тег, и поэтому мне нужно разобраться как открыть и закрыть его
все сразу.
Синтаксис, что это.
Технически, вы могли бы сделать что-то вроде этого в некоторых версиях HTML,
Но это просто глупо, потому что нет никаких причин для запуска и остановки что-то
если вы можете вместо этого сделать все сразу.
Поймите, что HTML5 не строго требует этого черта,
так что вы увидите учебники и интернет-ресурсы, которые не имеют его,
но для хорошей мерой давайте практиковать симметрии, которые мы видели до сих пор.
Это означает, что тег является как открываются и закрываются.
Так что теперь позвольте мне сохранить мое дело, вернуться сюда.
Да, это начинает выглядеть лучше, за исключением Web я знаю, это своего рода интерактивным,
и все же 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]