
こんにちは。
僕は今C言語を独学してる大学生ですがプログラミングに関してわからないことがあります。
まず、プログラミングの入門書には主にその言語の文法の解説だけしか載ってませんよね。
しかし実用的なソフトウェアを作るには文法以外にも大事な概念とか機能がありますよね?(実装とか組み込みとかライブラリとかフレームワークとかAPIとか.NETとかexeとか)
入門書はその部分を曖昧にしてると思うんですよね。
例えば「APIはOSとアプリケーションを繋ぐ窓口」とかいう感じで。
僕は「API」がどういう仕組みでどういう役割を持ち具体的にどう使えばいいのかを知りたいわけなんですよ。
この詳しい解説はいったいどんな本に載ってるんでしょうか?
次にソフトウェアって、僕の考え方が正しいかわかりませんが、他の色んな部分に繋がっていますよね。
例えばブラウザは「ネットワーク」に、OSは「ハードウェア」に。
その「連結部分」がいったいどういう仕組みで何が支配してるんでしょうか?
もちろんネットワークもハードウェアも仕組みが違うことはわかりますが、「Hello,World!」と表示する道具をどう弄れば「連結部分」となり得るのでしょうか?
以上の二つが僕が疑問に思ったことです。
文才が無くてすみません。
僕自身何がわからないのかわからないので。
つまり、作りたいモノがあっても「プログラミング」という一つのカテゴリーが大きすぎてどうやればいいかわからないということです。
ちなみに僕は人工生命のシミュレーションソフトを作ってみたいんですが、Linuxとかを弄ってみたいなと思っています。
誰かこの疑問に答えてくれませんか。
こいつのせいでプログラミングをやる意味が見出せずプログラミングに対して恐怖すら覚えるようになってきました。
助けてください。
お願いします。
No.7ベストアンサー
- 回答日時:
>どういう仕組みでどういう役割を持ち
デバイスドライバのことですかね。
APIとはつまり、デバイスドライバへのラッパーがほとんどです。
例えばファイルシステムはこんな感じになっています。
図 1. Linux ファイルシステム・コンポーネントのアーキテクチャー図
http://www.ibm.com/developerworks/jp/linux/libra …
デバイスドライバの多くは機械語(アセンブリ言語)で書かれ、そのデバイスドライバが個々のハードウェアに信号を出します。
そしてデバイスドライバへのアクセスを汎化する為に、OSが標準的なインターフェースを提供します。
そのインターフェースを更にラッピングする形で、私たちが普段目にするC言語の標準関数などが実装されます。
こういった階層を経ることで、OSが変わってもC言語の標準関数はそのまま使えるわけです。
簡単にはこんな流れですね。
参考になれば幸いです。
No.6
- 回答日時:
「API」の役割と具体的な使い方は「リファレンス」と呼ばれるドキュメントを読めばよいでしょう。
どういう仕組かは、そもそも内部的な動作を考えなくていいようにAPIが存在しているわけで、それを知りたければAPIのソースをみるのが一番です。
「連結部分」ですが、突き詰めると0と1の電気信号で成り立っています。
これが回線を伝わることによって、通信が行われますし、メモリ上に存在することで記憶されます。
Hello, World!も画面を構成する点(dot)で表現されていて、その点はグラフィックボード上のメモリの状態を反映させているもので、最終的には0/1の信号になります。
プログラミングするうえでハードウェアの仕組みを知っていると役に立つこともありますが、それを知らないとプログラミングできないわけではないですし、それを突き詰めるのは別なお話かと思います。
最近は、APIやフレームワークが充実しているので、ある程度ブラックボックスとして利用するのもありかと思います。
No.5
- 回答日時:
まぁ、今はとにかく規模が大きいので大変ですけど、基本的ににはそんなに難しいことをやっているわけではないんですけどね。
2進法な世界で、プログラムを読み、データを読み、ごく基本的な演算(ANDやOR、加減算)を行って、演算結果を書く。
コンピュータなんて所詮はこれだけのことを延々と高速に繰り返しているだけです。
最初は本当にごく単純なものでしたけど、「あれもこれも・・」という具合にどんどん肥大化するにしたがって独りのプログラマが全部面倒をみるのはとても大変なことになってきてしまったので、何とか楽をさせてあげようということで、いろいろな工夫が行われてきたわけですね。
C言語などの高水準言語はCPUが読み込むプログラムがややこしくなってきたので、より人間様にとって分かりやすい表現をしようっていうものです。
APIなんていうのは「そんな細かいところまでチマチマと毎回同じようなものを書くのは大変だから、ある程度共通に使えるようにしようよ」ということでどこかの誰かさんがあらかじめ作ったプログラムで、「皆、これを使ってくださいな」としたというものです。
この「どこかの誰かさん」が作ったプログラムが、質問者さんの言うところの「連結部分」というやつですね。昔はその連結部分も単純だったんですが、これまたいろいろと「サービス良く」してやろうとしてきた中でどんどん大きくなってしまって、物によってはそこだけで一冊本が出来るほどになっていますから、全部把握するのはなかなか大変ですね。
このあたりは、全体を把握しやすい、もっと規模の小さいマイコン(ワンチップマイコンなどが良いかなぁ?)でアセンブラでプログラムを組んでみるあたりからやってみると、「あぁ、なるほど」と思えてくると思いますよ。
No.4
- 回答日時:
定番のヘネシー&パターソンさんの本は、専門分野としてマイコンを扱う技術者にとってはバイブルです。
そういう意味で「定番」です。計算機という概念を俯瞰的に理解するという点で、個人的なおすすめは、次の本です。
「構造化コンピュータ構成 第4版―デジタルロジックからアセンブリ言語まで」
アンドリュー・S. タネンバウム (著)
悪く言うと、さまざまな話題が「広く浅く」書かれている本なのですが、
ハードウェアからOSまで、「なぜそのような仕掛けになっているのか」の
本質が押さえられているため、計算機そのものに対する理解が深められます。
また、ネットワークについて学びたいなら、同じくタネンバウムの
「コンピュータネットワーク第4版」
がおすすめ。この本も新たしい版が出るのが待ち遠しい。
No.3
- 回答日時:
>入門書はその部分を曖昧にしてると思うんですよね。
入門書を読んでいる人間にそんな事を書いても理解できないから
>「API」がどういう仕組みでどういう役割を持ち具体的にどう使えばいいのかを知りたいわけなんですよ。
C言語の場合は汎用的な解説書にはC言語の標準に乗っ取った事が書かれているのが当たり前。
各OSに特化した解説書を読みましょう。
Windowsの場合はMSDNを利用してWin32APIを調べましょう。
No.2
- 回答日時:
最初の質問に関しては次の本を
「コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版」
ヘネシー&パターソンの本といえば、これです。
定番中の定番ですので、計算機っつうもの本質から説明しています。
こいつを読むのは、コンピュータを「なんか分からんけど、いろんなことができる小人さんの家」から
論理的な機械として認識できるようにはしてくれるとは思います。
実際、機械の仕組みなんて知らん人も多いのが現実ですから。
次の質問に関しても、上記の書籍で答えがあると思います。
アセンブラでレジスタを叩いて通信をしたりとかいう世界なら
面倒くさい代わりに、ある意味わかりやすいのですが、面倒くさい部分を
肩代わりする形で、「OS」つうもので抽象化されてますからね。
No.1
- 回答日時:
そうですねえ・・・
古典ですが、マイヤー著の「ソフトウェアの複合/構造化設計」は面白いかも
しれません。
何が言いたいかというと、プログラムとは大きすぎて一度に考えられる量で
は無い、と言う前提で設計に関する考え方がまとめられています。
そして、プログラミングに付いて重要な抽象化という概念を学ぶことになる
でしょう。抽象化の概念は非常に重要で、システム設計では欠かせません。
抽象化が分かれば具体化とはなんぞやも理解できると思います。
「ソフトウェアの複合/構造化設計」の時代には解決出来なかった問題が、
数年後に登場する「オブジェクト指向」で解決します。
手段だけを学ぶのは辛いです。何故その手段が生まれたかという必然性と
なる「問題」を知ることが重要でしょう。
「システム」という言葉も辞書的にどういうものかを言えて、それに肉付け
出来るようになると多くのことが理解できるようになるでしょう。
なお、OSはソフトウェアの最たるもので、ハードウェアの管理はもとより
アプリケーションの管理もします。つまりコンピュータの中核をなすもので
すね。
どのようにハードと繋がっているか、これは制御権の制御です。OSの仕事です。
制御権、言い換えればCPUや他の機器に命令を出して働かせる権限です。
OS自体も狭く見る見方と広く観る見方があります。
インターネットを実現しているのは、TCP/IPというプロトコルです。
これをOSの一部としてみる広い見方があります。
ブラウザはこれらのプロトコルを利用するアプリケーションとなります。
もっともTCP/IPの上にhttpがあり、ブラウザが直接扱うのはhttpの方です。
http、mail、ftpなどがTCP/IPの上に乗かっているわけです。
これらは1つ1つ学ぶしか無いと思います。最初は手だけでゾウを撫でるみた
いに、実態が掴みにくいかもしれませんが、知識を増やし、多くの概念を
身につけるに従って全体像がおぼろげに見えてくるでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
in_addrのs_addr?
-
DirectX9 の学習法
-
RS232Cの制御について詳しく書...
-
VB と VC++ と VC#の違いは?
-
String^の^自体が何を意味して...
-
PostScript言語について
-
C言語について。
-
Windows Media Playerを開くと...
-
Excel2003 VBE 参照設定を解除...
-
静的ライブラリから静的ライブ...
-
本格的なGUIを作るのにおすすめ...
-
論理的思考の身につけ方 プログ...
-
ライブラリ作成時のグローバル...
-
色空間YCCKのJPEG画像
-
画像のBease64へのエンコ...
-
declaration of 'index' shadow...
-
文字列探索アルゴリズム(Aho Co...
-
C# EXCELセルの入力規則設定に...
-
boostのアンインストールについて
-
C/C++のRSSパーサ(ライブラリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ヤフー知恵袋みたいなサイトを...
-
C/C++でHTMLソースの取得はでき...
-
Qtを勉強するのに何か良い書籍...
-
[ADO]と[ADO.NET]の違い
-
IPアドレス、サブネットマスク...
-
C言語本 Windows10対応 お...
-
大阪梅田でプログラミング関係...
-
C言語の学習について
-
ドライバ開発の勉強方法を教え...
-
さっぱりわからない
-
HTML CSSの勉強のポートフォリ...
-
コマンドプロンプトのコマンド...
-
ラジオボタンについて
-
MSP430のプログラム学習
-
C++でのロボットのプログラミン...
-
C++導入または入門書として
-
c++のお勧めの入門書
-
WEBブラウザを作りたい。
-
秀和システムのPythonプログラ...
-
eclipseで関数printfを解決でき...
おすすめ情報