Мост (программирование)
В информатике во время выполнения , мосты описывают системы, которые отображают поведение разных языков программирования чтобы они могли использовать общие ресурсы. Они часто используются, чтобы позволить «иностранным» языкам управлять собственными объектными библиотеками хост-платформы , переводя данные и состояние по обе стороны моста. Преодоление контрастов с «встроенными» системами, которые допускают ограниченное взаимодействие через механизм «черного ящика» , где совместное использование состояний ограничено или отсутствует.
Apple Inc. неоднократно активно использовала мосты, особенно в ранних версиях Mac OS X , которые соединялись со старыми «классическими» системами с использованием системы Carbon , а также Java . Microsoft от Common Language Runtime , представленный вместе с .NET Framework , с самого начала разрабатывался как многоязычный и исключал необходимость в расширенных связующих решениях. Обе платформы недавно добавили новые системы мостов для JavaScript , ObjC-to-JS от Apple и HTML Bridge от Microsoft.
Концепции
[ редактировать ]Функции, библиотеки и среды выполнения
[ редактировать ]Большинство языков программирования включают концепцию подпрограммы или функции — механизма, который позволяет инкапсулировать и повторно использовать часто используемый код в программе. Например, программе, которая интенсивно использует математику, возможно, потребуется выполнить вычисление квадратного корня из различных чисел по всей программе, поэтому этот код может быть изолирован в виде sqrt(aNumber)
функция, которая «передаёт» число для вычисления квадратного корня и «возвращает» результат. Во многих случаях рассматриваемый код уже существует, либо реализован на аппаратном уровне, либо как часть базовой операционной системы, в которой работает программа. В этих случаях sqrt
Функцию можно еще упростить, вызвав встроенный код.
Функции часто попадают в легко идентифицируемые группы схожих возможностей, например, математические функции или обработка текстовых файлов. Функции часто собираются вместе в коллекции, известные как библиотеки , которые поставляются вместе с системой или, что чаще в прошлом, с языком программирования. Каждый язык имеет свой метод вызова функций, поэтому библиотеки, написанные для одного языка, могут не работать с другим; семантика вызова функций в C отличается от Pascal , поэтому обычно программы C не могут вызывать библиотеки Pascal и наоборот. Обычно используемое решение этой проблемы — выбрать один набор семантики вызовов в качестве системы по умолчанию для платформы, а затем привести все языки программирования в соответствие с этим стандартом.
Большинство компьютерных языков и платформ обычно имеют дополнительные функциональные возможности, которые не могут быть выражены в модели вызова/возврата функции. Например, сбор мусора выполняется на протяжении всего времени работы приложения. Функциональность такого рода фактически находится «вне» программы, она присутствует, но не выражена непосредственно в самой программе. Подобные функции обычно реализуются в постоянно растущих системах выполнения , библиотеках, которые компилируются в программы, но не обязательно видны в коде.
Общие библиотеки и общие среды выполнения
[ редактировать ]Внедрение систем общих библиотек значительно изменило модель построения традиционных программ. Раньше код библиотеки копировался непосредственно в программу «компоновщиком » и фактически становился частью программы. При динамическом связывании код библиотеки (обычно) существует только в одном месте — в файле, предоставленном поставщиком, в системе, который используется всеми приложениями. Ранние системы представляли множество проблем, часто связанных с производительностью, а разделяемые библиотеки были в основном изолированы от конкретных языков или платформ, а не от операционной системы в целом. Многие из этих проблем были решены в 1990-х годах, а к началу 2000-х большинство крупных платформ перешли на разделяемые библиотеки в качестве основного интерфейса всей системы.
Хотя такие системы решали проблему предоставления общих библиотек кода для новых приложений, эти системы обычно также добавляли свои собственные среды выполнения. Это означало, что язык, библиотека, а теперь и вся система часто были тесно связаны друг с другом. Например, в OpenStep вся операционная система фактически представляла собой программу Objective-C . Любые программы, работающие на нем и желающие использовать обширный набор объектов, представленный в OpenStep, должны будут не только иметь возможность вызывать эти библиотеки, используя семантику Obj-C, но также взаимодействовать со средой выполнения Obj-C, чтобы обеспечить базовый контроль над приложением.
Напротив, Microsoft .NET Framework с самого начала разрабатывалась с возможностью поддержки нескольких языков, первоначально C# , C++ и новой версии Visual Basic . Для этого MS изолировала библиотеки объектов и среду выполнения в Common Language Infrastructure (CLI). Вместо компиляции программ непосредственно из исходного кода в базовый формат среды выполнения, как это происходит в большинстве языков, в модели CLI все языки сначала компилируются в Common Intermediate Language (CIL), который затем вызывает среду Common Language Runtime ( СЛР). Теоретически любой язык программирования может использовать систему CLI и объекты .NET.
Преодоление
[ редактировать ]Хотя такие платформы, как OSX и .NET, предлагают возможность адаптации большинства языков программирования к системе выполнения платформы, также бывает, что эти языки программирования часто имеют в виду целевую среду выполнения — Objective-C по существу требует среды выполнения Obj-C. , а C# делает то же самое для CLR. Если кто-то хочет использовать код C# в Obj-C или наоборот, ему нужно найти версию, написанную для использования другой среды выполнения, которая часто не существует.
Более распространенная версия этой проблемы касается использования языков, независимых от платформы, таких как Java, которые имеют свои собственные среды выполнения и библиотеки. Хотя можно создать компилятор Java, который вызывает базовую систему, например J#, такая система также не сможет взаимодействовать с другим кодом Java, если она тоже не будет перекомпилирована. Доступ к коду в библиотеках Java может быть затруднен или невозможен.
Распространение веб-браузера как своего рода виртуальной операционной системы сделало эту проблему еще более острой. Современная парадигма «программирования» в HTML5 включает язык JavaScript (JS), объектную модель документа в качестве основной библиотеки и сам браузер в качестве среды выполнения. Хотя можно было бы создать версию JS, работающую на CLR, но это в значительной степени противоречит цели языка, предназначенного в основном для работы с браузерами - если этот компилятор не может напрямую взаимодействовать с браузером, в его использовании мало смысла. .
В этих и многих подобных случаях возникает необходимость в системе, которая позволяет двум средам выполнения взаимодействовать. Это известно как «связывание» сред выполнения.
Примеры
[ редактировать ]Яблоко
[ редактировать ]Apple широко использовала мостовые технологии с момента самых первых попыток, которые привели к созданию Mac OS X.
Когда компания Apple впервые приобрела NeXT, планировалось создать новую версию OpenStep, тогда известную как Rhapsody , с эмулятором , известным как Blue Box, который будет запускать «классические» программы Mac OS. Это вызвало серьезную реакцию со стороны сообщества разработчиков, и Rhapsody была отменена. [ 1 ] Вместо этого OS X будет реализовывать многие из старых вызовов Mac OS поверх основных функций OpenStep, предоставляя путь для корректного переноса существующих приложений.
Для этого Apple взяла полезный код с платформы OpenStep и повторно реализовала основные функции в библиотеке чистого C, известной как Core Foundation , или сокращенно CF. Библиотеки OpenStep, вызывающие базовый код CF, стали Cocoa API , а новые Mac-подобные библиотеки C стали Carbon API . Поскольку сторонам системы C и Obj-C необходимо было совместно использовать данные, а данные на стороне Obj-C обычно хранились в объектах (в отличие от базовых типов), преобразования в CF и обратно могли быть дорогостоящими. Apple не хотела платить за это снижение производительности, поэтому они внедрили схему, известную как «бесплатное соединение», чтобы помочь уменьшить или устранить эту проблему. [ 2 ]
В то время Java становилась основным игроком в мире программирования, и Apple также предоставила решение Java-моста, разработанное для платформы WebObjects . Это было более классическое решение, при котором прямые преобразования между типами Java и OpenStep/CF выполнялись в коде там, где это необходимо. В рамках Carbon программа, использующая CFStrings, использовала тот же код, что и приложение Cocoa, использующее NSString, и их можно было соединить бесплатно. С помощью моста Java вместо этого CFString были преобразованы в собственные объекты String Java, что потребовало больше работы, но сделало перенос практически невидимым. [ 3 ] Другие разработчики широко использовали подобные технологии для обеспечения поддержки других языков, включая систему «пиринга», используемую для того, чтобы код Obj-C мог вызывать код .NET под Mono . [ 4 ]
Поскольку потребность в этих решениях для переноса уменьшилась, Carbon и Java Bridge были признаны устаревшими и в конечном итоге удалены из более поздних версий системы. [ 5 ] [ 6 ] Поддержка Java была перенесена на использование Java Native Interface (JNI), стандарта из мира Java, который позволял Java взаимодействовать с кодом на основе C. В OSX JNI позволял использовать код Obj-C с некоторыми трудностями. [ 7 ]
Примерно в 2012 году обширная работа Apple над WebKit привела к внедрению новой технологии моста, которая позволяет программному коду JavaScript вызывать среду выполнения Obj-C/Cocoa и наоборот. Это позволяет автоматизировать браузер с помощью Obj-C или, альтернативно, автоматизировать приложения Cocoa с помощью JavaScript. Первоначально являвшийся частью веб-браузера Safari , в 2013 году этот код стал частью новой OSX 10.9. [ 8 ]
Майкрософт
[ редактировать ]Хотя в прошлом были некоторые примеры использования мостов, система CLI Microsoft была предназначена для поддержки языков поверх системы .NET, а не для работы в собственных средах выполнения и мостах. Это привело к тому, что в системе CLI был реализован ряд новых языков, часто включающих в свое название решетку (#) или «Iron». см . в списке языков CLI Более полный набор примеров . Эта концепция рассматривалась как пример поведения MS по охвату, расширению и подавлению , поскольку она создавала Java-подобные языки (например, C# и J# ), которые не работали с другим кодом Java и не использовали их библиотеки.
Тем не менее, «классическая» экосистема Windows включала значительный объем кода, который необходимо было использовать в мире .NET, и для этой роли MS представила хорошо поддерживаемую систему мостов. Система включала в себя множество утилит и языковых функций, упрощающих использование кода Windows или Visual Basic в системе .NET. [ 9 ] или наоборот. [ 10 ]
Microsoft также представила технологию моста JavaScript для Silverlight — HTML Bridge. Bridge предоставляет типы JS коду .NET, типы .NET коду JS и управляет памятью и безопасностью доступа между ними. [ 11 ] [ 12 ]
Другие примеры
[ редактировать ]Подобные мостовые технологии, часто с использованием JavaScript на одной стороне, распространены на различных платформах. Одним из примеров является JS-мост для ОС Android, написанный в качестве примера. [ 13 ]
Этот термин также иногда используется для описания систем объектно-реляционного отображения , которые устраняют разрыв между миром баз данных SQL и современными объектными языками программирования.
Ссылки
[ редактировать ]- ↑ Дэйв Винер, «Рапсодия отменена» , 12 мая 1998 г.
- ^ «Бесплатные мостовые типы» , Apple, 19 сентября 2012 г.
- ^ «Использование Java Bridge» , Apple
- ^ "Соединение"
- ↑ Эндрю Юлл, «Apple отказывается от моста какао-Java» , OSNews, 10 июля 2005 г.
- ^ «Устарение Carbon Core» , Apple, 23 июля 2013 г.
- ^ «Техническая заметка TN2147: Разработка JNI в Mac OS X» , Apple, 14 июля 2011 г.
- ^ Найджел Брук, «Новый мост Apple Objective-C к JavaScript» , 14 мая 2013 г.
- ^ Джейсон Кларк, «Вызов управляемого метода .NET из собственного кода» , журнал MSDN
- ^ «Вызов управляемого метода .NET из собственного кода» , Microsoft
- ^ «HTML Bridge: взаимодействие между HTML и управляемым кодом» , Microsoft
- ^ «Использование HTML Bridge» , Microsoft
- ^ «Разработка для Android: пример моста JavaScript – полное объяснение!» Архивировано 29 июля 2013 г., в Wayback Machine , граф объектов, 16 мая 2012 г.