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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

6回答

8847閲覧

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

ktr

総合スコア29

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

6クリップ

投稿2016/04/18 12:30

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

ベストアンサー

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

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

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

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

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

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

投稿2016/04/18 12:44

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ktr

2016/04/18 13:47

回答ありがとうございます。 本体というのはなんとなくイメージでしかわからないのですが、RubyですとArrayクラスや、CですとIntやFloatなどですかねー。組み込みライブラリの元となる型やクラスですかね。 そして今考えて思ったのですが、Rubyの場合ですと、Rubyというプログラミング言語の仕様の通りにプログラムを作り、それを処理系(Cなどで実装されている)が処理しバイナリにする。 つまり、今考え直してみると言語であるので実体ではなく、プログラミング言語が何かで実装されているということはないってことですか? 宜しくお願い致します。
otn

2016/04/18 14:24

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

2016/04/18 23:54

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

0

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

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/18 14:37

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ktr

2016/04/19 00:01

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

0

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

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

投稿2016/04/18 14:07

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ktr

2016/04/18 14:34

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

2016/04/18 22:10

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

2016/04/18 23:57

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

0

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

投稿2016/04/18 13:27

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ktr

2016/04/18 23:55

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

0

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

投稿2016/04/18 13:24

yoshi777

総合スコア674

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ktr

2016/04/18 23:55

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

0

こんにちは。

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

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

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

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

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

投稿2016/04/18 12:53

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ktr

2016/04/18 23:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問