ПЗ (1192662), страница 4
Текст из файла (страница 4)
Это означает, что при выполнении приложений хосту сценариев на серверной машине необходимоинтерпретировать ваш код и построчно преобразовать его в низкоуровневый машинный код. Этот процесс печально известен своей низкой скоростью [20].
Приложения ASP.NET всегда компилируются – фактически невозможно выполнить код С# или VB.NET без его предварительной компиляции. Приложения ASP.NET в действительности проходят два этапа компиляции. На первом этапе написанный вами код С# компилируется в код промежуточного языка под названием Microsoft Intermediate Language (MSIL), или просто IL. Этот первый шаг является фундаментальной причиной взаимозависимости .NET от языков.
По сути, все языки .NET (включая С#, Visual Basic и многие другие) компилируются в фактически идентичный код IL. Этот первый этап компиляции может произойти автоматически при первом запросе страницы, или же его можно выполнить заранее (этот процесс Известен как предварительная компиляция). Скомпилированный файл с кодом IL является сборкой [15,16,20].
Второй этап компиляции наступает непосредственно перед фактическим выполнением страницы. На этом этапе код IL компилируется в низкоуровневый собственный машинный код. Этот этап известен как оперативная компиляция "точно к нужному моменту" (Just-In-Time– JIT) и он проходит одинаково для всех приложений .NET (включая, например, приложения Windows).
Компиляция .NET делится на два этапа с целью предоставления разработчикам удобных условий и мобильности. Двухэтапный процесс компиляции показан на рисунке 1
Перед созданием низкоуровневого машинного кода компилятору необходимо знать, в какой операционной системе и на каком базовом оборудовании будет функционировать приложение (например, 32- или 64-разрядная ОС Windows). Благодаря двум этапам компиляции, можно создать скомпилированную сборку с кодом .NET и распределить ее на более чем одну платформу;
3) ASP.NET поддерживает несколько языков. Несмотря напредпочтение какого-то одного языка перед другимипри разработке приложений этот выбор не определит то, чего можно достигнуть с помощью Web-приложений, поскольку какой бы язык не использовался, код компилируется в IL.
IL является конечной целью каждого управляемого приложения (Управляемым (managed) приложением называется любое приложение, написанное для .NET и выполняющееся внутри управляемой среды CLR). В известном смысле IL является языком .NET и единственным языком, распознаваемым CLR;
Рисунок 1– Процесс компиляции
4) ASP.NET функционирует внутри исполняющей среды CLR. Возможно, наиболее важным аспектом ASP.NETявляется его функционирование внутри исполняющей среды CLR. Вся среда .NET Framework – то есть все пространства имен, приложения и классы – называется управляемый кодом.
Рассмотрим основные преимущества CLR:
– автоматическое управление памятью и сборка мусора. Каждый раз, когда приложение создает экземпляр объекта, CLR выделяет для него пространство памяти в управляемой куче. Как только ссылка на объект выходит за пределы области видимости (или приложение завершается), объект становится доступным для сборщика мусора. Сборщик мусора периодически запускается внутри CLR, автоматически восстанавливая неиспользованную память для недоступных объектов. Эта модель избавляет от низкоуровневых деталей манипулирования памятью C++ и от запутанности подсчета ссылок СОМ [3];
– безопасность типов. При компиляции приложения .NET добавляет к сборке информацию о доступных классах, их членах, типах данных и томуподобном. Это приводит к полной самостоятельности скомпилированных сборок кода. Другие разработчики могут использовать их без запроса каких-либо других файлов поддержки и компилятор может проверять допустимость каждого обращения во время выполнения. Этот дополнительный уровень безопасности полностью избавляет от возникновения низкоуровневых ошибок наподобие печально известного переполнения буфера;
– расширяемые метаданные. Информация о классах и элементах является лишь одним из типов метаданных, хранимых .NET в скомпилированной сборке. Метаданные описывают код и позволяют предоставлять дополнительную информацию исполняющей среде или другим службам. Например, эти метаданные могут сообщить Visual Studio о том, как отображать специальный элемент управления во время проектирования. Метаданные также можно использовать для активизаций других служб времени выполнения (например, веб Meтодов или служб СОМ+);
– структурированная обработка ошибок. Структурированная обработка исключений позволяет логически и лаконично организовать свой код обработки ошибок. Появляется возможность создавать отдельные блоки для работы с различными типами ошибок, встраивать обработчики исключений на глубину в несколько уровней;
– многопоточность. CLR предоставляет пул потоков, которые могут использоваться различными классами. Например, можно асинхронно вызывать методы, читать файлы либо взаимодействовать с веб-службами без необходимости явного создания новых Потоков;
5) ASP.NET являетсяобъектно-ориентированной.ASP поддерживает относительно слабую объектную модель с достаточно скудным набором объектов; эти объекты в действительности представляют собой лишь тонкий уровень, скрывающий подробности HTTP и HTML.
Напротив, ASP.NET является объектно-ориентированной средой. Один из лучших примеров объектно-ориентированного мышления в ASP.NET можно найти в серверных элементах управления. Серверные элементы управления представляют собой инкапсуляцию в миниатюре. Разработчики могут программно манипулировать объектами управления с использованием кода для настройки их внешнего вида, предоставления данных для отображения и даже реакции на события. Низкоуровневые подробности HTML спрятаны «за сценой». Вместо того чтобы вынуждать разработчика писать «сырой» HTML вручную, объекты управления преобразуются в HTML по завершении визуализации страницы. Таким образом, ASP.NET предлагает серверные элементы управления в качестве способа устранения низкоуровневых подробностей программирования на HTML и HTTP;
6) ASP.NET легко развертывается и конфигурируется. Одной из самых сложных проблем, предстающих перед разработчиками, является развертывание готового приложения на производственном сервере. Необходимо не только переместить файлы Web-страниц, базы данных и компоненты, но также зарегистрировать компоненты и повторно создать множество параметров конфигурации. В ASP.NET этот процесс существенно упрощен. Каждая инсталляция .NET Framework предоставляет одинаковые базовые классы. Поэтому развертывание приложения ASP.NET является относительно простым. В большинстве случаев просто потребуется скопировать все файлы в виртуальный каталог на производственном сервере (с использованием программы FTP или команды, подобной JCCOPY). Установка .NET Framework на машине-хосте избавит пользователя от трудоемкой регистрации. Распространение компонентов, используемых приложением, также является легким. Необходимо лишь скопировать сборки компонентов при развертывании веб-приложения [31,33].
Поскольку вся информация о компоненте хранится прямо в метаданных файла сборки, потребность в запуске программы регистрации или изменении системного реестра Windows отсутствует. Как только компоненты помещаются в подкаталог каталога веб-приложения, механизм ASP.NET автоматически определяетих наличие и делает доступными коду веб-страницы.
Конфигурирование является еще одной задачей, связанной с развертыванием приложения, в особенности при необходимости передачи информации о безопасности, такой как учетная запись и привилегии пользователя. ASP.NET упрощает процесс развертывания, сводя к минимуму зависимость от настроек US (Internet lnfoemation Services – информационные службы Interact). Вместо этого большинство установок ASP.NET хранится в специальном файле web.config [15].
Файл web.cohfig помещается в тот же каталог, что и веб-страницы. Он содержит иерархически сгруппированные настройки приложения, хранимые в удобочитаемом формате XML, который можно редактировать с использованием простого текстового редактора, подобного Notepad.
При изменении настройки приложения ASP.NET замечает это изменение и перезапускает приложение в новом домене приложения (поддерживая существующий домен приложения вплоть для завершения обработки каких-то невыполненных запросов). Файл web.config никогда не блокируется, поэтому его можно обновлять в любое время.
2.3 Язык С#
В июне 2000 года стало известно о новом языке программирования, родившемся в недрах компании Microsoft. Он стал частью новой технологии Microsoft, названной .NET(читается «DotNet»). В рамках этой технологии предусмотрена единая среда выполнения программ (Common Language Runtime, CLR), написанных на разных языках программирования. Одним из таких языков, основным в этой среде, и является С# (C#, читается «Csharp», «Си шарп»). Названием языка, конечно же, хотели подчеркнуть его родство с С++, ведь # – это два пересекшихся плюса. Но больше всего новый язык похож на Яву. И нет сомнений, что одной из причин его появления стало стремление Microsoft ответить на вызов компании Sun.
Хотя официально авторы С# не называются, но на титульном листе одной из предварительных редакций справочника по языку обозначены Андерс Хейльсберг (Anders Hej lsberg) – создатель Турбо Паскаля и Дельфи, перешедший в 1996 году вMicrosoft, и Скотт Вилтамут (Scott Wiltamuth).
Единая среда выполнения программ основана на использовании промежуточного языкаI(Intermediate Language – промежуточный язык), исполняющего почти ту же роль, что и байт-код виртуальной машины языка Ява. Используемые в рамках технологии .NET компиляторы с различных языков транслируют программы в IL-код. Так же как и байт-код Явы,IL-код представляет собой команды гипотетической стековой вычислительной машины. Но есть и разница в устройстве и использовании IL.
Во-первых, в отличие от JVM, IL не привязан к одному языку программирования. В составе, предварительных версий Microsoft.NET имеются компиляторы с языков С++, С#, Visual Basic. Независимые разработчики могут добавлять другие языки, создавая компиляторы с этих языков в IL-код.
Во-вторых, IL предназначен не для программной интерпретации, а для последующей компиляции в машинный код. Это позволяет достичь существенно большего быстродействия программ. Содержащие IL-код файлы несут достаточно информации для работы оптимизирующего компилятора.
Основные черты Си#
«С# – простой, современный, объектно-ориентированный язык с безопасной системой типов, происходящий от С и С+. С# будет удобен и понятен для программистов, знающих С и С++. С# сочетает продуктивностьVisualBasicи мощность С++.» Такими словами начинается описание С#. Мы же рассмотрим технические особенности языка.
Единицей компиляции является файл (как в С, С++, Яве). Файл может содержать одно или несколько описаний типов: классов (class), интерфейсов (interface), структур (struct), перечислений (enum), типов-делегатов (delegate) с указанием (или без указания) об их распределении по пространствам имен.
Пространства имен (namespace) регулируют видимость объектов программы (как в С++). Пространства имен могут быть вложенными. Разрешено употребление объектов программы без явного указания пространства имен, которому этот объект принадлежит. Достаточно лишь общего упоминания об использовании этого пространства имен в директиве using (как в Турбо Паскале). Предусмотрены псевдонимы для названий пространств имен в директиве using (как в языке Оберон).
Элементарные типы данных: 8-разрядные (sbyte,byte), 16-разрядные (short,ushort), 32-разрядные (int,uint) и 64-разрядные (long,ulong) целые со знаком и без знака, вещественные одиночной (float) и двойной (double) точности, символы Unicode (char), логический тип (bool, не совместим с целыми), десятичный тип, обеспечивающий точность 28 значащих цифр (decimal).
Структурированные типы: классы и интерфейсы (как в Яве), одномерные и многомерные (в отличие от Явы) массивы, строки (string), структуры (почти то же, что и классы, но размещаемые не куче и без наследования), перечисления, несовместимые с целыми (как в Паскале).
Типы-делегатыили просто «делегаты» (подобны процедурным типам в Модуле – 2 и Обероне, указателям на функции в С и С++).
Типы подразделяются на ссылочные (классы, интерфейсы, массивы, делегаты) и типы-значения (элементарные типы, перечисления, структуры). Объекты ссылочных типов размещаются в динамической памяти (куче), а переменные ссылочных типов являются, по сути, указателями на эти объекты. В случае типов-значений переменные представляют собой не указатели, а сами значения. Неявные преобразования типов разрешены только для случаев, когда они не нарушают систему безопасности типов и не приводят к потере информации. Все типы, включая элементарные, совместимы с типом object, который является базовым классом всех прочих типов. Предусмотрено неявное преобразование типов-значений к типу object, называемое упаковкой (boxing), и явное обратное преобразование – распаковка (unboxing).
Автоматическая сборка мусора (как в Обероне и Яве).
Обширный набор операций с 14 уровнями приоритета. Переопределение операций (как в Алголе-68, Аде, С++). С помощью операторовcheckedиuncheckedможно управлять контролем переполнения при выполнении операций с целыми.















