Когда приступаешь к изучению языка программирования Java, то очень многое кажется необычным. При чтении руководства по Java на сайте фирмы Sun Microsystems на английском языке поначалу непонятен даже общий подход. Начинают с того, что мир сложно устроен, потому и язык Java тоже сложно устроен. Он пытается моделировать мир, поэтому он объектно ориентированный и в нем много классов и сложные связи между ними. И так далее в том же духе. Я сам прошел этим путем и помню, как долгое время читал текст не особенно вникая в суть и ожидая, когда же начнут о главном - о программировании. Так и не дождавшись я начал читать книги, но и там о практическом почти ничего нет. Примитивные примеры ничему не учат, а реальные ситуации не рассматриваются.
Я попробую начать по другому. Да, мир сложен и никто не знает его до конца. Но человек рождается из ничего и поначалу ничего не умеет. Как же он учится понимать мир. Ребенок сначала слушает речь взрослых, затем пытается повторить звуки. В какой то момент ему это удается и он начинает повторять все подряд. И вот происходит чудо. Он говорит "Я хочу пить" и ему приносят воду. Он запоминает, что слова "Я хочу пить" означают возможность напиться. Он не знает что такое "Я", что такое "хочу" и что такое "пить". Но все вместе дает конкретный результат. Дальше больше. Человек потихоньку набирает целый арсенал готовых фраз, дающих ему возможность достичь той или другой цели. И только через пять лет разговорной практики он идет в школу и начинает учить грамматику языка и другие предметы, объясняющие явления реальной жизни.
Мне кажется - это самый простой и верный способ выучить любой язык. Беда только в том, что язык программирования начинают учить уже взрослыми людьми. Но некоторые взрослые становятся учеными как раз потому, что сохраняют детское отношение к миру. И в любом случае стоит попробовать этот метод. Он состоит в том, чтобы сначала выучить некий набор фраз, дающих конкретный результат. И получить этот результат в виде работающей программы. А уже только потом начать думать и осмысливать накопленную информацию с позиций общей философии, структуры и логики языка. Я не нашел такой книги, где бы так подавали материал. И мне пришлось прочитать несколько книг вхолостую, пока я не нашел нужные мне примеры, за что можно было бы зацепиться. И это при том, что за плечами у меня был солидный опыт работы на примитивных вычислительных языках первого поколения, более всего на фортране.
В этих лекциях я хочу рассказать о первых шагах, то есть о том же, о чем написано во многих книгах и статьях, но с позиций своей методики и своего опыта. То есть мы начнем сразу писать конкретную программу и заучивать конкретные фразы, дающие тот или иной результат. Но есть и вторая цель. Я не программировал системы, сервера, базы данных и прочее, чем обычно занимаются профессиональные программисты. Я сам физик-теоретик и программировал математические задачи. И в дополнение к этой работе я сам научился создавать простые новые языки программирования и писать интерпретаторы к ним. Об этом тоже хочу поговорить.
Есть несколько способов писать программы. Часто начинающие пишут программу целиком без параметров, потому что просто не умеют делать по другому. Например, надо вычислить объем шара с радиусом 2 в стандартных единицах. Пишется полная программа, в которой задается радиус шара, равный 2. Программа компилируется, выполняется и выдает ответ. Если нужно поменять длину радиуса с 2 на 3, то меняется код программы, новая программа опять компилируется и выполняется. И так каждый раз. На первый взгляд кажется глупо. Но если процесс компиляции совмещен с выполнением и все делается быстро, то вроде и разумно. Но так можно писать совсем простые программы. Если код программы большой и компиляция происходит по многим файлам источникам и даже занимает некоторое время, то все же удобнее выделить кусок, отвечающий за задание параметров к задаче, в отдельный блок и сделать программу таким образом, чтобы она умела делать запрос входных данных от пользователя, умела понимать этот запрос, анализировать его на правильность. И только после этого выполняла запрос. Такую программу придется компилировать реже, и она сможет долго работать при переносе на другой компьютер, где совсем нет компилятора.
Назовем такую программу - ПВП - программой с входными параметрами. Примеров таких программ много. Даже простой ввод пароля, который часто практикуется в целях безопасности - это тоже ПВП. В задачах компьютерного моделирования разных систем практически каждая программа - это ПВП. Чтобы упростить ввод входных параметров в программу были придуманы различные меню, кнопки, ползунки, линейки прокрутки и так далее. Часто вместо ввода ответа на вопрос предлагается полный список ответов, из которого надо выбрать нужный. Это позволяет избежать ошибок, но иногда доходит до абсурда. Например, бухгалтера в шоке от того, что им каждый год предлагают скачать программу для заполнения налоговой декларации. В этой декларации всего то несколько строчек в закодированном виде. Но при их заполнении вы обязаны установить базу данных с правильным написанием всех улиц России. Вы не можете набрать название улицы, а должны выбрать ее из списка. А этот список надо еще уметь сгенерировать из упакованного архива. Вобщем бухгалтера скоро будут опытнее программистов разбираться в компьютере.
Но если серьезно, то любой набор входных данных программы - это ее способ общения с пользователем. Она спрашивает что ей делать. Получает ответ, если он правильный - она выполняет инструкцию. Если нет - указывает на ошибку и просит исправить запрос. Есть программы, в которых пользователю не дают возможности сделать ошибку - он может только выбрать нужную кнопку в меню или одну строку из списка. Но есть и другие программы, которые получают инструкции в виде текста. И вот этот текст уже можно назвать языком программирования. В нем могут быть только числа типа радиуса шара, а могут быть слова и комбинации слов и чисел. Фактически язык программирования Java - это тоже всего навсего очень сложный набор входных параметров для программы-компилятора Java. Компилятор всего-то и делает, что проверяет набор входных данных (java-код) на правильность и после того, как ошибок не остается (скажем после десятой итерации) он записывает этот набор входных данных в более компактной форме байт-кода. Байт-код - это всего лишь другая форма записи входных данных для другой программы - интерпретатора Java, который ее авторы решили назвать Java Runtime Environment или короче JRE. А в просторечии они ее называют JVM или Java виртуальная машина. Вот эта программа - JVM как раз и выполняет все необходимые действия.
Короче говоря, реальный процессор компьютера все время имеет дело только с одной программой - JRE. А все остальное - это лишь набор входных данных. Увы, это пока единственный способ обеспечить универсальность работы программы пользователя в разных операционных системах, что является самой сильной стороной Java технологии. А описанный выше процесс - это действительно выше, чем просто язык программирования. Это новый взгляд на проблему и одновременно - новое ее решение. В эпоху сетей и интернета нужно иметь возможность общаться между компьютерами, работающими в разных операционных системах. Самым надежным средством для этого является текст. Был придуман текстовый язык HTML и интерпретаторы к нему в разных операционных системах. Интерпретаторы разные, а язык HTML - один для всех. Еще раньше для тех же целей был придуман текстовый язык PS (постскрипт). Но текстовый язык не всегда удобен для передачи по интернету. Поэтому на смену PS пришел PDF, а "международный" язык Java компилируется в байт-код. Иначе говоря, появляются системы записей входных данных, обязательные для всех операционных систем (ОС). А ПВП программы - интерпретаторы таких языков как раз являются разными в каждой ОС и на каждом компьютере они генерируют команды для того процессора, который реально работает. Часто можно слышать, что мол вот я работаю в Windows и никогда не видел Solaris, так зачем мне Java. Но ведь есть еще карманные компьютеры (КПК) и мобильники. Не надо вам Linux или UNIX, но без мобильника и КПК скоро не останется ни одного человека. И там тоже есть Java.
Итак, имеем цепочку: сначала [язык Java] потом [байт-код] затем [JRE]. Но программу на Java можно и нужно тоже писать с входными параметрами для общения с пользователем. И совсем нетрудно эти входные параметры организовать в новый язык программирования, скажем ACL, в котором будут свои входные параметры. Такая Java программа будет иметь входными параметрами язык ACL, а уже ACL будет общаться c пользователем. Далее входные данные ACL можно снова организовать в виде языка программирования и так далее. Естественно, что чем больше анализаторов кода, тем медленнее будет работать программа. И не стоит увлекаться программировать таким образом циклы с большим количеством повторений. Но одноразовые действия типа организации GUI (графических средств взаимодействия с пользователем, буквально graphical user interface) можно программировать в несколько каскадов безболезненно. Иногда это бывает очень удобно. Например, у вас есть JVM, но нет компилятора. Естественно вы не можете писать свои Java программы. Но если вам кто-то напишет одну Java программу - интерпретатор другого языка программирования, то вы сможете на нем программировать, пусть и с потерей в скорости. Как ни странно, проблема эта вполне реальна. Как раз так обстоят дела сегодня на карманных компьютерах и мобильниках. JVM для них есть, а компилятор есть только на большом компьютере. Именно это поначалу и было причиной, почему я разработал свой язык ACL (advanced command language) и сделал к нему интерпретатор на Java. Но и на большом компьютере этот интерпретатор оказался полезен. Он работает как Java программа со сложной системой входных данных. И очень много разных инструкций к такой программе можно сформулировать очень просто. Простые математические расчеты, векторная графика, операции с файлами, с картинками, управление сложными программами компьютерного моделирования, визуализация матриц и таблиц, слайд-шоу и многое другое. Более подробно смотрите на сайте vkACL.
Но вернемся к тому, с чего начали. Итак, в этих лекциях речь пойдет о том, как написать программу на языке Java и как сделать ее способной читать и анализировать сложную структуру входных данных. Метод обучения будет простым. Сначала будем ходить по готовой программе и слушать гида (как на экскурсии). При этом можно и самому пробовать работать на собственном компьютере. В тот момент, когда вам это занятие надоест или вы найдете лучшее решение, можете смело работать самостоятельно.