Можно ли совмещать языки программирования?

27

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

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

<html>
cout << "Hello world!";
</html>

или

import java.util.Scanner;
cout << "Insert a number from 1 to 10";
Scanner n = new Scanner(System.in);
System.out.println("The value you entered was" +n.newLine());

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

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

Ответы:

43

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

<HTML>
<?PHP
call_some_php_function(1,2,"a","b"); /* This is may return nothing, a text string, or actual HTML markup code */
?>
</HTML>

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

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

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

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

Java
{
    import java.util.Scanner;
}
C++
{
   cout << "Insert a number from 1 to 10";
}
Java
{
    Scanner n = new Scanner(System.in); //Actually, this line *could* be a C++ line - it's hard for me to tell just by looking at it.
    System.out.println("The value you entered was" +n.newLine());
}

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

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

FrustratedWithFormsDesigner
источник
Пример все забыли о (включая меня), поэтому , пожалуйста , не стесняйтесь , чтобы добавить его в свой ответ: CUDA. Это смесь двух совершенно разных языков Си, с некоторыми функциями, скомпилированными для устройства (GPU), а некоторые остаются на хосте, с выводом уровня связи.
SK-logic
7
Нередко JavaScript, а также HTML и PHP на одной странице. Ужасно, но не редкость.
Майкл Боргвардт
1
Не очень знаком с PHP, но код ASP.NET (будь то C # или VB.NET) генерирует HTML и JavaScript - и JavaScript часто внедряется прямо на странице .aspx. Полное разделение часто называют идеалом, но краткий обзор вопросов о SO.Тэгированных ASP.NET даст вам представление о том, насколько это может быть сложно.
sq33G
@ sq33G - ASP.NET генерирует HTML-код. Вы можете включить JavaScript, если хотите. ASP.NET, конечно, не то, что автор описывает как желание сделать.
Ramhound
Я собирался поднять PHP / HTML / JS в одном документе, если никто другой не сделал.
Бен Брока
19

Краткий ответ

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


Длинный ответ

Вложение

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

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

соединение

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

полиглотов

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

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

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

Вывод

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

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

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

На практике может оказаться очень полезным объединить несколько языков, специфичных для предметной области, в один основной язык. Редко возникает необходимость смешивать два или более одинаковых языка «общего назначения» вместе в одном файле исходного кода, хотя вы часто найдете проекты, написанные, например, на VB.NET и C #, с различными компонентами языка, скомпилированными по отдельности.

Что касается HTML, это просто язык разметки. Вы можете часто находить код на стороне сервера (например, в VB.NET), разметку HTML и код Javascript на стороне клиента, смешанные в одном исходном файле, хотя многие считают это плохой практикой.

SK-логика
источник
7

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

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

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

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

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

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

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

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

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

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

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

В мире .NET все вышеперечисленное применяется, более того, на уровне интерфейсов. Интерфейсы XAML и HTML могут жить вместе в Silverlight.

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

Без шансов
источник
2

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

Магнус
источник
0

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

Майкл Кон
источник
0

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

http://www.geekinterview.com/question_details/1047

Jalayn
источник
Я не думаю, что это означало оригинальный постер. Полученный байт-код имеет очень мало общего с тем, как он был написан на языке, с которого он был скомпилирован.
Perdian
Я не думаю, что вы поняли вопрос. Автор говорит о объединении нескольких языков в один непонятный файл.
Крейг
0

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

Однако возможно иметь большой проект, написанный на более чем 1 языке. Например, и Mozilla Firefox, и MySQL содержат код на C и C ++. Когда речь идет о больших проектах, эта практика часто используется, потому что определенный язык предоставляет некоторые функции, а другой нет. Например, в PHP вы можете запросить выполнение двоичного исполняемого файла, взять его результат и использовать его в своем PHP-коде с этого момента.

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

Раду Мурзеа
источник
-1

Вы можете «смешивать» языки в HTML. На самом деле важно, как много веб-сайтов работают, чтобы вы могли встраивать javascript в html. Но, конечно, HTML - это разметка, а не язык программирования.

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

markw
источник
+1 о смешивании языков в HTML, но я лично считаю, что лучше разделить HTML / CSS и JS. Веб-дизайнеры могут делать свое дело, не пытаясь пробираться сквозь неровный JavaScript, встроенный в сайт.
jmort253
Вы можете смешивать языки в HTML, но не многие из них являются языками программирования , о чем и идет речь.
Алексиос
А? Javascript не является языком программирования? PHP? Я также видел инъекции perl и python, хотя это было с модулями Apache.
Марк
-1

Язык - это инструмент. Перед тем, как выбрать инструмент (более того, сделать какую-нибудь странную комбинацию Хаммер-ПК-спектроскоп), следует спросить себя - что именно я хочу сделать ?? Как только ответ будет дан, вы обнаружите, что такое смешение языков редко требуется.

Амо
источник
-3

Да, можно смешивать языки программирования, если ваш интерпретатор / компилятор может это понять. Например, смешивая JavaScript, PHP, Python в HTML или C ++ в C #.

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

Гарретт Холл
источник