C言語を学びたいと思います。
ですが現状ではCやC++等の区別もあまりついてません。
目標はVB等のようにランタイムなどを使用せず単体で動作する
ネットワークツールなどを作る事を目標としております。
現在私が使えるのはHTML、Perl、PHP、VBをそれぞれ少しずつ使える程度です。
このような私が目標を達するためにお勧めの書籍やサイト、また学習方法などあれば教えて下さい。
id:quocard さん、こんばんは。
私はプログラミングをしませんが、 YukiWiki などの使い勝手の良さから、結城浩さんのサイトに親近感を覚えています。Java,Perl,Cと、情報も充実しているのも魅力かと思います。
http://www.hyuki.com/lc/lcvoice.html
上記書籍のページと、読者の声を紹介させていただきます。少しでもお役に立てば幸いです。
HSP(Hot Soup Processor)はいかがでしょうか。
比較的簡単にプログラミングが出来て参考書籍も豊富に御座います。
ありがとうございます。
こちらも考慮したのですがやはり昔からあるようなもので
基礎を固めたいと思っております。
Programming UNIX Socket FAQ (日本語訳)
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
SOCKETプログラミング
http://www.ops.dti.ne.jp/~allergy/socket/socket.html
こんな所が参考になるのではないでしょうか。
でもネットワークツールを作るのならRubyもお勧めですよ。
例えば以下だけでURL先を読んだりできます。同じことをCで組んだら凄いことになります。
require 'open-uri'
open("http://yahoo.co.jp"){|f|
puts f.read
}
ありがとうございます。
Rubyもやろうかとおもっていたのですが、スタンドアロンで動くかというと
少々難しい面もあるのでC言語というものにしました。
まだRuby自体をあまり理解していないのでひょっとしたら解釈がまちがっているかもしれませんが
回答ありがとうございました。
Cプログラミング診断室
http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html#mokuji8
この辺の内容が分かるようになればC言語は理解してると思われます。
---------------
文面からは、Windows系のプログラムだと判断したので、
Visual C++の勉強をしたらどうかなと思います。
やっぱり、C言語で書くというのはどうかなと思うので、
C++もやっぱり勉強すべきかも。
-----------------
■C言語によるTCP/IPネットワークプログラミング (単行本)
http://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3...
#UNIX系だとおもいますが・・。
■WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミングのすべて (単行本)
http://www.amazon.co.jp/WinSock2%E3%83%97%E3%83%AD%E3%82%B0%E3%8...
#Windowsなら、Windows Sockets APIあたりと使うと思うので、その系統の本を
ありがとうございます。
参考にさせていただきます。
「HTML、Perl、PHP、VB」はコンピュータはどう動くのか?を知らなくてもなんとなくプログラムが書けちゃう系の言語ですね。(最近はこちらだけでもプログラマは名乗れるようですが。)
対して、C/C++はメモリがどう使われるかなど、「本当のコンピュータの知識」が無いとまともに動くものは書けません。
まずは本当のコンピュータの知識を身につけてください。
「コンピュータはなぜ動くのか」は良い本です。
http://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%...
内容がかぶる部分もありますが、
「プログラムはなぜ動くのか」も読むとよいと思います。
http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%...
ところで目的は「ランタイムを使わない」ってことなのかな?
WindowsだとC++で書いてもMFCを使っちゃうとランタイムが必要ですよ。
学習目的でUNIX系OSであるLinuxを使ってみるのも良いですね。GUI無しで使ってみるといろいろなことが学習できると思います。
Windowsのように洗練されていない(失礼!)ため、素のコンピュータに触れられる機会が多いからです。ネットワークツールで使うSocketはUNIX発祥です。
コンピュータを使っていたつもりが使わされていただけって気づいたらたいしたもんです。
ありがとうございます。
書店でちょくちょく見かける度に気にはなっていたのですが
今度書店に寄ったときに見てみます。
「単体で動作するネットワークツールなどを作る事を目標としております」というのはいいことですね。ぜひ頑張ってほしいものです。
ただ「ランタイムを使用せず」というのがあまり明確ではないですね。
MFCランタイムも使わないと言うことであればいわゆる「Visual C++」は基本的に駄目ですね。MFCが前提なので。
いまどき巷に出回っているVisual C++の本は当たり前のようにMFCしかないんですよね~。
私のように WinMain から直書きしなきゃ気がすまない人は立場が狭いもんです。
このあたりが参考になるかもしれません。
ちょっと見てみましたが細かいところまで結構行き届いていてわかりやすいと思います。
私などは当時この辺にお世話になったもんですが、さすがに10年前の本ですからね。内容的には今でもWindowsXPやVistaでも十分に使える基礎的知識ではありますが、最新のトピックを含んでいませんのであまりお勧めはできません。
すいません。
C言語という部分についてはかなり初心者なものでして
MFC自体もランタイムと言えばランタイムですね。
おおまかな認識で
VBはWindowsにデフォルトでランタイムが入っていないので意識して入れる必要あり
CはMFCというランタイムを使うがたいてい入っているのである程度はスタンドアロンで使える
という勝手な認識でした。
まだまだ初心者なので間違っているかもしれませんが・・・・
C 言語を学ばれるのであれば,林晴比古さんの
新C言語入門 ビギナー編
http://www.amazon.co.jp/%E6%96%B0C%E8%A8%80%E8%AA%9E%E5%85%A5%E9...
をお勧めします。
この本を読まれた後に,同シニア編に進まれるとよいでしょう。
また,別のシリーズとして同じ林晴比古さんが書かれた C++ の本もありますが,
こちらを読まれる前に,C の本を読まれるほうがよいかもしれません。
いろいろな方がC++をやる前にCをやったほうがよいと言われています。
まだCとC++の差もよく理解できていないですが、検討したいと思います。
http://www.kouno.jp/home/c_faq/
C言語を知らず、C++から始めてもよい、という意見もあるんですが、自分はC言語をよく知ることから始めることをお勧めします。他人のC++のソースを読むとき、大抵Cの深い知識が必要になるからです。
プログラミング言語C(書籍)と C言語FAQ(リンクしました) を理解できれば、一通りわかっていると言ってよいと思います。これらは学術的な書かれ方をしていて、わかりにくいという意見もあります。Perlなどが分かるなら、入門書から始めるのは遠回りのように思いますが、個人差があるので色々御自分で試してみて下さい。
「ランタイムなどを使用せず」というのは無理です。C/C++の標準に、ネットワーク系の関数が無いからです。たとえばWindowsなら、Winsockライブラリが使用できるので、それを利用することになります。KUROXさんの回答にある本が良書です。
WindowsプログラミングをCでされるということなら、素直にVisual C++でMFCを使われることをお勧めしますが、個人的にはMFCはオブジェクト指向ライブラリとしてはかなりいびつなものだという印象があります。
私がお勧めするのは、Borlandの「Turbo C++」です。Express版なら無料でダウンロードできます。
http://www.turboexplorer.com/jp/cpp
MFCに相当するVCLというライブラリが使えますが、このライブラリはとても美しいオブジェクト指向構造を持っています。
ただ、作りたいのが「ネットワークツール」とのことですので、まずはgaryoさん、KUROXさんが挙げられているネットワークアプリケーションの知識から入った方が良さそうです。
一度、GUIなしで、コマンドライン上から操作するCUIアプリケーションを作ってみて、そこでネットワーク・プログラミングの基本を覚えるのが結局のところ近道ではないかと思います。GUI周りはそれだけで独特のプログラミングスタイルを学ぶ必要がある(VBの世界とは別世界です)ので、ネットワーク・プログラミングとは分けて学習すべきです。
が、その次にGUIを使ったプログラミングをすることになった際に、MFCか、VCLか、又は他のUNIX系ライブラリか、といった選択をすることになるかと思いますので、安易に開発ツールを選ぶと、後で後悔することになるかもしれません。
まずは良い本を探し、そこで採用されている開発環境からスタートするのも一つの手かと思います。
ありがとうございます。
同じC++でもMicrosoftの出しているものやDelphiなどいろいろあるみたいですね。
どちらで作っても同じものを作れると思うのですが
これらのソフトの違いというのは何になるんでしょうか。
WindowsでC言語の標準関数(mallocなど)を使うとCRT(Cラン
タイムライブラリ)が呼び出されてしまいます。
目標がランタイムを利用しないツールを作ることのようなので、
C言語の関数に対応するWinAPIを学ぶ必要があると思います。
まずはC言語の文法を学び、次にWinAPIを学ぶといったことに
なると思います。
C言語については皆さんが挙げられている本、WinAPIについては
MSDNなどを参考にされるとよいと思います。
また、ネットワークプログラミングでは、UNIX互換API、WinAPIが
利用できますが、やはりWinAPIを利用する必要があります。
KUROXさんが挙げられている「WinSock2プログラミング」が参考に
なると思います。
あと、コンパイル時にCRTがリンクされないようにビルド設定を
工夫する必要があると思います。(私はやったことありませんが・・・)
0からのゲームプログラミング ~ ゲームプログラマーへの第一歩を踏み出そう ~
http://www.plustarnet.com/aspil/Programming/
ネットワーク関連の記述はないですが、
私がC言語を独学するときに参考にしたサイトです。
ゲームプログラミングという題ではありますが、
一般的なC言語の基礎知識がしっかりおさえられていて
文章もわかりやすいので重宝しました。
他の言語との違いを理解しながら基礎を学びたいなら役に立つと思います。
ありがとうございます。
実際にこういった判りやすい題材を作りながら勉強するのは
実際に進んでいるという実感が得られてよいかもしれません。
ゲームというのは非常に興味があるので参考にさせていただきます。
C、C++ともに柴田望洋さんの著書がおすすめです。
プログラミング言語教育のあり方を研究題材にしてらっしゃる大学の先生で、著書の作りは非常に練られています。
「明解C++」、「明解C言語入門編」、「明解C言語実践編」
とはいっても、PerlやVB等の経験は既にお持ちで、しかもネットワークプログラムを作りたいという既に具体的な目標も持っておられるので、先の回答者さんたちがおすすめするようなソケットライブラリの解説書・サンプルプログラムを参考にどんどん手を動かして行けば自然と身に付いていきそうな気がします。チャットソフトとかFTPもどきが題材としておすすめです。
C、C++で一番難解だと皆さんが口をそろえて言うポインタ操作もおそれずはじめはメモリリークを起こしまくるようなプログラムをどんどん書いていけばいいと思います。そのうち、何かがおかしいと気づき始め、C言語の解説書を手にとって詳細なポインタ操作の文法の理解をしなければならなくはずです。
そして、ポインタ操作関連の文法を重箱の隅を突っつくぐらいに極めたら、結局ポインタ操作っていろいろできるけど、普段のプログラムでは数種類のイディオム(慣用表現)しか使わないもんだなって気づくようになります。そこまで達したら、おそらくC言語プログラマーとしてはかなりのレベルになってると思います。
ポインタ操作関連専用の書籍もあるので、ポインタ理解に行き詰まったら、そちらも参考になれることをおすすめします。
「C言語 ポインタ完全制覇」前橋 和弥著
言語なんて基本的にはどれも一緒ですので、
それだけの言語を読めるのであれば、
http://code.google.com/intl/ja/
で、やりたい事やってるソースを読むのが良いでしょう。
コンピュータの気持ちが分からない人であれば、
ポインタ、メモリアロケーションのことなんかは、
事前になんらかの情報を掴んでおいた方が良いかも知れませんが。
ところで、ネットワークツールと言うのが何かが分からないのですが、
ソケット通信で作るクライアント?
ポートを監視して待ってるdaemon?
いずれにせよある程度のものならば、
Perlでイケちゃうんじゃないかと思います。
むしろ性能的にクリティカルな何か、
とか、コンピュータネイティブな何か、
とか、じゃないのにC言語を使うと言うのは、
色々面倒くさいし、取り扱い注意な代物なので、
僕的にはマゾい感じなのでオススメできかねますが・・・
(C言語は好んで使わない人なので・・・)
最終目標とはずれますが、オススメの書籍としては、
以下のものを挙げておきます。
CODE READING
個人的にはWindowsで使うものを作るならばVisual Studioを使って作るほうがいいかと、
今のところ 英語版Visual Studio2008は完成しているようですが、日本語版はベータバージョンか2005しかありません。
最新情報 -> Visual Studio ホームページ
無料版は -> Visual Studio 2005 Express Edition
ただ、Visual C++ Express2005のみではネイティブなGUIアプリは作れません。(.NET2.0を使ったアプリなら出来ますが)
もしGUIアプリを作りたいのであればPlatform SDKをインストールするか、Standard Editionを買うしかなありません。
詳しくは -> Visual Studio 2005 Express Editions: Visual C++ 2005 Express Edition と Microsoft Platform SDK を一緒に使う
他には、Cygwin+Eclipse C/C++ Development Tooling - CDTを使ってみるとか・・・
Eclipseは本来Javaの開発環境ですがCDTがあればCのプログラムも組めます。
ただ、Eclipseは、Javaの仮想マシン上で動くので、Java入れないと動きません。
当然ですがCで書いたアプリケーションはコンパイルすればJava無くても動きます。
参考になりそうな物としては、既に紹介されてますが、林晴比古さんの本で『新C言語入門 ビギナー編』『新C言語入門 シニア編』、
あと、猫でもわかるプログラミングなんかはどうでしょう。
ネットワークに関しては、ちょっと詳しくないのでなんともいえません。
さらに詳しいことを知りたくなったら、MSDNやネット上を検索すればかなりの情報が出てきます。
もし、どうしてもC言語をということでなければですが、VB少し使えるということなので、ActiveBasicという選択肢もあるかと、ActiveBasicはBasicなのにネイティブアプリケーションが作れてしまうという代物です。Windows API使って開発できるらしです。(自分は使ったことですが・・・
今のところ ActiveBasic5.0は開発中らしいので、実用向きでは無い気がしますが、前のActiveBasic4.xもダウンロードできるので、そちらを使って見るのも手かと
activebasic.com - ActiveBasic公式サイト
ここからは私的な意見ですが、
最近Windowsはネイティブアプリというより、.NETな感じがします。Vistaには.NET3.0が標準で搭載されてるらしいので、.NETアプリケーションでもそのまま使えるようにようですし。.NETであればメモリリークの心配もありませんし、(絶対ではないらしい?
参考
まだ勉強はじめたばかりですがこの方の名前はよく拝見します。
参考にさせていただきます。