| 1 | .. _programming_language:
|
| 2 |
|
| 3 | Programming Language
|
| 4 | ====================
|
| 5 |
|
| 6 | The Linux kernel is written in the C programming language [c-language]_.
|
| 7 | More precisely, it is typically compiled with ``gcc`` [gcc]_
|
| 8 | under ``-std=gnu11`` [gcc-c-dialect-options]_: the GNU dialect of ISO C11.
|
| 9 | ``clang`` [clang]_ is also supported; see documentation on
|
| 10 | :ref:`Building Linux with Clang/LLVM <kbuild_llvm>`.
|
| 11 |
|
| 12 | This dialect contains many extensions to the language [gnu-extensions]_,
|
| 13 | and many of them are used within the kernel as a matter of course.
|
| 14 |
|
| 15 | Attributes
|
| 16 | ----------
|
| 17 |
|
| 18 | One of the common extensions used throughout the kernel are attributes
|
| 19 | [gcc-attribute-syntax]_. Attributes allow to introduce
|
| 20 | implementation-defined semantics to language entities (like variables,
|
| 21 | functions or types) without having to make significant syntactic changes
|
| 22 | to the language (e.g. adding a new keyword) [n2049]_.
|
| 23 |
|
| 24 | In some cases, attributes are optional (i.e. a compiler not supporting them
|
| 25 | should still produce proper code, even if it is slower or does not perform
|
| 26 | as many compile-time checks/diagnostics).
|
| 27 |
|
| 28 | The kernel defines pseudo-keywords (e.g. ``__pure``) instead of using
|
| 29 | directly the GNU attribute syntax (e.g. ``__attribute__((__pure__))``)
|
| 30 | in order to feature detect which ones can be used and/or to shorten the code.
|
| 31 |
|
| 32 | Please refer to ``include/linux/compiler_attributes.h`` for more information.
|
| 33 |
|
| 34 | Rust
|
| 35 | ----
|
| 36 |
|
| 37 | The kernel has support for the Rust programming language
|
| 38 | [rust-language]_ under ``CONFIG_RUST``. It is compiled with ``rustc`` [rustc]_
|
| 39 | under ``--edition=2021`` [rust-editions]_. Editions are a way to introduce
|
| 40 | small changes to the language that are not backwards compatible.
|
| 41 |
|
| 42 | On top of that, some unstable features [rust-unstable-features]_ are used in
|
| 43 | the kernel. Unstable features may change in the future, thus it is an important
|
| 44 | goal to reach a point where only stable features are used.
|
| 45 |
|
| 46 | Please refer to Documentation/rust/index.rst for more information.
|
| 47 |
|
| 48 |
|
| 49 |
|
| 50 |
|
| 51 |
|
| 52 |
|
| 53 |
|
| 54 |
|
| 55 |
|
| 56 |
|
| 57 |
|
| 58 |
|