| 1 | .. _programming_language:
|
| 2 |
|
| 3 | Programming Language
|
| 4 | ====================
|
| 5 |
|
| 6 | The kernel is written in the C programming language [c-language]_.
|
| 7 | More precisely, the kernel is typically compiled with ``gcc`` [gcc]_
|
| 8 | under ``-std=gnu89`` [gcc-c-dialect-options]_: the GNU dialect of ISO C90
|
| 9 | (including some C99 features).
|
| 10 |
|
| 11 | This dialect contains many extensions to the language [gnu-extensions]_,
|
| 12 | and many of them are used within the kernel as a matter of course.
|
| 13 |
|
| 14 | There is some support for compiling the kernel with ``clang`` [clang]_
|
| 15 | and ``icc`` [icc]_ for several of the architectures, although at the time
|
| 16 | of writing it is not completed, requiring third-party patches.
|
| 17 |
|
| 18 | Attributes
|
| 19 | ----------
|
| 20 |
|
| 21 | One of the common extensions used throughout the kernel are attributes
|
| 22 | [gcc-attribute-syntax]_. Attributes allow to introduce
|
| 23 | implementation-defined semantics to language entities (like variables,
|
| 24 | functions or types) without having to make significant syntactic changes
|
| 25 | to the language (e.g. adding a new keyword) [n2049]_.
|
| 26 |
|
| 27 | In some cases, attributes are optional (i.e. a compiler not supporting them
|
| 28 | should still produce proper code, even if it is slower or does not perform
|
| 29 | as many compile-time checks/diagnostics).
|
| 30 |
|
| 31 | The kernel defines pseudo-keywords (e.g. ``__pure``) instead of using
|
| 32 | directly the GNU attribute syntax (e.g. ``__attribute__((__pure__))``)
|
| 33 | in order to feature detect which ones can be used and/or to shorten the code.
|
| 34 |
|
| 35 | Please refer to ``include/linux/compiler_attributes.h`` for more information.
|
| 36 |
|
| 37 |
|
| 38 |
|
| 39 |
|
| 40 |
|
| 41 |
|
| 42 |
|
| 43 |
|
| 44 |
|
| 45 |
|