Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Python.docx
Скачиваний:
72
Добавлен:
19.05.2015
Размер:
116.84 Кб
Скачать

Введение Типографские соглашения

Важные понятиявыделяются в тексте полужирным шрифтом.

Команды, код программы и результаты их работывыделяются моноширным шрифтом.

URL-cсылки в тексте выделяются подчёркиванием. Обратите внимание, что не подчёркнутые знаки препинания после ссылки не входят в её состав.

О компьютерах и языках программирования

Компьютер это машина, предназначенная для обработки информации. Хотя на первый взгляд компьютеры выглядят не так как другие машины, на самом деле, по сути, они такие же машины, как те, которые состоят из шестерёнок, моторчиков, рукояток. Компьютеры не являются более «умными», чем другие машины, но они состоят из огромного числа элементов и работают очень быстро. В этом смысле компьютеры, вероятно, являются самыми сложными машинами, которые делает человек (если не считать машин, которые сами включают в себя компьютеры).

Рассмотрим музыкальную шкатулку, такую как иногда продают в сувенирных магазинах, в которой есть цилиндр со штырьками. Это тоже машина, только очень простая и очень медленная. Когда вращают ручку, барабан вращается и штырьки, зацепляясь за металлическую гребёнку, заставляют звучать музыку. И хотя музыка это достаточно сложная и интересная вещь, сама шкатулка не является «умной» машиной, она просто так устроена, что воспроизводит определённую мелодию. Шкатулка с одним цилиндром будет играть Моцарта, а с другим – Баха.

Если сделать шкатулку, в которой цилиндр можно заменять, то такая шкатулка сможет играть разные мелодии. Барабан шкатулки представляет собой программу– последовательность инструкций, предназначенную для выполнения машиной. Программу можно закодировать разными способами – штырьками на барабане, отверстиями на картонной карточке или бумажной полосе. Главное сделать машину, которая будет соответствующим образом реагировать.

Компьютеры очень похожи на такие музыкальные шкатулки. Только вместо того, чтобы издавать звуки разной частоты они выполняют другие операции – например, складывают числа или пробивают отверстия в других картах, чтобы выдать результат. Компьютер можно представить как счёты, которые управляются карточками. Первые компьютеры действительно управлялись карточками и выводили на них результат своей работы. С тех пор люди научились делать компьютеры, с которыми можно взаимодействовать более удобными методами – с помощью клавиатур, экранов, принтеров, WiFiиUSB-флешек. Но суть остаётся той же, за исключением того, что флешка занимает гораздо меньше места и вмещает гораздо больше информации, чем стопка карточек.

Современные компьютеры включают в себя большое количество модулей, которые умеют выполнять различные команды. Например, модуль для выполнения арифметических действий умеет складывать, вычитать, умножать и делить числа. Модуль для взаимодействия с монитором – выводить на мониторе точки разных цветов, и так далее. Каждая команда кодируется определённым числом. Каждое число, которое соответствует осмысленной команде для компьютера, называют машинной инструкцией. Полный набор кодов операций конкретной вычислительной машины называютмашинным кодом.

Существенным отличием компьютера от музыкальной шкатулки является то, что компьютер имеет внутреннее состояние. Выступ на определённом месте барабана всегда заставит музыкальную шкатулку издать один и тот же звук, и это не зависит от того, что она делала прежде. Однако результат операции увеличения числа на единицу зависит от того, какое число увеличивают. Устройство компьютера позволяет ему запоминать и хранить внутри себя числа, операции над которыми он выполняет. Набор всех запомненных чисел и представляет внутреннее состояние компьютера. Результат выполнения компьютером операций зависит и от того, какую операцию ему предписали выполнить, и от внутреннего состояния. А внутреннее состояние, в свою очередь, определяется тем, что компьютер делал раньше. По сути, иметь внутреннее состояние означает обладать памятью. Однако если запустить компьютер с самого начала с одной и той же программой и с одними и теми же исходными данными, то он всегда получит один и тот же результат1. Такое свойство компьютерных вычислений называютдетерминированностью.

Большинство современных компьютеров являются универсальными. Это означает, что один и тот же компьютер может быть использован для решения разных задач. Как музыкальная шкатулка, которая будет играть разные мелодии, если заменять её барабан, универсальный компьютер может выполнять разные функции, если заменять в нём программу. Универсальные компьютеры получили самое широкое распространение потому, что гораздо проще и дешевле запустить на универсальном компьютере новую программу, чем разработать и изготовить специализированный компьютер для решения новой задачи.

Появление универсальных компьютеров дало развитие сфере программирования– разработке программ для таких компьютеров. Программирование являетсяинженерной дисциплиной, то есть областью деятельности, направленной на практическое приложение научных знаний с целью обращения природных ресурсов в пользу человека.

Однако программирование существенно отличается от других видов инженерии – машиностроения, строительства, горного дела и других. Отличие это состоит в том, что программист создаёт не материальные, а информационные объекты - программы. Для программиста не является существенным, как именно представлена его программа – в виде выступов на барабане, отверстий в картоне или электрических зарядов в микросхеме. Существенна лишь последовательность действий, которую кодирует эта программа.

Современные технологии позволяют записывать большие объемы информации с минимальными затратами времени и материальных ресурсов. Создать файл с текстом программы гораздо проще, чем вставлять штырьки в барабаны, обрабатывать металл, бетон или другие материалы. Кроме того, программисты гораздо менее, чем все остальные инженеры, ограничены законами природы – в своём выборе они не скованны требованиями сопромата или законом всемирного тяготения2. Это приводит к тому, что программисты могут создавать и создают такие программы, которые только смогут себе представить, в том числе очень сложные. Поэтому программирование может быть очень интересным, увлекательным и разнообразным занятием.

Однако гибкость программ является не только даром для программистов, но и большой проблемой. Платой за высокую сложность и большую творческую составляющую в их работе является сложность проверки правильности полученного результата и оценки сроков, необходимых для реализации того или иного проекта. Поэтому, в программной инженерии куда больше, чем во всех остальных видах инженерной деятельности случаев, когда проекты выполняются с большими задержками сроков, превышениями бюджетов или вообще не выполняются. Ещё в 1968 году это явление получило название «кризис программного обеспечения»3. Надо отметить, что, не смотря на массу предпринятых усилий, с тех пор мало что изменилось.

Одной из самых фундаментальных идей в программировании, следование которой помогает справиться со сложностью, является идея повторного использования кода(англ.codereuse). Эта идея гласит, что однажды решив задачу, для её решения в последующем следует использовать уже готовое решение, насколько это будет возможно. Развитие этой идеи можно проследить во многих методах, парадигмах и приёмах программирования которые появились за время развития программной инженерии.

По всей видимости, самым первым способом повторного использования кода стала идея разбиения программы на функции. В программировании под функцией понимают именованный фрагмент кода, к которому можно обратиться из других мест в программе. Как и математические функции, функции в программировании могут получать входные параметры и возвращать значения.

Создание библиотекстало другим воплощением идеи повторного использования кода. В программировании под библиотекой понимают сборник программного кода (а также данных, документации), который имеет строго определённый интерфейс4, предназначен для решения определённых задач и может быть использован в различных программах. Если функции по большей части позволяют использовать свой собственный код в рамках одной программы, то библиотеки позволяют использовать чужие наработки. Например, тогда как процессор компьютера обеспечивает выполнение простых арифметических операций, библиотека может содержать код для вычисления более сложных функций, например тригонометрических. Библиотеки часто содержат код для работы с различными внешними устройствами, форматами файлов. Используя библиотеку, программист может не задумываться о том, как можно вычислитьsin(x) имея в своём распоряжении только сложение, вычитание, умножение и деление, или как именно выполняется преобразование Фурье при сжатии изображения в форматеJPG. Он может взять готовое решение и использовать его.

Универсальность компьютеров означает, в частности, что можно разработать программу, которая сама может моделировать работу компьютера. На первый взгляд это может показаться всего лишь забавным фактом из области компьютерной науки, особенно если представить, что внутри этого моделируемого компьютера можно написать ещё одну программу, которая тоже будет моделировать компьютер. А в той программе можно написать ещё одну…5

Однако идея моделирования компьютера внутри компьютера имеет и большое практическое значение. Рассмотрим, как будет выглядеть такая программа. Эта программа должна, во-первых, хранить своё состояние, то есть уметь запоминать числа. Во-вторых, она должна уметь выполнять различные операции с этими числами. И в третьих, она должна уметь считывать программу и выполнять операции в предписанном ей порядке. По сути, такая программа будет компьютером, но сделанным не из транзисторов, а реализованным программно. Такие программы существуют, и называются виртуальными машинами (англ.virtualmachine, сокращённоvm)6.

Почему виртуальные машины полезны? В настоящее время существует большое число различных компьютеров. Персональный компьютер весьма существенно отличается от того компьютера, который сейчас принято называть телефоном, а они оба – от компьютера, который находится в SIM-карте этого телефона7. Эти компьютеры имеют и разную наборы команд, и разную архитектуру в целом. Это означает, что программа, подходящая для одного из них, не сможет работать на другом. Вспомним аналогию с музыкальной шкатулкой – если вставить в шкатулку барабан, предназначенный для шкатулки другого типа, то вместо музыки мы услышим бессвязную какофонию. Таким образом, для каждого типа компьютера придётся разрабатывать свой вариант программы.

Если же для каждого компьютера реализовать виртуальные машины, которые бы понимали один и тот же набор команд (и были бы, в этом смысле, разыми реализациями одной и той же машины), то дальше мы сможем выполнить программы, написанные для этой машины, на компьютере любого типа. Поэтому, использование виртуальных машин позволяет реализовать идею повторного использования кода на разнотипных компьютерах.

Создавая наборы команд, разработчики компьютеров стараются делать машинные коды как можно более компактными. Это упрощает разработку процессоров (чтобы распознать более длинную команду может потребоваться больше транзисторов) и позволяет самим программам быть компактнее8. Поэтому, машинные коды представляют собой числа. Однако для человека такая запись не удобна. Но идея виртуальной машины может помочь и тут.

При разработке виртуальной машины программист не связан ограничениями на размер и форму представления команд. Поэтому, вместо неудобных для запоминания цифр можно использовать гораздо лучше запоминающиеся человеком слова. Кроме того, наряду с простейшими операциями, которые обычно выполняются компьютерами, можно предусмотреть и более сложные операции. В результате, написание программы для такой виртуальной машины существенно упростится. Впрочем, в данном случае чаще говорят не о виртуальной машине, а о языке программирования.

По сути, язык программирования это спецификация виртуальной машины. Он описывает, какого типа данные могут храниться во внутреннем состоянии, какие операции можно с ними выполнять и как корректно описывать последовательность выполнения этих операций, чтобы получить программу. Что касается реализации языка программирования, то тут возможны два варианта.

Первый вариант называется компиляцией. В этом случае текст программы обрабатывается специальной программой – компилятором, который анализирует его и переводит в эквивалентную программу на машинном коде. Полученный машинный код непосредственно выполняется на компьютере. Этот вариант, в большинстве случаев, обеспечивает максимальную скорость выполнения программы.

Другой вариант называется интерпретацией. В этом случае программа не переводится в машинный код, а выполняется другой программой –интерпретатором. Классические (и наиболее простые и медленные) интерпретаторы последовательно читают текст программы и выполняют предписанные ей действия – выполняют арифметические операции, выводят результаты и т.д. Многие современные интерпретаторы, сначала переводит текст программы в промежуточный код, который затем интерпретируется специальной виртуальной машиной.

Говоря о языках программирования часто используют термины язык программирования низкого уровняилиязык программирования высокого уровня. При этом под уровнем языка программирования понимают уровень абстракции этого языка от деталей устройства компьютера. В качестве самого низкоуровневого языка (который практически никогда не используется программистами людьми) можно рассмотреть машинный код. На следующем уровне находятся языки ассемблера, в которых по сути дела машинные коды заменены на буквенные аббревиатуры. Далее ситуация оказывается более запутанной, так как сравнивая практически любую пару языков программирования можно найти у каждого из них свойства, позволяющие отнести их к разным уровням. Сейчас к языкам высокого уровня относят такие языки какC++,C#,Java,JavaScript,Python,Ruby,Lisp.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]