C (язык программирования)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:35, 8 июня 2016.
(перенаправлено с «C»)
Си
Парадигма процедурный
Спроектировано Деннис Ритчи
Печать дисциплины статическая слабая
OS кроссплатформенное программное обеспечение
Главная реализация
GCC, TCC, Turbo C, Watcom, Oracle Solaris Studio C
Диалект
«K&R» C (1978)ANSI C (1989)C90 (1990)C99 (1999)C11 (2011)
Влияние
C++, Objective-C, C#, Cyclone, Java, BitC

Сикомпилируемый статически типизированный язык программирования общего назначения, разработанный в 1969—1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би. Первоначально был разработан для реализации операционной системы UNIX, но, впоследствии, был перенесён на множество других платформ.

История Си

Язык программирования С был разработан в лабораториях Bell Labs в период с 1969 по 1973 годы. Согласно Ритчи, самый активный период творчества пришёлся на 1972 год. Язык назвали «Си» (C — третья буква латинского алфавита), потому что многие его особенности берут начало от старого языка «Би» (B — вторая буква латинского алфавита).

К 1973 году язык С стал достаточно силён, и большая часть ядра UNIX, первоначально написанная на ассемблере, была переписана на Си. Это было одно из самых первых ядер операционных систем, написанное на языке, отличном от ассемблера.

K&R C

В 1978 году Брайан Керниган и Деннис Ритчи опубликовали первую редакцию книги «Язык программирования Си». Эта книга, известная среди программистов как «K&R», служила многие годы неформальной спецификацией языка.

K&R ввёл следующие особенности языка:

  • структуры (тип данных struct);
  • длинное целое (тип данных long int);
  • целое без знака (тип данных unsigned int);
  • оператор += и подобные ему.

После публикации K&R C в язык было добавлено несколько возможностей:

  • функции, не возвращающие значение (с типом void), и указатели, не имеющие типа (с типом void *);
  • функции, возвращающие объединения и структуры;
  • имена полей данных структур в разных пространствах имён для каждой структуры;
  • присваивания структур;
  • спецификатор констант (const);
  • стандартная библиотека, реализующая большую часть функций, введённых различными производителями;
  • перечислимый тип (enum);
  • дробное число одинарной точности (float).

ISO C

В 1983 году Американский национальный институт стандартов (ANSI) сформировал комитет для разработки стандартной спецификации Си. По окончании этого процесса в 1989 году он был утверждён как «Язык программирования Си» ANSI X3.159-1989. Эту версию языка принято называть ANSI C или C89. В 1990 году стандарт ANSI C был принят с небольшими изменениями Международной организацией по стандартизации (ISO) как ISO/IEC 9899:1990.

Одной из целей этого стандарта была разработка надмножества K&R C, включающего многие особенности языка, созданные позднее. Однако комитет по стандартизации также включил в него и несколько новых возможностей, таких, как прототипы функций (заимствованные из C++) и более сложный препроцессор.

ANSI C сейчас поддерживают почти все существующие компиляторы. Любая программа, написанная только на стандартном Си, гарантированно будет правильно выполняться на любой платформе, имеющей соответствующую реализацию Си.

C99

Новые особенности C99:

  • подставляемые функции (inline);
  • объявление локальных переменных в любом операторе программного текста
  • новые типы данных, такие, как long long int, булевый тип данных bool и тип complex для представления комплексных чисел;
  • массивы переменной длины;
  • поддержка ограниченных указателей (restrict);
  • именованная инициализация структур;
  • поддержка однострочных комментариев, начинающихся на //;
  • новые библиотечные функций, такие, как snprintf;
  • новые заголовочные файлы, такие, как stdint.h.

C11

Основные изменения:

  • поддержка многопоточности;
  • улучшенная поддержка Юникода;
  • обобщенные макросы
  • анонимные структуры и объединения;
  • управление выравниванием объектов;
  • статичные утверждения;
  • удаление опасной функции gets (в пользу безопасной gets_s);
  • функция quick_exit;
  • спецификатор функции _Noreturn;
  • новый режим эксклюзивного открытия файла.

Введение в Си

Язык программирования С отличается минимализмом. Авторы языка хотели, чтобы программы на нём легко компилировались с помощью однопроходного компилятора, чтобы каждой элементарной составляющей программы после компиляции соответствовало весьма небольшое число машинных команд, а использование базовых элементов языка не задействовало библиотеку времени выполнения. Однопроходный компилятор компилирует программу, не возвращаясь назад к уже обработанному тексту. Поэтому использованию функций и переменных должно предшествовать их объявление. Код на С можно легко писать на низком уровне абстракции, почти как на ассемблере. С часто называют языком среднего уровня или даже низкого уровня, учитывая то, как близко он работает к реальным устройствам. Однако, в строгой классификации, он является языком высокого уровня.

С (как и ОС UNIX, с которой он долгое время был связан) создавался программистами и для программистов, круг которых был бы ненамного шире круга разработчиков языка. Несмотря на это, область использования языка значительно шире задач системного программирования.

Си создавался с одной важной целью: сделать более простым написание больших программ с минимумом ошибок по правилам процедурного программирования, не добавляя на итоговый код программ лишних накладных расходов для компилятора, как это всегда делают языки очень высокого уровня. С этой стороны С предлагает следующие важные особенности:

В то же время в С отсутствуют

а также средства:

После появления язык С был хорошо принят, потому что он позволял быстро создавать компиляторы для новых платформ, а также позволял программистам довольно точно представлять, как выполняются их программы. Благодаря этому программы, написанные на Си, эффективнее написанных на многих других языках.

Одним из последствий высокой эффективности и переносимости С стало то, что многие компиляторы, интерпретаторы и библиотеки других языков высокого уровня часто написаны на языке Си.

Элементы Си

Типы данных

В С имеются типы целых чисел различных размеров (short int, long int), со знаком (signed) и без (unsigned), чисел с плавающей запятой (float, double), символов, перечисляемых типов (enum), записей-структур (struct) и объединений (union).

Простые:

  • целочисленные
  • вещественные
  • символьные
  • логические

Составные (сложные):

  • массивы
  • строки
  • структуры и объединения
  • перечислимый тип

В языке возможно преобразование типов, но оно не всегда происходит автоматически. Только некоторые типы числовых данных полностью совместимы друг с другом.

Хранение данных

В С есть три разных способа выделения памяти (классы памяти) для объектов:

  • Статическое выделение памяти: пространство для объектов создаётся в сегменте данных программы в момент компиляции.
  • Автоматическое выделение памяти: объекты можно хранить в стеке; эта память затем автоматически освобождается и может быть использована снова, после того, как программа выходит из блока, использующего его.
  • Динамическое выделение памяти: блоки памяти нужного размера могут запрашиваться во время выполнения программы с помощью библиотечных функций из области памяти, называемой кучей. Эти блоки освобождаются и могут быть использованы снова после вызова для них функции free.

Все три этих способа хранения данных пригодны в различных ситуациях и имеют свои преимущества и недостатки. Например, статическое выделение памяти не имеет накладных расходов по выделению, автоматическое выделение — лишь малые расходы при выделении, а вот динамическое выделение потенциально требует больших расходов и на выделение, и на освобождение памяти. С другой стороны, память стека гораздо больше ограничена, чем статическая или память в куче. Только динамическая память может использоваться в случаях, когда размер используемых объектов заранее неизвестен. Большинство программ на С интенсивно используют все три этих способа.

Там, где это возможно, предпочтительным является автоматическое или статическое выделение памяти: такой способ хранения объектов управляется компилятором, что освобождает программиста от трудностей ручного выделения и освобождения памяти, как правило, служащего источником трудно отыскиваемых ошибок утечек памяти и повторного освобождения в программе. Многие структуры данных имеют переменный размер во время выполнения программы, поэтому из-за того, что автоматически и статически выделенные области должны иметь известный фиксированный размер во время компиляции, очень часто требуется использовать динамическое выделение. Массивы переменного размера — самый распространённый пример такого использования памяти.

Библиотеки

В языке программирования Си, как основной метод расширения функционала, используются библиотеки. Библиотека - набор функций, "собранных в файл". Каждая библиотека имеет заголовочный файл, который содержит прототипы всех функций, типов данных конкретной библиотеки. Для использования библиотеки необходимо подключить заголовочный файл данной библиотеки, и тогда библиотека "сликуется" к программе.

Примеры на Си

«Hello World» — программа, которая выведет на экран строку текста «Hello, World!» и закончит своё выполнение.

#include <stdio.h>

int main (void)
{
  puts ("Hello, World!");
  return 0;
}

Сортировка пузырьком:

#include<stdio.h>
#define N 1000
 int main()
 {
    int n, i, j;
    int a[N];
    scanf_s("%d", &amp;n);

    for(i = 0 ; i < n; i++)
	{ 
        scanf_s("%d", &amp;a[i]);
    }
    for(i = 0 ; i < n - 1; i++)
	{ 
       for(j = 0 ; j < n - i - 1 ; j++)
	   {  
           if(a[j] > a[j+1])
		   {           
              int tmp = a[j]; a[j] = a[j+1] ; a[j+1] = tmp; 
           }
        }
    }
 }

По умолчанию предполагается, что основная функция программы (функция main()) возвращает целое число, поэтому такая программа должна компилироваться (возможно, с выдачей одного или нескольких предупреждений), если компилятор реализует стандарт ANSI C. Если, компилятор следует стандарту C99, то такой код не будет компилироваться, и потребуется явное описание типа возвращаемого функцией main() значения.

Литература

Ссылки

  1. Официальная страница международной рабочей группы по стандартизации языка программирования Си
  2. Документация языка Си