Содержание
В этом занятии нужно разобраться в блок-схемах, интерпретаторах и компиляторах, арифметике в Python, попрактиковаться в работе с командной строкой.
Интерпретаторы и компиляторы
Машинный код
Для непосредственного выполнения компьютером программа должна быть представлена в форме машинного кода . Такая запись содержит только номера команд процессора, необходимые данные и адреса ячеек памяти. И выглядит примерно следующим образом (для удобства двоичные данные чаще всего записываются в шестнадцатеричной форме, где 2 символа соответствуют 1 байту данных — именно поэтому шестнадцатеричная система счисления является такой популярной в программировании):
BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
Ассемблеры
Для написания таких программ применяются язык ассемблера, которые позволяют записывать команды вместо числовой формы в текстовой (MOV, ADD, IN, OUT) и содержат некоторые простые средства для облегчения написания программы. Но даже в таком «украшенном» виде программа остается чрезвычайно близкой к машинному коду и поэтому язык ассемблера относят к низкоуровневым языкам программирования (то есть таких, которые близки к уровню машинного кода).
Несмотря на неудобство написания, такой код выполняется с высокой скоростью и может быть максимально оптимизирован, так как программист имеет доступ буквально к каждому биту в нем. Поэтому чаще всего низкоуровневые языки применяются для программирования микросхем и отдельных действий в приложениях, где быстродействие является критической.
Ассемблер же — это программа, которая преобразует код, написанный на языке ассемблера, окончательно в машинный код. Но часто и сам язык называют сокращенно «ассемблером».
Трансляторы
Большинство программ пишется на высокоуровневых алгоритмических языках программирования. Такие языки обычно имеют сложный синтаксис, используют слова-операторы близкие к человеческой речи и — что самое главное — реализует алгоритмические структуры для простого и понятного записи программы.
С другой стороны, для выполнения компьютером такая программа должна быть превращена в машинный код или хотя бы переписана на низкоуровневый язык (а дальше уже ассемблер обеспечит ее понимание машиной). Причем команды высокоуровневого языка программирования могут быть достаточно сложными и соответствовать нескольким или даже нескольким десяткам машинных команд. Этот процесс преобразования называется трансляцией, а программы, которые его выполняют — трансляторами.
В этом контексте трансляторы по принципу работы делятся на 2 типа: компиляторы и интерпретаторы .
Компиляторы
Компилятор считывает сразу всю программу и переписывает ее машинным кодом или языком ассемблера. Процесс трансляции, который при таком подходе называется компиляцией, происходит один раз и результат сохраняется. Если код программы позже будет изменен, ее необходимо будет перекомпилировать.
Скомпилированая программа привязывается к операционной системе и набору команд процессора, поэтому не всегда может быть перенесена и выполнена на другом компьютере. С другой стороны она является «готовой к употреблению» и может быть быстро выполнена на той же или аналогичной машине: с точки зрения пользователя — просто щелкнуть и запустить, с точки зрения компьютера — просто прочитать набор команд и выполнить.
Интерпретаторы
Интерпретатор считывает исходный код программы по одной инструкции и, в простейшем случае, сразу пытается их «переводить» и выполнять. Это позволяет программисту быстрее проверять выполнение программы и находить ошибки в коде. Кроме того, такая программа может быть легко перенесена на другую машину и, если там есть нужный интерпретатор, выполненная им — независимо от операционной системы и процессора. А разницу между особенностями различных компьютеров покрывает сам интерпретатор, который, конечно, будет немного отличаться.
В такой схеме выполнение программы будет занимать немного больше времени — так как при этом каждый раз происходит анализ кода и его преобразования.
Поэтому для повышения быстродействия большинство современных интерпретаторов на самом деле работают по смешанной схеме, сначала транслируя исходный код программы в некоторую промежуточную форму — так называемый байт-код. Он является кодом низшего уровня и ближе к ассемблеру, но машинно-независимый — потому выполняется не напрямую компьютером, а некоторой виртуальной машиной, которая входит в состав интерпретатора. Это позволяет, при отсутствии изменений в оригинальной программе, не перечитывать ее полностью, а использовать байт-код как «полуфабрикат» для работы. Выполнение байт-кода все равно медленнее машинного кода, но такой подход является компромиссом, который пытается совместить преимущества интерпретации и компиляции.
Python — интерпретируемый язык программирования. И также создает байт-код для более быстрой работы. Обратите внимание на файлы с расширением .pyc, которые появляются в папке с текстами ваших программ во время их исполнения, — это он и есть.