В Интернете каждому компьютеру присваивается четырехбайтовый код, который обычно пишется
Обновлено: 04.11.2024
ЭТА СТРАНИЦА СОДЕРЖИТ ПРИМЕРЫ ОТВЕТОВ на викторину по главе 1 этого интерактивного учебника по Java. Обратите внимание, что во многих случаях на заданный вопрос существует множество правильных ответов.
Вопрос 1. Одним из компонентов компьютера является его ЦП. Что такое ЦП и какую роль он играет в компьютере?
Ответ: Центральный процессор или центральный процессор является активной частью компьютера. Его функция заключается в выполнении программ, написанных на машинном языке и хранящихся в основной памяти (ОЗУ) компьютера. Он делает это, повторяя цикл выборки и выполнения снова и снова; то есть он многократно извлекает из памяти инструкцию машинного языка и выполняет ее.
Вопрос 2: Объясните, что подразумевается под «асинхронным событием». Приведите несколько примеров.
Ответ: Асинхронное событие — это событие, которое происходит в непредсказуемое время вне контроля программы, которую выполняет ЦП. Он не "синхронизируется" с программой. Например, когда пользователь нажимает клавишу на клавиатуре или щелкает кнопку мыши. (Эти события генерируют «прерывания», которые заставляют ЦП прерывать свою работу и предпринимать некоторые действия для обработки асинхронного события. После обработки события ЦП возвращается к тому, что он делал до того, как оно было прервано.)
Вопрос 3: В чем разница между «компилятором» и «интерпретатором»?
Ответ: Компиляторы и интерпретаторы имеют схожие функции: они берут программу, написанную на каком-либо языке программирования, и переводят ее на машинный язык. Компилятор выполняет перевод сразу. Он создает полную программу на машинном языке, которую затем можно выполнить. Интерпретатор, с другой стороны, просто переводит одну инструкцию за раз, а затем немедленно выполняет эту инструкцию. (Java использует компилятор для преобразования программ Java в байт-код Java, который является машинным языком для воображаемой виртуальной машины Java. Затем программы байт-кода Java выполняются интерпретатором.)
Вопрос 4. Объясните разницу между языки высокого уровня и машинный язык.
Ответ: Программы, написанные на машинном языке данного типа компьютера, могут выполняться непосредственно ЦП. такого типа компьютера. Программы на языке высокого уровня должны быть переведены на машинный язык, прежде чем их можно будет выполнить. (Инструкции машинного языка закодированы в виде двоичных чисел, которые предназначены для использования машиной, а не для чтения или записи людьми. Языки высокого уровня используют синтаксис, который ближе к человеческому языку.)
Вопрос 5 : Если у вас есть исходный код программы Java и вы хотите запустить эту программу, вам потребуются как компилятор, так и интерпретатор. Что делает компилятор Java , и что делает интерпретатор Java?
Ответ: Компилятор Java переводит программы Java в язык, называемый байт-кодом Java. Хотя байт-код похож на машинный язык, он не является машинным языком реального компьютера. Интерпретатор Java используется для запуска скомпилированной программы байт-кода Java. (Каждому типу компьютеров требуется свой собственный интерпретатор байт-кода Java, но все эти интерпретаторы интерпретируют один и тот же язык байт-кода.)
Вопрос 6: Что такое подпрограмма?
< p> Ответ: Подпрограмма — это набор инструкций для выполнения какой-либо задачи, которые были сгруппированы вместе и получили имя. Позже, когда эта задача должна быть выполнена, достаточно вызвать подпрограмму, указав ее имя, а не повторять всю последовательность инструкций.Вопрос 7: Java — это объектно-ориентированный язык программирования. . Что такое объект?
Ответ: Объект состоит из некоторых данных вместе с набором подпрограмм, которые манипулируют этими данными. (Объект — это своего рода «модуль» или автономный объект, который взаимодействует с остальным миром через четко определенный интерфейс. Объект должен представлять некоторую связную концепцию или объект реального мира.)
< p> Вопрос 8: Что такое переменная? (Есть четыре разных понятия, связанных с переменными в Java. Постарайтесь упомянуть в своем ответе все четыре аспекта. Подсказка: один из аспектов — это имя переменной. )Ответ: Переменная — это ячейка памяти, которой присвоено имя, чтобы на нее можно было легко ссылаться в программе. Переменная содержит значение, которое должно быть определенного типа. Значение может быть изменено в процессе выполнения программы.
Вопрос 9: Java является "платформенно-независимым языком". Что это значит?
Ответ: Программа Java может быть скомпилирована один раз в программу Java Bytecode. Затем скомпилированную программу можно запустить на любом компьютере, на котором есть интерпретатор виртуальной машины Java. Другие языки должны быть перекомпилированы для каждой платформы, на которой они будут работать.Суть Java в том, что ее можно выполнять на компьютерах разных типов без перекомпиляции.
Вопрос 10: Что такое "Интернет"? Приведите несколько примеров его использования. (Какие услуги он предоставляет?)
Ответ: Интернет — это сеть, соединяющая миллионы компьютеров по всему миру. Компьютеры, подключенные к Интернету, могут взаимодействовать друг с другом. Интернет можно использовать для Telnet (который позволяет пользователю одного компьютера удаленно подключаться к другому компьютеру), FTP (который используется для копирования файлов между компьютерами) и World Wide Web (который позволяет просматривать «страницы» информации). опубликовано на компьютерах по всему миру.
Машинный язык, в котором код дополнения цифры является дополнением кода цифры.
Связанные термины:
Скачать в формате PDF
Об этой странице
Что такое сборка?
МАЙКЛ Л. ШМИТ, процессор Pentium™, 1995 г.
Машинный язык
Машинный язык — это язык, понятный компьютеру. Это очень сложно понять, но это единственное, с чем может работать компьютер. Все программы и языки программирования в конечном итоге генерируют или запускают программы на машинном языке. Машинный язык состоит из инструкций и данных, которые представляют собой двоичные числа. Машинный язык обычно отображается в шестнадцатеричной форме, чтобы его было немного легче читать. Язык ассемблера почти такой же, как машинный язык, за исключением того, что инструкции, переменные и адреса имеют имена, а не просто шестнадцатеричные числа.
Обзор исследования поддерживаемого инструментами тестирования проектов, основанных на требованиях, на основе моделей
Ралука Маринеску, . Пол Петтерссон, Достижения в области компьютеров, 2015 г.
6.4 АсмЛ
Затем мы выбираем репрезентативный инструмент категории записи до/после и применяем его к нашему рабочему примеру.
Архитектура
Сара Л. Харрис, Дэвид Харрис, в Digital Design and Computer Architecture, 2022
6.4.7 Интерпретация кода машинного языка
Для интерпретации машинного языка необходимо расшифровать поля каждого 32-битного командного слова. В разных инструкциях используются разные форматы, но все форматы имеют общее 7-битное поле кода операции. Таким образом, лучше всего начать с просмотра кода операции, чтобы определить, является ли это инструкцией типа R, I, S/B или U/J.
Перевод машинного языка на язык ассемблера
Переведите следующий код машинного языка на язык ассемблера.
Решение
Во-первых, мы представляем каждую инструкцию в двоичном виде и смотрим на семь младших значащих битов, чтобы найти код операции для каждой инструкции.
0100 0001 1111 1110 1000 0011 1011 0011 (0x41FE83B3)
1111 1101 1010 0100 1000 0010 1001 0011 (0xFDA48293)
Код операции определяет, как интерпретировать остальные биты. Код операции первой инструкции — 01100112 ; Итак, согласно Таблице B.1 в Приложении B, это инструкция R-типа, и мы можем разделить остальные биты на поля R-типа, как показано в верхней части рисунка 6.28. Код операции второй инструкции — 00100112 , что означает, что это инструкция I-типа. Мы группируем оставшиеся биты в формат I-типа, как показано на рис. 6.28, где показан ассемблерный код, эквивалентный двум машинным инструкциям.
Рисунок 6.28. Преобразование машинного кода в ассемблерный код
Языки программирования
ХАРВИ М. ДЕЙТЕЛЬ, БАРБАРА ДЕЙТЕЛЬ, Введение в обработку информации, 1986 г.
Язык ассемблера
Сегодня программисты редко пишут программы на машинном языке. Вместо этого они используют более понятные языки ассемблера или языки высокого уровня. Эти языки частично ответственны за широкое использование компьютеров в настоящее время.
Программисты, обремененные программированием на машинном языке, начали использовать сокращения, похожие на английские, для различных инструкций машинного языка. Эти аббревиатуры, называемые мнемоникой (вспомогательные средства запоминания), относятся к действию, которое необходимо предпринять, и имеют больше смысла для программиста. Например, вместо того, чтобы писать «+ 20» для обозначения сложения, программист может написать мнемоническое «ДОБАВИТЬ»; «SUB» может использоваться для вычитания, «DIV» — для деления и т.п. Даже местам хранения были даны имена. Если бы ячейка 92 содержала сумму, ее можно было бы назвать «ИТОГО» или «СУММА» вместо 92. Получившиеся программы было намного легче понять и модифицировать. Например, в программе расчета заработной платы, которая вычитает общую сумму вычетов из валовой заработной платы для расчета чистой заработной платы, могут появиться следующие инструкции на ассемблере:
К сожалению, компьютеры не могли понять эти программы, поэтому мнемоники все равно приходилось переводить на машинный язык для обработки. В профессии программиста возникла аристократия. «Высший класс» состоял из программистов, которые писали программы с использованием англоподобной мнемотехники.Затем «простолюдины», которых называли ассемблерами, брали эти программы и вручную переводили их на машинный язык — довольно механическая работа. В 1950-х годах программисты поняли, что этот перевод может быть выполнен компьютерами быстрее и точнее, чем люди, и поэтому была написана первая программа на ассемблере, или программа-переводчик (рис. 9-1). Программа инструкций, написанная на языке ассемблера, известна как исходная программа; программа на ассемблере переводит ее в программу на машинном языке, называемую объектной программой.
< бр />р>
Рисунок 9-1. Программа на ассемблере переводит программу на языке ассемблера (исходную программу) в программу на машинном языке (объектную программу).
Программы можно было писать быстрее на языке ассемблера, чем на машинном языке, хотя их все равно приходилось переводить на машинный язык, прежде чем они могли быть выполнены (см. рис. 9-2). Работа по переводу была более чем оправдана благодаря увеличению скорости программирования и уменьшению количества ошибок.
< бр />р>
Рисунок 9-2. Пример мнемоники на языке ассемблера, используемой в некоторых мейнфреймах IBM. Полный набор инструкций предлагает около 200 мнемонических кодов. Коды операций показаны в шестнадцатеричной системе счисления (с основанием 16).
Программы на языке ассемблера также зависят от машины и не переносимы. Программистам приходится писать большое количество инструкций, чтобы выполнять даже простые действия, а программы по-прежнему выглядят на компьютерном языке ( рис. 9-3 ).
< бр />р>
Возможно, в настоящее время языки ассемблера в основном используются при написании операционных систем — программ, управляющих оборудованием и делающих его более доступным для пользователей компьютеров (см. главу 12 ).
Макроинструкции
Следующим шагом в процессе эволюции стало введение макрокоманд . Макроинструкция — это одна инструкция, которая транслируется в несколько инструкций машинного языка. С помощью одной макрокоманды программист может указать действие, для которого обычно требуется несколько инструкций на языке ассемблера. Например, простой макрос SUM A, B, C может использоваться для добавления A к B и сохранения результатов в C.
Всякий раз, когда программа на ассемблере сталкивается с макрокомандой, она сначала выполняет раскрытие макроса. Он создает серию инструкций на языке ассемблера для выполнения функции макроса. Например, СУММА A, B, C может быть расширена до
а затем ассемблер переводил эти инструкции на машинный язык.
Изучение вычислительного языка (обновление главы 15)
Менно ван Заанен, Коллин де ла Игуэра, Справочник по логике и языку (второе издание), 2011 г.
16.1 Введение
При работе с языком (машинное) обучение может принимать различные формы, наиболее важными из которых являются те, которые связаны с изучением формальных языков и грамматик на основе данных. Вопросы в этом контексте находились на пересечении областей индуктивного вывода и компьютерной лингвистики в течение последних 50 лет. Возвращаясь к новаторской работе, Хомский (1955) и Соломонов (1964) по совершенно разным причинам интересовались системами или программами, которые могли бы выводить язык при представлении информации о нем.
Голд (1967) чуть позже предложил объединяющую парадигму под названием идентификация в пределе, а термин грамматический вывод, по-видимому, появился в докторской диссертации Хорнинга (1969).
Вне области лингвистики исследователи и инженеры, занимающиеся распознаванием образов, под влиянием Фу (1974) изобрели алгоритмы и изучали подклассы языков и грамматик с точки зрения того, что можно или нельзя изучить ( Фу и Бут, 1975 г.).
Исследователи в области машинного обучения занимались смежными проблемами (самой известной из них была задача вывода детерминированного конечного автомата на основе примеров и контрпримеров строк). Angluin (1981, 1987) ввел важную настройку активного обучения или обучения на основе запросов, в то время как Питт и Вармут (1993) и Питт (1989) дали несколько результатов, вдохновленных сложностью. , показывая сложность различных проблем обучения.
В более прикладных областях, таких как вычислительная биология, исследователи также работали над изучением грамматик или автоматов из строк, например Brazma et al. (1998) .Точно так же, исходя из компьютерной лингвистики, можно указать на работы, связанные с изучением языка с более сложными грамматическими формализмами (Канадзава, 1998), более статистическими подходами, основанными на построении языковых моделей, или различными системами, введенными для автоматического построения грамматик из предложений (Адриаанс , 1992; ван Заанен, 2000). Обзоры связанных работ в конкретных областях можно найти у Сакакибара (1997 г.), де ла Хигера (2005 г.) и Вольф (2006 г.) .
При рассмотрении истории теории формального обучения можно выделить несколько тенденций. Из «интуитивных» подходов, описанных в ранних исследованиях, возникли более фундаментальные идеи. Основываясь на этих идеях и более широком доступе данных, больше исследований было направлено на прикладное изучение языков. В последнее время наблюдается тенденция требовать более теоретически обоснованных доказательств в прикладной области, в основном из-за увеличения размера проблем и важности наличия гарантий на результаты. Эти тенденции привели к междисциплинарному характеру формального изучения языка. Здесь можно найти аспекты изучения естественного языка (как области применения), машинного обучения и теории информации.
При попытке найти общие черты работы в области изучения языков следует учитывать как минимум два аспекта. Обучение происходит в обстановке. Проблемы в этом измерении — это свойства обучающих данных, такие как положительные/отрицательные экземпляры, количество или уровень шума, а также мера успеха. Другое измерение связано с парадигмами в отношении обобщения обучающих данных. Цель изучения языка состоит в том, чтобы найти язык, который используется для генерации обучающих данных. Этот язык обычно более общий, чем обучающие данные, и требует подхода к обобщению.
Эта глава организована по параметрам обучения и парадигм. Во-первых, мы рассмотрим различные настройки обучения и их параметры. Во-вторых, обсуждаются различные парадигмы обучения, после чего делается вывод.
Как работает Интернет?
С чего начать? Интернет-адреса
Поскольку Интернет представляет собой глобальную сеть компьютеров, каждый компьютер, подключенный к Интернету, должен иметь уникальный адрес. Интернет-адреса имеют вид nnn.nnn.nnn.nnn, где nnn должно быть числом от 0 до 255. Этот адрес известен как IP-адрес. (IP означает Интернет-протокол; подробнее об этом позже.)
На рисунке ниже показаны два компьютера, подключенных к Интернету. ваш компьютер с IP-адресом 1.2.3.4 и другой компьютер с IP-адресом 5.6.7.8. Интернет представлен как абстрактный объект между ними. (По мере продвижения этой статьи Интернет-часть Диаграммы 1 будет объясняться и перерисовываться несколько раз по мере раскрытия деталей Интернета.)
Диаграмма 1 |
Если вы подключаетесь к Интернету через интернет-службу Провайдер (ISP), вам обычно назначается временный IP-адрес на время вашего сеанса телефонного подключения. Если вы подключаетесь к Интернету из локальной сети (LAN), ваш компьютер может иметь постоянный IP-адрес или может получить временный IP-адрес от сервера DHCP (протокол динамической конфигурации хоста). В любом случае, если вы подключены к Интернету, ваш компьютер имеет уникальный IP-адрес.
Стеки и пакеты протоколов
Уровень протокола | Комментарии |
---|---|
Приложение Уровень протоколов | Протоколы, характерные для таких приложений, как WWW, электронная почта, FTP и т. д. |
Уровень протокола управления передачей | TCP направляет пакеты определенному приложению на компьютере, используя номер порта. |
Уровень протокола Интернета | IP направляет пакеты на определенный компьютер, используя IP-адрес . |
Аппаратный уровень | Преобразует двоичные пакетные данные в сетевые сигналы и обратно. (Например, сетевая карта Ethernet, модем для телефонных линий и т. д. .) |
Если бы мы пошли по пути, то сообщение "Привет, компьютер 5.6.7.8!" брал с нашего компа на комп с IP адресом 5.6.7.8, получилось бы примерно так:
<ПР>Сетевая инфраструктура
Теперь вы знаете, как пакеты передаются с одного компьютера на другой через Интернет. Но что между ними? Из чего на самом деле состоит Интернет? Давайте посмотрим на другую диаграмму:
Диаграмма 3 |
Здесь мы видим диаграмму 1, перерисованную с большей детализацией. Физическое подключение через телефонную сеть к интернет-провайдеру было легко догадаться, но помимо этого могло быть какое-то объяснение.
У поставщика услуг Интернета есть пул модемов для своих клиентов с коммутируемым доступом. Это управляется каким-либо компьютером (обычно выделенным), который управляет потоком данных от модемного пула к магистральному или выделенному маршрутизатору. Эту настройку можно назвать сервером портов, поскольку она «обслуживает» доступ к сети. Здесь также обычно собирается информация об оплате и использовании.
После того как ваши пакеты проходят через телефонную сеть и локальное оборудование вашего интернет-провайдера, они перенаправляются на магистральную сеть интернет-провайдера или на магистральную сеть, у которой интернет-провайдер покупает пропускную способность. Отсюда пакеты обычно проходят через несколько маршрутизаторов и несколько магистралей, выделенных линий и других сетей, пока не найдут пункт назначения — компьютер с адресом 5.6.7.8. Но было бы неплохо, если бы мы знали точный маршрут, по которому наши пакеты проходят через Интернет? Как оказалось, способ есть.
Интернет-инфраструктура
Магистральная сеть Интернета состоит из множества крупных сетей, которые соединяются друг с другом. Эти крупные сети известны как поставщики сетевых услуг или NSP. Одними из крупных NSP являются UUNet, CerfNet, IBM, BBN Planet, SprintNet, PSINet и другие. Эти сети взаимодействуют друг с другом для обмена пакетным трафиком. Каждый NSP должен подключаться к трем точкам доступа к сети или NAP. В точках NAP пакетный трафик может переходить из одной магистрали NSP в магистральную сеть другого NSP. NSP также соединяются на городских биржах или MAE. MAE служат той же цели, что и NAP, но находятся в частной собственности. NAP были первоначальными точками подключения к Интернету. И NAP, и MAE называются точками обмена интернет-трафиком или IX. NSP также продают полосу пропускания более мелким сетям, таким как интернет-провайдеры и более мелкие поставщики полосы пропускания. На рисунке ниже показана эта иерархическая инфраструктура.
Диаграмма 4 |
Это не точное представление реального фрагмента Интернета. Диаграмма 4 предназначена только для демонстрации того, как поставщики сетевых услуг могут взаимодействовать друг с другом и более мелкими интернет-провайдерами. Ни один из компонентов физической сети не показан на диаграмме 4 так, как на диаграмме 3. Это связано с тем, что магистральная инфраструктура отдельного NSP сама по себе представляет собой сложный рисунок. Большинство поставщиков сетевых услуг публикуют карты своей сетевой инфраструктуры на своих веб-сайтах, и их легко найти. Нарисовать реальную карту Интернета было бы почти невозможно из-за его размера, сложности и постоянно меняющейся структуры.
Иерархия интернет-маршрутизации
Как же пакеты попадают в Интернет? Каждый ли компьютер, подключенный к Интернету, знает, где находятся другие компьютеры? Пакеты просто «рассылаются» на каждый компьютер в Интернете? Ответ на оба предыдущих вопроса — «нет». Ни один компьютер не знает, где находятся другие компьютеры, и пакеты не отправляются каждому компьютеру. Информация, используемая для доставки пакетов к месту назначения, содержится в таблицах маршрутизации, хранящихся на каждом маршрутизаторе, подключенном к Интернету.
Маршрутизаторы — это коммутаторы пакетов.Маршрутизатор обычно подключается между сетями для маршрутизации пакетов между ними. Каждый маршрутизатор знает о своих подсетях и используемых ими IP-адресах. Маршрутизатор обычно не знает, какие IP-адреса находятся «над ним». Изучите диаграмму 5 ниже. Черные ящики, соединяющие магистрали, — это маршрутизаторы. Более крупные магистрали NSP наверху подключаются к NAP. Под ними несколько подсетей, а под ними еще подсетей. Внизу две локальные сети с подключенными компьютерами.
Диаграмма 5 |
Когда пакет поступает на маршрутизатор, маршрутизатор проверяет IP-адрес, помещенный туда уровнем протокола IP на исходном компьютере. Маршрутизатор проверяет свою таблицу маршрутизации. Если сеть, содержащая IP-адрес, найдена, пакет отправляется в эту сеть. Если сеть, содержащая IP-адрес, не найдена, маршрутизатор отправляет пакет по маршруту по умолчанию, обычно вверх по магистральной иерархии к следующему маршрутизатору. Будем надеяться, что следующий маршрутизатор будет знать, куда отправить пакет. Если это не так, пакет снова направляется вверх, пока не достигнет магистрали NSP. Маршрутизаторы, подключенные к магистралям NSP, содержат самые большие таблицы маршрутизации, и здесь пакет будет перенаправлен на правильную магистраль, где он начнет свое путешествие «вниз» через все более и более мелкие сети, пока не найдет пункт назначения.
Доменные имена и разрешение адресов
Многие компьютеры, подключенные к Интернету, содержат часть базы данных DNS и программное обеспечение, позволяющее другим пользователям получать к ней доступ. Эти компьютеры называются DNS-серверами. Ни один DNS-сервер не содержит всю базу данных; они содержат только его подмножество. Если DNS-сервер не содержит доменного имени, запрошенного другим компьютером, DNS-сервер перенаправляет запрашивающий компьютер на другой DNS-сервер.
Диаграмма 6 |
Служба доменных имен имеет иерархическую структуру, аналогичную к иерархии IP-маршрутизации. Компьютер, запрашивающий разрешение имени, будет перенаправлен «вверх» по иерархии до тех пор, пока не будет найден DNS-сервер, способный разрешить доменное имя в запросе. На рис. 6 показана часть иерархии. В верхней части дерева находятся корни доменов. Некоторые из старых, более распространенных доменов видны вверху. Что не показано, так это множество DNS-серверов по всему миру, которые формируют остальную часть иерархии.
При настройке подключения к Интернету (например, для локальной сети или удаленного доступа к сети в Windows) в процессе установки обычно указываются один первичный и один или несколько вторичных DNS-серверов. Таким образом, любые интернет-приложения, которым требуется разрешение доменных имен, смогут работать правильно. Например, когда вы вводите веб-адрес в свой веб-браузер, браузер сначала подключается к вашему основному DNS-серверу. После получения IP-адреса для введенного вами доменного имени браузер подключается к целевому компьютеру и запрашивает нужную веб-страницу.
Если вы используете удаленный доступ к сети:
Откройте окно удаленного доступа к сети (которое можно найти в проводнике Windows под дисководом компакт-дисков и над сетевым окружением). Щелкните правой кнопкой мыши свое подключение к Интернету и выберите «Свойства». Внизу окна свойств подключения нажмите Настройки TCP/IP. кнопка.
Если у вас есть постоянное подключение к Интернету:
щелкните правой кнопкой мыши Сетевое окружение и выберите Свойства. Щелкните Свойства TCP/IP. Выберите вкладку Конфигурация DNS вверху.
Теперь вы должны посмотреть на IP-адреса ваших DNS-серверов. Здесь вы можете отключить DNS или установить для своих DNS-серверов значение 0.0.0.0. (Сначала запишите IP-адреса ваших DNS-серверов. Возможно, вам также придется перезагрузить Windows.) Теперь введите адрес в веб-браузере. Браузер не сможет разрешить доменное имя, и вы, вероятно, получите неприятное диалоговое окно, объясняющее, что DNS-сервер не найден. Однако, если вы введете соответствующий IP-адрес вместо имени домена, браузер сможет получить нужную веб-страницу. (Используйте ping для получения IP-адреса перед отключением DNS.) Другие операционные системы Microsoft аналогичны.
Пересмотр интернет-протоколов
Как упоминалось ранее в разделе о стеках протоколов, можно предположить, что в Интернете используется множество протоколов. Это верно; существует множество коммуникационных протоколов, необходимых для работы Интернета. К ним относятся протоколы TCP и IP, протоколы маршрутизации, протоколы управления доступом к среде, протоколы прикладного уровня и т. д. В следующих разделах описаны некоторые из наиболее важных и часто используемых протоколов в Интернете. Сначала обсуждаются протоколы более высокого уровня, а затем протоколы более низкого уровня.
Когда вы вводите URL-адрес в веб-браузере, происходит следующее:
Протоколы приложений: SMTP и электронная почта
Когда вы открываете почтовый клиент для чтения электронной почты, обычно происходит следующее:
<ПР>Протокол управления передачей
Под прикладным уровнем в стеке протоколов находится уровень TCP. Когда приложения открывают соединение с другим компьютером в Интернете, отправляемые ими сообщения (используя определенный протокол прикладного уровня) передаются по стеку на уровень TCP. TCP отвечает за маршрутизацию протоколов приложений к правильному приложению на целевом компьютере. Для этого используются номера портов. Порты можно рассматривать как отдельные каналы на каждом компьютере. Например, вы можете просматривать веб-страницы, читая электронную почту. Это связано с тем, что эти два приложения (веб-браузер и почтовый клиент) использовали разные номера портов. Когда пакет поступает на компьютер и продвигается вверх по стеку протоколов, уровень TCP решает, какое приложение получит пакет, основываясь на номере порта.
TCP работает следующим образом:
<УЛ>TCP не является текстовым протоколом. TCP — это ориентированная на соединение, надежная служба потока байтов. Ориентированность на соединение означает, что два приложения, использующие TCP, должны сначала установить соединение перед обменом данными. TCP надежен, потому что для каждого полученного пакета отправителю отправляется подтверждение доставки. TCP также включает в свой заголовок контрольную сумму для проверки полученных данных на наличие ошибок. Заголовок TCP выглядит следующим образом:
Диаграмма 7 |
Обратите внимание, что здесь нет места для IP-адреса в заголовке TCP. Это потому, что TCP ничего не знает об IP-адресах. Задача TCP заключается в надежной передаче данных уровня приложения от приложения к приложению. Задача передачи данных от компьютера к компьютеру — это работа IP.
Интернет-протокол
В отличие от TCP, IP является ненадежным протоколом без установления соединения. IP не важно, дойдет ли пакет до адресата или нет. IP также не знает о соединениях и номерах портов. Работа IP также заключается в отправке и маршрутизации пакетов на другие компьютеры. IP-пакеты являются независимыми объектами и могут поступать не по порядку или вообще не поступать. Задача TCP состоит в том, чтобы убедиться, что пакеты прибывают и находятся в правильном порядке. Единственное, что у IP общего с TCP, — это то, как он получает данные и добавляет свою собственную информацию заголовка IP к данным TCP. Заголовок IP выглядит следующим образом:
Диаграмма 8 |
Выше мы видим IP-адреса отправителя и принимающие компьютеры в заголовке IP. Ниже показано, как выглядит пакет после прохождения через прикладной уровень, уровень TCP и уровень IP. Данные прикладного уровня сегментируются на уровне TCP, добавляется заголовок TCP, пакет передается на уровень IP, добавляется заголовок IP, а затем пакет передается через Интернет.
Подведение итогов
Теперь вы знаете, как работает Интернет. Но как долго он будет оставаться таким? Версия IP, используемая в настоящее время в Интернете (версия 4), позволяет использовать только 232 адреса. В конце концов свободных IP-адресов не останется. Удивлен? Не волнуйтесь. IP версии 6 прямо сейчас тестируется на исследовательской базе консорциумом исследовательских институтов и корпораций. И после этого? Кто знает.Интернет прошел долгий путь с момента его создания в качестве исследовательского проекта министерства обороны. Никто на самом деле не знает, чем станет Интернет. Однако одно можно сказать наверняка. Интернет объединит мир, как никакой другой механизм. Информационная эра в самом разгаре, и я рад быть ее частью.
Рус Шулер, 1998 г.
Обновления 2002 г.
Ресурсы
Ниже приведены некоторые интересные ссылки, связанные с некоторыми обсуждаемыми темами. (Надеюсь, они все еще работают. Все открываются в новом окне.)
Библиография
Следующие книги являются отличным источником информации и очень помогли в написании этой статьи. Я считаю, что книга Стивенса является лучшим справочником по TCP/IP и может считаться библией Интернета. Книга Шелдона охватывает гораздо более широкий круг вопросов и содержит огромное количество информации о сетях.
Узнайте, что такое байт-код Python, как Python использует его для выполнения вашего кода и как знание того, что он делает, может вам помочь.
Если вы когда-либо писали или даже использовали Python, вы, вероятно, привыкли видеть файлы исходного кода Python; у них есть имена, оканчивающиеся на .py . Возможно, вы также видели файл другого типа с именем, оканчивающимся на .pyc , и, возможно, слышали, что это файлы «байт-кода» Python. (Это немного сложнее увидеть в Python 3 — вместо того, чтобы оказаться в том же каталоге, что и ваши файлы .py, они попадают в подкаталог с именем __pycache__ .) И, возможно, вы слышали, что это своего рода экономия времени. это предотвращает необходимость повторного анализа исходного кода Python при каждом запуске.
Но помимо фразы "о, это байт-код Python", вы действительно знаете, что находится в этих файлах и как Python их использует?
Если нет, то сегодня ваш счастливый день! Я расскажу вам, что такое байт-код Python, как Python использует его для выполнения вашего кода и как знание этого может вам помочь.
Как работает Python
Python часто называют интерпретируемым языком, на котором ваш исходный код транслируется в собственные инструкции ЦП по мере выполнения программы, но это верно лишь частично. Python, как и многие интерпретируемые языки, фактически компилирует исходный код в набор инструкций для виртуальной машины, а интерпретатор Python является реализацией этой виртуальной машины. Этот промежуточный формат называется «байт-код».
Таким образом, те файлы .pyc, которые Python оставляет лежать без дела, — это не просто какая-то «более быстрая» или «оптимизированная» версия вашего исходного кода; это инструкции байт-кода, которые будут выполняться виртуальной машиной Python во время работы вашей программы.
Давайте рассмотрим пример. Вот классический "Hello, World!" написано на Python:
А вот байт-код, в который он превращается (переведенный в удобочитаемую форму):
Если вы наберете эту функцию hello() и запустите ее с помощью интерпретатора CPython, Python выполнит приведенный выше листинг. Однако это может показаться немного странным, поэтому давайте более подробно рассмотрим, что происходит.
Внутри виртуальной машины Python
Дополнительные ресурсы по Python
CPython использует виртуальную машину на основе стека. То есть он полностью ориентирован на структуры данных стека (где вы можете «поместить» элемент на «верх» структуры или «вытолкнуть» элемент из «верха»).
CPython использует три типа стеков:
- Стек вызовов. Это основная структура работающей программы Python. В нем есть один элемент — «фрейм» — для каждого активного в данный момент вызова функции, причем нижняя часть стека является точкой входа в программу. Каждый вызов функции помещает новый фрейм в стек вызовов, и каждый раз, когда вызов функции возвращается, его фрейм извлекается.
- В каждом кадре есть стек оценки (также называемый стеком данных). В этом стеке происходит выполнение функции Python, а выполнение кода Python состоит в основном из помещения элементов в этот стек, манипулирования ими и извлечения их обратно.
- Кроме того, в каждом кадре есть стек блоков. Это используется Python для отслеживания определенных типов управляющих структур: циклов, блоков try/except, а с блоками — все они приводят к тому, что записи помещаются в стек блоков, а стек блоков извлекается всякий раз, когда вы выходите из одной из этих структур. Это помогает Python узнать, какие блоки активны в любой момент, так что, например, оператор continue или break может повлиять на нужный блок.
Большинство инструкций байт-кода Python управляют оценочным стеком текущего кадра стека вызовов, хотя есть некоторые инструкции, которые выполняют другие действия (например, переход к определенным инструкциям или управление стеком блоков).
Чтобы понять это, предположим, что у нас есть код, вызывающий функцию, например такой: my_function(my_variable, 2) . Python преобразует это в последовательность из четырех инструкций байт-кода:
- Инструкция LOAD_NAME, которая ищет объект функции my_function и помещает его на вершину стека вычислений
- Еще одна инструкция LOAD_NAME для поиска переменной my_variable и помещения ее в верхнюю часть стека вычислений.
- Инструкция LOAD_CONST для помещения буквального целочисленного значения 2 в верхнюю часть стека вычислений.
- Инструкция CALL_FUNCTION
Инструкция CALL_FUNCTION будет иметь аргумент 2, что указывает на то, что Python должен извлечь два позиционных аргумента из вершины стека; тогда функция, которую нужно вызвать, будет сверху, и ее также можно извлечь (для функций, включающих аргументы ключевого слова, используется другая инструкция — CALL_FUNCTION_KW, но с аналогичным принципом работы, и используется третья инструкция, CALL_FUNCTION_EX). для вызовов функций, которые включают распаковку аргументов с помощью операторов * или **). Как только Python получит все это, он выделит новый фрейм в стеке вызовов, заполнит локальные переменные для вызова функции и выполнит байт-код my_function внутри этого фрейма. Как только это будет сделано, фрейм будет извлечен из стека вызовов, а в исходном фрейме возвращаемое значение my_function будет помещено поверх стека вычислений.
Доступ и понимание байт-кода Python
Если вы хотите поэкспериментировать с этим, вам очень поможет модуль dis в стандартной библиотеке Python; модуль dis предоставляет «дизассемблер» для байт-кода Python, упрощая получение удобочитаемой версии и поиск различных инструкций байт-кода. Документация по модулю dis описывает его содержимое и предоставляет полный список инструкций байт-кода, а также то, что они делают и какие аргументы они принимают.
Например, чтобы получить приведенный выше список байт-кодов для функции hello(), я ввел его в интерпретатор Python, а затем запустил:
Функция dis.dis() будет дизассемблировать функцию, метод, класс, модуль, объект скомпилированного кода Python или строковый литерал, содержащий исходный код, и распечатать удобочитаемую версию. Еще одна удобная функция в модуле dis — это distb(). Вы можете передать ему объект трассировки Python или вызвать его после возникновения исключения, и он разберет самую верхнюю функцию в стеке вызовов во время исключения, распечатает ее байт-код и вставит указатель на инструкцию, вызвавшую исключение. исключение.
Также полезно взглянуть на скомпилированные объекты кода, которые Python создает для каждой функции, поскольку при выполнении функции используются атрибуты этих объектов кода. Вот пример функции hello():
Объект кода доступен как атрибут __code__ функции и содержит несколько важных атрибутов:
- co_consts — это кортеж любых литералов, встречающихся в теле функции.
- co_varnames – это кортеж, содержащий имена любых локальных переменных, используемых в теле функции.
- co_names — это кортеж любых нелокальных имен, на которые есть ссылки в теле функции
Многие инструкции байт-кода, особенно те, которые загружают значения для помещения в стек или сохраняют значения в переменных и атрибутах, используют индексы в этих кортежах в качестве аргументов.
Итак, теперь мы можем понять листинг байт-кода функции hello():
- LOAD_GLOBAL 0 : указывает Python искать глобальный объект, на который ссылается имя с индексом 0 в co_names (это функция печати), и помещать его в стек вычислений.
- LOAD_CONST 1 : принимает литеральное значение с индексом 1 в co_consts и помещает его (значение с индексом 0 — это литерал None , который присутствует в co_consts, потому что вызовы функций Python имеют неявное возвращаемое значение None, если нет явного оператора return достигнуто)
- CALL_FUNCTION 1: сообщает Python о вызове функции; ей нужно будет извлечь один позиционный аргумент из стека, тогда новая вершина стека будет вызываемой функцией.
«Необработанный» байт-код — нечитаемый человеком байт — также доступен в объекте кода как атрибут co_code . Вы можете использовать список dis.opname для поиска имен инструкций байт-кода по их десятичным значениям байтов, если вы хотите попытаться вручную дизассемблировать функцию.
Использование байт-кода
Теперь, когда вы дочитали до этого места, вы можете подумать: "Хорошо, я думаю, это круто, но какая практическая ценность в этом знании?" Отложив в сторону любопытство ради любопытства, понимание байт-кода Python полезно в нескольких отношениях.
Во-первых, понимание модели выполнения Python поможет вам разобраться в своем коде. Людям нравится шутить о том, что C является своего рода «портативным ассемблером», где вы можете сделать хорошие предположения о том, в какие машинные инструкции превратится конкретный фрагмент исходного кода C. Понимание байт-кода даст вам те же возможности, что и при работе с Python: если вы сможете предвидеть, в какой байт-код превратится ваш исходный код Python, вы сможете принимать более обоснованные решения о том, как его писать и оптимизировать.
Во-вторых, понимание байт-кода – полезный способ ответить на вопросы о Python. Например, я часто вижу новых программистов на Python, задающихся вопросом, почему одни конструкции быстрее других (например, почему <> быстрее, чем dict() ). Зная, как получить доступ к байт-коду Python и прочитать его, вы сможете найти ответы (попробуйте: dis.dis("<>") или dis.dis("dict()")).
Наконец, понимание байт-кода и того, как Python его выполняет, дает полезную информацию об особом виде программирования, которым программисты на Python не часто занимаются: программирование, ориентированное на стек. Если вы когда-либо использовали стек-ориентированный язык, такой как FORTH или Factor, это может быть старыми новостями, но если вы не знакомы с этим подходом, то изучение байт-кода Python и понимание того, как работает его стек-ориентированная модель программирования, будет отличным решением. способ расширить свои знания в области программирования.
Дополнительная литература
Если вы хотите узнать больше о байт-коде Python, виртуальной машине Python и о том, как они работают, я рекомендую следующие ресурсы:
Читайте также:
- Подфайл, чем открыть
- Не удалось инициализировать фотошоп из-за ошибки диска. Что делать
- Это не компьютерная модель.
- Не удалось упаковать файл в электронную почту vipnet
- Wsl, где хранятся файлы