Урок 2

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

Игру мы пишем для компьютера, который всё ещё пока что, в силу исторических причин, называется ПК - персональный компьютер. (К примеру смартфон, который по сути почти не отличается по архитектуре, по вычислительной мощности, и лишь расставляет другие акценты на функционале - персональным компьютером не считается) Персональный - потому что раньше то, что в СССР называли ЭВМ - электронная вычислительная машина - было большим, дорогим и сложным в обслуживании/использовании. В домоxозяйстве такие махины использоваться не могли и использовались, естественно, в организациях - которые могли себе позволить и окупить использование. Это лишь в 70-х - 80-х годах произошла революция и ЭВМ стали приходить в дома энтузиастов, на малые предприятия - в том числе, но отнюдь не только - благодаря Intel(Intel 4004), маркетинговому гению Стива Джобса, использовавшего радиотехнического гения Стива Возняка (Apple I & II), маркетинговому неудачнику, но благодаря этому, возможно, даже более великому человеку Лорду Синклеру (ZX Spectrum) и огромным корпорациям, конечно - во главе с IBM (IBM 5150). При этом в данном случае вопрос о месте личности в истории очевидным образом решён в пользу истории - персональные компьютеры появились не благодаря действиям отдельных людей, а благодаря разработке новых подходов к компьютерной архитектуре и достижениям физики, химии и технических новаций, вследствии чего - упрощению и миниатюризации (а как следствие вышеперечисленного - и удешевлению на порядки c кратным повышением надёжности) элементной базы, и готовности рынка - всё больше и больше людей и компаний хотели себе ЭВМ, и позволяли их себе. До этого же - ЭВМ так же хотели многие, но вот позволить себе могли единицы, так как создание одной машины представляло собой задачу, сравнимую с созданием цеха завода, а ещё раньше - по сути и самого завода.

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

Вычислительные машины существовали и до ЭВМ - задолго до ЭВМ. Механические вычислительные машины - арифмометры "Железный феликс" и всё семейство вычислителей, работающих благодаря механическому зацеплению деталей - не были компьютерами в привычном нам смысле слова, хоть и выполняли вычисления. Но производили они эти вычисления согласно единственной, заложенной в них при производстве, программе. Предпринимались попытки построить механические программируемые компьютеры - попытки не редкие, но редко успешные по тем или иным причинам (в основном, естественно, по причине невероятной сложности изготовления и взаимодействия множества подвижных механических деталей, а так же и из-за отсутствия наработок по построению таких машин) Начиная с мечты о "аналитической машине" Чарльза Беббиджа человечество мечтало о такой машине, которая поможет не только считать, но и думать - и осуществило эту мечту, как пример первого компьютера в мире - машина Z1 Конрада Цузе.
Но насколько важно создать "думающую" машину, настолько же важно уметь общаться с ней, создать такой язык, на котором с ней можно будет общаться.
Что важно для нас - у "Железного феликса" с собратьями, благодаря их заточенности на одну задачу, был очень понятный интерфейс. Так как служили они для вычисления арифметических операций, ввод осуществлялся с помощью рычажков с цифрами, а вывод - через окошко с цифрами - как на калькуляторе, куда уж проще!

С развитием технологий (и потребности в решении всё новых и новых вычислительных задач) появлялись новые технологии вычислительных машин - например, гидравлические. Интерфейс их был всё ещё довольно нагляден - программирование заключалось в пересоединении трубок, соответсвующих связям между компонентами моделируемой системы, а вывод результатов - наполнение баков, глядя на которые человек, разбирающийся в моделируемой области сразу видел наглядную картину моделируемого процесса. Наглядность, лёгкость программирования и дешивизна позволяли гидравлическим компьютерам эффективно использоваться вплоть до 70-х годов XX века, когда ЭВМ, наконец, достигли такого уровня развития, что смогли вытеснить гидравлические вычислители и из их ниши. Очень тяжело было научить ЭВМ решать, к примеру, дифференциальные уравнения - гидравлические же компьютеры справлялись с этими вычислениями "не задумываясь". Компьютерами в нашем понимании гидравлические компьютеры не являлись, вода текла по трубкам, могла даже перекрыть один из стоков - организуя ветвление - но не могла полностью переиначить схему соединения.

Именно электронные вычислительные машины родились как ответ на необходимость повторения одного и того же несложного вычислительного алгоритма многое и многое количество раз. ЭВМ (которые изначально так же создавались для решения конкретных задач - например, первый электронный, а не просто электромеханический компьютер ENIAC был придуман, разработан и создан лишь как вспомогательный инструмент для расчётов баллистических таблиц для американской артилерии) - очень легко меняли данные внутри себя, засчёт чего могли полностью менять своё поведение. Закончен ENIAC был только к концу второй мировой войны, когда уже не было такой необходимости в срочном создании множества артеллирийских таблиц, и он относительно легко был перепрограммирован на работы с другими проектами - например, расчётами для термоядерной программы. Более того, хоть это и не было очевидно сразу - но на ЭВМ можно было возложить задачу составлять программы для себя самой. Даже сейчас кажется невполне очевидным, что компьютер составляет для себя программу - но именно этим и занимается компилятор. Компилятор создан для того, чтобы из программы на человекочитаемом языке (например программы на Паскале, Бэйсике, Си, или даже на языке ассемблера) создать код для исполнения машиной.

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

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

Использование же для облегчения работы компьютер - по сути похоже. Тоже нужно будет разбить задачу на подзадачи, сформировать подзадачи (написать программу) и ввести её в компьютер. Для ввода в компьютер (а также и вывода информации из него) для проекта ENIAC не стали разрабатывать какое-то новое устройство, а взяли существующие (вполне себе распространённыые в те времена), изготовляемые в промышленных масштабах табуляторы ( с отдельными "перфораторами" для вывода) - машины, которые сродни железному феликсу выполняют арифметические операции, но ввод-вывод у них устроен не рычажками и окошками с цифрами, а на перфокартах. Таким образом, после написания программы нужно было "набить" перфокарты, загрузить в компьютер, а после проведения расчётов - проанализировать полученные перфокарты. Хотя мы ожидаем, что в игре должно постоянно что-то происходить на экране, соответственно, нужен экран или хотя бы постоянное обновление выводимых данных, чего на табуляторе ввиду его принципа работы происходить не могло, такие игры как наша первая "угадайка" уже вполне могла существовать. Программы для ENIAC составлялись всё ещё "схемно", соединением проводов между различными составляющими компьютера, и "перепрограммирование" могло занимать в разы больше, чем решение программы, так что запускать на нём игру, даже самую простую, на нём наверняка никто не стал. Но со временем (и ростом количества памяти) компьютеры стали и программу так же, как и данные, хранить в памяти. После этого загрузить программу в компьютер стало очень быстро, ведь для "перепрограммирования" можно было так же использовать табуляторы - программа писалась отдельно от компьютера, записывалась на перфокартах или перфолентах (или, точнее, "пробивалась" на них) - и загружалась в компьютер тогда, когда на это появлялось время. А что насчёт пошаговых игр для слабых, по нашим меркам, компьютеров - такие "пошаговые" игры вполне себе сушествовали и пользовались успехом у тех, кто мог позволить себе их запустить - например, "посадка на луну" для программируемых калькуляторов: играющий должен был каждый раз, когда он хотел поиграть, набрать программу в свой калькулятор из журнала или из тетради - и после этого он мог (с превеликим азартом!) пытаться благополучно посадить свой космический корабль, в пошаговом режиме вводя в калькулятор режимы работы двигателя и наблюдая после этого очередные параметры корабля. Если скорость посадки оказывалась слишком большой, а поверхность слишком близко - через несколько шагов наступал неминуемый финал. Но если же пытаться черезчур сильно заранее затормозить корабль - просто кончалось топливо, и финал был не менее неумолим. Так что играть было очень интересно, каждый ход человека приближа и формировал финал, напряжение было фантастическое - каждая миллисекунда включения двигателя, каждый грамм топлива влияла на исход миссии. И всегда можно было набрать новую программу, поиграть в другую игру.

С развитием компьютерной техники менялись и устройства вывода. Перфокарты (и перфоленты) ещё долго не сдавали своих позиций, но появлялись и лампочки, сигнализировавшие не только о каких-то внутренних процессах, и какие-то иные устройства получения результатьв вычислений, и даже векторные экраны. Основным результатом работы компьютера оставались ряды цифр - но так как перфоратор для пробития специально размеченного листа бумаги по конструкции был даже сложнее печатной машинки, а чтение с листа - намного комфортнее анализа перфокарты, компьютеры научились принимать ввод с клавиатуры, и выводить результаты на лист бумаги. С увеличением производительности компьютеров стало возможным возложить на компьютер обязанность по предоставлению результатов в человекочитаемом текстовом виде, появлялись буквы - компьютер стал общаться с человеком не только числами, но уже и вполне обычными словами. Экраны - тогда ещё векторные, и очень узкоспециализированные, тоже научились выводить текст. Бумага с перфорацией ещё долго оставалась одним из основных способов вывода информации, но своё место отвоёвывали печатаемые листы с текстом и даже текстовые экраны. С распростарнением векторных экранов уже довольно распространёнными программами становились именно компьютерные игры, такие, как к примеру, Spacewar! (компьютер PDP-1, 1962 год), и Space Travel (компьютер PDP-7, 1969 год). Space Travel знакова для нас не только тем, что написана она самим Кеном Томпсоном, но и тем, что именно она стала основой для появления операционной системы UNIX, и, соответсвенно, (хоть и опосредовано) самого языка Си.

Тем временем с увеличением быстродействия компьютеров и снижением их стоимости компьютерам доверяли всё более и более лёгкие задачи - если раньше расчёт чего-либо менее значимого, чем моделирование экономических процессов целой отрасли был экономически нецелесообразен, то наступили времена, когда компьютер мог стоять на каждом предприятии и считать зарплату, логистику и, к примеру, специфические расчёты конструкционных напряжений или параметров колебательных контуров - всё для нужд одного этого предприятия или даже одного отдела. И сами вычисления происходили не неделями, а чаще ограничивались несколькими минутами. Уже возникло желание поставить каждому специалисту, которому нужно взаимодействие с компьютером по собственному ПК в кабинет, но хоть и можно было позволить 1 компьютер на всех, по одному на каждого тогда было всё ещё чрезвычайно расточительно. Конечно, отсутствие компьютера в кабинете не было большой проблемой, если выполнять программу нужно было редко - например, раз в месяц расчитывать зарплату. Так как одному человеку компьютер требовался лишь иногда, он приходил к компьютеру, загружал свою программу и, получив результаты вычислений, уходил. Хотя такой подход и не исключал конфузов, когда к компьютеру возникала очередь - и хуже того, могли возникнуть ситуации, когда компьютер простаивал, например - по ночам. Для решения этих проблем в операционных системах стали разрабатываться механизмы выполнения программ "по кусочкам" - когда в компьютер можно было загрузить несколько программ, и компьютер начинал выполнять одну из них, работал над ней, допустим, секунду - а потом переключался на другую, и так по кругу. Для пользователей же это выглядело, как будто компьютер выполняет их программы одновременно, и быстрее всего заканчивалась не та программа, которую загрузили в компьютер первой, а та, которая оказалась самой маленькой (по размерам вычислений, а не по объёму кода, конечно же).

Более того, такой подход позволил сделать ещё один важный шаг: поставить в кабинет каждого специалиста по "компьютерной консоли" - с помощью которой он, когда надо было - набирал программу у себя в кабинете, а программа эта выполнялась компьютером в машинном зале. В итоге человек работал за своей консолью единолично, как будто это был целиком его компьютер - и никому не мешал, стоя в очереди на запуск своей программы, не бегая по этажам к машинному залу с колодой перфокарт. Как и в случае с табуляторами, для консолей не стали изобретать какие-то специальные устройства, а взяли обычные и чрезвычайно распространённые в те времена телетайпы. Телетайп по сути своей - это печатная машинка, он и выглядит также - у него есть клавиатура (правда, кроме клавиш с символами - буквами, цифрами и знаками препинания - там были ещё несколько "управляющих" клавиш), ну и конечно же лист бумаги, на котором печатался текст. Только вот текст печатался не тот, который набирали на клавиатуре, а с парного телетайпа - который проводами был подключен к этому, и мог быть расположен как угодно далеко. Например, в здании управления стоял телетайп, соединённый с цеховым телетайпом, в управлении набирали план работ для смены - и этот план распечатывалась в цеху. Лучше, чем диктовать по телефону, потому что распечатку всегда можно посмотреть, будучи уверенным что всё записано без ошибок, именно так как напечатали, и распечатается она даже если рядом нет никого, готового ответить на звонок (дальнейшим развитием идеи телетайпа стал телефакс, но нас он уже не интересует). Так вот телетайп стали подключать не к другому телетайпу, а к компьютеру - который принимал введённые с телетайпа символы, рассматривал их как программу (от определённого пользователя!), выполнял её - и отправлял теми же командами телетайпа обратно. У пользователя же на бумаге печатались эти символы как результат выполнения его программы. Идея с терминалами оказалась настолько универсальной и удачной, что терминальный режим работы с компьютером по сей день остаётся основным в большинстве операционных систем (GNU\Linux как раз одна из этих ОСей). Нажатие Ctrl+Alt+F1, Ctrl+Alt+F2, Ctrl+Alt+F3 и т.д., обычно до 6 - но настройки разные бывают - как раз и переключают виртуальные терминалы, которые ваша ОСь воспринимает как самые настоящие (разные, отдельные) физические консоли. Возврат в графический режим - либо в том терминале, в котором была запущена ваша сессия (Alt+F1), либо, обычно, под графическую подсистему выделяется отдельно Alt+F7 ну или где-то рядом.

Но как же текстовый режим может являться основным в работе компьютера, если всё, что мы видим после загрузки Linux'а и до его выключения - это графический режим, окошки всякие, красивые кнопочки, обои скучные в конце концов? Дело в том, что графический режим - это результат работы программы, обычной (хотя и очень сложной) программы, скорее всего - X window system. И остальные графические программы работают над X'ами. X же запускается в консоли, пусть и сразу после загрузки компьютера. Более того, сейчас видеокарта - в которую и подключается монитор - является отдельным компьютером, довольно сильно отличающимся по архитектуре от самого компьютера с процессором воглаве. На самом деле компьютер состоит из нескольких компьютеров, которые незаметно взаимодействуют друг с другом, например сетевая карта тоже отдельный компьютер, который работает даже когда ваш компьютер, казалось бы, выключен. Но для нас важным является то, что просто вывести изображение на экран - далеко не просто, для этого нужно использовать специальный язык, которым можно общаться с видеокартой, и кроме этого ещё научить нашу программу мочь заговорить на этом языке. Собственно, на этом этапе и отваливаются многие пытающиеся написать игру с нуля самоучки, и избирают лёгкую дорогу - использование готового игрового движка. Мы же, как нормальные герои, пойдём другим путём! Если сейчас, во времена видеокарт мы не можем просто взять и вывести что-то своё на экран, но раньше (до видеокарт были видеоадаптеры, которые не являлись отдельными компьютерами), на старых операционных системах можно было писать непосредственно в видеопамять - байты которой непосредственно соответсвовали пикселям экрана и, таким образом, запись в видеопамять сразу отображалась на экране. Этот подход более недоступен, но у нас же остаётся текстовый режим! Мы симулируем работу видеопамаяти, напишем обёртку над массивом символов, которая позволит выводить точки (довольно большие точки, размером с букву) в нужные места экрана, и так, из букв, и сможем составлять, рисовать изображение.