- ベストアンサー
混ぜちゃダメなんですか?
プログラミングについて疑問があります。 最終的に機械語に変換されるなら、javaとRubyとかPHP、他の言語を混ぜたプログラムは作れるんですか? そういうの、やった人とかいるのでしょうか? (言語って沢山あるんだ~、コンパイラって何?という超初心者レベルです。 お返事は素人が理解しやすいように書いて頂けたら嬉しいです。 よろしくお願いします。)
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
>最終的に機械語に変換されるなら、javaとRubyとかPHP、他の言語を混ぜたプログラムは作れるんですか? 「混ぜたプログラム」というイメージが湧きません。 例示のjavaはコンパイル言語でRuby、PHPはインタープリター言語なので水と油のように直接混ぜることができません。 RubyとPHPはWebコンテンツの中で混ぜることができるかも知れませんが試したことはありません。 Webサーバー上で動作するjavaアプレットとRubyやPHPをWebコンテンツで混ぜることも考えられますがこれも試したことはありません。 何れにしても幾つかのプログラム言語を1つのプログラムとして動作させるには夫々のプログラムを統括する親のプログラムが必要です。 親のプログラムから予め機械語化した子プログラムに作業を下請けさせれば良いと解釈できます。 あなたが期待しているのは1つのテキストファイルに幾つかのプログラム言語のコードを書き込んで一挙に機械語に変換させる方法のように読み取れるのですがそれはできません。 コンパイル言語は専用のコンパイラーで機械語に変換しますのでC言語はCコンパイラーで機械語に、java言語はjavaコンパイラーで中間コードに変換しますのでC言語とjava言語を混在して記述すると構文エラーが発生して処理できません。 誰かが構文を自動変換するプログラムを作成すればコンパイル言語同士の混在は可能かも知れません。 Perl、Ruby等のインタープリター言語同士も構文を自動変換出来れば同様に一元化できるでしょう。 何れにしても今までそのような例を見たことがありません。
その他の回答 (8)
- togurin
- ベストアンサー率45% (81/180)
難しい言葉を使わず簡単に、なんとなく意味合いをとらえていただければと思います。 他の方の回答にもあるように他の言語を混ぜた(混ぜるの意味合いも含め)プログラムはできたりできなかったりするのが現状でしょう。難しい手法とかが必要そうですよね。 あなたの疑問が「単純にいろんな言語で一つのプログラムは書けるのか」だったら 難しいことは置いといて、最終的に機械語に変換する変換機の性能の問題です。 やった人、やろうとした人がいるかはわかりませんが、いろんな言語を混ぜて書いたプログラムを変換してくれる変換機をみんなが協力して作らなければいけません。しかもそれぞれの言語に必要な環境なども考えて。対象が全部の言語になれば不可能に近いと思いますが超天才がやってくれるかもしれません。他の方がおっしゃるように話す言語と同じで、いろんな言語をあえて混ぜた(しかも単語単位でまぜるとか、左から書く言語と右から書く言語をまぜるとか)文章を日本語に翻訳するイメージです。果たしてそれにどれだけ意味があるのかといったことでしょう。そんなプログラム(や話す言語)は書きにくいし読みにくいし、誰が得をするのかと思い誰もやらないのではないでしょうか。 そうでなく、「ある部分だけこの言語に頼ったプログラムを書きたい」だったら他の方の回答にあるようにいろいろな手法があるようですが、なかなかこれも難しそうですね。そんなに単純ではないということです。 多分あなたほ質問の意図は前者の気がしますが。 不可能に近いが誰かがやってくれるかもしれない、それこそ流行りのAIが進化してそれぞれの言語を区別していろいろ意図を読み取りやってくれくれるかもしれません。でもそんな時代に人間はプログラムを書くのでしょうかね。おもしろいですね。
お礼
回答ありがとうございました
- amanojaku1
- ベストアンサー率54% (265/488)
「Java、Ruby、PHP」はインタープリタです(インタープリタと言われても今一イメージが沸かないかもしれませんが、BASICもインタープリタです、BASICをイメージして下さい)。 Javaは特殊でJavaVM(Java Virtual Machine:Java仮想マシン)用のJava用・仮想マシン語(Java bytecodeと言う)にコンパイルします。 一般的に言われているJavaとは(下記ページの)「Java Runtime Environment」であり、JavaVM(Java Virtual Machine:Java仮想マシン)のことです。 「Windows、Mac OS X、Linux、Solaris」用があり、それら用の「Java Runtime Environment」がインストールされていれば「Java bytecode」(Java用・仮想マシン語)が実行できる訳です(「Java bytecode」をJavaVM(Java Virtual Machine:Java仮想マシン)インタープリタが実行している)。 「Ruby、PHP」はテキストをインタープリットしていますが、それより「Java bytecode」をインタープリットして実行したほうが効率が良いと言う判断で こうなている。 ただし、高速化のために(「Java Runtime Environment」が)「Java bytecode」を一部 マシン語にコンパイルしている。 Java Runtime Environment https://www.java.com/ja/download/help/download_options.xml >Windows >Mac OS X >Linux >Solaris 混ぜると言う概念ではなく、(ライブラリーなり、関数なりを)呼び出すと言う概念です。 何でも呼び出せると言う訳ではありません、相手を呼び出す仕込みがなければ呼び出せません。 C++からJavaを呼び出す - PukiWiki for PBCG Lab http://www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?C%2B%2B%A4%AB%A4%E9Java%A4%F2%B8%C6%A4%D3%BD%D0%A4%B9 JavaからCの処理を呼ぶ方法(JNI/JNA/SWIG) https://qiita.com/kiida/items/9d26b850194fa1a02e67 WebSphere sMash で Java と PHP を統合する https://www.ibm.com/developerworks/jp/websphere/library/techarticles/0809_phillips/0809_phillips.html >Java Bridge を使用して PHP から Java クラスにアクセスする方法を紹介し、Java メソッドの呼び出し、そしてフィールド (インスタンスと静的の両方) へのアクセスについて説明します。 ↑こちらは呼び出すと言う概念を超えてPHP から Java クラスのフィールドへアクセスができるようです。
お礼
回答ありがとうございました。
- hue2011
- ベストアンサー率38% (2801/7250)
当然いろいろな言語で開発したものを組み合わせるのはごくごく普通のやり方です。あたりまえのことです。 しかし、一本のプログラムを複数の言語で書くなんて言うことはありません。 一本一本、それに適切な開発言語を選んで作成し、組み合わせるのです。 それと、おそらく理解していないと思われますが、javaはコンパイラ言語であり、Rubyはインタープリタ言語です。またの名をスクリプト言語と言います。 スクリプト言語というのは、その言語で書かれたものを実行するときに同時通訳みたいに働いてくれるインタープリタと言うものが必要で、これが逐一翻訳しながらやってくれますので、そのインタープリタを起動しないと動きません。 コンパイラは、コンパイルということをすると、機械語(ではなくその一歩手前のオブジェクトというもの)にします。 そして、その機械語一派手前のものをライブラリというものとリンクして、「実行可能形式」にするんです。CやCobolやFortranというのがそういうものであり、新しくはGoというのがそれにあたります。実行形式プログラムは、考えたらすぐわかるとおもいますが、実行できる環境でなければ動きません。Windows用に作った実行可能プログラムはWindowsでしか動かなない。Linux用に作った実行プログラムはLinuxでしか動きません。 気づいてほしいんですが、インタープリタ言語はこの機種依存がありません。機種に依存しているのはインタープリタそれ自体だけです。書いたプログラムはどのOSでも共通に読め、実行できるように見えます。 で、コンパイラ言語としてjavaを言いましたがこのプログラム言語だけちょっと違うことがあります。それはWindowsだとかLinux用の機械語なんか生成しないということです。 生成するのは、「仮想マシン」用のコードです。java virtual machineといいますが、これ用のコードです。 実行するときには、これを各OSにインタープリットするjavaというインタープリタが動くことになるのです。javacというコンパイラが仮想マシン用に翻訳したのを読みこみjavaが実行するんです。 javaはそこが強みで、細かいハードウェアなんて気にしないで、どんな環境でも動くプログラムを書けるのです。そのために発表されたものなんです。だから携帯電話空間に入り込みAndroidの実行プログラムが書けるんです。 複数の言語で組まれたプログラムを同居してシステムとして動かすのはパタンがあります。 まず、別々の実行プログラムを同時に起動して同期を取り合いながらやる方法があります。linuxでいうデーモンというのがそういうことをするためのサーバーです。 そうではなく、一つ一つは別のことをする処理を、段取りを決めて順番に実行するというやり方があります。シェルとかバッチ処理という考え方です。 プログラムの構造として、ある起動プログラムから、別言語で組んだ処理を呼ぶことがあります。 よくやるのは、pythonからperlを呼んでそのスクリプトを実行し、既存のwgribだとかいうプログラムを内部で起動したりすることです。 誰かが開発し、役に立つことが分かっているものを使用するというのはあたりまえのことです。
お礼
回答ありがとうございました
- GENESIS
- ベストアンサー率42% (1198/2796)
>最終的に機械語に変換されるなら 最終的には機械語になりますが、その機械語に翻訳する過程が問題です。 コンパイラとは翻訳すると言う意味で、人間がわかりやすく書いたソースプログラム(ソースコード)を機械語に翻訳する作業をします。コンパイラはそれぞれのプログラム言語…たとえばアセンブラ言語やC言語毎に用意されています。それぞれの言語はそれぞれの文法があり、その文法に沿った変換が必要なためにそれぞれのコンパイラが必要となるのです。もし全ての言語を網羅するコンパイラがあるとすれば、それは膨大な大きさのものになりコンパイル作業にも時間がかかってしまいます。 javaとRubyとかPHPについては私は良く解りませんが、アセンブラ言語にしてもC言語にしても1つの実行形式(.EXE等)の中に混在させることは可能です。 ただその方法は質問者様が思っている方法とは少し違うかもしれませんが…。 コンパイラは機械語に翻訳と言いましたが、一気に翻訳するのではなく実は中間言語を生成します。これはソースコードと機械語の中間に存在するものです。この中間言語をリンカという処理を行うことにより1つのライブラリとして扱うことが出来ます。つまり… 1.メイン処理:C言語 2.サブ処理1:アセンブラ言語 3.サブ処理2:アセンブラ言語 と作成し、サブ処理はメイン処理から呼び出させるものとします。これらをそれぞれの実行形式にしてしまうと呼び出せなくなりますが、それぞれの中間言語をリンカ処理することによりライブラリ化され、1つの実行形式として動作します。当然メイン処理内での呼び出し名は合致していないとエラーとなりますが。 javaとRubyとかPHPは解りませんので何とも答えられませんが、言語によってはリンカという処理を行うことで違う言語も混ぜて使うことは可能です。この方法であればBASIC(インタプリタ型ではなくコンパイラ型)もライブラリ化は可能です。 プログラム言語には、それぞれ得手不得手があります。この処理はこの言語が良いがこの部分はこちらの言語のほうがベストな処理となる…制御系では良く使われる手法です。最近では新しい言語も出てきているようで、このあたりは今どうなっているかは解りませんが、私が若い頃はこの手法は普通に行われていました。
お礼
回答ありがとうございました。
- maiko0333
- ベストアンサー率19% (839/4401)
すべての言語に有利不利、得意不得意があるからです。 すべての得意を持った「スーパー言語」が出てくれば あなたの希望通りになります。 例えて言うなら、 それが可能なら地球は1つの言語に統一されていないのはなぜなんでしょう。 同じ日本語でも方言があるのはなぜなんでしょう。 方言を禁止して統一することなく逆に「方言を愛する」のはなぜなんでしょう。 国同士で戦争を繰り返すのは、 各国の利権や思想(宗教)が違うためですね。 世界国家を作れば戦争のない国家が樹立できますがなぜしないんでしょうか?
お礼
回答ありがとうございました。
- cametan_42
- ベストアンサー率62% (162/261)
「混ぜる」ってのが具体的に何を意味するのか、ってのが厳密には分かりませんが、一応「出来ますよ」と答えておきます。 まあ、「プログラム」ってのも厳密にどう言う状態を指すのかも分からないですけど、一般的なアプリケーションで考えると、想定される答えは「アリ」ですし、「やった人」は無数にいますね。割と普遍的じゃないでしょうか。 一つはOSが用意した機能を使う事です。コンピュータのOSには端末と言う機能があって、例えばプログラムAとプログラムBを互いに呼び出して・・・等と言う事は比較的簡単に出来ます。 つまり、プログラムAが例えばJavaで書かれてて、プログラムBがRubyで書かれてて、端末上でお互いを呼び出し合ったりする・・・ってカタチですね。実際は別個に二個プログラムがあるわけですが、端末用のこれまたスクリプト言語で書かれたファイル(これをバッチファイル等と呼ぶのですが)にお互い端末上で呼び出し合うように指令を書いておいて、ユーザーからはそのバッチファイルを使えば簡単にそれら二つのプログラムが呼び出し合う・・・実はこの時点でプログラムが3個になってるんですが(笑)、一方、それは設計者のみが知ってる話で、ユーザーからは「単一のプログラムを使ってる」としか思わないわけでしょう。 実はこういう形式のプログラミングの仕方、ってのは良くあるんですね。だから、これが「混ぜる」を意図してたなら、まさしく「別々の言語で書かれたプログラム」が混ざってる、って事になるんじゃないでしょうか。 例えばWeb言語として利用率が高いPHPでも、サーバー内部でもプログラムを当然PHPで書いてるとは限らないわけです。ユーザーに渡すインターフェース部分(つまりこういうWebページですとか)なんかはPHPで書いて(もっと言うと、実はこの時点でHTMLとPHPが「混ざってる」わけですが)、ブラウザから転送された「データ」の処理を別の言語で書かれた「エンジン」で解析して返す、なんてのは良くあって、基本的には前述の通り、の事がサーバー内で起きてるわけですね。Googleが使ってるMySQL/MariaDBなんてデータベースは当然「Cで書かれてる」わけで、でもユーザーは単純に「Googleを使ってる」って思ってるわけですよね?全く同じ理屈で「混ざってる」んですよ。 あとは、プログラミング言語自体が他言語へのインターフェースを「持っている」場合があって、有名な例で言うとPythonなんかがそうですね。Python自体はC言語で実は書かれていて、またC言語で作られたプログラムをPython「から」呼び出す機能を持っています。 結果として、インタプリタとしてはかなり遅い分類の言語であるPythonですが、使用出来るライブラリは「Cで直接書かれた」高速のプログラムを呼び出せて、結果として、「速度が必要な部分だけ」Cで記述すれば良い、って言うテクニックが普遍化していますね。それは「プログラム全部をCで書き上げる」よりは遥かにラクなんで、そういった部分がPythonの人気の秘密になっていますね。 あとは例えばRubyなんかでも「GUIをやりたい」場合、やっぱ別言語で書かれた「プログラム」を呼び出す事は良くあります。GUI自体を全部包括する「言語」ってのは実は(ほぼ)無いんで、GUIライブラリ、つまりこれも「別言語で書かれたプログラム」ですね、それをある言語、例えばRubyから「呼び出す」必要があります。 GTK+ってライブラリはCで書かれてますし、QtってライブラリはC++で書かれてますし、そういうのを「呼び出」してGUIのプログラムを書く、ってのは「良くある」事なんです。そういう呼び出し機能を「バインディング」って言うんですが、特定の人気があるライブラリへのバインディングを持つ言語を選択する、ってのもプログラミング言語を「選ぶ」場合の基準になり得ます。 いずれにせよ、これも「混ぜる」の一例で、今のプログラミングだと、単一の言語「だけで」何かを書く、なんて方が場合によっては結構珍しい事なんじゃないでしょうか。
お礼
回答ありがとうございました。
- stss08n
- ベストアンサー率16% (454/2764)
コンフディション:エミュレーションテクニック
お礼
回答ありがとうございました。
- t_ohta
- ベストアンサー率38% (5238/13705)
最終的な機械語に変換するのがコンパイラーの役目です。 コンパイラーは変換元の言語毎に用意されているので、プログラミング言語毎に使用するコンパイラーが異なるため一つのプログラムに複数の言語を混ぜることは出来ません。 また、JavaもRubyもPHPも完全に機械語にコンパイルして実行するタイプのプログラミング言語では無く、中間コードと呼ばれる状態のプログラムに変換した上で、OS毎に異なるインタープリタによって最終的な実行が行われています。 インタープリタもプログラミング言語毎に異なるモノなので、複数の言語を交ぜてプログラムを書くことは出来ません。
お礼
回答ありがとうございました。
お礼
回答ありがとうございました。