#質問
C言語はなぜ非C言語環境下でも動かせるのでしょうか?
自分はRubyを使っていますが
もちろん、Ruby実行環境を用意しないと
Rubyコードを実行できない。
ただ、記事を見ているとC言語は
ほとんどの環境下で動かすことができると
書いてあるのですが
なぜでしょうか?
まず、RubyとC言語の違いについて調べたのですが(意外に結構あった)
まず目に止まったのが
string
1ruby ・・・プログラムを部分的に機械語に変換しながら実行。 2 3c系言語 ・・・プログラム全体を機械語に変換して実行する。
でも、どちらもコンパイル作業が実行されるのは
プログラム実行命令が出された後なのだから
非C言語・Ruby環境下ではコンパイル作業はできないはず・・・
基礎がわかりません。
C言語がほとんどの環境で実行できる理由を知りたいのですが
どのようなキーワードから引っ張りだせばいいかわかりません。
分からないので どういうワードで調べればでてくるのか、または
参考になるリンクまたは説明をお願いします。
追記
どのようにしてプログラムが実行されるのか?
というワードでもいったのですが
おいしい情報は手に入りませんでした。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答17件
0
どの環境下でも動くアプリケーションは、石(CPU)やライブラリー(内蔵装置・外部接続装置のドライバーやフレームワークのAPIなど)が適切に選択されリンクが成功することによって実現されます。ただしこれらがそろわなければ動かないわけでもなく、原始的なOS下で動かすのであれば直接ポートを操作して(よく叩くという)やりたいことをやってのけることができます。MS-DOSやN88(86)BASICのころは、OSを無視して直接BIOSをコールしてC言語プログラムを動かすことができました。
これらは、C言語の成果物がすでにそれぞれの環境で動作する条件を満たしたものになっていると言い切る証拠のようなものだと思います。
C言語はなぜ非C言語環境下でも動かせるのでしょうか?
誤解があって、まずC言語環境下というものはありません。しかしC言語のビルド環境はあります。ホストがWin/Unix/Linuxであることに関係なくターゲット機器上で動くように作成できます。
大昔にPC98上でHigh-C386など駆使してFM-TOWNS用のアプリケーションをビルドしたりしましたが、どちらかと言えばビルド環境の整ったホストがそこにあれば、仕向け(ターゲット環境)の差分だけをMakefileに織り込めば、どれ向けのアプリケーションでも作成できるという考え方だったと思います。この考え方は今でも存在していると思います。
.net Framework、React Native、Flutterなど、共用できる度合いが変わりますが、基本的に同じコードで仕向けを複数持たせることができます。
これらに比べると、C/C++はターゲットUIが変わると基本的に共用できなくなりますから、いろんな仕向けを用意できるものの、コードを共用するには割とコストが掛かります。
Rubyはフレームワークでもあるので、Ruby自体がOSの差分を吸収した上で動いていると思います。逆に言えばOSの差分を吸収しきれない場合リリースは困難でしょう。
ポテンシャルとしては、中身のないmain関数をそれ自体動かせるC言語に対して、フレームワークの導入が求められるRubyでは、マイコンなどでまず動かしてみることの敷居が猛烈に高いということになると思います。
またC言語は環境にフィットさせることを自前で行う必要があり、その面ではまず動かす敷居が高い場合もあるかもしれません。Rubyはその安定稼働が保証された環境下においてはコマンド一発で導入できるため敷居が極限まで低いといえるかもしれません。
以上は、おおむね論なので一部細かい指摘はあり得ます。そこに反論はありません。現実が事実です。
その他はみなさんおっしゃる通り。
これ長いなあ。
最後まで読んだあなたは努力家です。
投稿2019/08/27 00:05
編集2019/08/27 14:42総合スコア92
0
ベストアンサー
非C言語・Ruby環境下ではコンパイル作業はできないはず・・・
はい、そのとおりです。ただ、C言語の場合、コンパイルされた後のコードだけを持っていって動かすことが可能です。
投稿2019/08/23 07:29
総合スコア145930
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/01 01:59
2019/11/01 02:04
2019/11/01 02:06
0
C言語はその環境で動くような機械言語に変換してくれるからです。
C言語は一般にコンパイラ言語、Rubyはインタプリタ言語と呼ばれます。
コンパイラ言語はその言語で書かれたプログラムを直接その環境で動くように変換(コンパイル)します。Windowsで言えば.exeとか、.dllとかのファイルですね。
それらのファイルをメモ帳で開いても文字化けして我々人間はほとんど読めないはずです。しかし、機械にとっての言語なのです。
直接、機械で実行できますので、インタプリタ言語よりもコンパイラ言語は一般に早いと言われます。しかし、コンパイラ言語で作ったプログラムは他の環境(他のマシン)に持っていくと動かなくなることがあります。Windows同士であれば、ほぼ問題ありませんが、同じLinuxでもCPUが違えば動きません。同じWindows でも64bitのアプリケーションは32bit環境では動きません。
コンパイラ言語はプログラムを動かしたい環境に合わせて機械向けのアプリケーションを作ります。
逆にRubyなどのインタプリタ言語については、機械向けのアプリケーションは作りません。基本はruby xxx.rbなどファイルを直接Rubyに渡しています。
Rubyはファイルを渡されるとそのプログラムを動作している環境向けに変換(コンパイル)して実行までします。
つまり、
コンパイル言語はプログラムを1.コンパイル、2.実行と2段階に分けて実行するのに対し、
インタプリタ言語は1.コンパイル&実行としてくれるわけです(本当はコンパイルまでで止める事も可能ですが、簡単のために省略)
さて、質問についてですが、結論から言うとC言語のようなコンパイル言語(C++やPascalなど)は直接機械言語にしているからCを動かすソフトがインストールする必要がないのです。
Rubyなどはプログラムから動かす言語なので、機械言語に変換処理などが必要なので、プログラムだけでは動作せず、Rubyをインストールする必要があるのです。
この話は今の先端の技術ではそうでないことも述べていますが、知識としては無駄ではないはずです。
コンパイラ言語、インタプリタ言語ときたら次は中間言語となり、面倒な話になりますが、そこは今回の話とは関係ありませんので割愛します。
投稿2019/08/26 12:37
総合スコア86
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/26 23:50
2019/08/27 03:38
2019/08/27 14:01
2019/08/27 22:46
0
他の回答に異論があるわけではないのですが、異なる視点から回答してみたいと思います。
C言語はなぜ非C言語環境下でも動かせるのでしょうか?
自分はRubyを使っていますが
もちろん、Ruby実行環境を用意しないと
Rubyコードを実行できない。ただ、記事を見ているとC言語は
ほとんどの環境下で動かすことができると
書いてあるのですが
なぜでしょうか?
現在流通しているOSの大半はC言語で開発されていて、OS上で動くコマンドの多くもC言語で開発されています。なので、OS自体が「C言語が動く仕組み」を元々持っているわけです。そうじゃないと、C言語で開発されたコマンドが動かないですよね。
具体的には、Linuxはglibcというライブラリが元々ありますが、これは(主に)C言語から呼び出されるライブラリです。
なので、大半のOSは元々「C言語環境」なのだと言っても間違いではないと思います。ただし、そのような言い方を現実にするわけではないのでご注意ください。
投稿2019/08/27 02:44
総合スコア11705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/27 03:08
2019/08/27 14:09
0
英語は、なぜ 殆どの国で通じるのか?
昔は オープンソースなものも ソースコードから make configure から始めて
動作環境に合わせた設定を用意してからこコンパイルして使うのが普通でした。
いつのまにか CPU が同じで、ある程度 OS が似ているなら、バイナリーをもってくるだけで動作するようになりました。
ruby コードも C と同じようにこコンパイルして exe や 実行形式バイナリーしてしまうという方法もあります。この場合は ruby 環境がなくても プログラムは動作します。
shell スクリプトは、スクリプト言語ですが、 /bin/sh がある linux なら、ほとんどの環境で動作するでしょう。
ある形式に沿ったバイナリを動かす仕組みが、多くの環境で共通になっているというだけのことです。
投稿2019/08/28 15:18
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ただ、記事を見ているとC言語はほとんどの環境下で動かすことができると書いてあるのですがなぜでしょうか?
一言で言えば、「C 言語を使いたいという需要が多いから」となります。
ではなぜ需要が多いのか。
C言語はその生い立ちから、直接機械語を出力することを目的としており、さらにアセンブラとの親和性が高いという特徴を持っています(C言語ソース内に直接アセンブリを書けたりする)。
これはそもそもアセンブラベースで作成されていた初期のUNIX用のプログラムを書く際に、アセンブラと同等のことができる上でより書きやすい高級言語が欲され、その解答として作られたのがC言語だからです。
そのため、C言語はメモリ空間を直接操作することができる特徴を持っています(ポインタがまさにそれです)。
さて、アセンブラの代わりができる、ということは、新しいCPUなりなんなりを使えるようにするために基礎的なプログラムを作成する際に、C言語が使えるなら作業効率が上がります。むろん、C言語ならそれなりの移植性も持ち合わせています。
であるならば、まず「C言語でプログラムを作れるようにする」=対象の環境向けのCコンパイラを用意する、のを優先した方が、後の開発が楽になります。
結果的に、「まずCコンパイラを用意する」ことになり、それはつまり「C言語で書いたプログラムが動かせる環境ができあがる」のです。
よほど特殊なCPU(例えばJavaバイトコードを直接実行するとか)でもない限り、C言語が使えないというのはありません。そんなCPUは、そもそも売り物にならないからです。
※はなからごく少数しか使わない前提のCPUとかならC使えないなんてのもあるかも知れませんが……
投稿2019/08/27 09:42
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
すごーく比喩的にいうと、
Cでコンパイルするというのは、翻訳した本を書き上げるということ。
翻訳自体は、別にいつ、どこでやったものでも構わない。出来上がった本だけあれば読める。(その意味では、そもそも「C環境」なんていうものがないとも言える)
Rubyは、同時通訳してくれる人が側について、元本を翻訳しながら朗読してくれるもの。
ということは、同時通訳してくれる人(Ruby環境)がそこにいなきゃいけない。
もう一ついうと、Cは、プログラマに責任を負わせることでコンパイラは随分楽をしている。またそれとも関連するけどコンパイラがあれこれ手を回さずに、プログラムに書いてあるとおりコンピュータの中身を直接いじくるようなプログラムになる...
ので、コンパイラ自体は(基本としては)比較的コンパクトで、簡単に作れて、しかも対象コンピュータの能力を引き出しやすい(その分人間が苦労する)ので、どんなCPUであれ、高級言語としてCのコンパイラが用意される、ということになる。
(研究用で特定の言語に合わせたCPUというのが開発されることがあったけど(FORTHチップとか)、そういうのにCがあったかと言われるとそこまでは知りません。)
投稿2019/08/27 05:51
総合スコア7703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
通常はコンパイラ及びリンカによりC言語のソースから実行形式(機械語、あるいは中間言語)にされるので、この実行形式のプログラムは非C言語環境下でも動かせる可能性があります。
但し、実行時に特定の実行時ルーチン/dll等を必要とする場合があります。
C言語は使い勝手が良いので、様々な処理系に移植されています。
様々な処理系に実行時ルーチン/dll等が移植されていれば、その処理系上で実行できると思います。
投稿2019/08/27 00:16
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/27 00:18
2019/08/27 00:24
2019/08/27 00:40
退会済みユーザー
2019/08/27 09:17
2019/08/27 09:25 編集
退会済みユーザー
2019/08/27 10:05
2019/08/27 10:41
2019/08/27 10:50
退会済みユーザー
2019/08/27 11:08
2019/08/27 11:13
2019/08/27 11:17 編集
退会済みユーザー
2019/08/27 11:33
2019/08/27 11:37
退会済みユーザー
2019/08/29 06:31
退会済みユーザー
2019/08/29 13:14
2019/08/29 13:17
2019/08/29 13:19
2019/08/29 13:23
2019/08/29 13:24
退会済みユーザー
2019/08/29 21:13
2019/08/30 00:36
0
「C言語」は実行できないよ。直接実行できるのは機械語(バイナリの実行ファイル)だよ、ということを常識として知っておくといいですね。
機械語は人間には読めませんが、CPUには意味がわかる、というものです(厳密な話をしだすと、「機械語命令列」の前にOS宛のヘッダとか色々ついてる可能性はあるんですが、割愛。また、機械語ですらない可能性もあるのだが(Javaの方式とか)それも割愛)。
Cのコンパイラはこのバイナリの実行ファイルを生成します。
ではRubyの実行環境は何かというと、こいつ自身はバイナリの実行ファイルです(だと思います)。要は、これ自体が一つのソフトウェアです。
どんなソフトウェアなのかというと、ファイルに書かれた文字列を読み込んでそれに応じて色んな計算や処理をしてくれるというものです。こういうものをインタプリタと言います。
(実際はJITとかやり方がいろいろありますが、割愛)
投稿2019/08/23 17:02
編集2019/08/28 12:48総合スコア30935
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
There are numerous benefits from learning C; however, the most important benefit is that the C programming language is recognized worldwide and used in a multitude of applications, including advanced scientific systems and operating systems. Programming in C is fairly easy
C is one of most widely used computer programming languages. The reason C is so popular is because it is reliable, simple and easy to use.
C is what is called a compiled language.
投稿2019/08/29 04:39
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
すでに沢山の回答が上がっていますが、個人的に好きなテーマなので、整理を兼ねて書いてみました。
「正しい質問をすること」は意外に難しいことがあります。このご質問は、以下の2種類のテーマを含んでいると思います。
テーマ1:ランタイム環境の有無の問題
テーマ2:コンパイラとインタプリタの相違の問題
ご質問を精読すれば、前者1の質問ということになると思いますが、後者2の内容についても書いてみたいと思います。
なお、私は日頃、Ruby を使っていないので、言葉が多少、正確でない所があるかも知れませんが、あしからず。
■テーマ1に対する回答
初期のCコンパイラで開発したプログラムは、EXE ファイル単体で動いていました。ただ、Cコンパイラが生成したプログラム(EXE)には、誰もが使っているであろう printf() 関数や一連の文字列関数を処理するための共通ライブラリが、常に埋め込まれます。そうすると、C言語のプログラムが沢山出来上がったときに、同じ処理を行う共通ライブラリが、あちこちに存在することになります。
これはファイル容量の増大につながり、ディスクの無駄使いに思えます(フロッピー・ディスクを使っている時代はそうでした!)。また、共通ライブラリの中にバグが見つかった場合、C言語で開発したすべてのプログラムを、再度、コンパイル&リンクし直さなければなりません。そこで考え出されたのが、共通ライブラリを別ファイルの DLL にする方法です。DLL は、ダイナミック・リンキング・ライブラリの略で、実行時に、動的に EXE とくっついて動くライブラリという意味です。
今では、ランタイムを EXE に埋め込まず、別ファイルの DLL として配布する方法が一般的です。そして、C言語で開発されたプログラムは非常に多いため、Windows OS には、最初からC言語用のランタイムがインストールされています。ゆえに、エンドユーザが意識してC言語環境(C言語用のランタイムの DLL)を導入しなくても、C言語で開発されたプログラムは動きます。
たとえば、みなさんの Windows PC で、コントロールパネルの「プログラムと機能」を開くと、Microsoft Visual C++ 2013 Redistributable(x64) といったライブラリが見つかるでしょう。
これに対して、Ruby で開発したプログラムを利用する人は少ないので、Windows に標準では入っていません。通常は、利用者が明示的に Ruby のランタイム環境をインストールすることになります。
以上のことを整理しますと、「C言語は実行環境が不要だけれど、Ruby は必要」なのではなく、C言語の実行環境(DLL)は、最初から OS に入っているということになります。
■テーマ2に対する回答
一般に、C言語がコンパイラ言語であるのに対し、Ruby はインタプリタ言語です(インタプリタのC言語というのも、昔ありました)。インタプリタ言語を実行するときは、インタプリタがプログラムのソースコードを逐一解釈しながら実行する。だから、インタプリタ言語は、コンパイラ言語に比べて速度の面で遅いと言われます。
しかし、細かいことを言いますと、インタプリタは、プログラムの実行に合わせて、毎回毎回、if 文や while 文の文字列を解析して実行している訳ではありません。私は、Java で独自のスクリプト言語(インタプリタの言語処理系)を開発したことがありますが、ソースコードを解析するのは、最初の一度だけです。ソースコードを解析したら、それを効率よく実行するための Tree 構造(木構造)の特殊なデータに展開します。その後、その解析後のデータを使って、プログラムに記述されていた処理をスタートします。
最近のインタプリタ言語は、ソースコードを解析した後の Tree 構造のデータ(Ruby ではバイトコードと呼ぶようです)をいったん別ファイルに出力し、その後、そのファイルをインタプリタ・プログラム本体が読み込んで、実行するようになっているようです。
C言語が、「EXE」と「ランタイム DLL」の組み合わせで動くのに対し、Ruby は Ruby コンパイラが出力した「バイトコード」とバイトコードを読んで実行できる「バーチャルマシン(VM)」の組み合わせで動きます。ここで、EXE は機械語(CPU が直接実行できる命令)になっているのに対し、バイトコードは、直接 CPU が実行することはできません。バイトコードと CPU の間にバーチャルマシンが立って、両者の間で通訳しながらプログラムを実行している感じになります。
以上のように、C言語で組んだプログラムを実行するにはランタイム(DLL)が、Ruby で組んだプログラムを実行するにはバーチャルマシン(VM)が必要です。しかし、両者の仕組みには、いろいろと違いがあるという訳です。
投稿2019/08/28 12:30
総合スコア12
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
答えは単純で、c言語はコンパイルして
実行形式にして、それを動かすという一連の環境を、多くのos、cpuが対応しているからです。
rubyの場合、スクリプト言語なので、実行中に実行形式に変換していくため専用の実行環境が必要なのですが、そうした実行環境は多くのosではアディショナルな位置付けでデフォルトでは対応がない。だから一手間加えないと動かない。
歴史的にc言語は枯れた方式ですし、そもそも各osの成立時にc言語は主流の言語だったからとか、rubyは実行環境の更新が比較的多いからとか、その辺りがこの状況を生み出しているのだと思います。
投稿2019/08/27 21:06
総合スコア16
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
まだまだ、続いていますね。
C言語がほとんどの環境で実行できる理由を知りたいのですが
- C言語用のコンパイラが、ほとんどの環境で用意されているから。
- C言語でコンパイルされたファイルを実行する環境がほとんどの環境で用意されているから、、、。
でしょう。
ただ、2. に関しては、C言語でコンパイルされた結果の実行形式というよりは、それぞれのOSの実行形式にコンパイルされる、というのが正しいかもしれません。
もっと、荒っぽく言えば、C言語がメジャーなコンピュータ用言語なので、多くの処理系(OSとか、、)がサポートしてるってのが正しい。
ただし、当然ながら、Windowsでコンパイルした実行ファイルは、Linuxでは動きません。また、Windows用のC言語で書かれたソースが全て Linuxでコンパイル/実行できるわけではありません。逆も同様。誤解無きように。
投稿2019/08/27 11:57
総合スコア6385
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
もう誰も見てないかな...
多くの回答がありますが、少し足りていないように思います。
質問はつまるところ2つと理解しています。
(1) > C言語はなぜ非C言語環境下でも動かせるのでしょうか?
(2) > C言語はほとんどの環境下で動かすことができると書いてあるのですがなぜでしょうか?
(1)ついてはgvcさんの答えがズバリですね。気になるのは(2)に対する回答が十分ではないことです(tknakamuriさんとthkanaさんがそれぞれ同じ理由をひとつを述べているのみ)。直接的な答えはtknakamuriさんが述べているようにいろいろなアーキテクチャに対応したコンパイラがあるからで、さらに深くつっこんだ回答としてなぜそのような多様なコンパイラが用意されているか、なぜCが様々な環境で利用されているかなどの、Cが普及した歴史的な経緯や利点をもっと説明しても良いのではないでしょうか(gccやunix開発言語などなどについて)。ただ私はガチ素人なので説明できる知識ありませんが(^q^)。
投稿2019/08/27 08:45
総合スコア14
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/27 08:59
2019/08/28 12:59
2019/08/29 06:38
0
>C言語はなぜ非C言語環境下でも動かせるのでしょうか?
>もちろん、Ruby実行環境を用意しないと
>Rubyコードを実行できない。
Ruby実行環境にRubyコードでプログラミング実行
>ただ、記事を見ているとC言語は
>ほとんどの環境下で動かすことができると書いてあるのですがなぜでしょうか?
非C言語環境下とは、C言語コンパイラーがない環境の事ですね
C言語は、C言語コードでプログラミングし
C言語コンパイル(C言語コードを実行環境のcpuやosで実行できるコードへ変換)し実行可能コードを書き出します
その 実行可能コードを
互換性のあるcpuやosへコーピーする事で実行できます
Ruby等のインタプリタ言語はその言語の実行環境をインストールする必要がありますが
C言語は、稼働させてい環境のCPUやOS、デバイスをターゲットにプログラミングしているからです
説明になっていますか?
自分のコードがどんな仕組みで動くのか知りたいですよね
投稿2019/08/27 01:01
編集2019/08/27 01:05総合スコア23
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
元々C言語は UNIXというOSを出来るだけCPUに依存せずに書き、
異なるCPUへの移植を容易にするために作られた言語。
そのため言語仕様がとても小さく、様々なCPU用のCコンパイラを作るのが
他の言語に比べて容易なんです。
ただ標準ライブラリまでフル装備の移植はそんなにないはず。
投稿2019/08/26 23:44
総合スコア62
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/26 23:48
2019/08/27 00:20
2019/08/28 13:34
2019/08/28 13:56
2019/08/28 14:27
2019/08/28 14:36 編集
2019/08/28 15:15
2019/08/28 15:20
2019/08/28 15:21
0
でも、どちらもコンパイル作業が実行されるのは
プログラム実行命令が出された後なのだから
違います。
細かいことは抜きにして、C言語はプログラム実行命令が出されたら機械語が直接実行されます。
事前にコンパイルし機械語を生成するためプログラム(ソースファイル)は実行時には不要です。
投稿2019/08/23 07:44
総合スコア7918
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/27 00:13
2019/08/27 02:16
2019/08/27 02:56 編集