雑記内検索 / 「プログラミングする、ということ3:統合開発環境」で検索した結果
-
プログラミングする、ということ3:統合開発環境
統合開発環境ってありますよね。VC++とか。 あれって、あんまり好きじゃないんですよね。 ほんのちょっとしたプログラム書くときにも、最初にプロジェクト登録して、設定して。。正直うざい。VC++のコンパイラってやたらオプション多いし、いちいちMakefile書かなくていいからwindows用のプログラム書くなら統合開発環境もいいのかもしれないけど。 でも、テスト用のプログラムなんかはテキストエディタでソース書いて、コマンドラインからさくっとコンパイルしてしまいたい。 それに、ある環境に慣れすぎてしまうと他の環境で作業が行いにくくなってしまう。だいたい、初心者に対してやさしくない。 「C言語の勉強をしよう」と思ってVC++買ってきて、「プロジェクトの新規作成」とか言われてわけのわからない設定をさせられたら、きっと彼は実際にプログラミングに到達する以前に... -
プログラムを書くということ
プログラミング、というのは難しいイメージがありますが、CPUにできることなんてたかが知れてる。 ①転送 ある領域からデータを読み出す 書き込む コピーする ②演算 四則演算(掛け算割り算ができない奴もいる) ビット演算 ③処理分岐 ジャンプ ループ サブルーチンコール・リターン 極端に言って、これだけ。 皆さんのPCも、PS2も、ケータイも、そのほか中にコンピュータの入ってるもの全て、その制御の中心となるCPUなりが処理できるのはこの3種類。 信じられますか? その意味ではちゃんとプログラムが書ける、という能力は「C言語できます」とか「Javaできます」とか言うことじゃない。言語が何であれ、それを習得しているかどうかはクリティカルな問題じゃない。 ・・・だって、結局どの... -
メニュー
トップページ 本棚 両手で1000まで数えられますか?:2進法の話 数値 - 危険物取り扱い注意 100 × 200 =32?:変数のオーバーフローの話 パリティビット 小数の扱いについて ぽいんた ぽいんた2 ぽいんた3 ジ・オリジン ジ・オリジン:補足 かっこつける話 かっこつける話2 文字列のこと タイミングの話 拡張性の話 取り込む話 staticな話 コンパイルの話1 コンパイルの話2:止まらぬビルド コンパイルの話3:マシン語に落ちるということ1:メモリの話 コンパイルの話4:マシン語に落ちるということ2:最適化 コンパイルの話5:マシン語に落ちるということ3:変数とスタック コンパイルの話6:コンパイラはそもそも何をやってくれるのか?? リンクの話 プリプロセッサの話 OS、というもの オ... -
エディタの話
プログラミングする時、エディタは何を使っていますか? 統合開発環境でしょうか?Mifesなど市販のエディタ? それとも、秀丸などのオンラインソフトでしょうか? 「別に何を使ってもいいじゃん」とか、 「とりあえずVC++」とか言う人も多いかと思います。が。 確かに、VC++のエディタは構造体やクラスのメンバを プルダウンから選べたり、関数コールの際に引数を 表示してくれたりと便利な面もありますが。 どうにも、重いです。。 しかも、ちょっとしたお試しプログラムを書きたいだけでも プロジェクト作んないといけないし。 なので、私の場合は主に秀丸エディタを使用しています。 VC++でも外部ツールとして登録して、VC++でのカーソル行と 同じ位置で開けるようにショートカットキーを登録しています。 いくつかエ... -
プログラムを学ぶということの補足
素朴に、疑問に思うことがあるわけです。 私は大学も文系で、大学で手からもおよそ技術とはかけ離れた仕事に従事していたりしました。 偉そうかつ生意気な言い方になってしまうでしょうが、そんな私ですら、とりあえず今まで日記と称して垂れ流してきたあたりの知識は身につくわけです。 実際、業務としてC言語を扱うようになってから1年もたってないです。 その前にOS無し8bitマイコン&アセンブラで基礎的なことはひととおり実装を経験しているのですが。 でも、それを入れてもほぼ1年と2ヶ月。それだけの期間があれば、単純にC言語の文法がどうとかいうレベルではなくて、実際にマシン語に落ちたときにどうなるか、なんてこともある程度まともに理解できるということです。 やっぱり偉そうかつ生意気な言い方に聞こえてしまうんでしょうが、私の言いたいのは「だから私は賢い... -
OS、というもの
普段何気なく使っているOSというソフトウェアについて。 OSとは、Operation/Operating Systemの略なわけだけど、じゃあそれはいったい何をするものでしょう? OSの、もっとも重要な役目とは? こんな風なことを聞かれて、即答できる方はあまりいないのではないでしょうか。 ちょっと詳しい人に聞くと ①ファイルの管理 ②メモリの管理 ③ユーザインターフェースの提供 ④各種ドライバ(周辺機器)の管理 あたりの答えから返ってくるのではないかと思います。 ですが。 OSの最も重要な役割は、上記の中にはありません。 それは、「時間」の管理ということです。 最近のPC、また少し高機能な家電製品などのなかでは、同時並行的に多くのタスクが走っています。 これらのタスクを管理し、「時間」というリソースを割り当てる役割、また... -
お仕事プログラミング
趣味でやるプログラミングと違って、お仕事にしてしまうといろいろと制限も出てくる。 そのなかで、割と軽視されている(少なくとも今の職場では)のが設計書とコーディング規約。これはホントに環境によると思うんだけど。 というわけで今日はコーディング規約のお話。 お仕事のプログラムに求められるのは、まず第一に仕様書どおりに動くこと。趣味の範囲ならそこまででもかまわないんだろうけど、その次にそのソフトウェア資産を次回新機種に使ったり、機能拡張をしたりとメンテナンスする必要がある。 しかも、最初にコーディングした人がメンテするとは限らない(むしろまれ)。頼りは、設計書とソースコード、およびソース内のコメントだけ。 そのため、設計書の精度とソースコードの可読性というものが非常に重要となる。前に言ったコーディングスタイルの統一も個人レベルだと有効だけれどそれが人によっ... -
オブジェクト指向1
オブジェクト指向、というプログラミングパラダイムが現れて久しいわけですが、いまだに「オブジェクト指向」って根付いていない気がするんですよね。 JavaやC++/C#が使えたらオブジェクト指向でプログラミング出来ているか、というとそうでもないし。それらの言語はオブジェクト指向な「書き方が出来る」言語であって、それらを使えば自動的にオブジェクト指向のプログラミングが出来るわけではないし、逆にC言語やアセンブラではオブジェクト指向プログラミングが出来ないかといわれると、そうでもないと思うのです。 「オブジェクト指向」とは、あくまで、プログラミングパラダイムの一種だ、ということです。 オブジェクト指向というのがどういう考え方か、なんていうのは世にいろんな本が出ているわけで、いまさらここで私が述べるべきことってないと思います。ただ私がひとつだけいえるのはあくまでそれはプログラ... -
タイミングの話
というわけで(どういうわけだか)タイミングの話。 趣味などで一人でプログラミングしていたりすると、なかなか判りづらいかも知れない。 マルチスレッドあるいはマルチタスク環境においてプログラミングする場合、同時並行的にいくつもの処理が走るため、同期というものに気を使う必要性が出てくる。 特に、システムの起動と終了のタイミングはシビア。 例えばファイル管理タスクが先に落ちた後で他のタスクがファイルを読み書きしたいと思うと、そこで処理ができなくてフリーズする。通信タスクが初期化完了する前に通信を行おうと思うと待たされ、その間他のタスクやシステムへの応答ができなくなる。 Windowsみたいにマウスが砂時計になっても許してもらえる環境ならそれでもいい(でもできたらやめてほしい・・・)けど、組み込みの場合はかなり致命傷である。家電で、「しばらくお待ちください」な... -
本を読むということ:2
本の読み方(特に技術書)について。 技術書(たとえばプログラミング本)を読むときは、たいてい技術を身につけるために読むわけですが。 漫然と読んでいても、やっぱり頭には入りません。やっぱり、読む「コツ」ってあると思うんです。 それは人それぞれだと思いますが、私の場合の話。 私の場合は、わかるかわからないかにかかわらず、とりあえず一気に最後まで目を通してしまいます。途中でわからないことがあっても、戻って見直したりはあまりしません。 とりあえず最後まで目を通してしまうことで、全体の雰囲気というか、つかみ所をつかんでしまうことができます。その後で理解が不十分だと感じたならば、再びその該当部分だけ読み直します。 こうすることで、最初に読んでわからなかった箇所も、割とすんなり理解できるようになることが多いです。 これは、本を書いている人は「わか... -
コンパイルの話4:マシン語に落ちるということ2:最適化
コンパイラには「最適化」という機能がある。 最近のコンパイラはこの最適化機能が優れているので、下手にアセンブラでプログラミングするよりもC言語あたりで書いたプログラムをコンパイルしたものの方が良かったりする。 石の方の命令系統も、最近のはC言語でコンパイルされることを前提に作られていたりするし。 いまどき、アセンブラが必要な場面ってどうしてもC言語などで表現できない(あるいはしにくい)局面でしかほとんど使用されていないのではないだろうか。 じゃあコンパイラの最適化って、どんなことをしてくれるのか? 大まかに言って、 ①静的な演算 ②無駄な処理の省略 と言う感じ。他にもあるけど。 具体的にどんなのっていうのは、 ①の場合、例えば unsigned int iHoge; iHoge = 100*100; なんてあった場合にいちい... -
質問をするということ
今週(2月1日)から、うちの部署に新人が来ているわけです。 私が、2月末で現作業から離れるので、その代替人員なのですが。。 昨日までの三日間をstudyとして、資料を読んでもらったりターゲットマシンに触ってもらったりしているのですが、ぜんぜん質問が無いんですよね。 こちらから、「何かわからないところはない?」とつついて見ても、特に無いという。 それが本当なら、実に優秀なわけだけど。 つか、あんなわかりにくくてかつ細部では矛盾しまくった資料の山をみて質問が無いはずが無い。 自分が何を(あるいはどこを)わかっていないのかがわかっていないと、誰かに質問するということはできない。 ということは、彼はまだ「わかっていない」ということなのでしょう。 であれば、「まだ具体的には質問できる段階ではない」といってくれるなら、資料について解説... -
ソースファイルの話
ちいさなプログラムを書いているときには気にもならないし特に問題にもならないけど、だんだんプログラムが大きくなってくるとソースファイルを分割する、ということを行うと思います。 その際に、ただ単純に分ければいい、というものではないことはまあ誰でもわかると思うんです。だいたいは、機能別(C++なんかではクラス単位)に、わけるんじゃないでしょうか? 例えばあるプログラムにファイル処理を行う関数郡と画面の入出力を行う関数郡があったばあい、ソースファイルは 【プログラムのメイン処理を記述したソースファイル】 【ファイル処理用のソースファイル】 【画面の入出力用のソースファイル】 ぐらいに分割すると思います。 その際に、例えばファイルの処理にしてもソースファイル内でサブ関数的な使い方をする関数とメインの処理などからコールされる関数の2種類があるわけです。 ここまで... -
VisualStudio2005
話題の(?)Microsoft Visual Studio 2005のExpress Editonを入れてみました。年末に何やってんだか俺orz とりあえず、Visual C++ 2005のExpress Editionから入れてみて使ってみたんですが、これでタダなんだからいい世の中になりました。ホント。 同じものが書籍つきだと4,800円だけど、ネットにいくらでも使い方あるわけで。 ・・・isoイメージのダウンロードに死ぬほど時間がかかったけど・・・。 使ってみた感想としては、まずPlatformSDKが入っていないのが気に入らない。別途ダウンロードしてインストールして、VC2005の設定をいじってやる必要があるのが、面倒。他のEditionでは入ってるみたいだけど、 まあタダなので善し。 それにしてもVC2005の公式サイトの説明がうそば... -
Cという言語
C言語の売りというか、よく言われているうたい文句のひとつに、「移植性が高い」というのがある。 嘘っぱちである。 C言語なんてアセンブラが皮をかぶったようなもので、その気になれば(ならなくても)とてつもなく環境に依存したプログラムが出来上がる。 移植性が高いのは、モジュールである。正しく言い直せば、「その気になってやれば移植性の高いモジュールを作ることができる」というのがいいだろうか。 特に下回りのプログラムなどは、I/Oなどターゲットによって異なるし、そうでなくても例えばビッグエンディアンのCPUとリトルエンディアンのCPUではバイトオーダーが異なるわけで、バイト単位でしかデータを扱わないならともかく、そうでないならそれだけでたちまち移植性の悪いソースコードが出来上がる。 また、ターゲットにもよるけど下回りの環境って「標準入出力」がない場合もある。O... -
オブジェクト指向:2
グダグダ言っていてもしょうがないので、まじめにオブジェクト指向なお話。 オブジェクト指向の使いどころと学び方について。 オブジェクト指向とは、従来の構造化言語(C言語など)と異なって、「オブジェクト」という単位で考えよう、ということだ。 なんて簡単に済ませてしまうと怒られそう。。 でも、オブジェクト指向の話なんて、本屋に言ったらいっぱいあるから、あえてここで私が述べる必要のあることってあまりない。ほんとに。 ただ、「オブジェクト指向」というパラダイムと「オブジェクト指向言語」と「UML」は、区別したほうがいいと思う。どうも、ごっちゃになっている(あるいは故意にごっちゃにしている)本が多いような。。 前にも書いたけど、C言語でだってアセンブラでだってオブジェクト指向なプログラミングはできる。 JavaやC++は、オブジェクト指向でプロ... -
Do It Yourself!
開発の仕事をしている人でも、そうでない人でも、プログラミングを趣味として行っている人がいます。私もそうだけど。。 仕事でもないのにわざわざ勉強して、楽しいか、と言われると、これが楽しい。 プログラムって、動くんですよね。当たり前なんですが。自分が作ったものが、動く。工作の延長としての、楽しさがあると思います。 また、同じ動きを実現するにも、実にいろいろな方法があります。それがパズルを解くようで、わりと熱中してしまいます。 悩んだ末に問題が解決して、見事目的の動作を達成したときの快感は、ちょっと他では味わえないかもしれません。 しかも、比較的安価な趣味でもありますし(笑)BCCやGCCなんてただで手に入っちゃう。 普段何気なく使っているWindowsのプログラムなんかも、プログラミングの勉強をしてみるとどうやって機能を実現しているかがわかってくるのも... -
エレガントなプログラム
知らない人たちから見るとプログラマって言うのはなんかわけ判らんことをごちゃごちゃやってる人たちって言う印象あるのではなかろうか。 多少知っている人から見ても、複雑な処理をやってるプログラムを見たら、やっぱりプログラミングって難しいとか、思っちゃいそう。 私もそんな印象を持っていたクチなんですがね。仕事としてやってみて、いろいろな人のソースコードに触れる機会があってそうではないことに気付きました。 判っている人のソースって、仕方のない場合を除いて極力ロジックに頼らない設計になってるんですよね。関数の機能ごとの分け方も上手いし、テーブルの使い方も上手。それらを上手く組み合わせて汎用性があってかつシンプルなコードになってるんです。 だから、全体の見通しもいいし、不具合が入り込みにくい。もし不具合があっても対応がしやすい。 テーブル等を使うことで汎用的な作りに... -
本を読むということ
本を読む、ということは有益なことだ。たとえそれが娯楽小説のようなものでも。 友人とのメールのやり取りの中で、改めてそんなことを考える機会があったので、書いておく。 読んだ覚える必要はない。本を読んで、あるいは物語に触れて、またあるいは知らない知識に触れる。 そのことによって、例え内容は読み終えた瞬間に忘れてしまったとしても、何かがかわるはず。 本によってはちょっぴりかも知れないし、大きく影響のあることもあるかも知れない。 本を読むと言うのはそういうことだと思う。 ストーリーやらなんやらを覚えていなくても、 本の中で喜んだり悲しんだり感動したりすることって、 絶対読み終わったあとも何らかの形で心の中に残ると思う。 本は、賢くなるために読むんじゃなくて豊かになるために読むんだと思う。 生きてく上で役に立つことってい... -
神が死んだということ
哲学者ニーチェの『ツアラトゥストラかく語りき』冒頭にて「神は死んだ」と語られる。 神が死んだというのはどういうことか? 「神」という概念は、人間によって生み出されたものである。 それは最初自然現象や民族の成り立ちを説明付けるために考え出され、のちには政治的な権威や道徳の基準として発展していった。 しかし、「科学」の進歩に伴って「神話」ではなく「科学」によって自然が説明付けられ始めることによって、神話によって同時に説明されていた「道徳」もまた、そこで衰退していくことになる。 「神」という、「基準」が我々のなかから死んだのである。 われわれは、「なぜ人を殺しては行けないのか」という問いに客観的な根拠を持って答えなくてはならなくなったのだ。 あるいは「法律で決まっているから」と答える人もいるだろう。「自分がされたら嫌なことは人にもしてはいけないか... -
「何もしない」 != 「無駄」
たいていのCPUには、「何もしない」ための命令が実装されています。 「No OPeration」ということで通常NOP命令などと言われます。マシン語としてはだいたい0x00h、アセンブラとしてはNOPであらわされることが多いようです。 この命令は、ほんとに何もしないで、実行ファイルのバイナリ領域と実行時のマシンサイクルタイムを消費するだけです。 なぜ、こんな命令が、しかもほとんどのCPUに実装されているのでしょうか? CPUは、通常単体では意味を成しません。基盤にCPUをおいてVccとGNDをつないでも、それはまったく意味が無いただのオブジェにしかなりません。 したがって必然的に、CPUの周りにはさまざまな周辺回路が接続されることになります。 そういったさまざまな周辺回路とCPUの間でデータや制御命令をやり取りすると言うことは、基板上で通信を行っていると言... -
コンパイルの話5:マシン語に落ちるということ3:変数とスタック
C言語では、関数外にグロ-バル変数、関数内にローカル変数を宣言して使用することができます。 また、それらの変数の宣言の際に、staticやconstといった修飾子をつけることができます。 これはC言語にかぎらず、C言語以降の高級言語といわれているものではほとんど実装されている機能です。 これらは、コンパイルされた実行ファイル(マシン語に落とされた状態)ではどのような扱いになっているのでしょうか。 グローバルな変数は、関数にかかわらずそのプログラムが実行されている間はその領域に変更がないため、「ヒープエリア」と呼ばれる領域に確保されます。 コンパイラの実装やOSなどの処理系にも依存しますが、プログラムが実行される時に領域が確保されるわけです。 ローカル変数でstaticをつけて宣言した場合も、グローバル変数と同じ領域に確保されます。この場合もその領... -
抽象的な話
物事を考えるのには、「抽象化」というのは有効な手段だと思うんですよ。 ソフトウェアの開発においても、それはやはり有効だ。設計の初期の段階から、いちいち具体的なことを考えてはいられないし、自分の担当箇所以外の大まかな動きを把握する際に重宝するわけで。 でも、プログラミングの学習の「入り口」としては、いかがなものか、なあんて思うわけです。 たとえば、Windowsのプログラミング。 描画などの処理をDC(デバイスコンテキスト)として抽象化されているおかげで、細かい部分は別として大まかな捉え方としては画面(ウインドウ)に図形を描画するのとプリンタに出力するのを同じように扱えるメリットは大きいとは思います。 だけど、特にプログラミング自体が初心者だったら、抽象化された概念を把握するまでに時間がかかってしまうと思うのですよ。 たとえば、Javaのオ... -
小数の扱いについて
さて、コンピュータでの数値の取り扱いと計算についての注意点をいくつか書いてきたわけですが。 これまでに述べてきた以外にもいくつか、注意しなくてはいけない問題があります。 C言語における変数の型として、まだ述べていないものに [float][double] があります。 これらは【実数型】などと呼ばれ、浮動小数点数を格納できます。 これらの不動小数点数を扱う上で注意しなくてはいけないのは、浮動小数点演算には誤差がつき物である、ということです。 不動小数点数についての詳しい説明は省きますが、 例えば、浮動小数点では「0.1」を正確に表現できません。 コンピュータの内部ではこれまで書いてきたように2進数で数値を表現しています。それは、たとえ浮動少数点数であろうと例外ではありません。 したがって、内部的にはbitの並びでしかない... -
お勉強
勉強って言う言葉は嫌いな言葉でもあり、好きな言葉でもある。 正確に言うと、学生時代のような「勉強」は嫌いだが自発的にするそれは嫌いではない。かつ、その意味で使われるそれは、言葉としては好きである。 ・・・ややこしい? とにかく、「お勉強」のお話。 今日職場の女の子(実装組ではない)が「C言語を勉強したい」と言ってきた。それがきっかけでちょっと、プログラムの「お勉強」というものについて思ったこと。 プログラムができるようになるための学習って、最初の手順が難しいんじゃないかな、と思う。その理由は前に述べたように、例えばC言語ができればプログラミングができるようになるわけではないからだ。 かといって、なにがしかの言語なりが使えない状態でプログラムの勉強をできるわけではないので、まずC言語ならC言語の文法を知った上でロジックなりアルゴリズムなりの学習... -
善悪の彼岸から、力への意思を目覚めさせるということ
この世には絶対的な正義はおろか、善と悪のみならずすべてのことにおいて絶対的な基準が存在しないということになります。 今まで言われてきた善悪とは、そもそも人間の主観から生まれたものであり、それぞれの時代と地域、人の都合によって異なります。 例えば昔の日本においては、敵討ちによる殺人は正当なものでした。無礼打ち、なんていうものもありました。 西欧においても、大航海時代以降植民地の支配において奴隷を使役することは当たり前のことでした。 それらは、それらの時代においては少なくとも「悪」ではなかったわけです。 絶対的な基準が存在するのであれば、なぜ時代や地域によって「善悪」が異なるのか? それは「善悪」という絶対的な基準などというものがそもそも存在しないということの証明となります。 そこで、ニーチェはひとつの問題を提起します。 つまり、... -
100 × 200 =32?:変数のオーバーフローの話
変数には「型」があります。 この「型」って言うのは何なのかというと、 主に値を格納できるサイズの違いです。 C言語の場合、整数型の変数の型としては char、int、short int、long int、long long int がありますね。 (実数型も入れたらdouble、floatなどもありますが) それぞれ、1byte、2byte、4byte、8byteの領域を持っています。 1byteは8bitでした。なので、1byteで256通りの状態を表せるのでした。 ということは、 2byteなら256×256通り、 4byteなら256の4乗通り、 8byteなら256の8乗通りの状態が表せるわけです。 これは逆に言うと、ある型で表せる範囲が限定されているということでもあります。 u... -
データ構造とアルゴリズム
プログラムとは、「データ構造+アルゴリズム」だという言葉があります。 アルゴリズム(ロジック)だけではなく、目的の機能に最適なデータ構造を選択することも重要です。 がんばってがんばって、ロジックをこねくり回して目的の機能を得たとしても、それは処理時間あるいは処理に要するメモリなどのリソースの面でかならずしも最適な処理とはなっていないでしょう。また、後から保守なり拡張なりで手を入れる際にあまりにロジックがひねくれていると修正しにくいものです。 そこで、「データの持ち方」というのが重要になるわけです。 例えばある要素の集合を「データ」として持ちたいとします。 この「データの集まり」をどう扱うかによって、最適な「データの持ち方」を選択するということです。 要素に並び順があり、かつ要素と要素の間に新たな要素を加えたりする場合には、連結リスト構造がいいでし... -
2進法の話
両手で1000まで数えられますか? 正確には0から1023まで。 知っている人には、簡単な問題ですが・・・。 両手をグーにします。これが、「0」の状態。 右手の親指を立てます。これが「1」の状態。 右手の人差し指を立て、親指は戻します。これが、「2」の状態。 つまり、2進法で数えれば、2の10乗、つまり1024通りの状態を表すことができるわけです。 そんなわけで、2進法の話。 コンピュータはご存知のとおり、内部的に2進法で数値を表現しています。なんていうと難しそうですが、単純にスイッチのOn/Offの状態でしかありません。 直流で電圧が5ないしは3.3Vの時が「1」、0Vの時が「0」というわけです。 したがって、つい今しがた述べた表現は正確ではありません。 実際には「2進法でしか数値を表現できない」というのが... -
コンパイルの話:マシン語に落ちるということ
C言語なりなんなりのソースファイルをコンパイルすると、まあ大体マシン語が吐き出される。 その過程において、コンパイラはいろいろ苦労している。前に書いた最適化、なんていうのもそう。 そのほかにも、例えば動的なメモリの確保、なんていうのもそうだ。 メモリは限られたリソースであり、無限に使えるわけじゃない。実行時には最大でもそのPCに乗せてある分しか使えないわけだ。いつ、どのプログラムがどれだけメモリ使うかなんてわからないのに。 なのに、ソースコード上では便利に unsigned char* pHoge; pHoge = malloc((size_t)100); なんてことができちゃう。お気軽お手軽。 こんなことができるのも、OSさんのおかげ。 「ちくしょうまたフリーズかよ」「だからWind○wsは」なんて言っては、いけないのである。 ... -
C言語:「学問」と「実務」
C言語に限ったことではないんですが。 C言語には学問としてのC言語と実用としてのC言語があると思います。 どういうことかというと、 【学問としてのC言語】 ANSI規格への理想的な準拠とみなす アルゴリズムの探求 C言語のみで記述する 【実用としてのC言語】 ANSI規格と合致しているとは限らない まず納期と仕様 場合によってはアセンブラも併用する こんな感じで言いたいことつかんでいただけるでしょうか? 学校なんかで習うC言語は前者だと思います。 入門書なんかのC言語も、そうですね。 しかしながら。 実際、業務においてC言語を使用する場合は後者であることがほとんどです。 実際、現作業で使っているWindRiverのTornado環境では printf( "Hello " "C ... -
アセンブラのこと
最近になってなぜかアセンブラの本が、書店に多くなってきたような気がする。いやアセンブラを学ぼう、っていうのは良いことだとは思うんですけどね、ええ。 でもね、本屋に並んでるアセンブラの本って、本当にアセンブラの勉強の役に立つの??って言うのが正直な感想なんです。 どんな本が並んでいるかというと、まず①アセンブラといいつつPCゲームを改造する本。②80X86およびPentium系CPUのアセンブラの本。③情報処理試験向けCASLの本。④電子工作向けPICやH8アセンブラの本。 番号が若い順に多い。 ①は、論外。 ②は、まあとにかくほとんどのご家庭のPCがWindowsマシンなわけで、プラットフォームは、ある。でもWindowsプログラムをアセンブラで書くっていうのは、少なくともアセンブラ初心者にはオススメできないと思うんですが。 ③は、まあ学習用として... -
コンパイラはそもそも何をやってくれるのか??
C言語などのプログラミングにおいては、「コンパイル」という作業をすることで実行可能なバイナリを生成します。 これをしないと、いくらすばらしいコードを書いたとしても、それは単なるテキストファイルでしかありません。 では、このコンパイルを行ってくれる「コンパイラ」って、正味な話何をやってくれてるんでしょうか?? われわれプログラマがコンパイラに期待していることは、 ①何よりもまず実行可能なバイナリを吐くこと ②できたら「最適化」を行ってより効率のいい処理に置き換えてくれること でしょう。 ②については、以前にも書いてあるのでここでは割愛。 ①について、テキストファイルを読み込んで、それを実行可能なバイナリに変換するには、いったいどういう手順が行われているのかを、ここでは書きたいと思います。 プログラマから「コンパイルしてよ!」と指示を受... -
数値 - 危険物取り扱い注意
コンピュータの中では、数値はすべて2進数で表されるのでした。 そして、負数は最上位bitがOnとなった、2の補数表記で表されるのでした。 では、例えば signed char c; signed int i; c = -1;/* 0xff */ i = c; のようなコードを書いた場合、どうなるのでしょう。 32bit環境ならば、当然intは32bitです。残りの24bitはどうやって埋めるのでしょう? この場合、「符号拡張」が起こります。符号付(signed)な値の場合、より大きな型に代入する際には上位24bit分には代入する数値の符号で埋められます。上の例だと、-1は0xffとなり、符合は1です。したがって、上位24bitが1で埋められ、0xffffffffとなるわけです。 これは32bitの場合での2の補数表記となっており、辻褄が... -
こんなの、常識??
こんなの、常識?? 割とキャリアもあったりする人でも意外なことを知らなかったりすることがある。 C言語におけるオート変数(ローカル変数)は、ほとんどの処理系においてはスタック領域に確保される(というより、スタック領域の一部の領域をその変数として使う)。 それを知らなくても、まあローカル変数が関数を抜けたところで使えなくなるのは常識だと思う。 何が言いたいかというと、未完了復帰のAPIに、結果格納先としてオート変数のポインタを渡すということをする人が結構いるのだ。また、オート変数で馬鹿でかいワーク領域をとったりする人も。 オート変数の領域はは関数を抜けて、別の関数にエントリした時点で次の関数の別のオート変数に割り当てられる。したがって、意図しないタイミングで別のタスクによって変数の中身が書き換えられるということがおこる。 また、(Windoesアプリ... -
リンクの話
プログラムの入門書などを見ても、コンパイラについては結構皆さん意識してるんだけど、リンカについてはあんまり記述がない気がします。 実際、ソースファイルを実行ファイルにするには、「コンパイル」+「リンク」というあわせ技は必須なわけですが、どうにもリンカは影が薄い気がしてしまうのです(笑)。 単体のソースファイルのみでプログラムを書いているときはあまり気になりませんが、複数のソースファイルに分割して書いているならば、多少は意識があると思います。 リンカの役割は、(主にソースファイルごとに作られる)オブジェクトファイルの結合です。 ・・・といってしまうと、ソースファイルから機械語のオブジェクトファイルを作るコンパイラの方が主でリンカは従であるようなイメージを受けてしまうかもしれません。 しかし、そうではないのです。 ソースファイル内... -
コンパイルの話
C言語っていうのは、そのままでは実行することはできない。「コンパイル」という作業が最低限必要である。コンピュータにはテキストで書かれたソースファイルの意味はわからないからだ。 「コンパイル」という作業で行われることは、 ①ソースファイルの解析 ②処理の最適化 ③ターゲットのマシン語命令への変換 が行われる。 注意が必要なのは、処理の最適化が行われることによって、C言語の時点でプログラマが思っているのとは違うコードが吐き出される可能性があるということだ。 例えば、staticなどの宣言をつけてスコープを同一ソースファイル内に限定した関数が、一箇所でしかコールされていない場合にはサブルーチンに分けず呼び出し元に展開したりとか、ループ内での定数同士の演算はループの外に出したりとか。 ただし、このあたりの処理はコンパイラに依存するのでそれを期待しすぎるのは良... -
プリプロセッサの話
コンパイラ、リンカと並んで実行ファイルの生成に重要なのが、プリプロセッサです。 C言語の場合、プログラムをビルドするときに、コンパイラに先立ってソースファイル内の # で始まる「プリプロセッサ命令」を解釈、実行します。 おなじみなのは、やはり #include #define あたりでしょうか。 ほかにも、#defineなどの定数定義に従って #ifdef #elif #else #if #ifndef などを使って同じソースファイルでデバッグルーチンをオンにしたりなどできます。 また、コメントをコンパイラに渡す前に削除しているのもプリプロセッサです。 これらの命令や制御はコンパイラとは関係なく、プリプロセッサによって行われるので、使い方によっては面白いことができます。 たとえば、gccなどではテキストファイルや他の... -
戦争の防ぎ方に対する一考察
友人nishy氏が「戦争」というものについて書いていたので、それに対する返答ではないのですが、まじめに自分の意見を述べておきたいテーマだなと思ったので。。。 戦争というものについて。友人のblogに対する、私の回答というか、意見として、ここに述べておこうと思う。 戦争とは、その行為そのものを論ずる場合と、その思想を論ずる場合で論点が異なると思う。 まず、行為としての戦争とは何か。 第一にいえるのは、究極の消費経済であるということである。 戦争は、生産を伴わず、延々と消費のみを続ける。経済活動として、活発ではあるが、非常にゆがんだ形態であるといえる。生産を伴わない以上、物的にも人的にも経済を疲弊させる。負ければもちろん全てを失うが、勝ったとしても無傷というわけにはいかない。 それなのになぜ戦争を行うのか、というと、思想としての戦争、ということが... -
地球に優しいなんて大嘘
「地球に優しい」という言葉があります。 私は、実に欺瞞に満ちた言葉だと思うのです。 無論、言いたいことは分かります。言っていることも大事なことだとも思います。 現在の地球環境というのはこれまでの奇跡的といってもいい偶然によって生まれました。またさらなる偶然によって、現在われわれ人類にとって実に最適な環境となっているわけです。 その環境を大切にしよう、という考えそのものは、正しいと思います。ですが、同時に「現在の地球環境」を維持しようとすることはあくまで人間の立場からのエゴであることも同時に知っておくべきだと思うのです。 地球は誕生したときはただの石ころでした。 その後数億年かけて周囲の隕石との衝突・融合を繰り返し、マグマに包まれた火の玉といっていい状態がありました。 さらに数億年たって地球がある程度冷えたとき、大気中の水蒸気が冷やされて... -
低級品
「高級言語」「低級言語」という言葉があります。 一般にアセンブラ、マシン語などが「低級」とよばれ、コンパイラを使用する言語が「高級」と呼ばれます。 最近では、Javaなどの抽象度の高い言語が「高級」でC言語などは「低級」扱いされることも多いようです。 ちょっと、誤解を招く言葉だと思います。 プログラムの世界で「高級」というのは、「レイヤ(層)が上位にある」という意味です。 「高級言語」とは、 ・人間にとってわかりやすい ・CPUに依存した処理を書かなくてよい ・メモリ制御、IO制御等CPUレベルの操作を意識しなくてよい また「低級言語」とは ・コンピュータにとってわかりやすい(機械語とのセマンティクスギャップが少ない) ・プラットフォーム(CPU)に特有の処理が書ける ・メモリ操作、IO制御等CPUレベルの操作ができる と... -
ぽいんた2
続き。 「先っぽ」だけしか管理しないのは、いくつかの利点がある。 まず、でかい領域を関数に渡したいときなど、いちいち中身をコピーしていたら同じサイズの領域が必要になるし、コピー処理にとられる時間も馬鹿にならなくなる。ポインタを使えば、「ここにあるよ」っていう情報を渡してやればすむ。実に、合理的でしょ? 文字列だってそう。何文字あるかなんていちいち管理するより、「先っぽ」だけもらってNULLまでが文字列だよ、といわれた方が楽。 また、ポインタの真価はキャストと組み合わせることで発揮されるといっても・・・言い過ぎかな?でも本当にキャストと組み合わせることで様々な便利な使い方できる。 例えば、通信やファイルなどのデータをある領域に読み込むとき、読み込んでからじゃないとそれがどんなデータか判らないことがある。 ・・・判りにくいですか? BIT... -
リテラル
てなわけで文字列の話。 文字列リテラルは、静的かつconstな配列として確保されるということを前に書いた。 具体的には、以下のようなコードがあったとすると printf("AAA"); printf("BBB"); printf("CCC"); メモリ上の該当箇所をバイナリで見ると 41 41 41 00 42 42 42 00 43 43 43 00(←もちろんヘキサ) という風に確保される。 ということは、 char cHoge[10]; memcpy(cHoge, "AAA", sizeof(cHoge)); printf("BBB"); printf("CCC"); というコードを実行するとcHogeには ... -
拡張性
プログラムって言うのは、現在実現しようとしている機能のみ実現できてしまえばいい、というものではないと思っている。 個人の趣味でやっている場合でも、後から機能を追加したくなったりすることはあるし、しばらくたってから自分のプログラムを見直すこともあるだろう。使ってるうちにバグを発見したりもするだろうし。 その為にも、何度も書いているけど、将来のメンテナンスと拡張性を考慮したつくりにするべきだ、と私は考えている。 ひとつは、可読性をよくすること。 ざっくりといくけど、 ①コーディングスタイルの統一 ②変数の命名方法の統一 ③コメントの充実 ④機能・処理ごとに関数を分ける ⑤即値を避け、極力定数を宣言する などがある。(他にもあるだろうけど) ①~③は今まで何度か書いているのでそちら参照 ④は異存のある方もいるかもしれない。関数呼び出... -
ぽいんた3
メモリへのアクセスの制限事項の一つに、「アラインメント」もしくは「WORD境界」というものがある。 これは何かというと、奇数番地のアドレスに対して2バイト以上の型(8bit環境以外でのintなど)でアクセスすることができないという制限だ。 もちろん、すべてのCPUがその制限を持っているわけではない。幸いなことに?われらがPentiumは奇数番地アクセスが可能(たしか)。 具体的に言うと、 unsigned char* ucpHoge[100]; /*100バイトの領域確保*/ unsigned short int usiPiyo; /*short型の変数に*/ usiPiyo = *(unsigned short int*)(ucpHoge + 1); /* 奇数番地のアドレスを */ /* short*にキャスト... -
パリティビット
チェックサムを書いたので、似たようなロジックとしてパリティビットの話も。 bitの話も、もうしてあるので、準備も整ったことだし。 チェックサムは、1byteに入りきらない値が切り捨てられることを利用してデータの整合性を(ある程度)保障するというものでした。 これと似たようなテクニックとして、ビットを使うテクニックがあります。 1byteは8bitですが、通信などにおいては送信側と受信側で正常にエンコード/デコードできれば、問題はありませんね。 そこで、例えば送信する時には7bitずつ送って、最後の1bitをパリティビットとして使うことでデータの整合性を保障するということができます。 どういう風にするかというと、例えば0x5a5a5a5aという4byteのデータを通信で送受信するとすると、bitで表すと 【0101 1010... -
あなたは、どう読みますか?
C言語のキーワード、あなたは、どんな読み方をしていますか?? これが結構、人によって違いがあって面白い。 一例を示すと・・・ 【char】 キャラ チャー チャラ 派生して 【getchar】 ゲットキャラ ゲットチャー ゲットチャラ ・・・ありえないようなのもあるけど、ホントにそんな読み方する人いるんですよ(笑) で、時々「そんなのあんたしか言わないよ」みたいな極端な読み方をする人がいる。つか、嫌がらせ?みたいな。 業務のプログラムって一人でやるんじゃないんですよね。ちょっと複雑な処理やクリティカルな処理などだとソースコードレビューを行うこともしょっちゅうだし、引継ぎやデバッグなどの時にソースの説明をする必要がある場合もある。 そんな時、けっこう困るんですよ。こう、あまりにも、なんというか、個性的な読み方する人って。ホン... -
統計で嘘をつく方法
現在、報道・書籍・ネットなどメディアの充実により、情報だけは豊富に仕入れることができる時代となりました。 しかしながら、その情報も玉石混合といった感じなのは否めません。 転んでも泣かないためには、嘘を嘘と見抜ける能力が必要なわけです。 敵を知り己を知れば百戦して危うきなし。 そんなわけで、嘘をつかずに相手をだます方法をいくつか。 統計データで嘘をつく アンケートなどの統計結果の場合 該当アンケートの結果などを利用して嘘をつくのは常套手段です。 そのアンケート結果が信頼に値するかどうかは、ある程度以下で判断できます。 a.アンケート回答者が対象の事柄について十分な理解がある b.実施人数、有効回答数などが統計データとして十分である a.については、たとえば報道番組などで政治的なアンケートをとった場合、その対象となる政策について、その... -
Cという言語:2
C言語という言語はやっかいである。 コンピュータの発展に伴って言語仕様にさまざまなつぎはぎがされて統一感ないし。 そもそも、C言語の標準規格といわれるANSIに完全に準拠したコンパイラが存在しない!少なくとも新ANSI C言語辞典(技術評論社)がでた時点ではそうだったと書いてある。 実に困った言語なのである。 大体*という演算子だってややこしい。 宣言するときは int *hoge; とポインタであると宣言するために使うくせに、中身にアクセスするときにも i = *hoge; なんて使うし。 変数のアドレスを取得するときは piyo = piyo; だし。 統一感、ないっすよねえ。 returnだって、(今の仕様では)括弧つけてもつけなくてもいいし。 NULLなんていうのもそう。 たい... -
ガンダムのお話
ガンダムってアニメありますよね?いえ別にガンダムじゃなくてもいいんですが。他にも突っ込みいれたいものはいっぱいあるんですけどね。まあ私の趣味で。 最初に断って起きますが、私ガンダムって作品は好きなんですよ、ええ。誤解の無いように。 ------------------------------------------------- あれって試作品って設定で、跡で量産型のGIMって奴にその技術を応用された。 エンベッドのソフト屋さんとして気になるのが、その制御ソフトウェア。 GIMとガンダムで、ソフトウェア的にかなり互換性を持たせてるんだろうなあ。共通部品も多そうだし。 実際、陸戦型ガンダムがGIMの頭載せていたりする。。って、え?GIMってモノアイ構造のはず。ということはメインカメラは頭部ユニット内で制御してデータだけ本体側に通知しているってことだよな... - @wiki全体から「プログラミングする、ということ3:統合開発環境」で調べる