みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

「プログラミング」の「本質」?

こんにちは。
僕は今C言語を独学してる大学生ですがプログラミングに関してわからないことがあります。

まず、プログラミングの入門書には主にその言語の文法の解説だけしか載ってませんよね。
しかし実用的なソフトウェアを作るには文法以外にも大事な概念とか機能がありますよね?(実装とか組み込みとかライブラリとかフレームワークとかAPIとか.NETとかexeとか)
入門書はその部分を曖昧にしてると思うんですよね。
例えば「APIはOSとアプリケーションを繋ぐ窓口」とかいう感じで。
僕は「API」がどういう仕組みでどういう役割を持ち具体的にどう使えばいいのかを知りたいわけなんですよ。
この詳しい解説はいったいどんな本に載ってるんでしょうか?

次にソフトウェアって、僕の考え方が正しいかわかりませんが、他の色んな部分に繋がっていますよね。
例えばブラウザは「ネットワーク」に、OSは「ハードウェア」に。
その「連結部分」がいったいどういう仕組みで何が支配してるんでしょうか?
もちろんネットワークもハードウェアも仕組みが違うことはわかりますが、「Hello,World!」と表示する道具をどう弄れば「連結部分」となり得るのでしょうか?


以上の二つが僕が疑問に思ったことです。
文才が無くてすみません。
僕自身何がわからないのかわからないので。
つまり、作りたいモノがあっても「プログラミング」という一つのカテゴリーが大きすぎてどうやればいいかわからないということです。
ちなみに僕は人工生命のシミュレーションソフトを作ってみたいんですが、Linuxとかを弄ってみたいなと思っています。

誰かこの疑問に答えてくれませんか。
こいつのせいでプログラミングをやる意味が見出せずプログラミングに対して恐怖すら覚えるようになってきました。
助けてください。
お願いします。

投稿日時 - 2010-11-18 18:31:19

QNo.6328123

すぐに回答ほしいです

質問者が選んだベストアンサー

>どういう仕組みでどういう役割を持ち
デバイスドライバのことですかね。
APIとはつまり、デバイスドライバへのラッパーがほとんどです。
例えばファイルシステムはこんな感じになっています。

図 1. Linux ファイルシステム・コンポーネントのアーキテクチャー図
http://www.ibm.com/developerworks/jp/linux/library/l-linux-filesystem/#N10105

デバイスドライバの多くは機械語(アセンブリ言語)で書かれ、そのデバイスドライバが個々のハードウェアに信号を出します。
そしてデバイスドライバへのアクセスを汎化する為に、OSが標準的なインターフェースを提供します。
そのインターフェースを更にラッピングする形で、私たちが普段目にするC言語の標準関数などが実装されます。
こういった階層を経ることで、OSが変わってもC言語の標準関数はそのまま使えるわけです。

簡単にはこんな流れですね。
参考になれば幸いです。

投稿日時 - 2010-11-19 21:57:57

ANo.7

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.6

「API」の役割と具体的な使い方は「リファレンス」と呼ばれるドキュメントを読めばよいでしょう。
どういう仕組かは、そもそも内部的な動作を考えなくていいようにAPIが存在しているわけで、それを知りたければAPIのソースをみるのが一番です。

「連結部分」ですが、突き詰めると0と1の電気信号で成り立っています。
これが回線を伝わることによって、通信が行われますし、メモリ上に存在することで記憶されます。
Hello, World!も画面を構成する点(dot)で表現されていて、その点はグラフィックボード上のメモリの状態を反映させているもので、最終的には0/1の信号になります。

プログラミングするうえでハードウェアの仕組みを知っていると役に立つこともありますが、それを知らないとプログラミングできないわけではないですし、それを突き詰めるのは別なお話かと思います。

最近は、APIやフレームワークが充実しているので、ある程度ブラックボックスとして利用するのもありかと思います。

投稿日時 - 2010-11-19 16:25:37

ANo.5

まぁ、今はとにかく規模が大きいので大変ですけど、基本的ににはそんなに難しいことをやっているわけではないんですけどね。
2進法な世界で、プログラムを読み、データを読み、ごく基本的な演算(ANDやOR、加減算)を行って、演算結果を書く。
コンピュータなんて所詮はこれだけのことを延々と高速に繰り返しているだけです。

最初は本当にごく単純なものでしたけど、「あれもこれも・・」という具合にどんどん肥大化するにしたがって独りのプログラマが全部面倒をみるのはとても大変なことになってきてしまったので、何とか楽をさせてあげようということで、いろいろな工夫が行われてきたわけですね。

C言語などの高水準言語はCPUが読み込むプログラムがややこしくなってきたので、より人間様にとって分かりやすい表現をしようっていうものです。
APIなんていうのは「そんな細かいところまでチマチマと毎回同じようなものを書くのは大変だから、ある程度共通に使えるようにしようよ」ということでどこかの誰かさんがあらかじめ作ったプログラムで、「皆、これを使ってくださいな」としたというものです。

この「どこかの誰かさん」が作ったプログラムが、質問者さんの言うところの「連結部分」というやつですね。昔はその連結部分も単純だったんですが、これまたいろいろと「サービス良く」してやろうとしてきた中でどんどん大きくなってしまって、物によってはそこだけで一冊本が出来るほどになっていますから、全部把握するのはなかなか大変ですね。


このあたりは、全体を把握しやすい、もっと規模の小さいマイコン(ワンチップマイコンなどが良いかなぁ?)でアセンブラでプログラムを組んでみるあたりからやってみると、「あぁ、なるほど」と思えてくると思いますよ。

投稿日時 - 2010-11-19 08:05:18

定番のヘネシー&パターソンさんの本は、専門分野としてマイコンを扱う技術者にとってはバイブルです。そういう意味で「定番」です。

計算機という概念を俯瞰的に理解するという点で、個人的なおすすめは、次の本です。

「構造化コンピュータ構成 第4版―デジタルロジックからアセンブリ言語まで」
アンドリュー・S. タネンバウム (著)

悪く言うと、さまざまな話題が「広く浅く」書かれている本なのですが、
ハードウェアからOSまで、「なぜそのような仕掛けになっているのか」の
本質が押さえられているため、計算機そのものに対する理解が深められます。

また、ネットワークについて学びたいなら、同じくタネンバウムの
「コンピュータネットワーク第4版」
がおすすめ。この本も新たしい版が出るのが待ち遠しい。

投稿日時 - 2010-11-18 22:52:35

ANo.3

>入門書はその部分を曖昧にしてると思うんですよね。
入門書を読んでいる人間にそんな事を書いても理解できないから

>「API」がどういう仕組みでどういう役割を持ち具体的にどう使えばいいのかを知りたいわけなんですよ。
C言語の場合は汎用的な解説書にはC言語の標準に乗っ取った事が書かれているのが当たり前。
各OSに特化した解説書を読みましょう。
Windowsの場合はMSDNを利用してWin32APIを調べましょう。

投稿日時 - 2010-11-18 22:47:47

ANo.2

最初の質問に関しては次の本を

「コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版」

ヘネシー&パターソンの本といえば、これです。
定番中の定番ですので、計算機っつうもの本質から説明しています。
こいつを読むのは、コンピュータを「なんか分からんけど、いろんなことができる小人さんの家」から
論理的な機械として認識できるようにはしてくれるとは思います。

実際、機械の仕組みなんて知らん人も多いのが現実ですから。

次の質問に関しても、上記の書籍で答えがあると思います。
アセンブラでレジスタを叩いて通信をしたりとかいう世界なら
面倒くさい代わりに、ある意味わかりやすいのですが、面倒くさい部分を
肩代わりする形で、「OS」つうもので抽象化されてますからね。

投稿日時 - 2010-11-18 19:26:45

ANo.1

そうですねえ・・・
古典ですが、マイヤー著の「ソフトウェアの複合/構造化設計」は面白いかも
しれません。

何が言いたいかというと、プログラムとは大きすぎて一度に考えられる量で
は無い、と言う前提で設計に関する考え方がまとめられています。
そして、プログラミングに付いて重要な抽象化という概念を学ぶことになる
でしょう。抽象化の概念は非常に重要で、システム設計では欠かせません。
抽象化が分かれば具体化とはなんぞやも理解できると思います。

「ソフトウェアの複合/構造化設計」の時代には解決出来なかった問題が、
数年後に登場する「オブジェクト指向」で解決します。
手段だけを学ぶのは辛いです。何故その手段が生まれたかという必然性と
なる「問題」を知ることが重要でしょう。

「システム」という言葉も辞書的にどういうものかを言えて、それに肉付け
出来るようになると多くのことが理解できるようになるでしょう。

なお、OSはソフトウェアの最たるもので、ハードウェアの管理はもとより
アプリケーションの管理もします。つまりコンピュータの中核をなすもので
すね。

どのようにハードと繋がっているか、これは制御権の制御です。OSの仕事です。
制御権、言い換えればCPUや他の機器に命令を出して働かせる権限です。
OS自体も狭く見る見方と広く観る見方があります。
インターネットを実現しているのは、TCP/IPというプロトコルです。
これをOSの一部としてみる広い見方があります。
ブラウザはこれらのプロトコルを利用するアプリケーションとなります。
もっともTCP/IPの上にhttpがあり、ブラウザが直接扱うのはhttpの方です。
http、mail、ftpなどがTCP/IPの上に乗かっているわけです。

これらは1つ1つ学ぶしか無いと思います。最初は手だけでゾウを撫でるみた
いに、実態が掴みにくいかもしれませんが、知識を増やし、多くの概念を
身につけるに従って全体像がおぼろげに見えてくるでしょう。

投稿日時 - 2010-11-18 19:08:07

あなたにオススメの質問