Способ использования нескольких языков систем

Разработка гибридных подсистем. Использование нескольких языков программирования в одном приложении

На сегодняшний день существует большое количество языков программирования для среды Windows . Каждый из языков имеет свои преимущества и недостатки. Приложение , в котором используется несколько языков одновременно — гибридное, может обладать всеми преимуществами используемых языков. Например, производительность С++ и пользовательский интерфейс XAML .

В данной лекции рассматривается создание компонентов на C++ для Windows 8, который оформляется библиотекой DLL , вызываемой из приложения для Windows Store , построенного с использованием JavaScrip. Такой подход имеет ряд преимуществ:

  1. Используется производительность C++ в сложных операциях или операциях с большим объемом вычислений.
  2. Повторное использование существующего кода, который уже написан и протестирован.

В среде Windows 8 можно создавать компоненты (фактически DLL ) на языках C++, C# и Visual Basic , а затем использовать полученные компоненты в программах для Windows Store , разработанных на языке JavaScript, XAML . При этом имеется возможность в JavaScript обращаться к API функциям Windows . Фактически в Windows 8 реализован механизм, который позволяет выбрать язык для создания оболочки определенной функции, и реализовать интерфейс пользователя для этой функции на JavaScript.

При построении решения, содержащего JavaScript и компонент для Windows , файлы проекта JavaScript и скомпилированная библиотека DLL объединяются в один пакет, который можно отлаживать локально, в имитаторе, или удаленно в связанном устройстве. Также можно распространять только проект компонента как расширение SDK .

При написании кода компонента на C++, как правило, используются обычная библиотека C++ и встроенные типы , за исключением абстрактного двоичного интерфейса ( ABI ), в котором передаются данные в/из JavaScript. Здесь используются типы Windows и специальный синтаксис , поддерживаемый средой Visual C++ для создания этих типов и управления ими. Кроме того, код Visual C++ будет использовать такие типы, как delegate и event , для реализации событий, которые можно инициировать из компонента и обрабатывать на языке JavaScript.

Создание экземпляра объекта

Через интерфейс ABI можно передавать только типы cреды Windows. Если компонент содержит такой тип, как std::wstring , в качестве возвращаемого типа или параметра открытого метода, компилятор создает ошибку. Если используются встроенные типы C++, такие как int , double и т д., компилятор автоматически преобразует их в соответствующий тип int32 среды исполнения, float64 и т. д. в параметрах и возвращаемых типах открытых методов. Преобразование выполняется только при передаче типа через ABI.

Встроенные типы С++, типы библиотек и типы среды Windows

Экземпляр активируемого класса может быть создан в другом языке, например JavaScript. Для использования такого компонента, например написанного на JavaScript, необходимо наличие в компоненте, по крайней мере, одного активируемого класса.

Компоненты среды исполняемой среды могут содержать несколько активируемых классов, а также дополнительные классы, которые доступны только для внутреннего использования в компоненте. К типам C++, которые не предназначены для использования на JavaScript, необходимо применить атрибут WebHostHidden .

Активируемый класс должен быть объявлен как public ref class sealed . Ключевые слова класса ref указывают компилятору создать класс как тип, совместимый с исполняемой средой, а ключевое слово sealed запрещает наследование от этого класса. Для использования в JavaScript класс должен иметь модификатор sealed .

Все числовые примитивы определяются в пространстве имен по умолчанию. Platform Namespace — это пространство имен, в котором C++ определяет классы, являющиеся типами среда исполнения Windows. К ним относятся классы: Platform::String и Platform::Object . Конкретные типы коллекций, такие как Platform::Collections::Map и latform::Collections::Vector определяются пространстве имен Platform::Collections . Открытые интерфейсы, реализуемые этими типами, определяются в пространстве имен Windows::Foundation::Collections .

Обмен данными между классами и через ABI осуществляется через стандартные для С++ методы. Некоторые из них рассмотрены ниже.

Метод, возвращающий значение встроенного типа

Метод, возвращающий пользовательскую структуру значения

Для передачи определяемых пользователем структур через интерфейс ABI, необходимо определить объект JavaScript, который содержит те же члены, что и структура, определенная в C++. Затем можно передать этот объект в качестве аргумента методу C++, чтобы объект был неявно преобразован в тип C++. Другой способ состоит в определении класса, который реализует интерфейс IPropertySet (не показан).

Читайте также:  Маш способ приготовления крупа

Перегруженные методы

В JavaScript имеется ограниченная возможность различения перегруженных методов. Например, JavaScript может определить различия между следующими сигнатурами:

Однако, между следующими сигнатурами язык не определит разчилий:

или этими сигнатурами такого вида:

В случаях неоднозначности можно добиться, чтобы код JavaScript всегда вызывал конкретную перегрузку, путем применения атрибута Windows::Metadata::DefaultOverload к сигнатуре метода в файле заголовка.

Коллекции и массивы

Коллекции, всегда передаются через интерфейс ABI в качестве дескрипторов типов среды исполнения Windows, таких как Windows::Foundation::Collections::IVector^ и Windows::Foundation::Collections::IMap^ . Например, если возвращается дескриптор типа Platform::Collections::Map , он будет неявно преобразован в Windows::Foundation::Collections::IMap^ . Интерфейсы коллекций определяются в отдельном пространстве имен, состоящем из классов C++, которые предоставляют конкретные реализации.

Свойства

Открытые элементы данных, такие как свойства, необходимо представлять с помощью ключевого слова property . Тривиальное свойство аналогично элементу данных, поскольку вся его функциональность является неявной. Нетривиальное свойство имеет явные методы доступа get и set и закрытую переменную с именем, которая является «резервным хранилищем» для значения.

Делегаты и события

delegate — это тип среда исполнения Windows, представляющий объект функции. Делегаты можно использовать в связи с событиями, обратными вызовами и асинхронными вызовами методов, чтобы задать действие, которое будет выполнено позже. Подобно объекту функции, делегат обеспечивает безопасность типа, позволяя компилятору проверять тип возвращаемого значения и типы параметров функции. Объявление делегата напоминает сигнатуру функции, реализация аналогична определению класса, а его вызов похож на вызов функции. Экземпляр делегата может быть также создан «встроенным» с помощью лямбда-выражения.

Асинхронные методы

Чтобы использовать асинхронные методы, предоставляемые другими объектами среда исполнения, используйте класс task . Для реализации асинхронных методов в C++ необходимо использовать функцию Create_async() , которая определена в файле ppltasks.h. .

Исключения

Можно создавать исключения любого типа, определенного в среде исполнения Windows. От исключений среды нельзя наследовать пользовательские типы. Однако можно создать исключение COMException и предоставить пользовательский объект HRESULT , который может быть доступен для кода, перехватывающего исключение. Способы задания пользовательского сообщения в исключении COMException не предусмотрены.

Отладка все компонентов разрабатываемого приложения осуществляется стандартными средствами среды разработки. При отладке решения JavaScript, содержащего библиотеку DLL компонента, можно настроить отладчик для пошагового выполнения скрипта или машинного кода в компоненте, однако нельзя отлаживать эти части одновременно. Чтобы изменить этот параметр, разверните узел проекта JavaScript в обозревателе решений, а затем последовательно выберите пункты Свойства, Отладка, Тип отладчика.

Обязательно установить соответствующие возможности в конструкторе пакетов. Например, если требуется открыть файл с помощью интерфейсов API среда исполнения Windows, необходимо установить флажок Доступ к библиотеке документов в области Возможности конструктора пакетов.

Если коду JavaScript не удается распознавать открытые свойства или методы в компоненте, убедитесь, что в JavaScript используется «верблюжий» стиль имен. Например, метод LogCalc C++ следует вызывать из JavaScript как logCalc .

При удалении проекта компонента Среда выполнения Windows C++ из решения, необходимо также вручную удалить ссылку на проект из проекта JavaScript. Невыполнение этого требования приведет к невозможности последующей отладки и выполнения операций построения. При необходимости можно добавить ссылку на сборку в библиотеку DLL.

В лекции рассмотрены приемы создания гибридных приложений. Для создания гибридного приложения необходимо создать проект, в котором связать JavaScript и dll. Взаимодействие между различными компонентами происходит через интерфейс ABI. При этом используются компоненты как сред разработки, так и среды исполнения.

Источник

Как взаимодействуют несколько языков в одном проекте?

Я молодой, поэтому мне нужно многому научиться:)
Вопрос, который застрял у меня в голове : я слышал, что некоторые люди программируют на нескольких языках в одном проекте.Я не могу представить, как языки взаимодействуют друг с другом.

Я имею в виду, что нет метода Java, такого как

никогда не бывает .. или я ошибаюсь ? 🙂

12 ответов

наличие нескольких языков в одном проекте на самом деле довольно распространено, однако принципы не всегда просты.

в простом случае, разные языки компилируются в один и тот же код. Например, код C и C++ обычно компилируется в машинный ассемблер или C# и VB.Net компилируется в IL (язык, понятный среде выполнения .NET).

становится сложнее, если языки / компиляторы используют систему разных типов. Может быть много разных способы, основные типы данных, такие как integer, float и doubles представлены внутри, и есть еще больше способов представления строк. При передаче типов между разными языками необходимо убедиться, что обе стороны интерпретируют один и тот же тип или — если нет — типы правильно сопоставлены. Этот вид отображения типов также известен как упорядочить.

Читайте также:  Закупки путем проведения закрытого способа определения поставщика

классические примеры взаимодействия между различными языками программ (в основном из Windows мир):

  • различные языки, доступные для .NET platfrom. Это включает в себя C#, VB.Net, J#, IronRuby, F#, XSLT и многие другие менее популярные языки.
  • собственные компоненты COM, написанные на C++ или VB, могут использоваться с огромным разнообразием языков: VBScript, VB, все языки .NET, Java
  • Win32 api функции могут быть вызваны из .NET или VB
  • IPC (inter process communication)
  • описание, возможно, самый комплексный (и самый сложный) подход
  • веб-службы и другие сервис-ориентированные архитектуры, вероятно, самый современный подход

Как правило, любой веб-проект приличного размера будет использовать около пяти языков: HTML, CSS, Javascript, какой-то серверный язык «getting things done» (ASP, JSP, CGI-скрипты с Perl, PHP и т. д.), и некоторый вариант SQL для подключения к базе данных.

(Это, конечно, рука, отмахивающаяся от аргумента о том, считаются ли HTML и CSS языками программирования – я» они, но просто не полные языки Тьюринга», но это целый другой нитка.)

некоторые примеры того, как все это работает вместе:

Если вы идете по маршруту лучших практик, структура веб-страницы находится в HTML, а инструкции по ее отображению – в CSS, которые могут быть в том же файле, но не должны быть. CSS содержит кучу классов, на которые ссылается HTML, и браузер должен выяснить, как щелкнуть их вместе.

принимая все это на шаг дальше, любые сценарии javascript на этом страница может изменить любой из HTML / CSS, который присутствует (изменить содержимое HTML-сущностей, поменять один класс CSS на другой, изменить поведение CSS и так далее.) Он делает это с помощью чего-то, называемого объектной моделью документа, которая по существу является независимым от языка и платформы API для управления HTML-страницами объектно-подобным образом (в этот момент я медленно отступлю и просто предоставлю ссылку на соответствующая статья wiki.)

но тогда, где же все HTML / CSS / Javascript пришли? Это то, что делает серверный язык. В простейшей форме язык serer-side-это программа, которая возвращает гигантскую строку, содержащую HTML-страницу в качестве ее вывода. Это, очевидно, может стать намного сложнее: HTML-формы и параметры строки запроса могут использоваться в качестве входных данных для нашей серверной программы, а затем у вас есть вся вещь AJAX, где javascript получает возможность отправлять данные непосредственно на серверный язык. Вы также можете получить фантазии, где сервер язык может настроить HTML, CSS и Javascript, который выплевывается – по сути, у вас есть программа на одном языке, пишущая программу на другом языке.

серверный язык для подключения SQL работает почти так же. Есть много способов сделать его более сложным и безопасным, но самый простой способ для вашего языка сервера-динамически создавать строку с командой SQL в ней, передавать ее в базу данных через какой-то соединитель и возвращать результирующий набор. (Этот это случай, когда у вас действительно есть функция, которая сводится к someValue = database.executeThisSQLCommand( SQLString ). )

Итак, чтобы обернуть это, разные языки в этом случае либо общаются, фактически написав программы друг в друге, либо передавая данные в очень простых, легко разбираемых форматах, которые каждый может понять. (В основном струны.)

несколько языков в использовании называется «совместимость » или» взаимодействие » для краткости.

ваш пример неправильный. Java может вызывать функции C.

язык обеспечивает механизм взаимодействия.

в случае .NET языки компилируются в IL как часть CLI. Таким образом, любое .Чистый язык взаимодействия (вызов методов, определенных) модулей, определенных в любое другое .Чистый язык.

Я могу определить метод в В C#

и я могу вызвать его из Python (IronPython)

и получить ожидаемый результат.

вообще говоря, некоторые языки взаимодействуют лучше, чем другие, особенно если авторы языка специально сделали взаимодействие особенностью языка.

несколько языков могут взаимодействовать с:

  1. Piped вход-выход (любой язык может сделать это потому что вход и выход должны быть обязательно реализованы в каждой не-игрушке язык)
  2. наличие кода на одном языке компилируется в родную библиотеку в то время как другой поддерживает вызов собственного кода.
  3. связь по закольцованной сети. Вы можете таким образом, возникают трудности с вмешательством брандмауэра.
  4. базы данных. Это может быть мыслится как «универсальные» данные формат хранения, и, следовательно, могут быть доступны на большинстве языков с расширениями базы данных. Это вообще требуется одна программа для завершения работы перед следующей программой доступ к базе данных. Кроме того, все «коммуникации» являются обычно записывается на диск.
  5. Если языков работать на том же времени (т. е. .Чистая, JVM), то вы вообще можете передавать объектные данные с одного языка прямо к другому с небольшим импеданс.
Читайте также:  Будь здоров глицин форте способ применения

почти в каждом случае вы должны преобразовать любое сообщение в общее формат перед его обменом (исключение составляют языки на та же среда выполнения). Вот почему несколько языков редко используются в одном проект.

У вас может быть приложение, где основная часть работы выполняется на Java, но может быть какая-то ее часть, например, парсер данных или что-то написано на Python или что у вас есть. Почти два отдельных приложения на самом деле, возможно, парсер просто делает некоторую работу над файлами, а затем ваше основное приложение на Java использует их для чего-то. Если бы кто-то спросил меня, что я использовал в этом проекте, я бы сказал «Java и Python.»

существует много разных способов использования разных языков в одном проекте Существует две основные категории, которые приходят на ум

  1. использование разных языков вместе для создания одного приложения. Например, используя Java для создания GUI и используя JNI для доступа к API C (поэтому, отвечая на ваш вопрос, вы можете вызвать функции C из Java ;))
  2. совместное использование разных языков в одном проекте, но они не являются частью одного и того же приложения. Например. Я в настоящее время работает на iphone приложение, которое использует большое количество текста. В настоящее время я использую три языка Python (для работы с исходными источниками текста), SQL (чтобы поместить результаты приложения python в формат, легко доступный из api iphone sqlite3) и Objectiv C для создания фактического приложения. Несмотря на то, что конечный продукт будет только объективным C, я использовал два других языка, чтобы добраться до конечного продукта

существуют различные способы использования нескольких языков в одном проекте. Некоторые примеры:

  • вы можете написать DLL, скажем, в C, а затем использовать эту библиотеку, скажем, из программы VB.
  • вы можете написать серверную программу, скажем, на C++, и иметь много разных языковых реализаций клиента.
  • веб-проект часто использует множество языков; например, серверная программа, написанная, скажем, на Java( языке программирования), которая извлекает данные из базы данных, использующей SQL (язык запросов), отправляет результат в браузер в формате HTML (язык разметки), с которым пользователь может взаимодействовать с помощью Javascript (язык сценариев).

Я работаю над крупным корпоративным проектом, который состоит из (по последним подсчетам) около 8 языков. Большинство сообщений осуществляется через шину сообщений корпоративного уровня, которая содержит привязки для нескольких языков для подключения и передачи данных туда и обратно. Это называется Цыбко.

Это зависит от типа проекта. Если вы хотите поэкспериментировать, вы можете настроить веб-проект в .NET и изменить язык постранично. Это не работает, как вы показываете в своем псевдокоде, но это несколько языков. Конечно, фактический каталог кода должен быть одним языком.

существует несколько способов, которыми код на языках может взаимодействовать напрямую. Пока данные передаются между кодом в правильном формате, на уровне битов и байтов, нет причин, по которым разные языки не могут взаимодействовать. Этот подход используется в традиционной разработке DLL windows. Даже на разных платформах, если вы можете получить правильный формат (посмотрите на big / little endian, если это интересно), он будет работать до тех пор, пока ваш компоновщик (не компилятор) знает, как присоединиться к коду вместе.

помимо этого существует множество других способов, которыми языки могут разговаривать друг с другом. В .Net world код компилируется вплоть до IL-кода, который одинаков для каждого языка, таким образом, C#, VB.Net все одинаковы под капотом и могут звонить/работать друг с другом без проблем.

плохо. Если нет срочной необходимости, придерживайтесь одного языка. Вы увеличиваете зависимость и сложность. Но когда у вас есть существующий код, обеспечивающий интересную функциональность,его легче склеить, чем воссоздать.

чтобы добавить в список примеров, довольно часто оптимизируют код Python на C или C++ или пишут библиотеку C для привязки другой библиотеки к Python.

Источник

Оцените статью
Разные способы