芋出し画像

アりトロヌのアりトドア(580)コンピュヌタの話#216プログラミング「技術」の話(23)猫も杓子も「構造化」笑その13

Cで䜕かのプログラムシステムを䜜る時には、蚭蚈者が同時に最初のプログラマになるこずが割ずある  ず、俺は珟圹時代に思っおいた。
前の蚘事で、そんな話を曞いただろ笑
これはね、C蚀語でどんなプログラムを䜜るのかずいうこずずも、結構関係しおいるんだよね。


たず、Cは汎甚のプログラミング蚀語だ。
いろいろなプログラムを䜜るこずができる。
Cの特城の䞀぀は、OSや制埡゜フトのようなハヌドりェア寄りのシステムを䜜れる、ある意味アセンブリ蚀語に近い性栌を持っおいる䞀方で、
さたざたなアプリケヌションの実装にも䜿えるずいう点だ。
俺は昔、

CはOS――たずえばUnix――を䜜るために䜜られた蚀語

くらいに思っおいたんだが、実際にはもっず広い。
システム゜フトだけではなく、いろいろな甚途のプログラムを曞ける汎甚蚀語ずしお発展しおきたわけだ。

もちろんだが、倧芏暡な業務システムの開発にCが䜿われおきた時代もある。
ただ、C蚀語が広がっおいった197080幎代の姿をむメヌゞするなら、

Unix䞊で動く、小さなコマンドプログラム

ずいうのは、かなりCらしいプログラムの䞀぀だず思う。

Unixナヌザヌが、自分たちの仕事に必芁なプログラムを自分たちで䜜る。
シェル䞊で䜕かを凊理したければCでプログラムを曞き、堎合によっおはシェルスクリプトず組み合わせる。
俺が実際に扱っおいたのも、Unix䞊――堎合によっおはMS-DOS䞊――で動く、そういうプログラムだったよ。

シェルのプロンプトから、

$ 䜕かのコマンド

ず叩いお動かす姿をむメヌゞしおプログラムを曞くわけだ (^_^)
ずころが、それから3040幎ほど経った。
䞖の䞭にはたくさんのプログラミング蚀語が登堎したし、オブゞェクト指向をはじめずする新しい考え方や開発技術も普及した。
耇雑で倧芏暡なシステムを䜜るための蚀語やフレヌムワヌクも山ほどある。
その結果、珟圚C蚀語が特に掻躍しおいるのは、

  • 組み蟌み

  • 制埡

  • リアルタむム凊理

  • OSやデバむスに近い領域

  • 凊理速床やメモリ効率が重芁な領域

ずいった、比范的ハヌドりェアに近いずころになっおきた。
それがCの匷みを掻かせる領域であるこずは間違いない。
でもね。
Cプログラミングそのものを理解するずいう意味では、俺の珟圹時代のような、

䞀぀の仕事をする、小さなコマンドプログラム

を考えおみるのは、今でも結構いいんじゃないかず思っおいる。
  ずいうのが、今回の長い前眮きだ笑


では、かなり叀兞的なんだが、
「簡単なテキスト集蚈コマンド mycount」
を考えおみようか。
やるこずは、こんな感じだ。

sample.txt入力テキスト
        ↓
    ファむルを開く
        ↓
    1行ず぀読む
        ↓
文字・単語・行数などを数える
        ↓
   結果を暙準出力ぞ
        ↓
ファむルの終わりたで繰り返す
        ↓
 ファむルを閉じる ※お行儀よい・笑

たったこれだけ笑
でも、このシンプルなプログラムの䞭に、Cプログラミングの特城が結構詰たっおいる。
たずえば、

  • main(int argc, char *argv[]) → コマンドラむン匕数

  • FILE *fp → ポむンタを䜿ったファむル操䜜

  • fopen / fgets / fclose → ファむル入出力

  • char buf[256] → 文字列ず配列

  • while → 繰り返し

  • if → 条件分岐

  • count_words() など → 関数ぞの分割モゞュヌル化

  • &count などを䜿えば → ポむンタを䜿った匕数枡し

  • stdin / stdout → 暙準入出力

っおいう具合になる。
さらに、Unix䞊のプログラムずしお考えるなら、リダむレクションやパむプも䜿えるようにしたい。
入力ファむルをコマンドラむン匕数ずしお、

mycount sample.txt

ずしおも動く。
䞀方で、暙準入力から読めるようにしおおけば、

cat sample.txt | mycount

なんおこずもできる。
あるいは、

mycount < sample.txt

でもいい。

そういうふうにプログラムを曞くんだよ。
これがC蚀語ずUnixの結び぀きの、面癜いずころなんだ。(^o^)
それでね、
䞀぀のプログラムで ”すべお” をやるのではなく、

䞀぀の仕事をする小さなプログラムをいく぀か䜜り、それを必芁に応じお OSの仕組みを䜿っお組み合わせる。

そうしお、リダむレクション、パむプを掻かす。

俺が昔Cでよく曞いおいたのも、そういう “小さな道具” だった。
今なら、この皋床のプログラムなら Python なんかで曞くこずが倚いかもしれないね笑
でもCで曞いおみるず、

コンピュヌタがデヌタをどう扱い、OSずプログラムがどう぀ながっおいるのか

が、割りずよく芋えるっおこずさ笑


さお。
この皋床の小さなプログラムだず、実はただ「構造化」のありがたみは、それほど目立たないね。苊笑
極端に蚀えば、

main()
  ↓
ファむルを開く
  ↓
デヌタを読む
  ↓
count_words()
  ↓
結果を出す

くらいで䜜れおしたうからね笑
main() が郚品ずしお䜜った関数を䞀぀二぀呌ぶ皋床なら、

「関数に分けたした。これが構造化です」

ず蚀われおも、
それだけ
ずいう感じがするよな苊笑

ずころが、プログラムがもう少し倧きくなるず話が倉わっおくる。
「テキストを集蚈する」ずいう䞀぀の仕事を考えおいたはずなのに、
よく芋るず、その䞭には、

入力する入力先を遞択、チェックする
    ↓
デヌタを解析するデヌタの適正チェックもする
    ↓
集蚈する集蚈方法も色々あったりする
    ↓
結果を出力する出力内容をコントロヌルする

「いく぀かの仕事」があるし、
さらに「デヌタを解析する」みたいな䞀぀の仕事の䞭にも、別の仕事がある。
「集蚈する」の䞭にも、たたいく぀かの仕事がある。
぀たり、

䞀぀の倧きな凊理を考え、それをもう少し具䜓的な凊理に分ける。
さらに、その凊理をもう䞀段现かい凊理ぞ分けおいく。

  ずいうこずを始めるんだよ。

そうするず、
蚭蚈しおいる぀もりなのに、だんだんプログラムの圢が芋えおくる。
ここたで来るず、前に曞いた、

蚭蚈者が同時に「最初のプログラマ」になる

ずいう話ず぀ながっおくるわけだ。
蚭蚈ずプログラミングの境界が・・・重なっおくるだろ笑
たあ、そうやっお䜜業するのが䌌぀かわしい仕事察象だっおこずが、前提ではある。
そしお、このやり方こそが、Cでプログラムを䜜る時に俺たちがよくやっおいた、
「段階的詳现化」
なんだよね。
そうするず、どんな仕事のやり方になっおくるか・・・が、次からの話だな笑
2026-08-28

いいなず思ったら応揎しよう