質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.63%

RubyやPHPがCで実装されているの意味

解決済

回答 6

投稿

  • 評価
  • クリップ 4
  • VIEW 5,865

ktr

score 29

よくRubyやPHPはCで実装されている。などと書かれていますがあれはどういう意味なのでしょうか?
Ruby(CRuby)の処理系(RubyMRI)はCで実装されているのはわかるのですが、言語本体がCで実装されているのでしょうか?

またそうなるとCは何で実装されているのでしょうか?

加えて、最近の新しめな言語でSwiftなどは処理系はClang/LLVMなので確かC++?であるのはわかるのですがSwiftの言語自体は何で実装されているのでしょうか?

もしかすると自分の中で言語仕様、言語本体、言語処理系の区別があまりついていないのかもしれません…
宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

checkベストアンサー

+3

Ruby(CRuby)の処理系(RubyMRI)はCで実装されているのはわかるのですが、言語本体がCで実装されているのでしょうか?

「言語本体」という言い方はあまり聞きませんが、「実装される」の主語となり得るのは「処理系」だけです。「言語仕様」は日本語とか英語などの自然言語で書かれます(シンタックスの部分は特別な記法が使われますが)。
おそらく、

もしかすると自分の中で言語仕様、言語本体、言語処理系の区別があまりついていないのかもしれません…

と言うことだと思います。あなたは「言語本体」という言葉をどういう意味で使っていますか?

またそうなるとCは何で実装されているのでしょうか? 

CコンパイラはCで書かれていることが多いと思います。当然ながら、世界最初のCコンパイラはC以外、アセンブラか、あるいはCの元になった言語であるBかBCPLで書かれたと思います。いったん動くCコンパイラが出来れば、あとはそのCコンパイラが使えます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/18 22:47

    回答ありがとうございます。
    本体というのはなんとなくイメージでしかわからないのですが、RubyですとArrayクラスや、CですとIntやFloatなどですかねー。組み込みライブラリの元となる型やクラスですかね。

    そして今考えて思ったのですが、Rubyの場合ですと、Rubyというプログラミング言語の仕様の通りにプログラムを作り、それを処理系(Cなどで実装されている)が処理しバイナリにする。
    つまり、今考え直してみると言語であるので実体ではなく、プログラミング言語が何かで実装されているということはないってことですか?
    宜しくお願い致します。

    キャンセル

  • 2016/04/18 23:24

    Cのintやfloatは言語仕様で定められていて、処理系がそれを実現しています。
    RubyのArrayなど組み込みライブラリは微妙ですが、多くの物は言語仕様と密接に結びついていて、これも処理系が実現していると言っていいと思います。
    Cのprintfやgetchar、Rubyのdateやjsonなどは、標準ライブラリで、言語仕様で記述されていたりしますが、実装上は、ユーザー作成のライブラリと同列です。Rubyの標準ライブラリはCで書かれている物とRubyで書かれている物があります。

    コメントの後半「つまり~」は、ちょっと意味がわかりませんでした。

    キャンセル

  • 2016/04/19 08:54

    お詳しくありがとうございます。理解できました!

    キャンセル

+2

まずはコンパイラやインタプリンタという物を理解する必要があります。

CPUは機械語しかわかりません。しかし、機械語は人間にはとてもわかりにくく、直接書くには適していません。機械語を人間にも読めるようにした物がアセンブリ言語です。アセンブリ言語は機械語よりは読めないことはありませんが、単純な命令を高度に組み合わせてプログラムを実現する必要があり、言語自体が構造化されているわけではないため、そう簡単に書ける物ではありません。そこで、人間にも読みやすく、構造化により書きやすくしたものとしてプログラミング言語が作られました。

プログラミング言語は人間には理解できますが、CPUには理解できません。プログラミング言語をどうにかして機械語に変換し、CPUが理解できるようにしなければなりません。その機械語へ変換する行程の違いによって、プログラミング言語を大別すると四つに分かれます。

  1. プログラミング言語を機械語に静的に変換する。この変換するツールをコンパイラという。
        1. プログラミング言語を直接機械語に変換する。(GCC)
        2. プログラミング言語をバイトコードに変換した後、すぐに、CPUに合わせた機械語に変換する。(clang/LLVM)
  2. プログラミング言語をバイトコードに静的に変換する。実行時に、バイトコードを機械語に動的に変換する。前半は同じくコンパイラといわれ、後半は仮想マシンという。
        1. バイトコードで想定される動作を逐一実行する。(昔のJava)
        2. バイトコードを機械語に変換し、実行する。JITと呼ばれる。(今のJava、.NET Framework)
  3. 実行時に、プログラミング言語を機械語に動的に変換する。この変換するツールをインタプリタという。
        1. プログラミング言語を構文木で解釈し、想定される動作を逐一実行する。(昔のMRI)
        2. プログラミング言語をバイトコードに変換後、想定される動作を逐一実行する。(今のMRI)
        3. プログラミング言語を、直接またはバイトコードを介して、機械語に変換し、実行する。同じくJITと呼ばれる。(JavaScript各エンジン)
  4. プログラミング言語を静的に別の言語に変換し、あとはその別の言語の処理系任せる。この変換するツールをトランスパイラという。(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/19 09:01

    お詳しくご回答してくださりありがとうございます!おかげで基礎的な知識が増えました。

    キャンセル

0

こんにちは。

よくRubyやPHPはCで実装されている。などと書かれていますがあれはどういう意味なのでしょうか? 

これは正に「Ruby(CRuby)の処理系(RubyMRI)はCで実装されている」という意味です。

言語仕様、言語本体、言語処理系

言語仕様はその言語の機能や表現方法を定義した仕様書ですね。英語等で書かれた普通の文書です。
その3つの用語で「言語本体」に当たる実体は「存在しない」が正解と思います。
「言語処理系」が言語仕様にしたがって処理を行うコンパイラやインタプリタ等のことを指します。

ちなみにブートストラップ問題と言う話があります。もしかするとこれを読まれると何か見えてくるかもしれません。
最初のコンパイラをどうやってコンパイルしたのか?という鶏が先か卵が先かの問題です。
私も実際を目の当たりにしたことはないですが、たぶん、最初のコンパイラはアセンブラで開発されただろうと思います。最初のアセンブラはどうしたのか?疑問ですが、一番最初のものは手でアセンブルしたのではないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/19 08:54

    ご回答ありがとうございました!

    キャンセル

0

CコンパイラはC言語自体で作られることが多いですが、クロスコンパイルという方法もあります。
一般的にあるOS上で動作するコンパイラはそのOSで動作する命令コードを出力しますが、クロスコンパイラは別のOS上で動作する命令コードを出力します。
コンパイラが存在するOS上でターゲットとなるOS用のクロスコンパイラを開発し、そのクロスコンパイラを使ってターゲット用のコンパイラを開発する、というようなことをしていたことがあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/19 08:55

    ご回答ありがとうございました!

    キャンセル

0

そうですね~
知識を深めるという意味ではコンパイラーを
勉強してみるのはいいと思います。
余裕があればyaccやlexを触ってみるのもいいかも。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/19 08:55

    ありがとうございます!コンパイラの勉強してみます!

    キャンセル

0

参考情報
ruby にはいろいろな実装があります。

...
公式な実装
  MRI       まつもとゆきひろによって開発されはじめたC言語による実装
その他の実装
  JRuby     Java 言語による実装。純粋な Java で行われている
  IronRuby  .NET Framework 上で Ruby を動作させる実装
  Rubinius  大部分が Ruby で実装されている
  MagLev    smalltalk仮想マシン上で動作する実装

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/18 23:34

    これは正確にはRubyの仕様に基づいた処理系にはいろいろな実装があるという理解で大丈夫でしょうか?
    宜しくお願い致します。

    キャンセル

  • 2016/04/19 07:10

    はい、そうです。
    ruby にかぎらず、どんな言語でも いろいろな実装方法があります。
    C 実装が多いのは、単にCで書くのが簡単だからだと思います。メモリー管理部を書くことも可能です。(java などだとガーベージコレクトが動作するので、自分で細かくメモリー管理するのはかえって大変だったりします)
    OS 自体や 基本的なコマンドは C で実装されていることが多いと思います。

    キャンセル

  • 2016/04/19 08:57

    なるほどです。ありがとうございました!もやもやが解消できました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る