DEV Community

d.yoshimitsu
d.yoshimitsu

Posted on

可搬性の高いC言語のコードを書くために

#c

まえがき

C言語で初めてちゃんとしたソフトウェアを書いてみようって人向けの内容です。
初心者のかたが知らず知らずのうちに処理系依存の動作を作り込んでしまうという、
事態をさけて欲しいという思いで書きました。

可搬性

C言語の特徴のうちの一つに 可搬性が高い というものがあります。

  • あるコンピュータ用にC言語で作ったプログラムを、他のコンピュータ用に移植しやすいということです。

言語規格では厳密に仕様を定めていない

ではなぜ可搬性が高いのかと言うと、言語規格としては3種類の動作の仕様を定めていません。
順番に説明していきたいと思います。

1. 未定義の動作

まず一つ目に、未定義 (undefined)の動作というものがあります。
規格には「可搬性がないもしくは正しくないプログラム構成要素を使用したときの動作」と書かれており、

平たく言うとクソみたいなプログラムがどう動かくか定義したくないなから、そんなクソコードは書くなということです。

0除算

未定義の動作の例として0除算があります。
つまりC言語では0除算が発生した時に何が起こるかは規定されていません。
今時の高級な言語なら当然、例外が発生すると規定されているでしょう。

2. 未規定の動作

二つ目に未規定 (unspecified)の動作というものがあります。
プログラムの動きとして2つ以上の可能性があり、どれが実行されるかについて、
C言語の標準仕様として全く要求を課されていない動作のことです。
厳密に決めるとコンパイラ作る時に面倒だから考えたくないという意味です。

式の評価順序

未規定の動作の例として式の評価順序があります。
順番が保証されないので、結果がどうなるかは実行してからのお楽しみです。

3. 処理系定義の動作

最後に処理系定義 (implementation-defined)の動作というものがあります。
処理系の特徴に依存する動作のことです。

未規定の動作の一種で、同じくコンパイラ作る時に面倒だから考えたくないという意味ですね。

1byteあたりのbit数

処理系定義の動作の例として「1byteあたりのbit数」というのがあります。
ということは、C言語では1byteは8bitではない可能性があるということです。
もう何を信じればいいのかわからなくなりますね。

プログラマ側の責任

C言語ではシステムの停止や未定義動作を引き起こす元凶となる致命的なソフトウェアの不具合に対する最終防壁はなく、
全てプログラマ側の責任のもと実装する必要があります。
最高に やりがい を感じますね。

あとがき

  • 社内LTでC言語の魅力について発表した資料の文字起こしです。

    • Web, アプリ系エンジニアには当然ながら受けませんでした。
      • 受けないどころかC言語はクソだなとまで言われてしまいました。(泣)
  • マサカリをお待ちしています。

Top comments (0)