Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
12
Help us understand the problem. What are the problem?
@kaizen_nagoya

@yumetodo C++erに倣って、Cerを簡易に水準分けして、初心者詐欺を減らす試み

yumetodo C++erを簡易的にレベル分けすることで初心者詐欺を減らそうという試み

を見習って、C言語理解を、
C初学者
C入門者
C初心者
C中級者
C上級者
という区分は同様の順番にします。

規格読破は、全く別の次元だという理解でいます。

そこで、
C言語規格初学者
C言語規格入門者
C言語規格初心者
C言語規格中級者
C言語規格上級者
という区分を別に設けます。

また、C言語は、Cコンパイラが大事な応用例でした。
そこで
Cコンパイラ初学者
Cコンパイラ入門者
Cコンパイラ初心者
Cコンパイラ中級者
Cコンパイラ上級者
というのも別の次元で設けさせてください。

理解、規格、コンパイラの3次元として、どこかの次元は別の次元にそんなに影響を与えないことを想定。どこかの上級者は、別の初心者でもなれる。2つくらいの水準の差があってもいいというのが経験則。

アプリケーションはばんばん書くのに、規格全く呼んでない人、ANSI Cしか知らない人いっぱいいた。
アプリケーションばんばん書くのに、Cコンパイラをコンパイルしたことがない人いっぱいいた。

理解

C初学者

main.c
#include <stdio.h>
void main(void)
{
    printf("Hello World!");
}

という、mainとか、printfとかが可変長引数の、一番難しい関数だということを知らないままコンパイルしてリンクして実行して。やったC言語書けたという段階。

C入門者

main.c
#include <stdio.h>
int main(void)
{
    return printf("Hello World!");
}

可変長引数はわかっていないが、関数は戻り値があるのがいいらしいという認識が芽生える。

固定引数で、戻り値があるのが書ける感じ。

C初心者

main.c
#include <stdio.h>
int main(argc, argv)
{
    return printf("Hello World! $¥ arc = %d argv= %s", argh, argv);
}

可変数引数関数であるmainの引数を使いこなせるようになったら初心者。

C中級者

main.c
#include <stdio.h>
int main(argc, argv)
{
  int * ptrd = &argc;
    char ** ptrs = argv;
    return printf("Hello World! $¥ arc = %d argv= %s", *ptrd, ptrs);
}

ポインタ変数を宣言できるようになったら中級者。
実際には、しばしば間違えて暴走させたり、デバッグ方法がわからなくなって上級者に聞く。

C上級者

ポインタ変数を自由に扱えるようになったら上級者。

確かめるために、Cパズルブックを全部正解したらご褒美を挙げるとして、
3ヶ月でCコンパイラ書いた人も全問正解できなかった。Cコンパイラ中級者でもC上級者ではない可能性があるかも。

Cパズルブック

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識

アドレス演算 C言語

C言語規格

C言語規格初学者

ANSI CがC言語規格で、ISO/IECとかJISとか知らないのが初学者。

C言語規格入門者

ANSI C, ISO/IEC 9899があり、翻訳JISがあることを知ったら入門者。

C言語規格初心者

C言語規格のコード断片をコンパイルしようとするが、全部はコンパイルできないのは初心者。
未定義、未規定、処理系定義という定義があることは小耳に挟んでいるが、意味をうまく理解していないのが初心者。

C言語規格中級者

Cの精神を呼んで、未定義、未規定、処理系定義が、CPUの発展、コンパイラの発展を妨げないためのものだと知ったら中級者。

freestanding, hostが、POSIXを挟んで、C言語の三層構造になっていることがわかりかけたら中級者。

C言語規格のコード断片が全部コンパイルできる。

[C][C++]の国際規格案の例題をコンパイルするときの課題7つ。

C言語規格上級者

C++との整合性を簡単に取るには、どういう規格改定がいいか提案できる。

言語規格、コーディング標準の使い方

C言語:未定義、未規定、処理系定義

Cコンパイラ

Cコンパイラ初学者

Cコンパイラが、C言語で書かれているのを聞いたことがあるか、見たことがある。
コンパイラのコンパイルはしたことがない。

Cコンパイラ入門者

small C, portable Cなどの小さいCコンパイラのコンパイルはできる。
Cコンパイラのソースコードも読もうとする努力はしている。

Cコンパイラ初心者

GCC, ClangなどのCコンパイラのコンパイルはできる。
GCC, Clangのソースコードを一通り眺めたり、
Bison(Yacc), Flex(Lex)の存在を知り、両方を使ったソースもコンパイルできる。

Cコンパイラ中級者

Cコンパイラの改良ができる。シンタックスチェッカを作ったり、簡単なC言語のソースコード生成が書ける。

Cコンパイラ上級者

メモリの最適化、時間の最適化の比較ができ、方らしいCコンパイラの提案ができる。
C++とCの共通処理の範囲を知っている。

コンパイラを書くのは難しいか。仮説・検証(175)

C言語(C++)に対する誤解、曲解、無理解、爽快。仮説・検証(173)

C++/C コンパイルエラーを記録するとよい理由7つ

意図

OSEK OS, AUTOSAR OSがfreestandingで動作することを知らないC上級者がいて、どうしたらいいだろうと思った。C言語の習熟度と、Cコンパイラを書いた経験と、C言語規格の理解度は、初めの二つはやや連動するが、3つめは関係ない状態になっているようだと思った。

それならそうで、別々だよねって合意があると、話がややこしくない。

コンパイラ書くとCプログラムの半分くらいの書き方が習得できるとすれば、1次元目と2次元目は直交していない。規格書はプログラム作るのには要らない。コンパイラ作る時にはちょっと要るかも。2次元目と3次元目も直行していない。

30年ほど前、C言語を教える時に、まずCコンパイラを描こうねって勧めた。
C言語に3ヶ月時間をもらえる会社がいくつもあり、じゃ、自分がCコンパイラ書いたのは3ヶ月かかっているのでちょうどいいって、ほぼ3ヶ月かけてコンパイラを作る教育をしていた。

数年前に、3週間でパイソンばりばりに書ける人たちに遭遇した。

プログラムは音楽だ (A program is a music.) 仮説・検証(54)

言語処理100本ノックをdockerで。python覚えるのに最適。docker(19) python(1)

じゃあ、Cコンパイラも3週間でかけるようになるんじゃね。って思って、3週間でコンパイラ書きましょうって言う話になった。簡単なCコンパイラを、最初の週は入力してコンパイル。次の週は、自分でちょこちょこって書き換えてみる。最後の週は、目標をたてて、そのコンパイラの改良をしてみるっていう感じ。

無事、Cコンパイラの原理と、Cコンパイラの改良の仕方を手に入れたらしい。
ここで言うCコンパイラ中級者。

参考資料

算譜(program)が計画(plane),設計(design)である3つの理由

MISRA C 2012のTechnical Corrigendum 1の21.X訂正意見のかなりの部分が日本からだった件

MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認

MISRA C/C++の勇み足または書き足りない事項を見つける方法

C初学者がC++を学習するまでの軌跡

初めてのC初心者限定#1

初めてのC初心者限定#2

初めてのC初心者限定#3

初めてのC初心者限定#4

プログラミング言語教育のXYZ。Youtube(1) 仮説・検証(52)

Microsoftとの歴史 Cコンパイラを中心に

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
12
Help us understand the problem. What are the problem?