よくRubyやPHPはCで実装されている。などと書かれていますがあれはどういう意味なのでしょうか?
Ruby(CRuby)の処理系(RubyMRI)はCで実装されているのはわかるのですが、言語本体がCで実装されているのでしょうか?
またそうなるとCは何で実装されているのでしょうか?
加えて、最近の新しめな言語でSwiftなどは処理系はClang/LLVMなので確かC++?であるのはわかるのですがSwiftの言語自体は何で実装されているのでしょうか?
もしかすると自分の中で言語仕様、言語本体、言語処理系の区別があまりついていないのかもしれません…
宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
Ruby(CRuby)の処理系(RubyMRI)はCで実装されているのはわかるのですが、言語本体がCで実装されているのでしょうか?
「言語本体」という言い方はあまり聞きませんが、「実装される」の主語となり得るのは「処理系」だけです。「言語仕様」は日本語とか英語などの自然言語で書かれます(シンタックスの部分は特別な記法が使われますが)。
おそらく、
もしかすると自分の中で言語仕様、言語本体、言語処理系の区別があまりついていないのかもしれません…
と言うことだと思います。あなたは「言語本体」という言葉をどういう意味で使っていますか?
またそうなるとCは何で実装されているのでしょうか?
CコンパイラはCで書かれていることが多いと思います。当然ながら、世界最初のCコンパイラはC以外、アセンブラか、あるいはCの元になった言語であるBかBCPLで書かれたと思います。いったん動くCコンパイラが出来れば、あとはそのCコンパイラが使えます。
投稿2016/04/18 12:44
総合スコア84499
0
まずはコンパイラやインタプリンタという物を理解する必要があります。
CPUは機械語しかわかりません。しかし、機械語は人間にはとてもわかりにくく、直接書くには適していません。機械語を人間にも読めるようにした物がアセンブリ言語です。アセンブリ言語は機械語よりは読めないことはありませんが、単純な命令を高度に組み合わせてプログラムを実現する必要があり、言語自体が構造化されているわけではないため、そう簡単に書ける物ではありません。そこで、人間にも読みやすく、構造化により書きやすくしたものとしてプログラミング言語が作られました。
プログラミング言語は人間には理解できますが、CPUには理解できません。プログラミング言語をどうにかして機械語に変換し、CPUが理解できるようにしなければなりません。その機械語へ変換する行程の違いによって、プログラミング言語を大別すると四つに分かれます。
- プログラミング言語を機械語に__静的に__変換する。この変換するツールをコンパイラという。
- プログラミング言語を直接機械語に変換する。(GCC)
- プログラミング言語をバイトコードに変換した後、すぐに、CPUに合わせた機械語に変換する。(clang/LLVM)
- プログラミング言語をバイトコードに__静的に__変換する。実行時に、バイトコードを機械語に__動的に__変換する。前半は同じくコンパイラといわれ、後半は仮想マシンという。
- バイトコードで想定される動作を逐一実行する。(昔のJava)
- バイトコードを機械語に変換し、実行する。JITと呼ばれる。(今のJava、.NET Framework)
- 実行時に、プログラミング言語を機械語に__動的に__変換する。この変換するツールをインタプリタという。
- プログラミング言語を構文木で解釈し、想定される動作を逐一実行する。(昔のMRI)
- プログラミング言語をバイトコードに変換後、想定される動作を逐一実行する。(今のMRI)
- プログラミング言語を、直接またはバイトコードを介して、機械語に変換し、実行する。同じくJITと呼ばれる。(JavaScript各エンジン)
- プログラミング言語を__静的に__別の言語に変換し、あとはその別の言語の処理系任せる。この変換するツールをトランスパイラという。(CoffeeScript)
1.は静的に変換済みであるため、最も高速ですが、一度変換してしまった物はOS等が異なると使えません。逆に、2.と3.は移植性に優れています。2.で使われるバイトコードは中間言語とも呼ばれ、仮想的な命令のコードです。CPUはバイトコードを直接解釈することはできませんが、プログラミング言語そのものよりも高速に分析し、機械語へと変換が可能になっています。そのため、2.は3.よりも高速ですが、コンパイルする手間がかかります。3.は低速である代わりに、コンパイル不要ですぐに使えるという利点があります。4.は直接実行はされず、他の言語を介して実行されます。
一つの言語に対して一つの手段しか無いわけではありません。例えば、Haskellのようにコンパイラとは別にインタプリタも用意されている言語もあります。
この中で、インタプリタと仮想マシンは、その言語用のコンパイラが無い限り、その言語で作ることができません。例えば、RubyでできたRubyのインタプリタがあった場合、Rubyのインタプリンタ自体はどうやって動かせばいいのかわからなくなります。なので、RubyはRuby自体では無く、C言語やJava等でインタプリタが作られています。
逆に、コンパイラやトランスパイラは自分自身の言語で書くことができます。一番最初だけ他の言語で書く必要はありますが、そこさえクリアすれば自分自身も自分自身でコンパイルすることが可能です。GCCもそうですが、HaskellやGo等はその言語自身で作られています。トランスパイラも同様で、CoffeeScriptはCoffeeScriptでできています。
投稿2016/04/18 14:37
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
参考情報
ruby にはいろいろな実装があります。
- wikipedia Ruby https://ja.wikipedia.org/wiki/Ruby#.E5.AE.9F.E8.A3.85
...
公式な実装
MRI まつもとゆきひろによって開発されはじめたC言語による実装
その他の実装
JRuby Java 言語による実装。純粋な Java で行われている
IronRuby .NET Framework 上で Ruby を動作させる実装
Rubinius 大部分が Ruby で実装されている
MagLev smalltalk仮想マシン上で動作する実装
投稿2016/04/18 14:07
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/18 14:34
2016/04/18 22:10
2016/04/18 23:57
0
そうですね~
知識を深めるという意味ではコンパイラーを
勉強してみるのはいいと思います。
余裕があればyaccやlexを触ってみるのもいいかも。
投稿2016/04/18 13:27
総合スコア7458
0
CコンパイラはC言語自体で作られることが多いですが、クロスコンパイルという方法もあります。
一般的にあるOS上で動作するコンパイラはそのOSで動作する命令コードを出力しますが、クロスコンパイラは別のOS上で動作する命令コードを出力します。
コンパイラが存在するOS上でターゲットとなるOS用のクロスコンパイラを開発し、そのクロスコンパイラを使ってターゲット用のコンパイラを開発する、というようなことをしていたことがあります。
投稿2016/04/18 13:24
総合スコア674
0
こんにちは。
よくRubyやPHPはCで実装されている。などと書かれていますがあれはどういう意味なのでしょうか?
これは正に「Ruby(CRuby)の処理系(RubyMRI)はCで実装されている」という意味です。
言語仕様、言語本体、言語処理系
言語仕様はその言語の機能や表現方法を定義した仕様書ですね。英語等で書かれた普通の文書です。
その3つの用語で「言語本体」に当たる実体は「存在しない」が正解と思います。
「言語処理系」が言語仕様にしたがって処理を行うコンパイラやインタプリタ等のことを指します。
ちなみにブートストラップ問題と言う話があります。もしかするとこれを読まれると何か見えてくるかもしれません。
最初のコンパイラをどうやってコンパイルしたのか?という鶏が先か卵が先かの問題です。
私も実際を目の当たりにしたことはないですが、たぶん、最初のコンパイラはアセンブラで開発されただろうと思います。最初のアセンブラはどうしたのか?疑問ですが、一番最初のものは手でアセンブルしたのではないかと思います。
投稿2016/04/18 12:53
総合スコア23272
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/18 13:47
2016/04/18 14:24
2016/04/18 23:54