Программирование для Silverlight с помощью CoreCLR - Работа на различных платформах
ОГЛАВЛЕНИЕ
Работа на различных платформах
Silverlight работает не только на Windows. Мы находимся в партнерских отношениях с Novell, чтобы поддерживать Linux через среду выполнения Moonlight проекта Mono. Майкрософт также работает над версиями Silverlight для передовой ОС Symbian и Windows Mobile. Moonlight работает на Mono, а мобильная версия Silverlight будет работать на .NET Compact Framework (занимающей гораздо меньше памяти, чем CoreCLR). Но версия Silverlight для Mac OS X работает на точно той же CoreCLR, что и Windows.
Мы добились этого с помощью слоя платформенной адаптации (Platform Adaptation Layer – PAL). PAL – это интерфейс API, написанный для работы на различных платформах. Он предоставляет абстракции для обработки ошибок, обработки файлов, сетевых служб, семантики потоков и так далее. Функции в PAL имеют те же имена, что и интерфейсы API Win32, но различаются по реализации. Некоторые из интерфейсов API просто передают параметры функции PAL к функции OS X, тогда как другим необходимо использовать специальную логику для согласования функциональности OS X с сигнатурами интерфейсов API Windows. Часть функциональности Windows, используемой CoreCLR, не существует на Mac, и в силу этого ее приходится целиком реализовывать в PAL (см. рис. 2).
Значительная часть PAL Silverlight пользуется уроками, извлеченными при разработке инфраструктуры общего языка с кодом совместного пользования (SSCLI), также известной как Rotor. SSCLI работала на ряде платформ в стиле UNIX, помимо Windows. Базовая функциональность ОС на платформах типа UNIX сильно изменяется. PAL SSCLI нужно было работать как на микроядрах (таких как ядро Mach в Mac OS X), так и на монолитных ядрах, а также взаимодействовать с различными службами ОС, вроде работы с потоками, обработки исключений и сетевых стеков. Поскольку Silverlight предназначен только на компьютеры Windows и Intel Mac, у нас была возможность писать специальные реализации под Mac для многих из функций PAL, что помогло с размером и производительностью PAL.
PAL поддерживает лишь часть Win32, необходимую для работы Silverlight. В поддержке реестра, GDI+ или COM нет нужды. Мы не реализовывали Windows поверх OS X, а также не реализовывали Windows в достаточной мере, чтобы поддержать полные возможности настольной CLR. Ограничение PAL только поддержкой Silverlight позволило ему быть маленьким и быстрым.
Сокрытие различий между операционными системами является непростой проблемой с учетом того, насколько OS X отличается от Windows. Значительная часть OS X написана на Objective C и предоставляет систему обработки исключений, несовместимую с C++. CLR создает потоки ввода/вывода, отдельные от рабочих потоков. Они основаны на портах завершения ввода/вывода, появившихся в Windows NT 3.5 и не существующих в OS X. Даже простое обнаружение файла отличается в Mac благодаря разделению каталогов обратной косой чертой в Windows.
В ходе проектирования и разработки CoreCLR мы сосредотачивались на предоставлении среды, позволяющей разработчикам пользоваться существующими навыками и средствами при разработке насыщенного содержания для небольшой, безопасной среды выполнения. Большинство наших решений было определялось сокращенными случаями приложений для Интернета с широкими возможностями, но некоторые решения также извлекли пользу из нашей прошлой работы. Некоторые из решений, сделанных нами в случае CoreCLR, со временем доберутся обратно до настольных систем. Например, можно ожидать, что следующая версия настольной CLR будет работать параллельно в процессе с другими версиями CLR. Кроме того, большинство изменений, связанных с улучшенной моделью прозрачность безопасности, появятся в следующей CLR.
Мы тщательно рассмотрели, что имело смысл в случаях веб-приложений, а что не требовалось в среде. Мы надеемся, что сделанные решения верны и верим, что пользователи сообщат нам, что еще можно улучшить. Удачного программирования в Silverlight 2 и следите за этой рубрикой, чтобы не пропустить более глубоких рассмотрений CoreCLR.
Эндрю Парду (Andrew Pardoe)