電子書籍の厳選無料作品が豊富!

プログラミング初心者です。
C言語を勉強中に疑問に思ったことが2つあります。

まず1つ目。
C言語以外のプログラミング言語、例えばjavaとかC#とかjsとかpythonとかrubyとかPHPとか、には開発者にとって便利なライブラリとかフレームワーク(僕にはこの2つの明確な違いがわかりません。が、どちらも「開発者が定義しなくてもよい関数やオブジェクトの集合」という認識があります)がありますよね。
そのおかげで色んな人達がプログラミングし易くなりました。
ネット(はてぶのホットエントリとか)でも「馬鹿な俺がプログラミングを勉強して〇〇を作った」といった記事をよく目にします。
でも「C言語を使って」というのは聞いたことがありません。
そもそも、C言語はそいういったライブラリやフレームワークが少ないように感じます。
検索してもrailsとかjqueryのようなフレームワーク(ライブラリ?)は見つかりません。
これが無かったらプログラムなんて作れないのでは?
しかし、世間にはC言語で作られたプログラムが多いのもまた事実。
C言語ではいったいどのように開発が行われているのか教えてください。

2つ目
unixとかlinuxといったOSはC言語で書かれている聞いたことがあります。
しかし、プログラムの開発は「コードを書く→コンパイル(→デバッグ)→実行」という流れですよね。
ではOSを開発するときに、そのコードをどうやってコンパイルするのでしょうか?
コンパイラはOSの上に立っているとするなら、OSがない状態でコンパイラはどこに立てばいいのか。
そこがわかりません。

誰かこの2つの疑問に答えてください。
お願いします。

A 回答 (5件)

ちょっと極論になりますが...



○ライブラリ

fopen,printf,scanf等は使ったことありませんか?
厳密に言えば、これらは「C言語」ではなく「標準ライブラリ」というライブラリにある関数です。

でも、「C言語で標準ライブラリを使って作りました」なんて言う人はほとんどいないでしょう。

標準でないものでも、総合的なライブラリもあります。
しかし、どちらかと言えば、目的に特化したものの方が多いです。Cの思想や利用目的を考えたらその方が正しいのかもしれません。

○コンパイラ
別に、使用しているOS用しか作れないわけではありません。ようするに最終的に目的のオブジェクトができればよいのです。
画像に例えれば、どんなソフトを使おうとも、JPEGとしての仕様を満せばJPEGとして表示できる、というような感じです。

現在の環境とは違う環境用にコンパイルするとをクロスコンパイルと呼びます。

実機が無くても、シミュレータやエミュレータで動作確認やデバッグを行えます。
Android用アプリも、PCのシミュレータでデバッグしますよね。あんな感じです。
    • good
    • 0

1つ目: ruby とか python とか PHP とか自体が C でできてるんじゃなかったっけ.


2つ目: 最悪, 人間がコンパイルすればいい. 「できるかどうか」ではなく「やりたいかどうか」という問題はあるが.
    • good
    • 0

>1つ目


>検索してもrailsとかjqueryのようなフレームワーク(ライブラリ?)は見つかりません。
>これが無かったらプログラムなんて作れないのでは?

C言語の場合は、WEB専用とか機能特化していないので開発者の用途に応じてライブラリは色々なものが別々に作られています。色々ありすぎて、今更体系にまとめられないと言う事情もあります。

有名なのだと、クロスプラットフォームのGUIフレームワークとしてGTK+がありますね。
「GTK+ - Wikipedia」
http://ja.wikipedia.org/wiki/GTK%2B
ゲームとかだとDXライブラリ(Windows限定)とかSDL(クロスプラットフォーム)など色々有ります。
「SDL - Wikipedia」
http://ja.wikipedia.org/wiki/SDL
「DXライブラリ置き場 HOME」
http://homepage2.nifty.com/natupaji/DxLib/

まぁ、DirectXやらWin32APIやらOpenGLやら描画系のAPIを直接使っている場合もありますので、配布ライブラリに頼らず自前ライブラリで組んでいる場合もありますね。

C++だとさらに多くてとてもたくさん有るとしか言えません。
「link集/ライブラリ系/C++ - NomisoBraaan Wiki」
http://www.nbrains.net/php/pukiwiki/index.php?cm …
C言語だけでもたくさん有るのが分かると思います。

>2つ目
>コンパイラはOSの上に立っているとするなら、OSがない状態でコンパイラはどこに立てばいいのか。

その理論で言うと新しいOSを作るコンパイラが無いことになります。
今あるOS上で動くコンパイラで新しいOSを作るのが正しいです。

じゃあ、OSが生まれる前は?
それはOSなしで動くアセンブラなどが使われました。
    • good
    • 0

・ライブラリについて



C言語においても、さまざまなライブラリが存在します。

C言語は、他の言語と違って、様々な用途に使えるため
「これ一つで何でもできる」ようなライブラリはありません。
jQueryのような「C言語はこれ一つで何でもできる」ようなライブラリは作れないのです。

「個々の用途に応じた小さなライブラリ」が非常に数多く存在しますので、
結果として個々のライブラリの注目度が下がっているだけでしょう。

あまりに数が多すぎて例を挙げるのも難しいのですが、
たとえば、JPEG画像を表示しているプログラムでは、よく Independent JPEG group の JPEG ライブラリが使われています。C言語以外の言語でも、C言語のJPEGライブラリを組み込むことが多いです。
非常によく使われるライブラリで、これの恩恵を受けている人は多いと思いますが、一方でJPEG画像表示が必要ないC言語開発者にとっては縁のないどうでもよいライブラリと言えます。


・開発環境について
あるOSを開発するときに、そのコンパイラを動かすOSがそれ自身である必然性はどこにもありません。
別のOS上でコンパイルすればいいのです。
そういう開発の仕方を「クロスコンパイル」「クロス開発」といいます。
これに対し、開発環境と実行環境が同じものは「セルフコンパイル」と呼びます。

たとえば、再初期の Linux は minix というPC用 UNIX 系OSの上で開発されました。
minix上でコードを書き、コンパイルし、それを(minixを終了させてから別のOSとして)実行、
というクロス開発の流れをしていたのです。

この場合、Linux の開発のためだけにminix が必要になりますので、
ある程度開発が安定してから以降、今ではLinux上でセルフコンパイルできる環境を構築し、
Linux上でコードを書き、コンパイルし、それを(コンパイルに使ったLinuxを終了させてから別のOSとして今コンパイルしたLinuxを)実行、
という開発の流れになっています。

(このような経緯から、「Linux はminix を元に作られた」という誤解もあったりしますが、
あくまで開発環境として利用しただけであり、Linux が minix を元にしているわけではない、
ということに注意してください)
    • good
    • 0

1つめ



> 検索してもrailsとかjqueryのようなフレームワーク(ライブラリ?)は見つかりません。
> これが無かったらプログラムなんて作れないのでは?

では、そのRailsやjQueryはどうやってできたと思いますか?
魔法か何かでしょうか? それとも、天の恵みでしょうか?

RailsやjQueryは違いますが、高級言語で利用可能な便利なライブラリは、CやC++で作られていることも少なくありません。
また、Cのライブラリというのはかなり充実しています。
何を作りたいのかにもよりますが、探し方にも問題があるかもしれません。

2つめ

> コンパイラはOSの上に立っているとするなら、OSがない状態でコンパイラはどこに立てばいいのか。

クロスコンパイルについて調べてみてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!