Чи можливо комбінувати мови програмування?


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, якщо мій вище приклад неможливий, що він зробив?


12
Для того, щоб це працювало (не змушуючи людей бути божевільними), потрібні принаймні суворі правила щодо їх взаємодії та які частини слід обробляти якою мовою.

6
Знадобиться один геллова лексера / парсер.
Чад Гаррісон

2
@Brian Lua вкладається в те, що інтерпретатор пов'язаний з деяким кодом C або C ++ і використовується для запуску коду Lua, що зберігається в рядках або зовнішніх файлах, можливо, піддаючи об'єктам C / C ++ код 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());
}

Але я чесно не впевнений, що ти зробив би щось корисне, зробивши це.

Крім того, як це гібридне мовне середовище оброблятиме мовні функції, несумісні між ними?


Приклад все забули про (включно зі мною), тому , будь ласка , чи не соромтеся , щоб додати його в свій відповідь: CUDA. Це суміш двох дуже різних мов C, з деякими функціями, складеними для пристрою (GPU), а деякі залишаються на хості, з шаром зв'язку.
SK-логіка

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 звичайно НЕ є тим, що автор описує як прагнення зробити.
Рамхаунд

Я збирався вивести PHP / HTML / JS в одному документі, якщо нікого іншого не було.
Бен Брокка

19

Коротка відповідь

Не зовсім.


Довга відповідь

Вбудовування

Як правило, один вихідний файл містить код точно для однієї мови програмування. Нечасто кілька мов поєднуватись в одному файлі з кількох причин:

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

Зв’язування

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

Поліглоти

Код поліглоту є дійсним та еквівалентним більш ніж однією мовою. На 404 сторінці стека Overflow є одна така програма:

Переповнення стека 404

Це друкує "404" у Python, Perl, Ruby, C, Brainfuck та Befunge.

Висновок

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


Я не бачу тут Рубі ...
Джейсон Льюїс,

@JasonLewis Я не знаю Рубі, але ця публікація говорить про те, що вона оцінює рядок №4.
Maxpm

9
Мови не завжди змішуються для сміху. Більшість компіляторів С дозволяють змішувати збірку та C, а також багато Forths. Ще у вісімдесятих роках один із найкращих діалектів BASIC у грі, Acorn's BBC Basic, дозволив вам змішати збірку 6502, і це було дуже бажаною функцією тоді. Це, безумовно, змусило користувачів BBC сміятися, але в основному всі інші плакали, особливо ті, хто повинен був зібрати машинний код 6502 вручну і вставити необроблені коди у своїх програмах у DATAвисловлюваннях. Не те, щоб я гірко чи що-небудь. Нуоо.
Олексій

1
@ SK-логіка SQL - це структурована мова запитів, а не мова програмування.
Maxpm

1
Одне з сумних речей щодо сучасної розробки програмного забезпечення - це те, що зараз багато мовних програм набагато складніше. Ще в дні DOS майже все складено в один і той же об’єктний файл і використовувало ті самі параметри, що передають умовні умови. Просто пов'язувати їх разом було дуже просто. У наш час не так вже й багато ...
Брайан Ноблеуч

7

Так, це справді можливо. Звичайно, не так, як ви уявляли. Існують деякі мови , побудовані спеціально для цієї мети.

На практиці може бути дуже корисно змішати кілька мов, що стосуються домену, в одну мову хоста. Рідко виникає потреба в змішуванні двох або більше однаково "загальноосвітніх" мов разом в одному файлі вихідного коду, хоча ви часто знайдете проекти, написані в обох, скажімо, VB.NET і C #, з різними мовними компонентами, складеними окремо.

Що стосується HTML, то це лише мова розмітки. Часто ви можете знайти код на стороні сервера (наприклад, у VB.NET), розмітку HTML та код JavaScript на стороні клієнта, змішані в єдиний вихідний файл, хоча багато хто вважає це поганою практикою.


7

Це часто називають поліглот-кодом - є кілька цікавих / шалених прикладів, якщо ви переходите за посиланням або в різних інших місцях в Інтернеті. Більшість із них - просто для розваги / довести, що це можливо.

Більш серйозно, існують різні приклади реального життя, де дві або більше різних мов можна корисно поєднувати:

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

6

Можна виконати комбінацію мов за допомогою Perl Inline, яка дозволяє написати сценарій Perl та вставити розділи коду, написані іншою мовою:

Inline має підтримку C, C ++, Java, Python, Ruby, Tcl, Assembler, Basic, Guile, Befunge, Octave, Awk, BC, TT (Шаблон Toolkit), WebChat і навіть PERL


Я ніколи не чув про Perl Inline. Це цікава ідея, але чи дає вона якусь перевагу перед тим, що, мабуть, звичайний підхід мати окремі модулі для не-PERL коду?
FrustratedWithFormsDesigner

1
@FrustratedWithFormsDesigner: Inline Perl - чудовий модуль, але він має деякі недоліки. Він працює добре, але лише в міру досить базового коду. Хоча над цим працювали деякий час, я б не використовував його в будь-якому виробництві.
Динамічний

3

Вбудований SQL був поширеним способом вбудовування SQL-операторів у програми інших мов.

У наші дні його майже повністю замінив простіший для збирання доступ до бази даних на основі API, який не потребує модифікації мови хосту, а використовує його звичайні здібності.


1
Цього дня вбудований SQL здійснив своє повернення у формі LINQ, і саме тут залишитися.
SK-логіка

@ SK-логіка: як LINQ щось подібне до вбудованого SQL? Це не інша мова, це просто застосування додаткових мовних конструкцій на мові хоста.
Йоахім Зауер

LINQ - це дуже типовий вбудований DSL, семантично чужий мові хоста. І, якщо LINQ2SQL поводиться точно так само, як це робив старий вбудований SQL, він перекладається буквально на SQL.
SK-логіка

Але вбудований SQL не "переведений на SQL". Ви пишете буквальний SQL всередині свого коду С (а зазвичай і не в межах строкових констант). Навіть "хоча LINQ використовує мовні функції, які були (наскільки я знаю) розроблені спеціально для LINQ, це" просто "API в рамках його хост-мови.
Йоахім Зауер

1
Pro C і Pro Fortran трохи перевели оператори SQL. І LINQ - це не просто API, це API з синтаксичним цукром і купою взаємозамінних зворотних компіляторів. Що робить його прекрасним прикладом повноцінного вбудованого DSL.
SK-логіка

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 створена для того, щоб дозволити декілька мов брати участь в одному рішенні. Він працює до тих пір, поки мова може виробляти байтовий код, сумісний з CLR.

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


Я не думаю, що це означало оригінальний плакат. Отриманий байт-код має дуже мало спільного з тим, як він був написаний мовою, з якої він був складений.
пердіан

Я не думаю, що ти зрозумів це питання. Автор говорить про поєднання декількох мов в одному незрозумілому файлі.
Крейдж

0

Поєднувати кілька мов програмування в 1 файл дуже важко, дуже некрасиво і часто марно.

Однак можливий великий проект, написаний більш ніж однією мовою. Наприклад, і Mozilla Firefox, і MySQL містять у собі код C і C ++. Якщо мова йде про великі проекти, то цю практику часто використовують, оскільки певна мова надає деякі функції, які інша не має. Наприклад, у PHP ви можете попросити виконання двійкового виконуваного файлу, взяти його результат і використовувати його у своєму PHP-коді з цього моменту.

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


-1

Ви можете "змішувати" мови в HTML. Насправді важливо, як працює багато веб-сайтів, щоб ви могли вбудовувати JavaScript у html. Але звичайно, HTML - це розмітка, а не мова програмування.

Я думаю, що робити те, що ви пропонуєте, все одно означатиме писати нову мову. Або вам доведеться створити інтерпретатора / компілятора, який розмовляв би всіма цими мовами і міг би їх послідовно формувати, або вам знадобиться якийсь спосіб оцінки рядка за рядком явно в тому, що буде мета-мовою. Ці два варіанти в основному однакові, за винятком того, що програміст повинен зробити, щоб мови працювали разом.


+1 про змішування мов у HTML, але я особисто вважаю, що чистіше зберігати HTML / CSS та JS. Веб-дизайнери можуть зробити свою справу, не намагаючись проникнути через жорсткий JavaScript, який вбудований у весь сайт.
jmort253

Ви можете змішувати мови в HTML, але не багато з них є мовами програмування , що є темою.
Олексій

Так? Javascript не є мовою програмування? PHP? Я також бачив ін'єкції perl та python, хоча це було з модулями Apache.
Марк

-1

Мова - це інструмент. Перш ніж вибирати інструмент (до того ж, робити якусь дивну комбінацію спектру-мікроскопа «hummer-PC»), слід запитати себе - що саме я хочу зробити ?? Як тільки відповідь буде надана, ви дізнаєтесь, що подібний тип мовної суміші рідко необхідний.


-3

Так, можна змішувати мови програмування до тих пір, поки ваш перекладач / компілятор може це зрозуміти. Наприклад, змішування javascript, PHP, python в HTML або C ++ у C #.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.