プログラミング言語を組み合わせることは可能ですか?


27

私はしばらくプログラミングをしており、いくつかの初歩的なプログラムを書きました。そして、学び続けたいと思っています。次は何を学べばいいのか分からないところまで来たので、私自身の好奇心について質問したいと思います。

簡単に言えば、質問は、複数のプログラミング言語を1つの結果に結合できるかどうかです。たとえば、このコードは可能ですか?

<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());

これはばかげた質問のように感じますが、それが可能かどうかわからないので、私はそれを尋ねています。で、この私の上記の例が不可能な場合は、質問私は、彼はhtmlコードにPythonコードを使用している気づき、彼が何をしましたか?


12
これが機能するためには(人々を狂わせることなく)、彼らがどのように相互作用し、どの部分をどの言語として処理すべきかに関して、少なくとも厳格なルールが必要です。

6
hellova lexer / parserが1つ必要です。
チャドハリソン

2
@Brian Luaは、インタープリターがCまたはC ++コードにリンクされ、文字列または外部ファイルに格納されたLuaコードを実行するために使用され、C / C ++オブジェクトをLuaコードに公開する可能性があります。Luaは、この質問の意味で「組み込まれている」わけではありませんが、そうではありません

2
これは、26の文字にそれぞれ異なる記号を使用して5つのアルファベットを作成し、それらを1つの本に混ぜ合わせたようなものです。
ThomasX

7
私は、人々が「言語の組み合わせ」の最も一般的な(そして私が考えることができる有効な実生活のみ)ユースケース- 通常はパフォーマンス上の理由でC / C ++プログラムのASMフラグメントを明らかに忘れていると思います。
TC1

回答:


43

最初の例は、ある種の可能性です。通常、このようなことは、次のようなPHP(およびその他の関連するWebプログラミング言語)で発生します。

<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に「注入」されます。次に、そのblob全体がクライアント/ブラウザーに送信され、完全なHTMLがレンダリングされます。

2番目の例は、C ++とJavaのマッシュアップのようなものです。異なる言語で書かれたコンパイル済みモジュールを相互に通信させることは可能ですが、同じソースファイルで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());
}

しかし、正直に言って、これを行うことで有用なものが得られるかどうかはわかりません。

また、このハイブリッド言語環境は、2つの間で互換性のない言語機能をどのように処理しますか?


誰もが(私も含めて)忘れていた例ですので、お気軽に回答に追加してくださいCUDA。これは、デバイス(GPU)用にコンパイルされた一部の機能と、ホスト上に残り、通信層が推測される2つの非常に異なるC言語の混合です。
SKロジック

7
1つのページに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を1つのドキュメントで表示するつもりでした。
ベンブロッカ

19

短い答え

あんまり。


ロングアンサー

埋め込み

通常、単一のソースファイルには、正確に1つのプログラミング言語のコードが含まれています。いくつかの理由により、複数の言語が単一のファイルに結合されることはまれです。

  • 構文的に異なる複数の言語を一度に解析することは非常に困難です(完全に不可能でない場合)。
  • プログラミング言語の扱いはプログラミング言語によって異なります。Haskellの関数の概念は、C ++の概念とは異なります。

リンク

共通のアプリケーションバイナリインターフェイスを共有するさまざまなプログラミング言語を組み合わせて、単一の実行可能ファイルまたはライブラリを形成できます。2つの言語の署名を相互に利用可能にすることは、しばしば少し手間がかかりますが、プロセスを容易にするツールが存在します。

ポリグロット

ポリグロットコードは有効であり、複数の言語で同等です。 Stack Overflowの404ページには、そのようなプログラムが1つあります

Stack Overflow 404ポリグロット

これは、Python、Perl、Ruby、C、Brainfuck、およびBefungeで「404」出力します。

結論

ファイル内で言語が混ざることはめったにありません。混同されると、笑い声になります。人々は、それがもたらす余分な手間のために、プロジェクト内で言語を混合することさえ避けようとします。したがって、技術的には可能ですが、異なる言語を混在させることは一般的でも実用的でもありません。


私はここにはルビー...見ない
ジェイソン・ルイス

@JasonLewis私はRubyを知りませんが、この投稿では4行目を評価すると述べています。
Maxpm

9
笑い声がいつも混じっているわけではありません。ほとんどのCコンパイラでは、アセンブリとCを混在させることができ、多くのForthも同様です。80年代に戻って、ゲームで最も優れたBASIC方言の1つであるAcornのBBC Basicを使用すると、6502アセンブリを混在させることができ、それは非常に望ましい機能でした。それは確かにBBCユーザーを笑わせましたが、他のほとんどの人、特に6502マシンコードを手で組み立て、DATAステートメントに生のオペコードを貼り付けなければならなかった人たちは大声で泣きました。私が苦いというわけではありません。いやー
-Alexios

1
@ SK-logic SQLは構造化照会言語であり、プログラミング言語ではありません。
Maxpm

1
最近のソフトウェア開発に関する悲しいことの1つは、複数言語のアプリが今ではずっと難しくなっていることです。DOS時代に戻って、ほぼすべてが同じオブジェクトファイルにコンパイルされ、同じパラメーターを渡す規則を使用していました。それらを一緒にリンクするのは本当に簡単でした。...今日では、そんなにない
ブライアンKnoblauch

7

はい、それは確かに可能です。もちろん、あなたが想像した方法ではありません。この目的のために特別に構築されたいくつかの言語があります。

実際には、多数のドメイン固有言語を単一のホスト言語に混在させることが非常に役立つ場合があります。2つ以上の「汎用」言語を単一のソースコードファイルに混在させる必要はほとんどありませんが、VB.NETとC#などの両方で記述されたプロジェクトを見つけることができます。

HTMLに関しては、単なるマークアップ言語です。サーバー側のコード(VB.NETなど)、HTMLマークアップ、およびクライアント側のJavascriptコードが1つのソースファイルに混在していることがよくありますが、多くの人が悪い習慣と見なしています。


7

これはしばしば多言語コードと呼ばれます -リンクをたどったり、Web上の他のさまざまな場所で見たりする場合、いくつかの楽しい/非常識な例があります。これらのほとんどはただの楽しみのために/それが可能であることを証明するためです。

さらに深刻なのは、2つ以上の異なる言語を便利に組み合わせることができるさまざまな実例です。

  • Webテンプレート-PHPやJSPファイルなどの言語は、コードをHTMLにミックスします。これが良いアイデアであるかどうかについての意見は大きく異なります。
  • マクロ言語 -多くの場合、マクロ言語はC / C ++プリプロセッサマクロなどのソースファイルに混在しています。マクロ言語自体がLispであるLispなどの興味深いケースもあります(唯一の違いは、コードがコンパイル時または実行時に実行されるかどうかです)
  • DSL-ドメイン固有の言語は、特定の問題を効果的に解決するために定義されることが多く、別の言語のソースコードに組み込まれています。Clojureコードに埋め込むことができるSQL用の美しいDSLの例を次に示します。
  • スクリプト -一部の動的言語は、短いスクリプトに特に有用であり、別の言語で記述されたソフトウェア内に埋め込まれるように設計されています。たとえば、Groovyスクリプトは非常に簡単にJavaアプリケーションに組み込むことができます。
  • 言語プロジェクト -時には、それぞれの異なる機能を活用するためだけに複数の言語を使用することが理にかなっています。たとえば、JVMはかなり透過的に相互運用できる複数の言語をサポートしているため、Java(速度と静的に型指定されたOOP用)とClojure(インタラクティブな開発、同時実行性、関数型プログラミング用)を混在させることができます。このようなプロジェクトは、通常、異なる言語を個別のソースファイル/フォルダーに分離しますが、同時にコンパイルされて単一のアプリケーションを生成します。

6

Perlスクリプトを記述し、別の言語で記述されたコードのセクションを挿入できるPerl Inlineを使用して、いくつかの言語の組み合わせを行うことができます。

Inlineは、C、C ++、Java、Python、Ruby、Tcl、Assembler、Basic、Guile、Befunge、Octave、Awk、BC、TT(Template Toolkit)、WebChat、さらにはPERLをサポートしています


Perl Inlineについて聞いたことがありません。これは興味深いアイデアですが、PERL以外のコード用に個別のモジュールを使用するという通常のアプローチよりも利点がありますか?
FrustratedWithFormsDesigner

1
@FrustratedWithFormsDesigner:インラインPerlは優れたモジュールですが、いくつかの欠陥があります。うまく機能しますが、かなり基本的なコードの範囲でのみ機能します。それはしばらくの間取り組んできましたが、私はどんな種類の生産でもそれを使用しません。
動的

3

埋め込みSQLは、SQLステートメントを他の言語のプログラムに埋め込む一般的な方法でした。

最近では、ホスト言語を変更する必要はなく、代わりに通常の機能を使用する、より簡単にコンパイルできるAPIベースのデータベースアクセスにほぼ完全に置き換えられています。


1
最近では、組み込みSQLがLINQの形で復活しましたが、今後もそうです。
SKロジック

@ SK-logic:LINQは埋め込みSQLのようなものですか?別の言語ではなく、ホスト言語で追加の言語構成を適用するだけです。
ヨアヒムザウアー

LINQは非常に典型的な組み込みDSLであり、ホスト言語とは意味的に異質です。そして、LINQ2SQLの場合、古い埋め込みSQLとまったく同じように動作し、文字通りSQLに変換されます。
SKロジック

ただし、埋め込みSQLは「SQLに変換」されません。Cコード内にリテラル SQLを記述します(通常は文字列定数内にも記述しません)。「LINQは(私が知る限り)LINQ専用に開発された言語機能を使用していますが、ホスト言語内の「単なる」APIにすぎません。
ヨアヒムザウアー

1
Pro CおよびPro Fortranは、SQLステートメントを少し変換しました。また、LINQは「単なる」APIではなく、構文シュガーと多数の交換可能なコンパイラバックエンドを備えたAPIです。これは、本格的な組み込みDSLの完璧な例です。
SKロジック

2

複数のプログラミング言語を使用して1つのexeを作成できます。1つの方法は、DLLを使用することです。もちろん、これにはさまざまな懸念があります。たとえば、パラメーターの互換性、COMの互換性など。実際、作業を行うためにデータベースシステムを呼び出す方法を考えると、DBMSが常に知っている言語で書かれているとは限らないことがわかります。インターフェイスが既知である限り、おそらく気にしないでしょう。

この概念は、ソリューションがWebサービスを利用する場合にさらに取り入れられます。Webサービスは、複数のソフトウェアコンポーネントを組み合わせたよりクリーンな方法です。

.NETの世界では、上記のすべてがインターフェイスレベルで適用され、XAMLとHTMLインターフェイスはSilverlightで共存できます。

UNIXの世界では、かつてKShellスクリプトを使用してC ++およびCOBOLプログラムを起動し、ソリューションが機能するようにしました。


2

ここでCythonに言及する価値があると思います。C拡張機能を記述するためのPythonのスーパーセットであり、それ自体が本当にユニークな言語ですが、CythonのPythonスタイルの構文に準拠している場合、PythonコードでCコードを使用できます


0

言語の組み合わせの例:Jython(Javaのpython)、Cog(Pythonはほとんど何でも埋め込みコードジェネレーターとして使用されます)。コード生成をカウントする場合、Perlコードを使用してC ++を生成することがよくあります。


0

.NETフレームワークは、複数の言語が1つのソリューションに参加できるように構築されています。言語がCLR互換のバイトコードを生成できる限り機能します。

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


私はそれが元のポスターが意味するものだとは思わない。結果のバイトコードは、コンパイル元の言語で記述された方法とはほとんど関係がありません。
ペルディアン

あなたが質問を理解したとは思わない。著者は、複数の言語を1つの不明瞭なファイルに結合することについて話しています。
クレイジュ

0

1つのファイルに複数のプログラミング言語を組み合わせるのは非常に難しく、非常にく、しばしば役に立たない。

ただし、複数の言語で書かれた大きなプロジェクトを作成することは可能です。たとえば、Mozilla FirefoxとMySQLの両方には、CおよびC ++コードが含まれています。大きなプロジェクトになると、特定の言語が提供する機能が他の言語にはないため、このプラクティスがよく使用されます。たとえば、PHPでは、バイナリ実行可能ファイルの実行を要求し、その結果を取得して、その時点からPHPコードで使用できます。

世界で最も重要なオープンソースプロジェクトのいくつかにどの言語が使用されているのか興味がある場合は、チェックアウトできますOhloh.net。多くのプロジェクトのソースコードに関する統計情報がそこにあります。


-1

HTMLで言語を「ミックス」できます。実際には、多くのWebサイトがどのように機能するかが重要であり、javascriptをhtmlに埋め込むことができます。しかし、もちろん、HTMLはマークアップであり、プログラミング言語ではありません。

とにかくあなたが提案することをすることは、新しい言語を書くことを必要とすると思います。これらのすべての言語を話すインタープリター/コンパイラーを作成し、それらを一貫してフレーム化するか、メタ言語となるものを行ごとに明示的に評価する何らかの方法が必要になります。これら2つのオプションは、プログラマーが言語を連携させるために何をする必要があるかを除いて、基本的に同じです。


HTMLでの言語の混合に関する+1ですが、個人的には、HTML / CSSとJSを分離しておく方がクリーンだと思います。Webデザイナーは、サイト全体に埋め込まれている文字列のJavaScriptを歩いてみようとせずに自分のことを行うことができます。
jmort253

HTMLで言語を混在させることはできますが、その多くはプログラミング言語ではありません。これは目前のトピックです。
-Alexios

え?Javascriptはプログラミング言語ではありませんか?PHP?また、Apacheモジュールを使用した場合でも、perlおよびpythonの注入を確認しました。
-markw

-1

言語はツールです。ツールを選択する前に(さらに、奇妙なハマーとPC分光器の組み合わせを作成する前に)自問する必要があります-正確に何をしたいのですか?答えが得られると、このような種類の言語の混合はほとんど必要ないことがわかります。


-3

はい、インタープリター/コンパイラーが理解できる限り、プログラミング言語を混在させることができます。たとえば、javascript、PHP、HTMLのpython、またはC#のC ++を混合します。

ただし、言語を混在させると、コードの読み取りや変更が難しくなる可能性があるため、慎重に行う必要があります。これを回避する1つの方法は、呼び出す必要がある言語のコード用に個別のファイルを作成し、それを埋め込むのではなくインポートすることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.