Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №6/2008


Семинар

Язык Java и его возможности

Часть I. Основные идеи и первое знакомство

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

Одной из технологий, призванных решить эту проблему (и некоторые другие тоже), стал язык Java. Его появление позволило сделать web-страницы динамическими и интерактивными. Особые программы — аплеты, разработанные на этом языке, легко вставляются в HTML-документ в качестве иллюстраций. В отличие от простых рисунков они могут обладать весьма сложным поведением и даже, если предусмотрено алгоритмом аплета, изменять его в соответствии с действиями рассматривающего страницу пользователя. Появилась принципиально новая возможность иллюстрировать текст “живыми” картинками, очень похожими на те, которыми в детских мультфильмах украшают волшебные книги.

Несмотря на огромные возможности, в том числе и для электронных материалов учебного назначения, Java-аплеты красуются далеко не на всех страницах. Причин тому много, но не последнюю роль, видимо, играет тот факт, что написание простенького аплета на Java и создание даже весьма сложной HTML-страницы не одно и то же. К тому же многих современных компьютерных пользователей пугает само слово “программирование”. Да и другие альтернативные технологии тоже существуют…

Отдельно стоит подчеркнуть роль Java-приложений в сотовых телефонах, что в данный момент особо актуально в связи с бурным развитием в России сотовой связи. Фирма Sun Microsystems даже предусмотрела специальную версию Java — Micro Edition (J2ME) для подобных устройств.

Цель данной публикации заключается в том, чтобы популярно рассказать о возможностях и наиболее общих принципах Java-технологии, а также на простых примерах продемонстрировать, как это делается. Автор не призывает всех становиться Java-программистами, но надеется убедить читателей в том, что это: а) под силу среднестатистическому человеку и б) может быть полезным, в том числе и в области образования. Наконец, если говорить об учителях информатики, то для них значение понимания сути распространенных технологий вообще трудно переоценить.

1. О чем стоит предварительно знать

Немного истории

Своим появлением в 1991 году язык Java обязан Джеймсу Гослингу (James Gosling), Патрику Нотону (Patric Naughton), Крису Ворсу (Chris Worth), Эду Фрэнку (Ed Frank) и Майку Шеридану (Mike Sheridan) [1]. Все они являлись сотрудниками компании Sun Microsystems и занимались тогда вопросами облегчения программирования для многочисленных бытовых электронных приборов вроде микроволновых печек. Разработка первой рабочей версии языка для программирования подобных устройств заняла около полутора лет. Первоначально язык имел название “Oak” (дуб), в честь дерева, росшего под окном офиса Дж. Гослинга [2]. Позднее, в 1995 году, когда было сделано публичное представление нового языка, он был переименован в Java; “единственное разумное объяснение названию — любовь программистов к кофе 1 ” [2]. Количество сотрудников, которые приняли участие в превращении рабочей версии в полноценный язык программирования, существенно увеличилось; фамилии разработчиков, внесших наиболее существенный вклад в реализацию Java, можно найти в книге [1] (обратите внимание на тот факт, что один из ее авторов как раз является одним из “отцов-основателей”, перечисленных выше).

Наиболее удивительным во всей этой истории является, по-видимому, то, что толчком к возникновению языка Java послужило совсем не развитие Интернета. Главным побудительным мотивом оказалась практическая потребность в языке, не зависящем от платформы, т.е. от архитектуры конкретной аппаратной части. Речь идет о создании программного обеспечения для разнообразных микроконтроллеров и специализированных процессоров: программировать для них в кодах слишком трудоемко, а предварительно разрабатывать транслятор для каждой новой архитектуры с тем, чтобы потом на полученном языке высокого уровня быстро и комфортно написать надежное ПО, не менее долго и сложно. Для получения максимально простого и эффективного решения Дж. Гослинг и его команда стали искать способы реализации переносимого кода, который абсолютно независим от конкретной платформы (и, возможно, от программной среды, в частности, операционной системы, если, конечно, таковая в устройстве имеется). Эти усилия в конце концов и привели к созданию Java.

О расцвете WWW, совпавшем по времени со становлением Java, также нельзя не упомянуть. Кто знает, если бы не это обстоятельство, Java мог бы так и остаться языком для программирования бытовой электроники. Но Интернет потребовал переносимости программ даже сильнее, чем оригинальная причина появления Java. Соединение разнородных компьютеров в единую сеть с необходимостью требует чего-то общего, несмотря на непримиримые разногласия между поклонниками Wintel (Windows +  Intel), Macintosh и многочисленных клонов Unix.

Язык Java унаследовал многие черты C и C++, а синтаксис базовых конструкций этих языков практически одинаков. Но есть одно важное существенное различие: из Java по сравнению с C сознательно удалены все средства, с помощью которых программа может “добраться” до аппаратных ресурсов компьютера (наиболее важным ограничением является исключение механизма ссылок 2 , благодаря которому исполняемая программа может изменить данные в произвольной области памяти). В соответствии с принципами безопасности Java-код, поступающий из Интернета, не способен получить доступ к компонентам компьютера, на котором данный код исполняется; возможен лишь обмен информацией с компьютером-сервером 3 .

Основные достоинства Java

По свидетельству Патрика Нотона [1], при разработке языка создатели Java руководствовались следующим списком требований:

  • простота;

  • безопасность;

  • переносимость;

  • объектно-ориентированная направленность;

  • устойчивость к ошибкам;

  • многопоточность;

  • независимость от архитектуры;

  • интерпретируемость;

  • высокая производительность;

  • распределенность;

  • динамичность.

Два фактора из этого списка мы уже обсудили. Теперь кратко рассмотрим остальные.

Простота. Поскольку язык при создании рассчитывался на профессиональных программистов, то для них самым простым решением было сохранение синтаксиса того языка, к которому они уже привыкли. В результате Java унаследовал синтаксис C и С++. Заметим, что с точки зрения простоты обучения новичков данное решение, видимо, не является самым удачным. Сошлемся для примера на мнение Н.Вирта по этому поводу [3].

Объектно-ориентированная направленность. Созданный до распространения ООП, прототип Java — язык C, не был объектным. Позднее, при разработке C++, в него были добавлены соответствующие идеи. Очевидно, что дополнение новых свойств к уже стандартизированному языку не могло произойти идеально. Зато создаваемый заново язык Java, не претендуя на совместимость со своими предшественниками, мог позволить себе впитать в себя все лучшие идеи объектно-ориентированного подхода. За исключением 8 простых типов, о которых будет подробнее рассказано позднее, все остальное в Java есть объекты. Объект, в полном соответствии с идеологией ООП, состоит из данных и процедур (методов) манипулирования этими данными.

Устойчивость к ошибкам. Многоплатформенность среды Web выдвигает чрезвычайно высокие требования к надежности программы. Поэтому устойчивость программ к ошибкам было одним из приоритетов при создании языка Java. В качестве примера можно еще раз привести исключение из конструкций языка механизма доступа к памяти через указатели, что в языке Си было источником большого количества ошибок. Кроме того, в Java предусмотрены специальные конструкции (try, catch и некоторые другие) для обработки ошибок в ходе исполнения программы — в результате хорошо написанная программа может сама обрабатывать все ошибки времени выполнения.

Многопоточность. Наличие данного свойства позволяет выполнять несколько процессов одновременно. Это, например, дает возможность обрабатывать взаимодействие с пользователем, не прерывая отображаемой на экране анимации или процесса сложного анализа информации. К слову сказать, создание анимации в Java обычно реализуется именно на потоковом механизме.

Независимость от архитектуры. Разработчики языка стремились к тому, чтобы программа была не только переносимой, но и долговечной. В частности, на ее работу не должны влиять ни обновление операционной системы, ни модернизация процессора или изменение объема оперативной памяти. Их цель состояла в том, чтобы осуществить принцип “Write Once Run Anywhere”, что можно примерно перевести “однажды написанное работает всегда и везде”.

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

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

Динамичность. Java-объекты несут в себе значительный объем информации о собственных свойствах и структуре (так называемая RTI — run-time information), что позволяет Java-машине принимать решения об их обработке и размещении в процессе выполнения программы. Именно такой подход, когда обработка (например, выделение области памяти) производится не при компиляции, а при выполнении, программисты и называют динамическим.

Особенности реализации языка

Как же достигается в Java переносимость и безопасность? Главная идея заключается в том, что программа представляется в виде так называемого байт-кода, предназначенного для выполнения на виртуальной Java-машине. Последнюю иногда называют еще исполняющей системой (run-time system), или интерпретатором байт-кода. Байт-код абсолютно универсален, поскольку виртуальная машина лишена каких бы то ни было аппаратных деталей. Таким образом, схема исполнения Java-программы выглядит следующим образом.

Рис. 1. Схема обеспечения аппаратной независимости

Пусть на некоторой машине с процессором номер 1 запущен компилятор. В ходе своей работы он обрабатывает текст Java-программы и генерирует соответствующую ей программу для виртуальной машины (байт-код). Последний по определению годится для любой Java-машины, на каком бы процессоре он ни работал (будем для наглядности рассуждений считать, что процессоры номер 1 и 2 несовместимы друг с другом по системе команд!). Компилятор и Java-машина — это обычные исполняемые программы, написанные в кодах конкретного процессора. Символические изображения цепочек, которыми соединены процессоры со своим ПО, подчеркивают факт, что оно “привязано” к “родному” процессору. Поскольку, по нашему предположению, процессоры номер 1 и 2 несовместимы, то из этого немедленно следует, что сами Java-машины 1 и 2 различны и неспособны функционировать на “чужом” процессоре.

Таким образом, мы видим, что предложенная схема реализации языка программирования действительно решает проблему платформенной независимости! Компилятор, функционирующий на процессоре-1, “ничего не знает” о процессоре-2 и любых других, но тем не менее готовит программу, которая может быть на них исполнена (при наличии Java-машины, разумеется!). В результате оказывается возможным иметь мощный инструментальный компьютер на процессоре-1 для разработки всевозможных приложений, а для конкретной архитектуры (скажем, на процессоре-2) остается только реализовать стандартную Java-машину. Выигрыш очевиден: Java-машина универсальна и гораздо проще, чем любое приложение, взаимодействующее с “непредсказуемым” и постоянно ошибающимся пользователем; тем более если сопоставлять сложность машины и целого комплекта приложений.

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

Примечания. 1) Технически возможно на процессоре-1 реализовать компилятор, генерирующий исполняемый код для процессора-2. Но проблемы совместимости это, конечно, не решит, поскольку тогда полученная программа не сможет работать уже на процессоре-1 или любом другом. 2) Чтобы ускорить исполнение байт-кода, Java-машины часто реализуют его компиляцию (так называемая Just-In-Time — JIT-компиляция) в машинный код, который затем исполняется обычным образом.

По приведенному рис. 1 можно также косвенно судить и о решении проблемы безопасности. Байт-код не в состоянии напрямую воздействовать на процессор, а Java-машина надежно следит за тем, чтобы не было выполнено каких-либо операций, которые способны оказать на компьютер вредоносное действие. Для реализации безопасного выполнения программы, полученной из сети, виртуальная машина выделяет специальную область — так называемую песочницу (sandbox), код в которой выполняется, но полностью ограничен от взаимодействия с локальными ресурсами компьютера.

Дополнение о возможных схемах трансляции

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

Начнем с того, что сами идеи о виртуальной машине не новы и восходят как минимум к Никлаусу Вирту, который предлагал процесс трансляции со своего детища — Паскаля, производить в два этапа. На первом шаге после синтаксического контроля текст программы преобразовывался в код для некоторой виртуальной машины. Данный код получил название P-код (сокращение от Pascal-код; читается “пи-код”). На втором шаге P-код по возможности оптимально транслировался в код конкретного процессора. Предложенная “ступенчатая” методика была призвана упростить переносимость компиляторов Паскаля: все алгоритмы, кроме последнего, связанного с конкретным процессором, были абсолютно универсальными, а значит, при переносе на новую платформу их не требовалось изменять и отлаживать. Кроме того, трансляция в код “идеальной” P-машины оказывается существенно проще, чем генерация кода реального процессора с учетом его особенностей.

Сам Вирт писал: “После того как стало известно о существовании Паскаля, несколько человек попросили нас помочь в его реализации на различных машинах, подчеркивая, что они намерены использовать его для обучения и что быстродействие для них не имеет первостепенного значения. После этого мы решили создать версию компилятора, которая генерировала бы код для машины нашей собственной конструкции. Позднее этот код стал известен как P-код... Pascal-P оказался исключительно удачным языком для распространения среди большого числа пользователей. И если бы у нас хватило мудрости предвидеть масштабы такого развития событий, то мы приложили бы больше усилий и тщательности при разработке и документировании P-кода”. А один из учеников Вирта — Михаэль Франц заметил следующее: “Переносимость Java основана на наличии виртуальной машины, позволяющей легко имитировать большое число архитектур. Идея виртуальной машины была очень популярна уже более двадцати лет назад, хотя впоследствии о ней забыли. Тогда речь шла о Pascal-P — созданной в ETH 4 реализации Паскаля, которая сыграла решающую роль в распространении этого языка. Интересно, что виртуальные машины для Паскаля и Java весьма схожи по архитектуре...” (цитируется по [4]).

Самые ранние реализации трансляторов, которые были выполнены по данному принципу, относятся к 1973–1975 годам. На базе P-кода была построена весьма уважаемая коммерческая версия Паскаля — UCSD [5]. Заметим, что известный всем нам Турбо Паскаль фирмы Borland не использует P-код.

Позднее, развивая подобного рода идеи, М.Франц изучил проблему в наиболее общем виде. Он предложил разбить все компиляторы на две части: front-end и back-end [6]. Первая отвечает за сканирование исходного текста и формирование промежуточного представления, вторая занимается оптимизацией и генерированием объектного кода под целевую аппаратную платформу. Если имеется M языков и N целевых аппаратных платформ, то вместо создания MN полноценных компиляторов достаточно иметь всего M компиляторов промежуточного кода (front-end) и N генераторов машинного кода (back-end). Идея такого “языкового коммутатора” (linguistic switchbox) была материализована еще в 1958 г. Для промежуточного языка было выбрано имя UNCOL, что означает “универсальный машинно-ориентированный язык” (UNiversal Computer-Oriented Language).

Российские программисты, вероятно, смогут припомнить и еще одну любопытную схему трансляции. На машинах семейства ДВК Паскаль-компилятор работал следующим образом: паскалевская программа сначала транслировалась в текстовый файл на ассемблере, а затем последний стандартным ассемблером (отдельно!) компилировался в машинный код.

Отличие данной двухступенчатой схемы от описанной ранее в том, что в роли промежуточного языка выступает язык не виртуальной, а реальной машины. Кроме того, в отличие от P-кода, хранящегося в некотором внутреннем оптимальном для исполнения представлении, здесь мы имеем дело с промежуточным текстовым файлом, написанным на понятном человеку языке, что представляет определенный интерес с образовательной точки зрения. Действительно, при подготовке компьютерных специалистов возможность увидеть, во что преобразуется текст программы, довольно интересна (ассемблер — это язык очень близкий к машинному!). В связи с этим, видимо, не случайно в учебном компьютере “Нейман” [7] выбрана такая схема трансляции.

Важно подчеркнуть, что при описанной технологии трансляции возникает возможность 5 “собирать” в ассемблере блоки, полученные с разных языков программирования (при условии, конечно, соблюдения компиляторами общего стандарта). Схема, поясняющая возможность создания программ на основе модулей, написанных на разных языках, поясняется на рис. 2. Для описанного семейства компьютеров роль языка с номером 0 играл ассемблер, но это совсем не обязательно: промежуточный язык может быть любым.

Рис. 2. Принцип совмещения модулей из нескольких языков

В частности, идея о едином для всех языков фундаменте положена в основу платформы Microsoft, которая называется .NET (читается “точка-нэт” или “дот-нэт”, что то же самое, поскольку dot есть по-английски “точка”). С точки зрения нашего разговора стоит отметить следующие сведения. Для выполнения программ разработана общеязыковая исполняющая среда (CLR — Common Language Runtime), которая есть не что иное, как виртуальная машина. CLR является фундаментом платформы, которую Microsoft назвала .NET Framework. Для программирования CLR используется промежуточный язык CIL/IL (Common Intermediate Language/Intermediate Language) — на рис. 2 это язык 0. Важно подчеркнуть, что хотя CIL-инструкции и напоминают язык ассемблера, но важной составляющей текста на CIL являются текстовые описания метаданных. В книге [8] CIL охарактеризован как “объектно-ориентированный язык ассемблера на основе стека”. В результате трансляции текста на CIL получается платформенно-независимый IL-код (аналог байт-кода), который исполняет виртуальная машина CLR. Таким образом, родство технологий весьма очевидно. “.NET Framework можно сравнить с языком программирования Java… Язык Java предлагает многие функциональные возможности…, за исключением того, что они могут быть реализованы только с помощью единственного языка программирования” [8].

Примечание. Если читателей заинтересовал приведенный выше краткий материал о среде .NET, автор убедительно рекомендует прочесть с. 97–100 в книге [8], где подробно демонстрируется, как устроен IL-код для простейшей программы, оттранслированной с языка C# 6 .

Отметим, что рассмотренные выше машины (Java, P и CLR) имеют много общего. В частности, все они реализованы на базе стека, о котором читатели постарше, возможно, помнят по программируемым микрокалькуляторам.

О некоторых интересных чертах языка Java

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

Свойства типов данных не зависят от платформы. Сравним для примера Java с различными реализациями языка Паскаль для IBM PC. В частности, в Turbo Pascal число типа integer хранится в двух байтах, а длина строки в string не превышает 255 символов, что ограничено ее однобайтовой длиной.
В более современной системе программирования Delphi (версию языка часто называют Object Pascal) под тип integer отводится уже 4 байта 7 , а для целей обратной совместимости предусмотрен двухбайтовый тип smallInt. Что же касается string, то он автоматически заменяется на AnsiString (ASCII-текст) либо на WideString (Unicode) в зависимости от настройки компилятора, причем в обоих случаях максимальная длина строки около 2 Гб; старая 255-символьная строка из соображений совместимости тоже есть и называется ShortString. Таким образом, мы видим, что даже на одной аппаратной платформе разные реализации одного и того же языка имеют разные характеристики для типа данных с одним и тем же названием. Что уж говорить о разных компьютерах с процессорами различной разрядности!

Для Java как для внеплатформенного языка такой проблемы просто не существует: независимо от разрядности процессора, архитектуры компьютера, операционной системы и чего-либо еще разрядность всех данных постоянна (см. таблицу на с. 7).

Примечание. Интересно, что в Java отсутствуют беззнаковые типы чисел: это компенсируется введением специальной операции беззнакового сдвига данных вправо.

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

Особенности преобразования типов. Java очень строго следит за соответствием типов в различных местах программы, например, в операторах присвоения.
В то же время, везде, где это однозначно возможно, типы преобразуются автоматически. При этом Java “руководствуется” следующими весьма естественными правилами.

  • Если два типа совместимы, причем результирующий тип имеет диапазон значений больше, чем у исходного, т.е. преобразование всегда однозначно выполнимо, оно осуществляется автоматически. Такое преобразование называется расширяющим. Пример — перевод из byte в int.

  • Если типы совместимы, но соотношение диапазонов обратное, то такое (сужающее) преобразование по определенным правилам возможно, но программист обязан его записать в явном виде. Примеры: преобразование int в byte: b = (byte) i; double в int: i = (int) d; В первом случае b = i mod 256 (проще говоря, остается только младший байт), а во втором — i = trunc(d), причем, возможно, потребуется и нахождение остатка тоже.

Отметим, что автоматическое преобразование производится не только с числами, но и с более общими выражениями. Вот очень полезный с практической точки зрения пример: выражение "x="+x обрабатывается так: поскольку "x=" — строка, то переменная x тоже автоматически переводится в строковую форму! Эта особенность очень удобна при выводе информации, когда не надо задумываться о переводе чисел и других данных в строку.

Особенности данных в объектном языке. В Java выделяется 8 простых (элементарных) типов данных: byte, short, int, long, char, float, double и boolean. Элементарные типы представляют собой единственное исключение из правил, ибо, как и в обычных языках программирования, считаются единичными значениями, а не объектами. “Все заключается в эффективности: превращение простых типов в объекты повлекло бы за собой слишком ощутимое снижение производительности” [1].

В то же время, наличие “необъектов” приводит к некоторым принципиальным трудностям. Например, в отдельных случаях язык оперирует с объектами, а требуется поместить в него простое значение, скажем, число. Для преодоления этой проблемы в Java элементарным типам ставятся в соответствие дополнительные классы: Number, Double, Float, Integer и Long (обратите внимание, что во избежание путаницы все эти имена всегда пишутся с заглавной буквы). Наличие перечисленных классов позволяет преобразовывать элементарное значение в объект и наоборот. Попутно эти классы решают и более сложные задачи приведения типов, например, преобразование строки в число или обратно. В частности, метод parseInt() класса Integer обрабатывает строку и получает из нее целое число (с этим методом мы позднее встретимся в одном из наших примеров).
В случае ошибочной исходной строки возникает исключительная ситуация NumberFormatException, которую, если написан обработчик, программа имеет возможность обработать сама; в противном случае на ситуацию отреагирует исполняющая код Java-машина.

Заметим, что тип String реализован в Java как объект, что иногда приводит к не совсем привычным эффектам. В качестве примера рассмотрим сравнение строк. Пусть у нас описаны две строковые переменные s1 и s2, и мы присвоили им одинаковые значения. Тем не менее при сравнении на равенство Java будет утверждать, что они различны: причина в том, что объект по своей сути — это ссылка на область памяти, а не то, что там лежит. В результате, поскольку наши переменные “живут” в разных местах памяти, они, естественно, не равны никогда, какими бы ни были присвоенные им значения. А для корректного сравнения значений собственно текстов (а не объектов, их содержащих) нужно применить специальный метод equals(), что записывается в виде:

s1.equals(s2)

Прочитать это следует так: к объекту s1 применяется метод equals(), аргументом которого является объект s2. Метод устроен так, что он извлечет из обоих объектов строковые значения и, сравнив их, вернет результат в булевском виде.

С массивами Java также обращается несколько “по-своему”, но мы не будем здесь обсуждать этот вопрос.

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

Язык Java дает неплохую возможность для того, чтобы компактно обсудить работу с объектами. Для этой цели можно воспользоваться классом String, который, как уже говорилось выше, реализован в языке как объект, причем объект весьма наглядный и понятный.

Описание строки, как и любого другого объекта, выглядит следующим образом:

String s = new String( );


Рис. 3. Java-приложение Protege

Эта немного странная с виду строка обозначает следующее. Описывается переменная типа (или, иными словами, объект класса) String, имя которой s. Правая часть данного равенства создает переменную (выделяет под нее память) — это всегда делает команда new, за которой следует вызов конкретного метода, формирующего данную переменную. Имя такого метода всегда формально совпадает с именем типа переменной (класса), и в Java он имеет специальное название — конструктор. Каждый класс имеет свой собственный конструктор или даже несколько — с разным числом параметров (в нашем описании параметры в скобках после имени отсутствуют).

Создав объект, можно поместить в него значение или воздействовать на него методами, которые определены в его классе (обсуждаемый сейчас класс String встроен в одну из библиотек языка). Рассмотрим следующий несложный пример.

String s = new String( );
s = "пример текста";|
s = s.replace('е', 'э');

Данный фрагмент описывает уже объясненным способом “пустую” переменную s (первая строка программы) и присваивает ей произвольное значение (вторая). Наконец, в последней строке программы к нашей переменной применяется метод replace(), который по всему тексту заменяет букву е на э 8 .

Описание переменных может быть не только в начале программы. Описание переменных в Java-программе может стоять практически в любой части программы. Пожалуй, наиболее впечатляющий вариант — когда рабочая переменная цикла описывается непосредственно внутри него; правда, в таком случае вне цикла данная переменная уже не может быть использована. Соответствующая строка на Java имеет вид (описание целочисленной переменной i выделено жирным шрифтом):

for (int i = 1; i < 10; i++)

Данная строка является типичным образцом цикла, восходящего к Cи, по i от 1 до 9.

Приложения и аплеты

Компилятор языка Java может создавать два типа программ — приложения (applications) и аплеты (applet).

Важное “филологическое” примечание. Как предпочтительнее писать — “аплет” [1] или “апплет” [9]? В весьма подробном собрании подобного рода сложностей [10] ответ на этот вопрос под номером 6141 гласит: “Рекомендуем: аплет. Большая часть заимствуемых слов сейчас теряет удвоенные согласные, ср.: бизнес, дискета, фитнес и т.п.”. Трудно удержаться и не добавить к списку офис… Честно говоря, в данном случае больше убеждает авторитет книги [1], чем тенденции языка бизнес-сообщества с его отношением к грамотности. Так или иначе, в данной публикации везде используется форма “аплет”.

Первый тип Java-программ приложения, по сути мало чем отличается от обычных исполняемых файлов, но требует наличия на компьютере предварительно установленной Java-машины. Многие современные разработки выполняются на языке Java, в том числе программные разработки фирмы IBM и бесплатный офисный пакет ThinkFree компании Haansoft ThinkFree. В качестве примера на рис. 3 приведен скриншот весьма известной программы для ведения онтологий знаний Protege. На нем на передний план специально вынесено консольное окно интерпретатора Java, которое обычно “спрятано”, и потому не все его замечают. Непосредственный вызов интерпретатора Java на рисунке обведен рамочкой (см. вторую строку в черном окне).

К достоинствам описанного выше подхода следует отнести создание программного продукта, который способен работать в любой операционной системе, что существенно расширяет его пользовательскую аудиторию. К недостаткам — чувствительность к версии Java-машины, имеющейся на компьютере: иногда при попытке запустить приложение оно “жалуется” на то, что ему требуется более поздняя версия виртуальной машины с более широкими возможностями. Чтобы сгладить это неудобство, последние версии виртуальной машины способны к самообновлению через Интернет 9 , но в связи с тем, что размер инсталляции составляет десятки мегабайт, в российских условиях это все равно малоприятная процедура.

Второй тип Java-программаплеты, устроен принципиально по-другому и специально предназначен для использования в Сети. Главная идея состоит в том, что аплет функционирует в окне браузера, существенным образом опираясь на его внутреннюю мощь. Такое технологическое решение позволяет аплету быть максимально простым, а значит, иметь минимальный объем и быстро передаваться по сети. Строго говоря, браузер не обязан поддерживать байт-коды Java — формально для этого необходима установка дополнительного программного обеспечения. Тем не менее в настоящее время даже в Internet Explorer, который первое время не спешил принять конкурирующие технологии, особых проблем с проигрыванием аплетов не возникает. В принципе для просмотра аплета можно применять и специализированное приложение, которое входит в комплект поставляемых с Java файлов (appletviewer), но им сейчас мало кто пользуется на практике.

Примечание. Сам термин applet происходит от добавления к слову application (приложение) уменьшительного суффикса let [11], т.е. маленькое приложение. В самых первых версиях Internet Explorer эту конструкцию пытались переводить как “приложеньице” (вместо “Applet started” писали “Приложеньице запущено”), но подобная терминология не прижилась.

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

2. Необходимое программное обеспечение

Прежде чем познакомиться с Java, необходимо установить соответствующее программное обеспечение. Начать стоит с того, что загрузить с официального сайта Sun Microsystems [12] бесплатный продукт под названием JDK (Java Developer’s Kit — пакет разработчика программ на Java). В его состав, помимо виртуальной Java-машины с необходимым комплектом файлов сопровождения, которые позволяют исполнять байт-код на вашем компьютере, также входят инструментальные программы для компиляции Java-программ. Программы и данные, необходимые для установки, собраны в единый инсталляционный файл, запуск которого автоматически выполнит все необходимые действия. Никаких специфических познаний в области Java не потребуется — процедура инсталляции осуществляется обычным образом.

Наиболее важные исполняемые файлы, входящие в состав JDK, приводятся в следующей ниже таблице (по данным [9]).

Если вы планируете заняться разработкой Java-аплетов более серьезно, дополнительно к JDK стоит установить какую-нибудь более комфортную среду разработки. Для начальных упражнений можно порекомендовать “облегченную” интегрированную среду, коих существует великое множество, причем большинство из них разработаны энтузиастами и распространяются свободно (в мире Java, которая сама является бесплатным продуктом, это выглядит вполне естественно!). Автору нравятся две проверенные временем программы такого рода — Java Editor [13] и Free Java 10 (“скриншоты” приводятся ниже), причем первая более простая и естественная, а вторая — более “комфортная” в работе: колоризация текста, настройка шрифтов и т.п. приятные излишества. Обе программы имеют существенное достоинство: они способны автоматически вызывать компилятор javac.exe для трансляции и браузер для просмотра 11 , что позволяет перейти от “доисторического” интерфейса командной строки к привычному молодым современным пользователям оконному интерфейсу. Еще одним достоинством подобных систем является то, что в ходе своей работы они создают файл, куда сохраняют всю необходимую информацию о проекте в целом. В частности, ваш проект может содержать несколько HTML- и JAVA-файлов, но благодаря проектному файлу все они будут загружаться при открытии проекта единовременно.

Примечание. Проектные файлы обеих оболочек имеют расширение JPR (Java PRoject), но несовместимы между собой.

Помимо “легких” оболочек, существуют и более сложные бесплатные среды для разработки Java-приложений, например, Eclipse [14] (наиболее существенный вклад в продвижение этого проекта внесла фирма IBM) и NetBeans [15] (восходящая к Sun Microsystems). В западной сфере образования большой популярностью пользуется среда BlueJ [16], которая дополнительно обладает графическим представлением информации об объектах. Все они заслуживают отдельного обсуждения, которое мы пока отложим, поскольку для первых экспериментов подобные системы слишком сложны.

Выбор среды разработки — дело довольно индивидуальное и неоднозначное: нет ничего более безнадежного, чем спор двух поклонников разных программных продуктов (причем неважно, идет ли речь о Windows и Linux, Java и .Net или названных выше средах!). Автор рекомендует читателям при разборе приведенных в статье примеров придерживаться следующей (по его мнению, оптимальной) тактики. Самый первый и самый простой пример непременно стоит проделать без всяких дополнительных инструментов, пользуясь исключительно возможностями JDK, что даст некоторое наглядное представление о самом процессе компиляции. Затем, вдоволь насладившись “удобствами” такой деятельности, можно закачать и инсталлировать Java Editor 12 , как образец простой интегрированной среды, настроить ее и проделать второй пример.
И только потом, если вы действительно захотите пользоваться языком Java для разработки учебных или иных аплетов, можно обратиться к более профессиональным средам разработки.

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

3. Практическая работа с Java

Итак, приступим наконец к конкретной работе с Java!

Первый аплет

Попробуем реализовать наш первый аплет. По сложившейся традиции он должен выводить на экран строку с текстом “Hello world!”. В нашем случае экраном будет служить окно браузера.

Начнем с набора текста Java-программы. Набор можно осуществить в любом текстовом редакторе, проще всего — в Блокноте. Собственно программа аплета выглядит следующим образом (помните, что при наборе необходимо строго соблюдать заглавные и строчные буквы!):

import java.awt.*;
import java.applet.*;

public class hello extends Applet {
      public void paint(Graphics g) {
          g.drawString("Hello world!",10,10);
      }
}

Кратко поясним, что здесь закодировано.

Первые две строчки импортируют, т.е. используют, стандартные классы из созданных разработчиками библиотек awt и applet. Название первой библиотеки — Abstract Windows Toolkit, переводится что-то вроде “абстрактного набора инструментов для работы с окнами”; несмотря на трудности перевода, суть как раз проста: это многочисленные стандартные классы, позволяющие создавать и управлять окнами, а также реализующие их управляющие элементы вроде кнопок, флажков и т.д. Выражаясь проще, это поддержка графического интерфейса. Назначение второй библиотеки еще более очевидно — поддержка аплетов. Обозначение “.*” легко понятно любому, кто работал с MS-DOS; для остальных скажем, что это обозначает все объекты. Дело в том, что теоретически можно импортировать только отдельные части библиотек, но такой “высший пилотаж” пока не для нас.

В следующей строке объявляется наш собственный класс с выбранным нами именем hello, расширяющий (по-английски extends) стандартный класс Applet. Для облегчения доступа к нему “извне” он объявлен как public (общедоступный).

Все конструкции в Java, как и в Cи, заключаются в фигурные скобки. Чтобы не путаться в многочисленных скобках, рекомендуется писать текст с отступами, например, так, как это продемонстрировано выше.


Рис. 4. Протокол получения байт-кода из текста программы (используем JDK)

Далее следует заголовок метода paint, который абстрактным образом описан в awt. Этот метод вызывается каждый раз, когда аплет вновь рисуется на экране (включая даже прохождение постороннего окна над окном аплета). Мы конкретизируем (в Java принят термин overload — “перекрытие”, “перегрузка”) содержание данного метода, в результате чего аплет будет рисовать именно то, что нам требуется. В качестве аргумента метод paint содержит объект с (произвольным, вообще говоря) именем g, который имеет тип Graphics. Это одновременно и очень сложный, и очень удобный в использовании объект: он содержит в себе все данные о графике аплета (в Windows обычно используется термин графический контекст; в Delphi существует довольно наглядное аналогичное понятие Canvas — “холст для рисования”). Начинающих должно порадовать известие о том, что данный объект по умолчанию настроен Java-системой и уже готов к использованию без особой предварительной инициализации. Все, привязка к стандартным конструкциям Java наконец завершена, можно писать программу!

Собственно программа состоит из одной строки, которая для нашего объекта-холста g вызывает метод drawString 13 , который рисует (“пишет”) нашу столь знаменитую строку. Пара чисел, стоящая после текста, есть не что иное, как его координаты в пикселях, причем начало координат предполагается в левом верхнем углу.

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

После полного набора текста программы его необходимо сохранить с именем hello.java (именно таким!).

Примечание. Если вы набирали текст в Блокноте, не забывайте в диалоге сохранения вместо “Текстовые документы” выбрать “Все файлы”, иначе получится файл hello.java.txt.

Теперь полученный файл надо откомпилировать в байт-код. Входящий в состав JDK компилятор, как мы уже знаем, носит имя javac.exe. По умолчанию он находится в каталоге program files\java\jdk1.6.0\bin (если на вашем компьютере это почему-то не так, найдите указанный файл, пользуясь стандартной процедурой поиска в Windows; возможно, у вас будет указан другой номер версии JDK). Хотя “по правилам хорошего тона” так поступать не рекомендуется, для простоты скопируйте файл hello.java в найденный каталог с компилятором. Сейчас можно попытаться запустить процесс компиляции.

Работать будем в среде командного интерпретатора (Пуск > Выполнить > набираем cmd). В появившемся окне “стиля MS-DOS” вводим команду

cd c:\program files\java\jdk1.6.0\bin

которая сделает каталог с компилятором и нашим пробным файлом текущим. Остается командой 14

javac hello.java

осуществить компиляцию.

Авторский диалог выглядел так, как показано на рис. 4 (вводимые команды обведены рамочкой).

Отметим, что на приведенной копии экрана первый запуск компиляции (на рис. 4 он не обведен, но если захотите, вы легко сможете его найти) оказался неудачным: в результате опечатки при наборе название метода оказалось неправильным, о чем свидетельствует подробное “разъяснение” компилятора. Надеюсь, читатели будут более внимательными и в их выдаче промежуточная часть диалога не появится.

После успешной компиляции (отсутствие “возражений” со стороны компьютера) в каталоге появится еще один файл с названием hello.class, что, собственно, и есть байт-код для нашей программы.

Остается просмотреть его через браузер. Для этого создадим еще один файл — hello.html (имя можно выбрать другое), в который внесем следующие строки ссылки на аплет:

<applet code="hello" width=200 height=60>
</applet>

Примечание. Конечно, те, кто умеет создавать web-странички грамотно, могут “по большой науке” дополнить этот текст тегами <html>, <head>, <body> и т.д. Но современный браузер, как ни странно, вполне обходится и без них.

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

Рис. 5. Наш первый аплет работает!

Обратите внимание на строку состояния, где браузер отобразил информацию о работе аплета. В нашем случае все и так замечательно — аплет стартовал, но при наличии ошибок информация о характере ошибки (например, не найден файл .class) может оказаться весьма полезной.

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

Подводя итоги первого удачного упражнения, очень полезно вернуться к рис. 1 и еще раз рассмотреть его, сопоставив с проделанными при создании аплета действиями.

Работа с графикой в аплетах

Возможно, при работе с нашим первым аплетом вы обратили внимание на тот факт, что строка рисуется (draw по-английски “рисовать”), а не пишется. Данное обстоятельство позволяет надеяться, что рисование в Java дело не очень сложное. И это действительно так!

Объект Graphics (тот самый, с помощью которого мы вывели нашу знаменитую строку) обладает множеством встроенных методов для рисования. Не претендуя на полноту обзора, перечислим методы, относящиеся непосредственно к рисованию: drawLine() — рисование линии, drawRect() и fillRect() — пустой и заполненный прямоугольники, drawOval() и fillOval() — то же для эллипса или окружности, drawArc() и fillArc() — дуги и сектора, DrawPolygon() и fillPolygon() — многоугольники. Кроме того, имеются методы для изменения цвета, шрифтов и прочие “штучки”, без которых немыслима графическая среда современного компьютера. Грех не воспользоваться таким богатством!

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

В качестве примера рассмотрим аплет, рисующий систему окружностей (см. рис. 6).

Рис. 6. Аплет может работать с графикой

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

Для освоения различных технологий реализовать данный аплет предлагаю уже не с помощью Блокнота и JDK, а с использованием программы Java Editor [13] (рис. 7).

Обратите внимание на операционные кнопки, которые делают работу в оболочке гораздо более комфортабельной. Это самые правые кнопки в окнах: в верхнем справа окне с Java-текстом на кнопке изображена чашка с дымящимся кофе — это вызов компилятора JDK 15 , а соответствующая кнопка в HTML-окне, на которой нарисовано изображение земного шара, вызывает для просмотра браузер. Так что никаких текстовых команд больше не требуется, и вся работа организуется средствами интегрированной среды.

Третье (левое на рис. 7) окно — это окно проекта. В нем видны значки файлов JAVA и HTML, с которыми мы работаем и текст которых находится в соответствующих окнах справа. Как уже отмечалось, группировка файлов в проект есть важное удобство при работе с Java-программами, особенно когда проект большой и файлов много. Заметим, что Java Editor также позволяет включать в проект текстовые файлы, содержащие описания, инструкции и документацию. Для наших целей можно обойтись без этой дополнительной возможности.

Для сравнения на рис. 8 этот же самый аплет приведен в среде Free Java. Видно, что скриншоты по своей сути очень похожи, хотя конкретные детали изображений, разумеется, отличаются. В частности, приятной особенностью среды Free Java является выделение цветом служебных слов, комментариев и т.д., чего нет в Java Editor.

Рис. 7. Работа над аплетом в среде Java Editor

Рис. 8. Работа над аплетом в среде Free Java

Текст программы на языке Java имеет следующий вид.

import java.applet.*;
import java.awt.*;
//подключение стандартных библиотек
public class circles extends 

   java.applet.Applet {
   //заголовок класса

    public void paint(Graphics g) {
    int k = Integer.parseInt(getParameter("Number"));
    //преобразовать строку с параметром в число:
    g.setColor(Color.red);
   //рисуем красным цветом
   for (int i = 1; i <= k; i++)
     //рисуем k окружностей
    g.drawOval(0,0,20*i,20*i);
    //очередная (i-я) окружность
    }
}

Начальные ее строки нам уже знакомы по предыдущему аплету и отличаются лишь названием класса. Два символа “/” являются признаком комментария, так что весь следующий за ними текст до конца строки предназначен исключительно для программистов и машиной просто игнорируется.

Наиболее сложная строчка программы преобразует считанный с web-страницы параметр (как выглядит текст страницы, показано ниже) из строковой формы в числовую. Она работает так: сначала функция getParameter("Number") возвращает значение данного параметра из текста страницы, а затем с помощью стандартной функции класса целых чисел Integer, которая называется Integer.parseInt( ), полученный текст преобразуется в целое число. В результате переменная k принимает значение, равное требуемому количеству окружностей на рисунке.

После этого устанавливается цвет рисования и в цикле рисуется необходимое количество окружностей (“овалов с одинаковой длиной и шириной”). Заметим, что переменная цикла i, изменяясь от 1 до k, обеспечивает пропорциональное увеличение радиуса окружности.

Текст web-страницы, отображающий аплет, может выглядеть примерно так.

<HTML>
   <TITLE>Наш аплет</TITLE>
<BODY>
Это наш аплет!!!
<P>
<APPLET 
      CODE = "circles.class"
      WIDTH = 200
      HEIGHT = 200>
   <PARAM Name="Number" Value="10">
</APPLET>
</BODY>
</HTML>

Обратите внимание на новую для нас строку, описывающую параметр с именем Number, которому присваивается значение 10 (разумеется, мы можем задавать и другие).

<PARAM Name="Number" Value="10">

В качестве выделенного под аплет места был задан квадрат со стороной 200 пикселей. Как видно из внимательного рассмотрения рис. 6, для последней окружности этого чуть-чуть не хватает: ее правая и нижняя границы не прорисованы. Автору показалось поучительным продемонстрировать на рисунке именно недоработанный вариант, а не окончательную картинку с правильно подобранными размерами.

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

Ссылки

1. Нотон П., Шилдт Г. Полный справочник по Java. Киев: Диалектика, 1977, 592 с.

2. Знакомство. История создания. http://ru.sun.com/java/start/intro/history.html.

3. Преподавание информатики: потерянная дорога. Информатика, 2007, № 23, с. 1, 23–24, 48.

4. Богатырев Р. Никлаус Вирт — патриарх надежного программирования. Мир ПК — диск, 2004, № 3, с. 1–7.

5. P-code machine. http://en.wikipedia.org/wiki/P-code_machine.

6. Богатырев Р. Java на марше. Мир ПК, 2002, № 9. http://www.osp.ru/pcworld/2002/09/164031/.

7. Семакин И.Г. Информатика. Базовый курс / И.Г. Семакин, Л.А. Залогова, С.В. Русаков, Л.В. Шестакова. М.: БИНОМ. Лаборатория знаний, 2004, 390 с.

8. Уоткинз Д., Хаммонд М., Эйбрамз Б. Программирование на платформе .NET. М.: Издательский дом “Вильямс”, 2003, 368 с.

9. Джамса К. Изучи сам Java сегодня. Минск: ООО “Попурри”, 1996, 416 с.

10. О чистоте русского языка и точности терминологии (под ред. М.Р. Когаловского). Oracle Magazine, русское издание, 2002, март. http://www.oracle.com/global/ru/oramag/march2002/general_sokol4.html#s15.

11. Википедия. ru.wikipedia.org.

12. Официальный сайт Sun Microsystems. http://java.sun.com.

13. Dick Chase Java Editor. http://pclc.pace.edu/~bergin/Java/dickchasejavaeditor.html.

14. http://www.eclipse.org.

15. http://www.netbeans.org.

16. http://www.bluej.org.


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

2 Ссылки (на объекты!) в Java все-таки есть, но пользователь лишен возможности их произвольно устанавливать.

3 Сказанное в полной мере относится только к Java-аплетам, а полноценные Java-приложения не имеют такого жесткого ограничения; о различиях между аплетами и приложениями речь пойдет далее.

4 ETH — Eidgenoessische Technische Hochschule, Швейцарский федеральный технологический институт в Цюрихе.

5 И на ДВК она была реализована практически.

6 C# — версия языка C в среде .NET (читается “си шарп”; одно из значений слова sharp — диез).

7 Не зря же предусмотрена константа MaxInt = High(Integer), позволяющая программисту узнать максимально разрешенное в данной версии Паскаля целое значение.

8 Пример навеян эпизодом из известного романа Ильфа и Петрова про пишущую машинку с турецким акцентом.

9 В отличие от некоторых продуктов Microsoft процедура обновления осуществляется только после подтверждения пользователем своего согласия.

10 Позднее программа называлась RealJ; в момент подготовки статьи ни под одним именем найти программу в Сети не удалось, несмотря на большое количество ссылок.

11 В Java Editor при первом запуске программисту необходимо указать пути к этим приложениям в ходе традиционного диалога выбора файлов.

12 Склонные к новизне компьютерные пользователи могут поискать и опробовать более “свежий” эквивалент.

13 В Java существует традиция идентификаторы, объединяющиеся из нескольких слов, писать именно так: первое слово со строчной, а все остальные — с заглавной буквы; в своих именах вы можете делать по-другому, но drawString — это стандартный метод, к нему надо обращаться именно так.

14 Логика построения команды традиционна: имя программы для исполнения (в нашем случае компилятора) и объект обработки (текст программы) через пробел.

15 Если вы наблюдательны, то заметите, что в момент компиляции на панели задач Windows появляется прямоугольник, соответствующий консольному окну компилятора, с которым мы с вами работали над предыдущим аплетом; само окно не видно, поскольку имеет статус минимизированного.

Е.. А.. Еремин,
г. Пермь

TopList