Статья
Версия для печати
Обсудить на форуме
Язык программирования Ява (Java). Часть 1.



   Друзья!
   
   Сегодня мы с вами начинаем изучать язык программирования Ява.
   
   Данный курс расчитан на людей не знакомых с программированием. Однако предполагается, что читатели представляют себе, что такое программирование, недесятичные системы счисления, как данные представляются в компьютере - то есть, обладают некоторым базовым набором знаний, необходимым для того, чтобы заниматься программированием. Если у Вас такого набора нет - рекомендую прочитать вводные лекции по программированию для начинающих, а также лекции по внутреннему представлению данных в компьютерах, помещенные здесь: Раздел начинающим
   
   Курс построен на базе лекций, прочитанных мной на протяжении 1998-2003 годов в различных учебных заведениях. Курс будет публиковаться на указанном выше сайте по частям, по мере их подготовки. Наряду с курсом на том же сайте могут публиковаться отдельные статьи по Яве, не имеющие к курсу прямого отношения. Если при первом прочтении такие статьи покажутся вам слишком сложными - не беспокойтесь! Просто вернитесь к ним еще раз через некоторое время. При возникновении вопросов, их можно задать в форуме на том же сайте. Я обычно отслеживаю такие вопросы и отвечаю на них.
   
   1. Что здесь будет и чего не будет.
   Здесь будет язык Ява как таковой. Здесь будут (по возможности) различные технологии, построенные на или с использованием языка Ява.
   
   Здесь НЕ БУДЕТ детального анализа различных средств разработки. Курс будет базироваться на стандартном минимально необходимом не интегрированном наборе программных средств, доступном для бесплатной и абсолютно законной загрузки с сайта компании Sun Microsystems(r). Если у вас есть какая-нибудь любимая интегрированная среда для разработки на Яве - в добрый путь! Только разбираться, что делает глубоко скрытый пункт меню вашей любимой среды вам придется самостоятельно.
   
   2. Язык Ява - что это такое, откуда оно взялось и для чего оно нужно.
   Язык Ява был создан в компании Sun Microsystems(r) в 1992 году. Первоначально язык предназначался для платформо-независимого программирования процессоров, встроенных в различные бытовые устройства.
   
   Основным недостатком существовавших на тот момент языков программирования была их ориентированность на конкретный процессор. Даже языки высокого уровня, позволявшие, в принципе, создавать программы для любого процессора, требовали наличия соответствующего компилятора, выходной код которого ориентирован на процессор, на котором программы будут исполняться. "Вековая мечта всего прогрессивного программирующего человечества" - чтобы программу можно было один раз написать, а дальше использовать на разных процессорах и под разными операционными системами - на тот момент не была реализована. Именно эту мечту и хотели воплотить в жизнь разработчики языка Ява.
   
   Интересно, что, сами того не подозревая, они создали нечто гораздо большее, чем задумывали. Дело в том, что, совершенно независимо от создания языка Ява, шло развитие интернета. И тут выяснилось, что идеи, заложенные в Яву, позволяют решить многие проблемы, связанные с программированием для интернета. Ниже мы рассмотрим детально, чем язык Ява оказался так полезен для интернета. В любом случае, вместо узкоспециализированного языка программирования для встроенных процессоров получился универсальный язык, позволяющий создавать программы, не зависящие от процессора и операционной системы, да еще и с поддержкой современных технологий!
   
   В 1995 году именно такой универсальный язык программирования Ява и был представлен компанией Sun Microsystems(r) для коммерческого использования.
   
   3. Как удалось этого достичь.
   Платформо-независимый язык - это хорошо! Но как же удалось этого достичь? Чтобы понять это, давайте посмотрим, как работает большинство языков программирования.
   
   Допустим, мы написали программу. Что мы дальше с ней делаем? Правильно, компилируем, подсоединяем библиотеки и в результате получаем исполняемый код, включающий команды процессора, на котором он должен работать. А что если мы хотим запустить эту программу на другом типе процессора? В идеале, нам надо ее просто перекомпилировать так, чтобы исполняемый код включал команды этого нового процессора. То есть, нужен другой компилятор (вообще говоря, и другие библиотеки, и другой линкер, чтобы их подсоединить). Описанный выше процесс относится к компилируемым языкам программирования. Таковыми являются, например, языки С и С++, Паскаль и многие другие.
   
   Существует и другой вариант. Написав программу мы не компилируем ее, а вместо этого запускаем специальную программу, которая называется интерпретатор. Этот интерпретатор читает нашу программу, прямо исходный текст, строчку за строчкой, команду за командой, анализирует каждую команду и исполняет ее. Языки, использующие такой подход, называются интерпретируемыми языками программирования. К таковым относились первые версии Бэйсика, а также такие языки, как Лисп и многие другие.
   
   Что нам нужно, чтобы исполнить программу, написанную на интерпретируемом языке на другом типе процессора? Перекомпилировать, естественно, ничего не нужно, просто нужно иметь интерпретатор, работающий на этом новом процессоре.
   
   У обоих подходов есть свои преимущества и недостатки. Инрерпретируемая программа не нуждается в перекомпиляции при внесении изменений или при переносе на другую платформу. Это, безусловно, преимущество по сравнению с компилируемой программой. Однако, есть и очень существенный недостаток: в отличие от скомпилированной программы, где исполняемый код состоит из команд процессора и непосредственно процессором же и исполняется, в интерпретируемой программе интерпретатор должен проанализировать каждую команду и исполнить ее. А написана-то программа в виде текста, ориентированного на человека, а не на компьютер. Таким образом, чтобы исполнить каждую команду, надо выполнить много всяких дополнительных действий по анализу текста команды, что приводит к значительному замедлению работы. В компилируемой программе эти действия выполняются однократно в процессе компиляции и, соответствено, при исполнении программы не нужны. Поэтому интерпретируемая программа может исполняться в несколько десятков, а иногда и сотен раз медленнее аналогичной компилируемой программы.
   
   Разработчики языка Ява решили совместить эти два подхода, попытавшись избавиться от недостатков обоих. Программа, написанная на Яве, сначала компилируется. Но в результате получается не исполняемый код, состоящий из команд процессора, а так называемый байткод. Байткод в дальнейшем интерпретируется. Основная идея байткода заключается в том, что он оптимизирован с точки зрения интерпретации. То есть, это не исходный текст программы, а некий вид записи инструкций программы, который можно интерпретировать во много раз быстрее, чем исходный текст. В сочетании со специальными ухищрениями при написании интерпретатора это приводит к тому, что скорость исполнения интерпретируемого байткода сравнима со скоростью исполнения скомпилированной программы.
   
   Таким образом, что мы имеем?
   1. Скомпилированная программа может быть исполнена на любом процессоре без перекомпиляции, нужен только соответствующий интерпретатор, понимающий байткоды.
   2. Скорость интерпретации байткодов ненамного медленнее скорости исполнения скомпилированной программы.
   
   Однако, и это еще не все! Допустим, мы получили обычную компилируемую программу неизвестно откуда (что стало особенно актуально с появлением интернета). В чем главная опасность при исполнении такой программы? Она может выполнять какие-то вредоносные действия на нашем компьютере, и ничего с этим не поделаешь: процессор не анализирует, что он исполняет, просто выполняет программу команда за командой. А что если мы получили программу в виде байткодов? Она будет интерпретироваться, а не исполняться непосредственно процессором. А в интерпретатор вполне можно встроить средства проверки, не пытается ли интерпретируемый код сделать что-то нехорошее. Таким образом, при правильно написанном интерпретаторе абсолютно бессмысленно, например, пытаться заразить байткод вирусом: все равно интерпретатор не даст ему работать. Именно это и было реализовано в рамках создания языка Ява.
   
   Есть и еще один интересный момент: если есть спецификация байткодов, можно написать компилятор с любого языка в байткоды, а исполнять ее будет все тот же интерпретатор. Эта дополнительная возможность, созданная компанией Sun Microsystems(r) в рамках языка Ява, была в дальнейшем широко использована в других средствах программирования другими компаниями.
   
   4. Место Явы в семействе языков программирования.
   При разработке языка Ява был широко использован синтаксис языков С и С++. Так что если вы знакомы с этими языками, вы увидите в Яве много знакомых элементов. Если вы не знакомы с С и С++ - ничего страшного: мы все равно будем изучать синтаксис Явы в полном объеме, так что вы ничего не потеряли.
   
   При создании языка Ява анализировался не только синтаксис языков С и С++, но и опыт их использования. Многие сложные и подверженные ошибкам средства этих языков в результате такого анализа были или упрощены, или устранены вовсе. Поэтому изучать язык Ява, совершенствоваться в языке Ява и создавать на нем программы проще, чем, скажем, на С++.
   
   Ява является объектно-ориентированным языком программирования. Не смущайтесь, если эти слова вам абсолютно не знакомы. В ходе изучения языка мы подробно разберем, что все это значит.


Автор: Sashok Sam
Версия для печати
Обсудить на форуме