RoboCup Junior Japan Rescue Kanto OB
2005~2013
2005~2013
なぜか前回のダンガンの記事が反響があって混乱してます。
自分はSリボルバーやWレイザー最つよ世代でFレース以降はそこまで詳しくないのです。。。
ハードはクソ雑魚ナメクジなので地区大会決勝までは残るけど全国には行けないくらいの位置にいました。
その後別ジャンルに転向した後河童に転向して、そっからのことはこのブログに書いてありますね
言いたいことは記事タイトルに書いてあるので、結論だけ見たい方はタイトルだけ読んだらブラウザ閉じてOKです。
自分はSリボルバーやWレイザー最つよ世代でFレース以降はそこまで詳しくないのです。。。
ハードはクソ雑魚ナメクジなので地区大会決勝までは残るけど全国には行けないくらいの位置にいました。
その後別ジャンルに転向した後河童に転向して、そっからのことはこのブログに書いてありますね
言いたいことは記事タイトルに書いてあるので、結論だけ見たい方はタイトルだけ読んだらブラウザ閉じてOKです。
今日はTwitterで適当に呟いたら各所からリプやら空リプやらきまくったC言語の話題についてまとめました。
今回の記事ネタは前回の記事よりさらに10年から20年昔の話となります。まさか更に古いのが来るとは・・・
今回の発端はこれ。
学校のC言語のテスト
— 遠藤を守くん (@Hx1gUkx0GGF8mIX) June 17, 2021
意味不明過ぎwwww pic.twitter.com/Hgrw0WA10O
パズってたのが回ってきました。多分知り合いではないはずですが、どうやら河童関係者の方のようです。
それはともかく、これについて、皆さまはどう思われますでしょうか。
投稿者に寄り添う形の意見の方もいれば、採点者に寄り添う形の意見の方もおられるかと思います。
僕の予想ですが、これの反応は世代によって変わるのではないでしょうか。
と、いうのもこれが通るかどうかは「コンパイラの規格」に依存します。
現在このブログ見てる方はなんか年齢層が高い気がするので、今更これを説明するのもあほらしいかと思いますが、
元々(10年前)、学生が学生に情報を共有する体で作られたブログなので、それに合わせていこうと思います。
この形式が通るのはC99という比較的新しい規格以降の規格となります。1999年策定が新しい・・?何かバグってますね
で、これが通らない規格というのがC89とかANSI Cとか言われる規格になります。(同じものです)
C89では変数は変数宣言を実処理の後に書けないという制約があります。
というかもともとCにはその制約があって、C99で撤廃されました。
なので、C99が普及する前にCを学んだ方からすると、これは絶対×になりますし、
C99が普及した後にCを学んだ方からすればこれは〇というカラクリになります。
でもIT業界は日進月歩。古い規格の記憶を引き摺っている人間はそもそもダメなのでは?
そう思われるかもしれません。
では皆さん。現在C言語の最新の規格をご存じでしょうか。
答えはC17です。2017年策定です。
でも、私が知る限り、C17どころか、そのひとつ前のC11ですら、一度も見たことがありません。
※頻繁に新しいのが出る組み込みだともしかしたらあるかもです・・・
実質的に現在最新の規格で動いてるコンパイラは、なんと20年以上前のC99になるのです。
なんとなくお判りいただけたでしょうか。C言語は一般的に非常に規格の更改対応が遅いのです。
というか、私の経験上、殆どのところがコンパイラの規格の更改なんて、していないと思います。
もっと現実的な話をすると、多分C99ですら、ほとんど現実のシステムには存在しないです。
恐らく生きているCの全てがC89、あるいはそれ以前のものであると推察されます。
これも理由が簡単で、そもそも、もっと簡単に書ける言語がたくさん存在する上に、
そもそも超身近に上位互換であるC++が存在するにも関わらず、未だにC言語を使っているような現場。
どう考えても、技術の止まっている、変えることのできない特殊な現場だとは思いませんか?
これは生存バイアスと真逆の考え方をすれば一発で辿り着く答え。
「この令和の時代にCなんか使ってる時点で、ほぼ確実に30年物の骨董システムである」ということです。
現状この辺りの例外としては特殊な業界として、組み込み、OS、カーネルなどがありますが、それも時間の問題でしょう。
というわけで、実際のC開発の現場ではC99なんて新しいものはまず使われておりません。
つまり、C言語を使う以上、「基本的にはC89に互換するような形式でソースを書くのが安牌」
というのが一般的なプロのCプログラマの見解になるのかと思います。
因みに下りのツイートでは最終的に意義申し立てが通って〇になったようです。
・・・というのをTwitterで話してたら
いやもっと古いカオスな規格あったよな・・・?という空リプが飛んできてこの話になった訳です。
はい、得意技がタイムスリップの僕の出番ですね。40代未満の方がポカーンする話に突入します。
皆さんは、こういう関数定義の仕方をご存じでしょうか。
int sub(a,b) int a; char b; { printf("%d %c"a,b); }
何の言語?と思われる方もいるかもしれませんがれっきとしたCです。純正のCです。
これは、正式名称ではありませんが一般に「K&Rスタイル」と呼ばれる記法でして、
1978年に発売されたThe C Programming Languageという本の2名の作者の頭文字をとった名前となっております。
これはプログラミング教育の始祖とも言える本で、今では標準出力例題の定番となったHello Worldもこの本が初出です。
C言語は1972年にこの世に生まれたプログラミング言語で、様々な媒体で使われるようになるわけですが、
実はC89が登場した1989年まで、C言語には統一規格がありませんでした。
そのためC言語の教科書として一番著名だったこの本の内容が実質的に規格として定着することになります。
多分コンパイラの開発者もこれ見て作ってたのではないでしょうか。
ぶっちゃけこの辺の話は調べれば当然ネットにも書いてあることではあるのですが、
実物をみないとそもそも認知しないので調べようもないですから、若い人はほぼ知らない内容でしょう。。。
で、なんでこれをぼくが知っているかというと、特殊な事情で、結構仕事でK&Rスタイルを使うんですよ。
頻繁にタイムスリップすることで有名な僕ですが、生まれる前にスリップするのは珍しいですね・・・
さて、ここまで書いたところでC89以前のCというものがどういうものなのか、
なんとなくお分かりいただけたかと思います。
漫然と書いてますが、ここでひとつお気づきになられたでしょうか。C89が初めての統一規格である。と
つまりそれ以前のCには統一規格がない。これがどういう意味をもたらすか。
規格が存在しない上に当時のマニュアルなんか残っている訳がないので
ソースの挙動が一切わからないんです。
やべぇだろ。C言語。いやそもそもマニュアル残っててもそんなクリティカルなことまで書いてある訳ねーだろ。
当時は規格のように扱われていた「K&Rスタイル」はあくまで教本なので
今の言葉で正しく言うと、コーディングルールに近い位置になります。
それも一般的に「K&Rスタイル」というと、先ほど紹介した関数定義の仕方のみを指す概念でして、
それ以外のことに関しては一切関与しておりません。あんな分厚い本からお前らはそれしか得れられなかったのか
因みにこれまでぼくが触った環境の中で、C89との違いを自分が感じた内容は下記になります。
・複数ファイルで共有する変数の定義をヘッダに記載せずextern修飾子を全cファイルに定義する
・変数名に$や#などの一部特殊文字が使える
・struct内要素のバイト数を4の倍数にする必要がある
・structをA,BをA.Bで入れ子にし、B側の要素cを参照する際にA側にcが定義されていなければA.cで参照できる
・関数の宣言時に引数の型を定義しなくてもコンパイルが通る(当然型を間違えると正常に動かない、最悪環境が飛ぶ)
・ローカル変数が強制的にレジスタに飛ばされ、デバッガで実行時に値が取れない
・etc...
とまぁこんな感じ。統一規格がないということは恐らくこの挙動もコンパイラによってまちまちなのでしょう。
全体的に当時のものは厳密な定義が少なく良きに計ら的な思想を感じます。
多分この時代はコーナーケースをつつくことでバグが生まれるのでしょうね。。。
・・・さて、ここまで話せば、記事タイトルの意味がわかっていただけるのではないかと思います。
この時代のCについてはもう藪蛇でしかないので、意図的につつくことは絶対にしませんが、
また面白い挙動が観測できれば単一で記事にしてみたいと思います。
さて、この記事を最後まで読んで頂いた皆様に伝えておきたいことはただひとつ。
組み込み、OS、カーネル以外で、C言語で開発してる現場は避けましょう。
以上です。おわり
(^・ω・)ノ RadiumProduction at curonet
カレンダー
最新CM
カテゴリー
らじぷろ目次
らじぷろ検索機
最新記事
(01/01)
(08/27)
(04/29)
(01/01)
(11/20)
(09/06)
(09/04)
(08/09)
(08/06)
(07/27)
(05/29)
(03/15)
(01/01)
(05/07)
(01/11)
プロフィール
HN:
Luz
性別:
男性
アーカイブ