Основные понятия Интернет

Автор: Пользователь скрыл имя, 20 Октября 2012 в 17:46, лекция

Описание работы

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

Работа содержит 1 файл

Опорный конспект лекций.doc

— 648.00 Кб (Скачать)

# Выясняем, поддерживает  ли браузер XHTML.

my $html = "text/html";

my $xhtml = "application/xhtml+xml";

my $type = $ENV{HTTP_ACCEPT} =~ m/\Q$xhtml\E/ ? $xhtml : $html;

# Вывод соответствующего  заголовка.

print "Content-Type: $type\n\n";

# Вывод (X)HTML-документа.

print "...";

При отправке данных как  «application/xhtml+xml», надо учитывать ещё  несколько моментов, без которых  возможно появление ошибок. Так как  синтаксически XHTML — это XML , элементы «script» и «style» в XHTML — это #PCDATA-блоки (а не #CDATA). Содержимое таких блоков необходимо помещать в специальную секцию CDATA , иначе процессор XML преобразует специальные символы в их эквиваленты ещё до обработки браузером таблицы стилей или сценария. Следующий пример показывает, как можно это сделать:

<script type="text/javascript"><!--//--><![CDATA[//><!--

  ...

  //--><!]]></script>

...

<style type="text/css"><!--/*--><![CDATA[/*><!--*/

...

/*]]>*/--></style>

Такой синтаксис универсален. Этот код будет корректно работать и при «text/htm l » и при «application/xhtml+xml».

Хорошим и самым простым  решением будет подключение внешних  файлов таблиц стилей и скриптов. В XHTML это делается так же как и  в HTML :

<!-- Подключение CSS -файла (не забудьте о закрывающем слеше). -->

< link rel = "stylesheet" type = "text/css" href = "file.css" title

= "" media = "screen" / >

<!-- Подключение JS -файла. -->

< script type = "text/javascript" src = "file.js" ></

script >

 

Тема 7 Языки программирования систем.

 

Java

Язык Java - это новый  объектно-ориентированный язык программирования, созданный фирмой Sun для разработки программ, распространяемых по сети Internet. Система программирования Java позволяет  использовать World Wide Web (WWW) для распространения небольших интерактивных прикладных программ (апплетов), которые размещаются на серверах Internet, транспортируются клиенту по сети (точно так же, как картинки или звуковые файлы), автоматически устанавливаются и запускаются на месте, как часть документа WWW. При этом апплет имеет весьма ограниченный доступ к ресурсам компьютера клиента, так что он может предоставить произвольный мультимедийный интерфейс и выполнять сложные вычисления, не привнося при этом риска заражения вирусом или порчи данных.

Система программирования Java может служить основой для  совместной разработки больших программных  систем коллективом разработчиков, связанных между собой только через WWW (они и знакомы между  собой могут быть лишь заочно, через e-mail, а когда они наконец повстречаются где-нибудь на международном симпозиуме, в их активе уже может быть совместно разработанная программная система). Java и WWW являются первыми системами, обеспечивающими такую возможность, поэтому их внедрение и распространение многие программисты справедливо называют революцией в разработке программного обеспечения. Ясно, что ведущую роль в обеспечении указанной возможности играет именно Java, так как именно Java позволяет распространять не просто тексты, а работающие программы и их фрагменты (апплеты) по WWW.

Отсюда большой интерес  к языку и системе программирования Java со стороны буквально всех категорий  разработчиков и пользователей  программного обеспечения. Все ведущие  фирмы, разрабатывающие компьютерную аппаратуру и программное обеспечение (и IBM, и DEC, и Microsoft, список можно продолжать очень долго) официально объявили о поддержке языка и системы программирования Java. Все распространенные инструментальные системы уже поддерживают программирование на Java. В WWW можно найти сотни тысяч публикаций и программной продукции, связанных с Java, в том числе свободно распространяемая система программирования Java, разработанная фирмой Sun-Soft (недавно из этой фирмы выделилась самостоятельная фирма Java-Soft), а также свободно распространяемая система программирования GNU-Java, разработанная FSF. Написаны десятки учебных пособий по Java (часть из них переведена на русский язык и издана в нашей стране), статьи и обзоры по языку Java и его применениям регулярно публикуются в серьезных и популярных программистских журналах и еженедельниках.

В состав системы программирования Java входят следующие компоненты:

  • компилятор с языка Java на внутренний язык Java Byteсode (JavaBC): Java-программы и апплеты распространяются по WWW и интерпретируются на JavaBC;
  • загрузчик-верификатор программ на JavaBC;
  • интерпретатор JavaBC, называемый виртуальной машиной языка Java (JavaVM - Java Virtual Machine);
  • многочисленные библиотеки классов и утилиты, существенно упрощающие программирование на Java.

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

Основным свойством  апплетов является возможность выполнять их на различных платформах и в различных окружениях, не оказывая вредного влияния на аппаратуру, программы и данные их пользователей. Язык, ориентированный на программирование апплетов должен прежде всего обеспечивать надежность и безопасность. Этого легче всего достичь в интерпретируемом языке, хотя интерпретация, как правило, ведет к существенной потере эффективности программы (она выполняется гораздо медленнее, чем могла бы), причем эти потери растут (нелинейно!) с ростом объема программы и объема обрабатываемых ею данных. Пока язык используется для разработки сравнительно небольших апплетов (например, апплета, выводящего на экран текущее состояние табло аэропорта, или биржи, или баскетбольного матча), эти потери просто не замечаются. Создается иллюзия, что скоро вообще можно будет решить проблему составления новых программ путем объединения ("сшивания") уже имеющихся в сети апплетов. Если стать на такую точку зрения, то интерпретируемый язык является наиболее естественным: ведь программа, состоящая из вызовов большого числа апплетов, все равно интерпретируется. К сожалению, с ростом объема такой программы она вообще перестанет выполняться ввиду нехватки ресурсов, или будет выполняться неприемлемо долго. Поэтому в окружении Java остро стоит проблема эффективности Java-программ. Авторы языка Java предчувствовали возникновение этой проблемы. Они ввели в язык легковесные процессы (трэды), обеспечив их параллельное выполнение на многопроцессорных компьютерах (которых становится все больше), они сконструировали интерпретатор языка (JavaVM) таким образом, что в Java-программу можно включать фрагменты, написанные на других языках и выполняемые в объектном коде (native code) соответствующей платформы. Но, как будет показано, эти средства языка Java не решают проблемы эффективности в полной мере, так как потери, связанные с интерпретацией намного больше. В данной статье будут рассмотрены основные пути решения проблемы эффективности системы Java.

Как уже было отмечено, Java - объектно-ориентированный язык. Это дало возможность зафиксировать достаточно компактное ядро языка, ограничив его сравнительно небольшим числом различных синтаксических конструкций, а большую часть возможностей языка вводить с помощью классов. Так, трэды включены в язык с помощью классов Thread и ThreadGroup. В виде классов реализованы и такие базовые языковые понятия, как функции обработки строк и обработка исключений. Развитие языка Java тоже ведется путем включения в него новых классов и пакетов (пакеты заменяют в системе программирования Java файлы-заголовки окружения C/C++, однако, в отличие от файлов-заголовков, пакеты содержат как спецификацию классов, так и их реализацию; подробнее о пакетах см. ниже). Такой способ расширения языка удобен тем, что старые компиляторы остаются пригодными и для расширенного языка. Многие новые свойства языка, введенные в него через новые классы и пакеты, будут рассмотрены (или хотя бы упомянуты) ниже. В частности, будут рассмотрены пакеты GJL и SJL, обеспечивающие некоторые удобные для приложений структуры объектов (контейнеры и итераторы). В языке C++ такие возможности поддерживаются широко известной библиотекой классов STL, в 1995 году включенной в его стандарт.

 

 

Основные конструкции  языка Java

Авторы языка Java стремились сделать его внешне похожим на широко распространенный среди программистов язык C++. Поэтому синтаксис языка Java во многом совпадает с синтаксисом C и C++. И действительно в Java сохранена лексика и основные синтаксические конструкции C++. Как и в C++ в Java определены унарные и бинарные арифметические, логические и битовые операции, несколько операций присваивания, тренарная условная операция, явные и неявные операции приведения типов (причем все перечисленные операции имеют такие же обозначения и приоритеты, что и соответствующие операции C/C++). Как и в C++ в Java определены управляющие операторы if, if-else, break, switch, return, while, do-while, for, continue (все перечисленные операторы имеют семантику аналогичную семантике соответствующих операторов C/C++). Как и в C++ в Java определены классы, имеющие закрытую (private), ограниченно доступную (protected) и общедоступную (public) части, классы служат шаблонами для порождения объектов, для классов определено отношение наследования (правда в Java отменено множественное наследование), определены конструкторы и деструкторы, указатель this, абстрактные классы. На первый взгляд может показаться, что Java - просто еще одна версия C++.

Но это впечатление  неверное. Язык Java существенно отличается от C++, так как при разработке Java из C++, который был взят за основу, были исключены почти все особенности C++, имеющие корни в языке C, из которого развился C++. В результате Java оказался не очередным диалектом C++, а новым языком, который лучше C++ в основном за счет того, чего в нем нет по сравнению с C++. В отличие от C++ Java позволяет писать надежные, безопасные, простые, удобные и легкие для понимания программы, хотя и более медленные, чем программы, написанные на C++.

Что же было исключено  из C++ при разработке Java? Прежде всего были исключены указатели. Указатели или адреса в памяти - наиболее мощное средство написания высокоэффективных программ в окружении C/C++, но это и наиболее опасное средство этих языков. И дело даже не в том, что, как отмечают авторы языка Java, при недостаточно аккуратном обращении с указателями могут возникать трудно устранимые ошибки в C++-программе. Более существенные трудности в работе с указателями выявляются при разработке распределенных программ, когда требуется осуществить удаленный вызов функции (метода), среди параметров которой есть указатели. Еще более существенные трудности связаны с возможностью работы с произвольными адресами памяти через бестиповые указатели, так как это позволяет полностью игнорировать защиту памяти.

В языке Java нет указателей; все объекты программы расположены  в куче (heap) и доступны по объектным  ссылкам, которые представляют объекты  во всех структурах, в которые могут  входить объекты в качестве компонентов. Поскольку при работе с кучей  программист не может пользоваться взаимным расположением объектов в памяти, это решение означает, что из языка Java исключена "кусочно-линейная" модель памяти системы C/C++, при которой массив - лишь точка (ячейка) памяти, на которую ссылается указатель этого массива; конечно, это решение исключило непосредственный доступ к памяти, но оно усложнило работу с элементами массивов и, естественно, является источником более низкой эффективности Java-программ по сравнению с C++-программами. Необходимо отметить, что объектные ссылки языка Java содержат информацию о классе объектов, на которые они ссылаются, так что объектные ссылки - это не указатели, а дескрипторы объектов. Наличие дескрипторов позволяет JavaVM выполнять проверку совместности типов на фазе интерпретации кода, возбуждая исключение в случае ошибки.

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

Стремление упростить Java-программы и сделать их более  понятными привело к отказу от файлов-заголовков (h-файлов) и препроцессорной обработки. По мнению авторов Java файлы-заголовки, содержащие прототипы классов и распространяемые отдельно от двоичного кода этих классов, усложняют управление версиями, а механизм поддержки этой возможности в C/C++ помогает злонамеренным пользователям получать доступ к приватным данным объектов. В Java-программах спецификация класса и его реализация всегда содержатся в одном и том же файле. Препроцессор C/C++ с его возможностями условной компиляции дает возможность писать непонятные тексты программ, что, конечно, не очень хорошо. Но отказ от препроцессора привел к невозможности параметризации классов по типам (классам) их членов, что усложняет программирование простых вещей (например, на Java, в отличие от C++, нельзя иметь массив, элементами которого являются объекты произвольного класса). И, конечно, из Java исключен ненавидимый многими программистами-педантами оператор goto, замененный на continue и break с меткой.

Кроме того из Java исключены "дублирующие" понятия и конструкции языка C++, в частности, функции (в Java есть только методы классов), а также структуры (struct) и объединения (union) (в Java для этого используются атрибуты классов).

Необходимо также отметить, что в куче размещаются все данные Java-программы. Это означает, что хотя в Java и определены данные простых типов (byte, short, int, long, char, float, double, boolean) переменные этих типов могут быть лишь атрибутами объектов. Отсюда следует, что если нужно завести переменную, например, целого типа (int), то необходимо завести объект класса Int, который имеет один атрибут типа int и два метода - соответственно чтения значения этого атрибута и записи в него нового значения.

Таким образом, несмотря на внешнее сходство с C++, Java не просто является новым языком программирования, он настолько глубоко отличается от C++, что конвертировать разумным образом C++-программы на язык Java (или наоборот) - очень сложная задача.

Завершая краткий обзор  языка Java, рассмотрим его конструкции, которых нет в C++. Это операторы package, import, interface и implements.

Оператор package, помещаемый в начале исходного программного файла определяет пакет, т.е. область  в пространстве имен классов, в которой  определяются имена классов, содержащихся в этом файле; внутри указанной области пространства имен можно выделить подобласти, используя все тот же оператор package; действие оператора package аналогично действию объявления директории на имена файлов. Для обеспечения возможности использования коротких имен классов, помещенных в другие пакеты, используется оператор import. Пакет, определяемый оператором package по существу является структурной частью проектируемой программной системы, в аспекте интерфейса во многом похожей на объект, но имеющей более сложную структуру (он играет роль подсистемы). Если ввести пакеты (подсистемы) в объектно-ориентированные методологии структурного проектирования программных систем (например, в известную методологию OMT), они станут еще более мощным средством поддержки программных проектов.

Оператор interface, позаимствованный разработчиками Java из языка Objective_C (там  аналогичное понятие называется протоколом), открывает определение  интерфейса. Интерфейс - это набор  сигнатур методов без из реализации. Каждый интерфейс может быть реализован одним или несколькими классами, при этом классы, реализующие один и тот же интерфейс, могут быть никак не связаны по иерархии наследования. Класс может реализовывать любое число интерфейсов (список интерфейсов, реализуемых некоторым классом указывается в операторе implements, дополняющим определение соответствующего класса). На множестве интерфейсов тоже определена иерархия по наследованию, но она не имеет отношения к иерархии классов. В языке Java интерфейсы обеспечивают большую часть той функциональности, которая в C++ обычно представляется с помощью механизма множественного наследования.

Информация о работе Основные понятия Интернет