155 lines
7.6 KiB
Markdown
155 lines
7.6 KiB
Markdown
# C
|
||
|
||
{ We have a [C tutorial](c_tutorial.md)! ~drummyfish }
|
||
|
||
C is a [low level](low_level.md), [statically typed](static_typing.md) [imperative](imperative.md) compiled [programming language](programming_language.md), the go-to language of most [less retarded software](lrs.md). It is the absolutely preferred language of the [suckless](suckless.md) community as well as of most true experts, for example the [Linux](linux.md) and [OpenBSD](openbsd.md) developers, because of its good minimal design, level of control, uncontested performance and a greatly established and tested status.
|
||
|
||
C is usually not considered an easy language to learn because of its low level nature: it requires good understanding of how a computer actually works and doesn't prevent the programmer from shooting himself in the foot. Programmer is given full control (and therefore responsibility). There are things considered "tricky" which one must be aware of, such as undefined behavior of certain operators and raw pointers. This is what can discourage a lot of modern "coding monkeys" from choosing C, but it's also what inevitably allows such great performance -- undefined behavior allows the compiler to choose the most efficient implementation.
|
||
|
||
## History and Context
|
||
|
||
C was developed in 1972 at [Bell Labs](bell_labs.md) alongside the [Unix](unix.md) operating system by [Dennis Ritchie](dennis_ritchie.md) and [Brian Kerninghan](brian_kerninghan.md), as a successor to the [B](b.md) language ([portable](portability.md) language with [recursion](recursion.md)) written by Denis Ritchie and [Ken Thompson](ken_thompson.md), which was in turn inspired by the the [ALGOL](algol.md) language (code blocks, lexical [scope](scope.md), ...).
|
||
|
||
In 1973 Unix was rewritten in C. In 1978 Keninghan and Ritchie published a book called *The C Programming Language*, known as *K&R*, which became something akin the C specification. In 1989, the [ANSI C](ansi_c.md) standard, also known as C89, was released by the American ANSI. The same standard was also adopted a year later by the international ISO, so C90 refers to the same language. In 1999 ISO issues a new standard that's known as C99.
|
||
|
||
TODO
|
||
|
||
## Standards
|
||
|
||
C is not a single language, there have been a few standards over the years since its inception in 1970s. The notable standards and versions are:
|
||
|
||
- **K&R C**: C as described by its inventors in the book *The C Programming Language*, before official standardization. This is kind of too ancient nowadays.
|
||
- **C89/C90 (ANSI/ISO C)**: First fully standardized version, usable even today.
|
||
- **C95**: A minor update of the previous standard, adds wide character support.
|
||
- **C99**: Updated standard from the year 1999 striking a great balance between "modern" and "good old". This is a good version to use in LRS programs, but will be a little less supported than C89.
|
||
- **C11**: Updated standard from the year 2011. This one is too [bloated](bloat.md) and isn't worth using.
|
||
- **C17/C18**: Yet another update, yet more bloated and not worth using.
|
||
|
||
LRS should use C99 or C89 as the newer versions are considered [bloat](bloat.md) and don't have such great support in compilers, making them less portable and therefore less free.
|
||
|
||
The standards of C99 and older are considered pretty [future-proof](future_proof.md) and using them will help your program be future-proof as well. This is to a high degree due to C having been established and tested better than any other language; it is one of the oldest languages and a majority of the most essential software is written in C, C compiler is one of the very first things a new hardware platform needs to implement, so C compilers will always be around, at least for historical reasons. C has also been very well designed in a relatively minimal fashion, before the advent of modern feature-creep and and bullshit such as [OOP](oop.md) which cripples almost all "modern" languages.
|
||
|
||
## Compilers
|
||
|
||
- [gcc](gcc.md)
|
||
- [clang](clang.md)
|
||
- [tcc](tcc.md)
|
||
- scc
|
||
|
||
## Standard Library
|
||
|
||
So the standard library (libc) is a subject of live debate because while its interface and behavior are given by the C standard, its implementation is a matter of each compiler; since the standard library is so commonly used, we should take great care in assuring it's extremely well written. As you probably guessed, the popular implementations ([glibc](glibc.md) et al) are [bloat](bloat.md). Better alternatives thankfully exist, such as:
|
||
|
||
- [musl](musl.md)
|
||
- [uclibc](uclibc.md)
|
||
- [not using](dependency.md) the standard library :)
|
||
|
||
## Bad Things about C
|
||
|
||
C isn't perfect, it was one of the first relatively higher level languages and even though it has showed to have been designed extremely well, some things didn't age great, or were simply bad from the start. We still prefer this language as usually the best choice, but it's good to be aware of its downsides or smaller issues, if only for the sake of one day designing a better version of C.
|
||
|
||
TODO
|
||
|
||
|
||
## Basics
|
||
|
||
This is a quick overview, for a more in depth tutorial see [C tutorial](c_tutorial.md).
|
||
|
||
A simple program in C that writes "welcome to C" looks like this:
|
||
|
||
```
|
||
#include <stdio.h> // standard I/O library
|
||
|
||
int main(void)
|
||
{
|
||
// this is the main program
|
||
|
||
puts("welcome to C");
|
||
|
||
return 0; // end with success
|
||
}
|
||
```
|
||
|
||
You can simply paste this code into a file which you name e.g. `program.c`, then you can compile the program from command line like this:
|
||
|
||
`gcc -o program program.c`
|
||
|
||
Then if you run the program from command line (`./program` on Unix like systems) you should see the message.
|
||
|
||
## Cheatsheet
|
||
|
||
It's pretty important you learn C, so here's a little cheat sheet for you.
|
||
|
||
**data types** (just some):
|
||
|
||
- **int**: signed integer, at least 16 bits (-32767 to 32767) but usually more
|
||
- **unsigned int**: unsigned integer, at least 16 bit (0 to 65535) but usually more
|
||
- **char**: smallest integer of at least 8 bits (1 byte, 256 values), besides others used for containing [ASCII](ascii.md) characters
|
||
- **unsigned char**: like char but unsigned (0 to 255)
|
||
- **float**: [floating point](float.md) number (usually 32 bit)
|
||
- **double**: like float but higher precision (usually 64 bit)
|
||
- **short**: smaller signed integer, at least 16 bits (−32767 to 32767)
|
||
- **long**: bigger signed integer, at least 32 bits (-2147483647 to 2147483647)
|
||
- **pointer**: memory address (size depends on platform), always tied to a specific type, e.g. a pointer to integer: `*int`, pointer to double: `*double` etc.
|
||
- **array**: a sequence of values of some type, e.g. an array of 10 integers: `int[10]`
|
||
- **struct**: structure of values of different types, e.g. `struct myStruct { int myInt; chat myChar; }`
|
||
- note: header *stdint.h* contains fixed-width data types such as *uint32_t* etc.
|
||
- note: there is no **string**, a string is an array of *char*s which must end with a value 0 (string terminator)
|
||
- note: there is no real **bool** (actually it is in header *stdbool*), integers are used instead (0 = false, 1 = true)
|
||
|
||
**branching aka if-then-else**:
|
||
|
||
```
|
||
if (CONDITION)
|
||
{
|
||
// do something here
|
||
}
|
||
else // optional
|
||
{
|
||
// do something else here
|
||
}
|
||
```
|
||
|
||
**for loop** (repeat given number of times):
|
||
|
||
```
|
||
for (int i = 0; i < MAX; ++i)
|
||
{
|
||
// do something here, you can use i
|
||
}
|
||
```
|
||
|
||
**while loop** (repeat while CONDITION holds):
|
||
|
||
```
|
||
while (CONDITION)
|
||
{
|
||
// do something here
|
||
}
|
||
```
|
||
|
||
**do while loop** (same as *while* but CONDITION at the end):
|
||
|
||
```
|
||
do
|
||
{
|
||
// do something here
|
||
} while (CONDITION);
|
||
```
|
||
|
||
**function definition**:
|
||
|
||
```
|
||
RETURN_TYPE myFunction (TYPE1 param1, TYPE2 param2, ...)
|
||
{ // return type can be void
|
||
// do something here
|
||
}
|
||
|
||
```
|
||
|
||
## See Also
|
||
|
||
- [C tutorial](c_tutorial.md)
|
||
- [C pitfalls](c_pitfalls.md)
|
||
- [C programming style](programming_style.md)
|
||
- [IOCCC](ioccc.md) |