Как соединить два языка программирования в одной программе

Обновлено: 05.07.2024

Такой простой вопрос, но я не нашел разумного ответа на этот вопрос.

В настоящее время я программирую на Python, интерпретируемом языке. Я всегда слышу о том, как люди используют несколько языков в одной программе? Затем я слышу их, используя языки сценариев; Может кто-то здесь, пожалуйста, просто объясните мне разницу между тем, что я знаю как языки программирования и сценарии, и как на Земле люди используют несколько языков вместе. Это просто не имеет никакого смысла.

Как кто-то может использовать Javascript, PHP и ASP вместе. Или запрограммировать игру на C /C ++ и использовать python в качестве скриптов? Это просто не имеет смысла для меня, они разные языки по какой-то причине, я полагаю, так как они играют роль друг с другом?

3 ответа

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

Скомпилированный язык обычно является C /C ++, но может быть много других языков (Haskell, Erlang, Java и т. д.). Скомпилированный язык предоставляет базовое приложение. База обеспечивает интерфейс к базовой операционной системе, а также основу для работы, выполняемой приложением. Приложение часто обеспечивает более низкую функциональность, что упрощает разработку с использованием интерфейса сценариев.

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

Много раз интерфейс скрипта обеспечивал бы почти определенный доменом язык, предоставляя полезные функции и интерфейс высокого уровня, специфичные для приложения, делая его более легко настраиваемым.

Несколько хорошо известных примеров. Emacs написан на C и настроен с использованием Emacs Lisp. TextMate - это скомпилированное приложение, настроенное с использованием Ruby. Atom - это новый текстовый редактор, написанный на JavaScript для работы на узле. Atom более косвенный. Приложение (почти?) Все JavaScript, в то время как Node.js использует V8, который написан на C ++. World of Warcraft имеет интерфейс сценариев, который использует Lua.

В качестве личного примера я работал над установкой, способной создавать бренды, где базовый код был Objective-C /C ++ для доступа к элементам пользовательского интерфейса на MacOS с настройкой с использованием AppleScript. Интерфейс AppleScript использовался только нами, чтобы маркировать приложение для каждого клиента.

Как говорили другие, используйте правильный язык для правильного приложения.

Bill Door привела несколько хороших примеров, где «основная программа» написана на C или C ++, а язык сценариев включен для настройки, но есть и общий, но другой сценарий, где «основная программа», написанная в некоторых «сценариях» (независимо от того, что люди имеют в виду, когда они используют это слово) расширяется модулями, написанными на C или C ++. Например, в Python типичным вариантом использования будет реализовать расширение или модуль в C , из-за лучшей производительности обычно можно достичь этого. Вот почему основные части модулей Python, такие как NumPy или SciPy, в основном написаны в C, PyGame или Python Imaging Library (PIL).

Взаимодействие обычно достигается путем передачи данных

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

Возникновение новых языков, языковые платформы

До сих пор не создано такого языка программирования, который бы одинаково хорошо решал все задачи программных систем. Уже существует большое количество языков и новые продолжают появляться. Устаревшие языки не спешат уйти со сцены, на них написаны программы, и они продолжают работать, а значит, по ним нужны специалисты для сопровождения и развития существующих программ. Возможно, не стоит ориентироваться на устаревшие или не получившие достаточного распространения языки, но, например, если вы вдруг надумаете устроиться программистом в компанию Боинг, то вам придется изучить язык достаточно прогрессивный для своего времени и не очень распространенный в наше - язык Ада.

Текущее представление языков примерно выглядит так:

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

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

Таблица 1. Новые языки, появившиеся в последнем десятилетии от известных ИТ-компаний

язык общего назначения на замену Objective C

язык реализации веб-приложений

более надежная и производительная замена JavaScript

JetBrains (СПб, Россия)

простая и эффективная замена Java

«улучшенный» JavaScript (аннотация типов, классы)

язык реализации алгоритмов для многоядерных архитектур

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

С появлением таких языковых платформ как JVM и CLR задача интеграции библиотек кода на различных языках была решена на качественно новом уровне. Код, написанный на платформе, автоматически становится интегрированным в общую многоязычную среду. Платформа обеспечила не только интеграцию на этапе исполнения, но и переносимость как аппаратную, так и программную под различные операционные системы. Отладка и написание многоязычных проектов стала возможной в единой среде разработки. Последнее обстоятельство привело к новому видению использования различных языков в одном проекте - созданию многоязычных проектов.

Структурирование многоязычных приложений

Пирамида Ола Бини (Ola Bini)

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

Системный архитектор и разработчик Ола Бини (Ola Bini) интересуется языками программирования. В своей статье

Быстрая прикладная разработка

1С, SQL, XML, XAML, веб-шаблонизаторы

Быстрая продуктивная, гибкая разработка

JavaScript, Python, Clojure

Стабильный, высокопроизводительный, хорошо протестированный функционал

Рисунок 1. Пирамида Бини

Разделение языков по уровню типизации


Системный архитектор и идейный вдохновитель компании

Рисунок 2. Языки по типизации: сильная-слабая, статическая-динамическая с выделением слоев Бини

Функциональное деление (будущее языков)

В развитии своей теории многоязычного программирования Нил Форд выдвинул идею того, что в классификации слоев Бини стабильные языки будут развиваться в сторону увеличения поддержки функционального стиля. Уже сейчас в моду входит функциональный стиль программирования и, хотя программы бухгалтерского учета пока еще не пишут на Haskell, многие языки начинают поддерживать операции с функциями высшего порядка. Такие понятия, как «декларативный», «чистые функции», «каррирование» потихоньку начинают проникать в лексикон все большего количества программистов.

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

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

Форд также обращает внимание на распространение поддержки создания DSL средствами самого языка. В таких языках как Scala и Clojure встроенная поддержка создания собственных DSL позволяют просто и компактно формализовать важные концепции предметной области. По Форду языки будущего помимо мультипарадигмальности будут также поддерживать DSL во всех сло ях.

Мультипарадигмальные языки

Современные языки идут по пути поддержки мультипарадигмальности. Языки, исторически поддерживающие парадигму процедурного и ОО программирования, начинают вводить элементы поддержки парадигмы функционального стиля. Функциональные языки наоборот расширяют свои возможности, вводя поддержку ОО парадигмы.

Такое развитие имеет как свои плюсы, так и минусы. Если поддержка функционального стиля - это, как правило, расширение возможностей языка, то добавление в функциональный язык ОО парадигмы - это улучшение интеграции с другими языками с ОО парадигмой. Сравните: язык Scala - продвинутый язык Java с элементами функционального стиля и Clojure - чисто функциональный язык с поддержкой ОО парадигмы для совместимости с Java.

Мультипарадигмальность увеличивает мощь языка, но может и привести к проблемам. Так, когда один проект разрабатывается разными командами с использованием различных парадигм, то существует риск разработки несовместимых библиотек. Разработка в ОО парадигме стимулирует использование структур, а в функциональной - композицию и функции высшего порядка. В результате смешения парадигм могут получиться существенно различающиеся алгоритмы, которые не смогут работать без взаимной адаптации, а значит, внесения дополнительного усложнения в проект. Подобные проблемы команды разработчиков уже испытывали при переходе с Java на Ruby или с C на C++.

Рисунок 3. Распределение языков по слоям приложения по функциональному признаку

Выбор языков

В сложившейся ситуации программисту недостаточно знать только один язык программирования. Работая сегодня над проектом на одном языке, возможно, уже в следующем проекте или в этом же, придется писать код на другом языке, выбранном для решения соответствующих задач. Так какой же язык имеет смысл знать или изучать? Однозначного ответа на этот вопрос нет. Однако есть нечто общее во всех языках и есть различия. Знание общего позволят сэкономить время вхождения в новый язык, сконцентрировавшись лишь на различиях.

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

В общем случае профессионально-ориентированному программисту необходимо владеть знаниями компьютерных наук, различных парадигм и быть в курсе последних тенденций развития языков. Можно рекомендовать знать несколько языков из различных слоев приложений (см. Слои Бини) или одного слоя - в количестве 3-4 языков. Ниже приведены варианты выбора языков исходя из целей.

Выбор для образования

Узнать, как устроен и работает компьютер

Научиться работать со сложными структурами данных

Научиться программировать эффективные алгоритмы работа с данными

Научиться строить большие и сложные сайты

Для цели определения какой язык стоит изучить можно использовать также исследование

Выбор для работы

Нужна быстрая и эффективная программа?

трудно писать; трудно поддерживать

Быстро написать и получить работающую программу или сайт?

JavaScript, Python, Ruby

работает медленно, часто ломается (зависает), пока происходит поиск ошибок

Быстро небольшой веб-сайт?

для дальнейшего улучшения веб-сайта может потребоваться много усилий

Выбор для проекта

Выбор языка в проекте зависит от множества факторов, вот некоторые из вопросов, которые могут помочь определиться с языком:

  • какова кривая освоения языка?
  • насколько эффективны существующие фреймворки?
  • насколько развито сообщество языка?
  • насколько быстро можно найти нужных разработчиков?
  • насколько легко язык интегрируется в многоязычную среду?

Встроенный язык 1С как DSL

Несмотря на то, что в заголовке этого абзаца язык 1С обозначен как DSL, это утверждение не всеми разделяется. Действительно, на языке уже написана масса прикладных решений в самых разнообразных сценариях использования и это не только учетные задачи. В самом языке есть встроенные объекты для работы с файлами даже на уровне байтов. Все это может представляться как написанное на языке общего назначения. Сам Мартин Фаулер, который ввел понятие DSL, в своем труде отмечал, что порой очень сложно отнести возможности языка именно к DSL и существует тонкая грань, где язык выходит за рамки только одной предметной области и уже может рассматриваться как язык общего назначения. Но давайте рассмотрим, что же представляет собой встроенный язык платформы 1С.

Платформа 1С поддерживает встроенный язык программирования (именно "встроенный язык", а не "язык 1С", т.к. официального названия у этого языка нет). Предполагается, что основная функциональность прикладного решения реализуется средствами визуального конструирования в режиме конфигуратора. Платформа предоставляет множество событий, в обработчиках которых на встроенном языке можно изменить типовое поведение платформы.

Основное ограничение встроенного языка - алгоритмы могут быть запущены только в реализованных событиях платформы. Определение вызываемой функции по событию также предопределено платформой и не может быть произвольным. В платформе отсутствует также понятие "библиотеки" в смысле кода со своей областью видимости. Синтаксис и семантика встроенного языка максимально просты. Все основные возможности языка реализуются через встроенные объекты платформы.

Встроенный язык обладает множеством ограничений, которые не характерны для языков общего назначения. На этом языке нельзя построить эффективный веб-сервер или реализовать интерфейс, не поддерживаемый платформой (попробуйте изменить цвет выделения текущей строки табличного поля). С другой стороны, все необходимое для решения прикладных задач максимально реализовано в объектах платформы, которые доступны из языка. Семантика объектов определена на уровне платформы и благодаря этому обеспечивается их поддержка: целостность данных, расчет итогов, права доступа, представление в интерфейсе и т.д.

Из определения языка 1С как DSL следует вывод о возможном его развитии. Собственно, сам язык, начиная с версии 1С7, не сильно изменился. Все, что меняется для языка - это расширение встроенных объектов и появление дополнительных встроенных функций. И, скорее всего, так и будет продолжаться: в платформе продолжат появляться новые объекты, потребность в которых будет обозначена сложными реализациями на встроенном языке. Например, недавно появились объекты, с помощью которых можно работать с историей хранения, когда похожая функциональность была реализована ранее средствами встроенного языка и потребность в простом решении на уровне платформы назрела.

Заключение

Практика показала безуспешность поиска единого универсального языка программирования. Новые языки продолжат появляться. Каждый новый язык будет по-своему находить компромисс между скоростью разработки, производительностью и надежностью. Кроме того, большое разнообразие предметных областей гарантирует неисчерпаемую потребность в предметно-ориентированных языках, как наиболее адекватно описывающих её задачи. Платформы JVM и CLR, изначально созданные для решения задачи переносимости, а в последствии и унификации моделей программирования, будут только способствовать появлению новых языков.

В сложных приложениях найдут применение многоязычные проекты. Такие проекты в рамках одной платформы JVM или CLR будут включать алгоритмы, написанные на разных языках, однако на уровне байт-кода это будут единые приложения с разделяемыми данными.

Универсальные языки продолжат развиваться в сторону мультипарадигмальности. Исторически такие языки начинали работать в процедурной парадигме, затем в ОО и теперь набирает популярность функциональная парадигма. Постепенно функциональный стиль будет становиться основным, а императивный вспомогательным. Ответственные приложения будут делаться на функциональных языках, сфера применения императивных языков останется для задач ввода/вывода, необратимых операций, разработки интерактивных интерфейсов пользователя.

Наряду с мультипарадигмальностью языки начнут поддерживать создание DSL. Останутся также и внешние DSL как самые приближенные к предметной области языки. Эти языки будут иметь самый низкий порог вхождения и будут доступны даже для непрограммистов.

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

Материал этой статьи был представлен ранее в сокращенном варианте новостного формата. Там же есть опросник "Сколько языков программирования вы знаете?". Новость получила живой отклик. Тема мне показалась интересной, и я решил выложить полный вариант статьи, получившейся в результате моего исследования.

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

Вопрос в двух словах: можно ли объединить несколько языков программирования в один результат? Например, может ли этот код быть возможным?

Это похоже на глупый вопрос, но я не могу знать, возможно это или нет, поэтому я и задаю его. В этом вопросе я замечаю, что он использует код Python в html-коде, если мой приведенный выше пример невозможен, что он сделал?

Чтобы это работало (не делая людей безумными), нужны как минимум строгие правила относительно того, как они взаимодействуют и какие части должны обрабатываться на каком языке. @Brian Lua встроен в то, что интерпретатор связан с некоторым кодом C или C ++ и используется для запуска кода Lua, хранящегося в строках или внешних файлах, возможно, подвергая объекты C / C ++ коду Lua. Lua не (не часто, если вообще) не «встроен» в смысле этого вопроса. Это все равно, что сделать пять алфавитов, каждый с разными символами для 26 букв, и смешать их в одной книге: бессмысленно, раздражающе и излишне. Я думаю, что люди явно забывают о наиболее распространенном (и единственно допустимом из реальной жизни, который я могу придумать) случае использования «объединения языков» - фрагментов ASM в программах на C / C ++ , обычно по соображениям производительности.

Ваш первый пример является своего рода возможным. Обычно такие вещи случаются в PHP (и других связанных языках веб-программирования), например:

Несколько важных моментов, на которые следует обратить внимание в этом примере:

  • HTML НЕ является языком программирования, это язык разметки.
  • PHP и HTML и не выполняются / интерпретируются в одном месте: код PHP выполняется интерпретатором PHP, работающим на сервере, и результат «внедряется» в окружающий HTML. Затем весь этот большой двоичный объект отправляется клиенту / браузеру, который отображает полный HTML-код.

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

Полагаю, теоретически вы могли бы написать специальный компилятор / препроцессор с такими «языковыми» индикаторами, как:

Но я, честно говоря, не уверен, что ты получишь что-нибудь полезное, сделав это.

Кроме того, как эта гибридная языковая среда будет обрабатывать языковые функции, которые несовместимы между ними?

Пример все забыли о (включая меня), поэтому , пожалуйста , не стесняйтесь , чтобы добавить его в свой ответ: CUDA . Это смесь двух совершенно разных языков Си, с некоторыми функциями, скомпилированными для устройства (GPU), а некоторые остаются на хосте, с выводом уровня связи. Нередко JavaScript, а также HTML и PHP на одной странице. Ужасно, но не редкость. Я собирался поднять PHP / HTML / JS в одном документе, если никто другой не сделал.

На самом деле, нет.

Вложение

Как правило, один исходный файл содержит код точно для одного языка программирования. Нередко объединение нескольких языков в одном файле по нескольким причинам:

  • Парсинг нескольких синтаксически разных языков одновременно чрезвычайно труден (если не невозможен).
  • Разные языки относятся к программированию по-разному . Понятие функции в Haskell отличается от понятия C ++.

соединение

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

полиглотов

Код полиглота действителен и эквивалентен на нескольких языках. На странице 404 Stack Overflow есть одна такая программа:

Стек Переполнения 404 полиглота

Это печатает «404» на Python, Perl, Ruby, C, Brainfuck и Befunge.

Вывод

Языки редко смешиваются в файлах, и когда они есть, это для смеха . Люди даже стараются избегать смешения языков в проектах из-за дополнительных хлопот, которые он создает. Таким образом, хотя это технически возможно, смешивание разных языков не является ни распространенным, ни прагматичным.

Языки не всегда смешаны для смеха. Большинство компиляторов C позволяют смешивать ассемблер и C, как и многие Forths. В восьмидесятые годы один из лучших диалектов BASIC в игре, Acorn BBC Basic, позволял вам смешивать сборку 6502, и тогда это была очень желательная особенность. Это, конечно, заставляло пользователей BBC смеяться, но почти все остальные плакали, особенно те, кому приходилось собирать машинный код 6502 вручную и вставлять необработанные коды операций в свои программы в DATA операторах. Не то чтобы я горький или что-то в этом роде. Noooo. @ SK-logic SQL - это язык структурированных запросов, а не язык программирования. Одна из печальных вещей в современной разработке программного обеспечения состоит в том, что многоязычные приложения стали намного сложнее. В прежние времена DOS почти все компилировалось в один и тот же объектный файл и использовало те же соглашения о передаче параметров. Было очень легко просто связать их вместе. В наше время не так много .

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

Это часто называют кодом полиглота - есть несколько забавных / безумных примеров, если вы переходите по ссылке или в других местах в Интернете. Большинство из них просто для развлечения / доказать, что это возможно.

Более серьезно, есть различные примеры из реальной жизни, где два или более разных языка могут быть с пользой объединены:

  • Веб-шаблоны - языки, такие как файлы PHP или JSP, смешивают код в HTML. Мнения сильно различаются по поводу того, хорошая это идея или нет.
  • Языки макросов - часто язык макросов смешивается с исходным файлом, таким как макросы препроцессора C / C ++. Есть также интересные случаи, такие как Lisp, где язык макросов сам по себе является Lisp (единственное отличие состоит в том, выполняется ли код во время компиляции или во время выполнения)
  • DSL - часто определяется язык, специфичный для предметной области, чтобы помочь эффективно решить конкретную проблему, которая встроена в исходный код другого языка. Вот пример прекрасного DSL для SQL, который может быть встроен в код Clojure.
  • Сценарии - некоторые динамические языки особенно полезны для коротких сценариев и предназначены для встраивания в программное обеспечение, написанное на другом языке. Например, скрипты Groovy очень легко внедрить в Java-приложение.
  • Проекты Polyglot - иногда имеет смысл использовать несколько языков только для того, чтобы использовать различные возможности каждого из них. Например, JVM поддерживает несколько языков, которые могут прозрачно взаимодействовать, поэтому вы можете смешивать Java (для скорости и статически типизированного ООП) с Clojure (для интерактивной разработки, параллелизма и функционального программирования). Такие проекты, как правило, по-прежнему разделяют разные языки на отдельные исходные файлы / папки, но они компилируются одновременно для создания одного приложения.

Можно использовать некоторую комбинацию языков, используя Perl Inline, которая позволяет писать Perl-скрипт и вставлять фрагменты кода, написанные на другом языке:

Inline поддерживает C, C ++, Java, Python, Ruby, Tcl, Assembler, Basic, Guile, Befunge, Octave, Awk, BC, TT (Template Toolkit), WebChat и даже PERL.

Я никогда не слышал о Perl Inline. Это интересная идея, но дает ли она какое-либо преимущество по сравнению с тем, что, вероятно, является обычным подходом иметь отдельные модули для не-PERL-кода? @FrustratedWithFormsDesigner: Inline Perl - отличный модуль, но у него есть некоторые недостатки. Это работает хорошо, но только в объеме довольно простого кода. Несмотря на то, что над ним какое-то время работали, я бы не стал его использовать в любом виде производства.

Встроенный SQL был распространенным способом встраивания операторов SQL в программы других языков.

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

В эти дни встроенный SQL вернулся в виде LINQ, и он здесь, чтобы остаться. @ SK-логика: как LINQ похож на встроенный SQL? Это не другой язык, это просто применение дополнительных языковых конструкций на языке хоста. LINQ - это очень типичный встроенный DSL, семантически чуждый языку хоста. И, в случае LINQ2SQL, он ведет себя точно так же, как старый встроенный SQL, он буквально переводится в SQL. Но встроенный SQL не «переводится на SQL». Вы пишете литеральный SQL внутри вашего C-кода (и обычно не внутри строковых констант). Несмотря на то, что LINQ использует языковые функции, которые (насколько я знаю) были разработаны специально для LINQ, это «всего лишь» API в пределах его основного языка. Pro C и Pro Fortran немного переводили операторы SQL. И LINQ - это не просто API, это API с синтаксическим сахаром и набором взаимозаменяемых внутренних компонентов компилятора. Что делает его идеальным примером полноценного встроенного DSL.

Несколько языков программирования могут быть использованы для формирования 1 exe. Одним из способов является использование DLL. Конечно, есть различные опасения по этому поводу. Например, параметр совместимости, COM-совместимость и тому подобное. Фактически, если вы думаете о том, как вы называете систему баз данных для своей работы, вы можете обнаружить, что СУБД не всегда написана на языке, который вы знаете. Возможно, вам даже все равно, если интерфейс известен.

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

В мире UNIX одно время мы использовали скрипты KShell для запуска программ на C ++ и COBOL, чтобы решение могло работать.

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

Примеры объединения языков: Jython (python в Java), Cog (python используется как генератор встроенного кода практически во всем). Я часто использовал Perl-код для генерации C ++, если вы считаете генерацию кода.

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

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

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

При построении решения, содержащего 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. .

Исключения

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

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

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

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

Краткие итоги

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

Читайте также: