Языки программирования 1
Компьютер – штука целиком и полностью электрическая, т.е понимает только есть ток или нет, горит лампочка или нет, 1 или 0. А человеку от него требуются самые разнообразные вещи.
Язык программирования это то, что позволяет писать команды, которые компьютер сможет выполнить. Кроме этого понятно, что есть чистое электрическое железо, а есть то, что опять же придумывает человек, чтобы другому человеку было проще писать команды. Т.е понятно, что компьютер это ещё и среда обитания в которой, по возможности, должно быть удобно.
Первое, что придумали это байт. Пусть машина понимает 0 и 1, но пусть она берёт сразу набор этих нулей и единиц, в котором таких 8 штук. Это позволяет предавать 256 значений, т.е от 0, где только нули до 255, где только единицы. Это первое внутренне соглашение, которое просто кто-то придумал. Почему 8, а не 7 или 9? А потому что. Это просто цифра, которая ничего не значит. Так исторически сложилось потому, что в какой-то момент посчитали, что меньше мало а столько достаточно.
Так машину научили понимать, распознавать, интерпретировать и как-то обрабатывать не только горящую и не горящую лампочку а КОД. Код это тоже цифра, которая не имеет никакого физического смыла. Его просто взяли потому, что она первая, которая пришла в голову. Но как и в случае с байтом, в котором договорились о 8 битах, тут тоже все договорились, что эта цифра будет означать это. В своё время я довольно долго пыталась понять, почему функции для работы с экраном обрабатывает 10-е прерывание, а самое богатое по набору возможностей 21-е. Что означают эти цифры? Почему не наоборот? Потом поняла ,что ничего они не означают, это просто внутренние договорённости известные как тем, кто компьютеры производит так и тем, что с ними работает. Все эти цифры номеров прерываний и функций написаны в специальных справочниках.
Понятно, что машине можно и нужно передавать команды с помощью кодов. Пусть код «11» будет приказом «сложи» например. Но ведь ещё нужно передать, что с чем складывать. Так придумали систему из нескольких цифр, передаваемых последовательно. Первая цифра – код команды, вторая – первое значение, третья – второе значение (если оно есть). Внутри в машине это три цифры, следующие три (или две) цифры и т.д пока не кончится файл с командами, которые должен выполнить компьютер.
Но писать цифры неудобно даже если можно выучить цифры кодов команд. Не так уж и много простейших команд, которые может выполнять компьютер. Появление языка ассемблера – первый шаг в сторону удобства.
Тут в драйвере для мыши в языке Си куча вставок на ассемблере:
http://www.codenet.ru/progr/other/mouse.php
Например:
mov ax, 2
int 33h
… Команда «mov» от move – задвинуть, т.е присвоить ax значение 2. В обычном языке так и было бы написано ax=2, но язык ассемблер ещё не понимает арифметических операций. Он понимает только ясно записанную команду «присвоить значение». Первое значение у этой команды ax (без того было бы непонятно чему присваивать). Второе – 2 (без этого было бы непонятно, что присваивать.
Команда int (от interrupt – прерывание) - вызов 33-го прерывания, которое уберёт с экрана курсор мыши. Единственное значение, нужное этой команде – номер прерывания, которое надо вызвать.
Ассемблер и работа с прерываниями добавила много чего на логический уровень. До сих пор там была только команда, выполняющая какие-то действия и получающая максимум два значения, уточняющие что конкретно надо сделать.
В примере выше «ax» это так называемый регистр, которых в базовой версии было 4: ax, bx, cx, dx. Точнее даже 8, т.к каждый из них распадался на два байта, т.е ax = ah+al.
Пусть я хочу чтобы курсор мыши можно было перемещать только в диапазоне от 5 до 10 строки экрана. Тогда я напишу так:
http://stanislavs.org/helppc/int_33.html
mov ax, 8
mov cx, 5
mov dx, 10
int 33h
… В ax я записываю номер функции прерывания, а в cx и dx диапазон строк. И всё будет выполнено. И я уже могу писать команды в которых не два поясняющих значения а целых 8 (количество внутренних регистров, которым можно присвоить значения, которые могут быть обработаны).
Получилась уже не простая команда компьютеру, а полноценная ФУНКЦИЯ, т.е команда что делать с большим набором АРГУМЕНТОВ (терминология моя, как функциями как и командами что только не называется). .
Бытовые аналогии. Пусть есть приказ «дать информацию о выпуске цеха №1 с 1 по 10 сентября», Команда это «дать информацию» а не «запустить в три смены», например. А аргументы это «выпуск» (могут быть ещё и расходы на зарплату), «цех №1» (может быть любое другое подразделение), и диапазон дат, который доже может быть любой.
Придумать аналогию регистров немного сложно. Регистры здесь некий вспомогательный инструмент который такой же результат произвола, как и 8 бит в одном байте. Придумали, что будет удобно если вся система будет видеть значения этих 8 внутренних переменных, сможет их отовсюду читать и писать. Это такая информированная секретарша, которая почти наверняка знает, что происходит. А знает она как раз потому что к ней и идут общаться. Так сложилось по каким-то человеческим и административным причинам.
Следующая вещь которая уже присутствует и используется на этом этапе это СОБЫТИЕ. Со словом «прерывание» много сложностей. Звучат слова «прерывание», «обработчик прерывания», «функция прерывания», «вектор прерывания». То, что показано выше это просто вызов функции с какими-то аргументами. Функцию написали авторы операционной системы (точнее конкретно тут драйвера мыши) чтобы все, кому надо пользовался. А что прерывается-то?
Событие это и есть событие, которое случилось. А раз оно случилось, то надо прерваться(!) и что-то сделать. Отсюда и взялось слово «прерывание». События могут быть обычными, происходящими постоянно. Если случилось утро (а это бывает часто) и на стол положили новую информацию, то надо прерваться и посмотреть на неё. Точно также компьютер каждую миллисекунду «прерывается» на то чтобы увеличить количество миллисекунд, прошедших с начала суток, на 1.
Но могут быть и редкие события, о которых тоже необходимо сообщать потому, что почти наверняка эту информацию захотят использовать а на происходящее реагировать. Если, например, произошла авария то об это надо доложить. Точно также система «докладывает», то была нажата кнопка PrintScreen, которую нажимают довольно редко. И тут просто договоренность, что о событии – нажатии именно этой кнопки будут «докладывать» отдельно. Но ведь логично и удобно если система не только «докладывает» о произошедшем но и делает какие-то действия, предусмотренные системой. Их, конечно, можно при желании отменить и поменять по пусть будет какая-то команда (точнее последовательность команд), которую написали программисты, которые писали операционную систему. Это и есть стандартный, поставляемый вместе с системой обработчик прерывания. Обработчик прерывания это тоже функция, т.е написанная последовательность «заклинаний», заставляющая машину выполнить какие-то действия.
Сходство инструментария заставило использовать один и тот же механизм прерываний и для записи (в виде программ!) типовых реакций на происходящие события и для вызова других программы, которые написали программисты, которые писали операционную систему (чтобы другие программисты могли это всё использовать).
На уровне ассемблера вызов любой функции (обработчик прерывания это тоже функция) – команда jmp:
http://www.firststeps.ru/asm/r.php?11
… т.е «прыжок» на какой-то адрес в оперативной памяти и последовательное выполнение команд, написанных с этого места.
Формально там разные команды. JMP – означает «перейти к адресу такому-то и начинать выполнять команды». INT 33h означает вызвать обработчик прерываний 33h/ Но можно сказать, что как только система встречает команду INT, так сразу выполняет JMP 33h*4, т.к адреса функций обработчиков прерывания (вектора прерываний) расположены в самом начале оперативной памяти (начина с 0000:0000).
Соберу то, что уже есть на логическом уровне, т.е в виде «надстройки» над электрическим компьютером. Логическая надстройка позволяет смотреть на происходящее не как на выключенные и выключенные лампочки а как на клавиатуру, монитор и мышь, забыв, что в них внутри сплошное электричество.
Есть функция с аргументами, позволяющая выполнять какие-то действия. Есть события на которые почти наверняка надо реагировать (и есть возможность написать какие-то команды или функции).
Кроме того выполнять действия должно что-то конкретное (мышь, принтер) и что-то случается тоже с чем-то конкретным (с каким-то конкретным объектом).
Просто чтоб было понятно к чему веду. Тут:
https://msdn.microsoft.com/ru-ru/library/system.device.location.geocoordinatewatcher(v=vs.110).aspx
… описание объекта (тут уже термин из объектно-ориентированного программирования а не просто слово!), позволяющего работать с приёмником GPS сигнала.
У любого объекта есть свойства, методы и события.
И опять бытовая аналогия. Объект это цех. Свойство – номер телефона его начальника. Событие при котором именно этот начальник о чём-то доложит – нечто оговоренное, о чем он должен докладывать. Методы это список того, что ему можно приказать и что он сделает если ему прикажут. А конструктор…. это телефонный звонок, с которого начинается общение.
|