C言語
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/02/16 14:02 UTC 版)
規格
K&R
米国国家規格協会(ANSI)による標準化が行われるまで、1978年出版のデニス・リッチーとブライアン・カーニハンの共著『The C Programming Language』が実質的なC言語の標準として参照されてきた。この書籍は、著者らのイニシャルを取って「K&R」とも呼ばれている。C言語は発展可能な言語で、K&Rの記述も発展の可能性のある部分は厳密な記述をしておらず、曖昧な部分が存在していた。そのためC言語が普及するとともに、互換性のない処理系が数多く誕生した。
C89/C90
そこで、ISO/IEC JTC1とANSIは協同でC言語の規格の標準化を進め、1989年12月にANSIがANSI X3.159-1989, American National Standard for Information Systems -Programming Language-Cを、1990年12月にISOがINTERNATIONAL STANDARD ISO/IEC 9899 : 1990(E) Programming Languages-Cを発行した。ISO/IEC規格のほうが章立てを追加しており、その後ANSIもISO/IEC規格にならって章立てを追加した。それぞれC89 (ANSI C89) およびISO/IEC C90という通称で呼ぶことがある。
日本では、これを翻訳したものを『JIS X 3010-1993 プログラム言語C』として、1993年10月に制定した。
最大の特徴は、C++と同様の関数プロトタイプ[注釈 4]を導入して引数の型チェックを強化したことと、void
やenum
などの新しい型を導入したことである。一方、「処理系に依存するものとする」に留めた部分も幾つかある(int
型のビット幅、char
型の符号、ビットフィールドのエンディアン、シフト演算の挙動、構造体などへのパディング等)。
規格では以下の3種類の自由を認めている部分がいくつかある[17]。
- 規格で定義しないことを決めている「未定義」 (undefined)
- 規格で選択肢を定義したもののどれにするかを決めておらず、処理系が選択する必要があるが、文書化の必要はない「未規定」 (unspecified)
- 処理系ごとに決めて文書化する必要のある「処理系定義」 (implementation-defined)
これにより、プラットフォームやプロセッサアーキテクチャとの相性による有利不利が生じないような仕様になっている。
8ビット/16ビット/32ビットなど、レジスタ幅(ワードサイズ)の異なるプロセッサ (CPU) に対応・最適化できるようにするため、組み込み型の情報量(大きさ)や内部表現にも処理系の自由を認めている。型のバイト数はsizeof
演算子で取得し、各型の最小値・最大値はlimits.h
で定義されているマクロ定数で参照することとしている。ただし、1バイトあたりのビット数は規定されていない。sizeof(char) == 1
すなわちchar
型が1バイトであることは常に保証されるが、8ビット(オクテット)とは限らない。実際のビット数はCHAR_BIT
マクロ定数で取得できる。とはいえ、現実の多くの処理系ではchar
型は8ビットである。また、その他の整数型については、sizeof(int) >= 2
、sizeof(int) >= sizeof(short)
、sizeof(long) >= sizeof(int)
、という大小関係が定められているだけである(符号無し型も同様)。多くの処理系ではshort
型のサイズは2バイト(16ビット)であるが、int
やlong
のサイズはCPUのレジスタ幅などによって決められることが多い。int
型、short
型、long
型で符号を明示しない場合はsigned
を付けた符号付き型として扱われる。しかしchar
型に関しては、signed
(符号付き)にするか、それともunsigned
(符号無し)にするかは処理系依存である。char
型、signed char
型、unsigned char
型はそれぞれ異なる型として扱われる。
規格上には、BCPLやC++形式の1行コメント(//…
)は無いが、オプションで対応した処理系も多く、gccやClangはGNU拡張-std=gnu89
でサポートしている。
GNU Cコンパイラ や Clang では、-std=c89
(または-ansi
もしくは-std=c90
)をつけることにより、GNU拡張を使わないC89規格に準拠したコンパイルを行うことができる[注釈 5]。加えて、-pedantic
をつければ診断結果が出る。商用のコンパイラではWatcom Cコンパイラが規格適合の比率が高いと言われていた。現在Open Watcomとして公開している。
C89には、下記の追加の訂正と追加を行った。
- ISO/IEC 9899/COR1:1994
- ISO/IEC 9899/AMD1:1995 - 英語圏での利用を想定して制定したC89に対して、国際化のためワイド文字版ライブラリを追加したAmendment1が1995年に発行された。
- ISO/IEC 9899/COR2:1996
C99
1999年12月1日に、ISO/IEC JTC1 SC22 WG14 で規格の改訂を行い、C++の機能のいくつかを取り込むことを含め機能を拡張し、ISO/IEC 9899:1999(E) Programming Language--C (Second Edition) を制定した。この版のC言語の規格を、通称としてC99と呼ぶ。
日本では、日本産業規格 JIS X 3010:2003「プログラム言語C」がある。
主な追加機能:
- 変数宣言がブロックの先頭でなくても良くなった。
- ブール代数を扱うための
_Bool
型が予約語に追加され、標準ライブラリとしてstdbool.h
を追加した。 - 複素数を扱うための
_Complex
型や_Imaginary
型を予約語に追加し、標準ライブラリとして、complex.h
を追加した。 - 少なくとも64ビットの整数値を保持できる
long long int
型の追加。 - オプションとして、固定幅かつ内部表現の規定された整数型の標準化(
stdint.h
)。 //
による1行コメント。- インライン関数(
inline
キーワード)。 - 可変長配列(
alloca
関数の代替)[18]。
C99は下記の訂正がある。
- ISO/IEC 9899:1999 Cor. 1:2001(E)
- ISO/IEC 9899:1999 Cor. 2:2004(E)
- ISO/IEC 9899:1999 Cor. 3:2007(E)
C11
2011年12月8日にISO/IEC 9899:2011(通称 C11)として改訂された。改訂による変更・追加・削除機能の一部を以下に記述する。
C11はUnicode文字列(UTF-32、UTF-16、UTF-8の各符号化方式)に標準で対応している。そのほか、type-generic
式、C++と同様の無名構造体・無名共用体、排他的アクセスによるファイルオープン方法、quick_exitなどのいくつかの標準関数などを追加した。
また、_Noreturn
関数指示子を追加した。_Noreturn
は従来処理系ごとに独自に付加していた属性情報(たとえばgccでは__attribute__((__noreturn__))
)を標準化したもので、「呼び出し元に戻ることがない」という特殊な関数についてその特性を示すためにある。return
文を持たない関数という意味ではなく(規格ではreturn
文を持たなくとも、関数の最後の文の実行が終われば制御は呼び出し元に戻る)、この指示が意味するものは、当該の関数、ないしその内部から呼び出している関数の実行中に、必ず_exit
やexecve
を実行したり、例外などで終了する、あるいは、longjmp
による大域ジャンプで抜け出す[注釈 6]、継続渡しスタイル変換されたコードである、などのために、絶対に制御が呼び出し元に戻らない、という関数を指示するためにある。そのような関数は、スタックに戻りアドレスを積む通常の呼び出しではなく、スタックを消費しないジャンプによって実行できる。
アラインメント機能、_Atomic
型やC言語ネイティブの原始的なスレッド機能などを省略可能な機能として規格に組み込んだ。また、C99では規格上必須要件とされていた機能のうち、複素数型と可変長配列を省略可能なものに変更した。これらの省略可能な機能はC11規格合致の必須要件ではないので、仮に完全に規格合致の処理系であっても、対応していないかもしれない。C11規格では、省略可能な機能のうちコンパイラがどれを提供しているかを判別するために利用できる、テスト用のマクロを用意している。
これにより、gets
関数は廃止されている。
C17
2018年にISO/IEC 9899:2018(通称C17またはC18)として改訂された。仕様の欠陥修正がメインのマイナーアップデートである[19]。
注釈
- ^ 英語ではC-family, C-style, C-likeなどと呼ばれる。「C系」の定義は明確ではないが、構文がCに類似しているものを指すことが多い。
- ^ 例えばポインタのエイリアシングは最適化やベクトル化を妨げる[1]。
- ^ 他の言語、例えば、BASICやPascalではプログラム開始直後に実行するプログラム要素はサブルーチンや手続きや関数ではない。
- ^ C89においては関数プロトタイプは必須ではない。
- ^ C89規格に準拠しないソースコードをGNU Cコンパイラでコンパイル失敗させるには、
gcc -ansi -pedantic -fstrict-aliasing -Wall -Wextra -Wmissing-declarations -Werror test.c
とすれば良い(→エイリアシング)。 - ^
setjmp.h
を参照。
出典
- ^ ポインター・エイリアシングとベクトル化 | iSUS
- ^ もう一度基礎からC言語 第19回 いろいろな演算子~ビット演算子 Cは高級アセンブラ?
- ^ 第1回 Chapter 1 C言語の概要(1):Cプログラミング入門|gihyo.jp … 技術評論社
- ^ ISO/IEC 14882:2003 §3.6.1 「The function main shall not be used within a program.」
- ^ JIS X 3014:2003「プログラム言語C++」(日本産業標準調査会、経済産業省) §3.6.1 「関数mainは、プログラムの中で挙用してはならない。」
- ^ EXP33-C. 未初期化のメモリを参照しない JPCERT/CC、2014年3月25日(2014年8月22日閲覧)。
- ^ “Memory Allocation Guide”. The Linux Kernel documentation. 2023年11月8日閲覧。
- ^ main 関数 - cppreference.com
- ^ [Python入門]Pythonってどんな言語なの?:Python入門(1/2 ページ) - @IT
- ^ Hello, Worldプログラム | Programming Place Plus C言語編 第2章
- ^ Portability of C Programs and the UNIX Systems
- ^ a b The Evolution of the Unix Time-sharing System
- ^ ソースレベル互換 - ZDNet Japan
- ^ http://www.tohoho-web.com/ex/draft/kanji.htm
- ^ Rust言語でAndroidはより強固・安全に ~GoogleがOS開発への導入を進める - 窓の杜
- ^ Microsoft、Windows 10の一部をRustへ書き換えてセキュリティ強化狙う | TECH+
- ^ C FAQ 11
- ^ 6.19 Arrays of Variable Length
- ^ C の歴史 - cppreference.com
- ^ Clang 拡張 C++ コンパイラ - RAD Studio
- ^ Status of C99 features in GCC - GNU Project - Free Software Foundation (FSF)
- ^ C11Status - GCC Wiki
- ^ “Microsoft Releases C Program Wares, Provides Rebates”. InfoWorld: p. 29. (1987年11月9日)
- ^ インテル® C++ Composer XE 2011 Windows* 版インストール・ガイドおよびリリースノート - w_ccompxe_2011.7.258_Release_Notes_ja_JP.pdf
- ^ C99 Support in Intel® C++ Compiler | Intel® Software
- ^ C11 Support in Intel C++ Compiler | Intel® Software
- ^ 脇英世(監修)、1987、『パソコンの常識事典』、日本実業出版社 pp. 339、342 - 普及率、解説書の多さについて。
- ^ 長沢英夫(編)、1988、『パソコンベストソフトカタログ』、JICC出版局 pp. 201 - Personal版、解説書の多さについて。
- ^ ucom10 1983, p. 80.
C++
(C言語 から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/01/15 03:09 UTC 版)
C++(シープラスプラス)は、汎用プログラミング言語のひとつである。派生元であるC言語の機能や特徴を継承しつつ、表現力と効率性の向上のために、手続き型プログラミング・データ抽象・オブジェクト指向プログラミング・ジェネリックプログラミングといった複数のプログラミングパラダイムが組み合わされている[1]。C言語のようにハードウェアを直接扱うような下位層向けの低水準言語としても、複雑なアプリケーションソフトウェアを開発するための上位層向け高水準言語としても使用可能である。アセンブリ言語以外の低水準言語を必要としないこと、使わない機能に時間的・空間的コストを必要としないことが、言語設計の重要な原則となっている[2][3]。
- ^ Open issues for The C++ Programming Language (3rd Edition) - このコードはストロヴストルップ自身による訂正文からの引用(633ページ)。
std::endl
を'\n'
に改めている。またmain
関数がデフォルトで0を返す件についてはwww.research.att.com及びwww.delorie.com/djgpp/ を参照されたし。このデフォルト仕様はmain
関数のみであり他の関数にはない。
- ^ a b 『プログラミング言語C++』第4版、pp.12-13。
- ^ 『C++の設計と進化』、pp.152-153。
- ^ 『プログラミング言語C++』第4版、p.11。
- ^ “Bjarne Stroustrup's FAQ - When was C++ invented?” (English). 2006年5月30日閲覧。
- ^ Bjarne Stroustrup; Margaret A. Ellis (1990). The Annotated C++ Reference Manual. Addison-Wesley Professional. ISBN 978-0201514599
- ^ Bjarne Stroustrup; Margaret A. Ellis『The Annotated C++ Reference Manual』足立高徳、小山裕司、シイエム・シイ、2001年。ISBN 978-4901280396。
- ^ ISO/IEC 14882:1998
- ^ ISO/IEC 14882:2003
- ^ ISO/IEC TR 19768:2007
- ^ ISO/IEC 14882:2011
- ^ ISO/IEC 14882:2014
- ^ https://www.iso.org/standard/68564.html
- ^ https://www.iso.org/standard/79358.html
- ^ We have C++14! : Standard C++
- ^ “Current Status”. isocpp.org. 2020年9月7日閲覧。
- ^ “C++20 Approved -- Herb Sutter”. isocpp.org. 2020年9月8日閲覧。
- ^ “ISO/IEC 14882:2020”. 2021年3月16日閲覧。
- ^ “Working Draft, Standard for Programming Language C ++” (2020年12月15日). 2021年3月16日閲覧。
- ^ Sutter, Herb (2020年7月29日). “Business Plan and Convener's Report: ISO/IEC JTC1/SC22/WG21 (C++)”. 2021年3月16日閲覧。
- ^ “Upcoming Meetings, Past Meetings”. 2021年3月16日閲覧。
- ^ Ranns, Nina (2020年11月19日). “WG21 2020-11 Virtual Meeting: Minutes of Meeting”. 2021年3月16日閲覧。
- ^ Koenig, Andrew; Bjarne Stroustrup (1989年5月11日). “C++: as close as possible to C – but no closer” (PDF) (英語). 2016年11月19日閲覧。
- ^ Stroustrup, Bjarne. “Stroustrup: FAQ Is C a subset of C++?” (英語). 2016年11月19日閲覧。
- ^ 『C++の設計と進化』、pp.124-125。
- ^ Bjarne Stroustrup (2000年). The C++ Programming Language (Special Edition ed.). Addison-Wesley. pp. 46. ISBN 0-201-70073-5
- ^ 式 - cppreference.com
- ^ Sutter, Herb; Alexandrescu, Andrei (2004). C++ Coding Standards: 101 Rules, Guidelines, and Best Practices. Addison-Wesley
- ^ Henricson, Mats; Nyquist, Erik (1997). Industrial Strength C++. Prentice Hall. ISBN 0-13-120965-5
- ^ Stroustrup, Bjarne (2000). The C++ Programming Language (Special Edition ed.). Addison-Wesley. p. 310. ISBN 0-201-70073-5. "A virtual member function is sometimes called a method."
- ^ Andrew Birkett. “Parsing C++ at nobugs.org”. Nobugs.org. 2009年7月3日閲覧。
- ^ Why We Can’t Afford Export (PDF, 266 KB)
- ^ “Minutes of J16 Meeting No. 36/WG21 Meeting No. 31, April 7-11, 2003” (2003年4月25日). 2006年9月4日閲覧。
- ^ “C++ ABI”. 2006年5月30日閲覧。
- ^ 後藤大地 (2013年4月22日). “LLVM Clang、C++11にフル対応”. マイナビニュース. 2013年9月7日閲覧。
- ^ “GCC 4.8 Release Series — Changes, New Features, and Fixes - GNU Project”. gcc.gnu.org. 2022年11月7日閲覧。
- ^ “Bjarne Stroustrup's FAQ - Is C a subset of C++?”. 2008年1月18日閲覧。
- ^ “C9X -- The New C Standard”. 2008年12月27日閲覧。
- ^ 可変長配列: §6.7.6.2
- ^ C言語の最新事情を知る: C99の仕様 - Build Insider
固有名詞の分類
- C言語のページへのリンク