Надо Знать

добавить знаний



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



План:


Введение

C ( англ. C ) - Универсальная, процедурная, императивная язык общего назначения, разработанная в 1972 году Денисом Ритчи в Bell Telephone Laboratories с целью написания на ней операционной системы UNIX. [1]

Хотя, С и был разработан для написания системного программного обеспечения, [2] пока она довольно часто используется для написания прикладного программного обеспечения.

С вероятно, является самой популярной в мире языком программирования с количеством уже написанного на ней программного обеспечения, доступного в свободными лицензиями кода и количества программистов, которые его знают. [3] [4] Реализации компиляторов для языка С существуют для многих операционных систем и архитектур. C оказала большое влияние на другие языки программирования, особенно в C + +, которая изначально проектировалась, как расширение для С, а также на Java и C #, которые переняли С синтаксис.


1. Философия

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

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


1.1. Минимализм

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

Бьярни Страуструп как-то написал о ней: "С делает так, чтобы вам было легко выстрелить себе в ногу" [5] Иными словами, С разрешает осуществление ряда операций, которые часто являются не желательными, а потому немало ошибок в коде не обнаруживается компилятором , и не могут быть очевидными во время выполнения. Если во время программирования и поддержки программного обеспечения не придерживаться ряда строгих правил, позже может возникнуть немало проблем с быстродействием, стабильностью и безопасностью программного обеспечения. (Хотя, виной подобных проблем зачастую программисты, поскольку С сама по себе обеспечивает низкий уровень защиты).

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

В ответ на критику языка C, как сильно типизированной языка, Керниган и Ритчи, сослались на основе философии дизайна C: "Тем не менее, C сохраняет основной принцип, который предусматривает, что программисты хорошо знают, что они делают, и требует лишь, чтобы они четко давали компилятору знать о своих намерениях". [6] [ 7]


2. Характеристика

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

C также такие специфические свойства:

  • переменные могут быть скрытыми во вложенных блоках
  • слабая типизация: например, символы могут использоваться как целые числа
  • низкоуровневый доступ к оперативной памяти путем преобразования машинных адресов указатели
  • указатели на функции и данные поддерживают динамическое полиморфизм
  • массив индексов как вторичное понятие, определяется в терминах арифметики указателей
  • стандартизированный препроцессор C для макроопределения, включение файла с исходным кодом, условной трансляции и т. д.
  • комплексная функциональность, как I / O, манипуляция строками, и делегирование математических функций библиотекам
  • относительно небольшое количество зарезервированных слов (32 в С89, и 37 в C99)
  • Лексические структуры, напоминающие B больше ALGOL, например:
    • { ... } { ... } в отличие от ALGOL "овского begin ... end begin ... end
    • знак равенства для назначения (копирование), как это делается в языке Fortran
    • два знака равенства используются для проверки равенства (подобно .EQ. в Fortran "и либо одного знака равенства в BASIC)
    • && и || отличие от ALGOL "ивстких and и or (этим она семантически отличается от битовых операторов & и |.
    • большое количество операторов объединения, вроде +=, ++, ......

2.1. Отсутствует функциональность

С испытывает нехватку следующих возможностей, которые есть в других языках программирования, (хотя далеко не всегда недостаток некоторых возможностей, имеющихся в каких-то языках, является недостатком):

  • Отсутствие нескалярних операций, вроде копирования массивов или строк.
  • Отсутствие автоматического управления памятью (сбор мусора)
  • Отсутствует проверка границ массива
  • Отсутствие полу динамических массивов до С99
  • Отсутствие синтаксиса для массивов, вроде А.. В, которые используют, как старые, так и новые языки программирования
  • Отсутствие вложенных функций (хотя, эта возможность есть с некоторыми компиляторами, например GCC. Однако опять же, является противоречивой сама потребность вложенных функций.)
  • Отсутствие обработки исключений
  • Отсутствие рудиментарной поддержки модульного программирования
  • Отсутствие статического полиморфизма в форме перегрузку функций или операторов
  • Отсутствие поддержки объектно-ориентированного программирования
  • Отсутствие встроенной поддержки многозадачности и работы с сетями, хотя эти возможности обеспечиваются популярными библиотеками
  • Отсутствие стандартных библиотек для работы с графикой и других библиотек для прикладного программирования

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

Возможности языка повышаются путем использования сторонних библиотек. Большинство объектно-ориентированных функций включают специальный указатель "это" (this в C + +, Java), который ссылается на текущий объект. Передавая этот указатель в качестве аргумента функции в С, те же функциональные возможности могут быть использованы в С. Например, в C + + можно написать:

 stack  ->  push  (  val  )  ; 

в то время, как в С это выглядело бы, например, так:

 push  (  stack  ,  val  )  ; 

где аргумент stack в С является указателем на структуру (struct), что является эквивалентной этом указателе в С + +, который является указателем на объект.


3. История

3.1. Ранняя разработка

Начальный этап разработки Си состоялся в стенах Bell Labs между 1969 и 1973 годы; Денис Ритчи утверждает, что наиболее творческим был 1972 год. Язык был назван "Си" из-за того, что многие ее возможностей было получено от ранее созданной языка B.

Существует немало легенд о происхождении языка Си, и связанной с ней операционной системы UNIX, среди них:

  • Разработка Си стала результатом того, что его будущие авторы любили компьютерную игру, похожую на популярную игру Asteroids (Астероиды). Они уже давно играли в нее на главном сервере компании, который был недостаточно мощным, и должен был обслуживать около ста пользователей. Томпсон и Ритчи виришилилы, что им не хватает контроля над космическим кораблем для того, чтобы избегать столкновений с некоторыми камнями. Поэтому они решили перенести игру на свободный PDP-7, стоящий в офисе. Однако этот компьютер не имел операционной системы, что заставило их ее написать. В конце концов, они решили перенести эту операционную систему еще на офисный PDP-11, что было очень трудно, поскольку ее код был полностью написан на ассемблере. Было вынесено предложение использовать какую-то высокоуровневую портативную язык, чтобы можно было легко переносить ОС с одного компьютера на другой. Язык B, которую они сначала хотели использовать, оказалась лишенной функциональности, способной использовать новые возможности PDP-11. Поэтому они и остановились на разработке языка С.
  • Самый компьютер, для которого первоначально написана UNIX, предназначался для создания системы автоматического заполнения документов. Первая версия UNIX была написана на ассемблере. Позднее для того, чтобы переписать эту операционную систему, был разработан язык С.

К 1974 года речь С стала достаточно функциональной для того, чтобы переписать на ней большую часть ядра UNIX, которое сначала было написано на ассемблере PDP-11. Это было первое ядро операционной системы реализовано не на ассемблере.


3.2. K & R C

В 1978 году Ритчи и Керниган опубликовали первую редакцию книги "Язык программирования Си". Эта книга, известная среди программистов как "K & R". Описанную в ней версию языка Си, часто называют "K & R". Вторая редакция этой книги посвящена позднему стандарту ANSI C, описанном ниже.

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

  • Тип данных struct
  • Тип данных long int
  • Тип данных unsigned int
  • Оператор =- было изменено на -=, чтобы избавиться семантической двусмысленности создаваемой конструкциями, вроде i=-10, которая могла интерпретироваться, как i =- 10 или i = -10

K & R часто считают главной частью речи, которую должен поддерживать компилятор С. Много лет, даже после выхода ANSI C, он считался минимальным уровнем, которого следовало придерживаться программистам, желающим добиться от своих программ максимальной портативности, поскольку не все компиляторы тогда поддерживали ANSI C, а код на K & R C был совместным и с ANSI C.

В ранних версиях C, только функции, возвращающие значения с типом отличным от int должны были быть объявленными, если они использовались перед определением функции; функции без предварительного объявления должны возвращать только целое число.

Для примера: long int SomeFunction (); int OtherFunction ();

 int  CallingFunction  (  )  {  long  int  test1  ;  int  test2  ;  test1  =  SomeFunction  (  )  ;  if  (  test1  >  0  )  test2  =  0  ;  else  test2  =  OtherFunction  (  )  ;  return  test2  ;  } 

В этом примере, как SomeFunction, так и OtherFunction были объявлены перед их использованием. В K & R объявлением OtherFunction можно было пренебречь.

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

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

  • функции по типу результата void;
  • функции, возвращающие значння типа struct или union (а не указатель)
  • присвоения для типа struct
  • Определитель const, который делал объект доступным только для чтения
  • Перечислювани типа

Большое количество дополнений и отсутствие стандартной библиотеки, вместе с большой популярностью языка, создали настоятельную потребность в стандартизации.


3.3. ANSI C

В конце 1970 -х, язык C опередила BASIC, и стала самым популярным языком программирования для микрокомпьютеров. В течение 1980 -х, ее приняли для использования в IBM PC, и ее популярность начала расти довольно быстрыми темпами. В то же время, Бьярн Страуструп и другие работники Bell Labs начали работу над приложением объектно-ориентированных конструкций в C, что привело к возникновению C + +.

В 1983, Американский Национальный Институт Стандартов (ANSI) сформировал комитет X3J11 для создания стандартной спецификации для языка C. В 1989, стандарт был ратифицирован как ANSI X3.159-1989 "Язык программирования C". Эту версию часто называют ANSI C, Стандартный C, или С89.

В 1990, стандарт (с несколькими незначительными модификациями) ANSI C ратифицировала Международная Организация по Стандартизации (ISO), ISO / IEC 9899:1990. Эту версию иногда называют C90. Поэтому термины "C89" и "C90" по сути, обозначают один язык.

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

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

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


3.4. Стандарт C99

После процесса стандартизации ANSI спецификация языка C в течение какого-то времени осталась относительно статической, тогда как C + + продолжала эволюционировать, в значительной степени благодаря своим собственным усилиям по стандартизации. Нормативная Поправка 1, создала новый стандарт для языка C в 1995, но лишь для того, чтобы исправить некоторые детали стандарта C89 и добавить обширную поддержке международных наборов символов. Однако, стандарт подвергся дальнейшему пересмотру в конце 1990 -х, приведя к публикации ISO 9899:1999 в 1999 году. Этот стандарт обычно именуют, как "C99". Он был принят, как стандарт ANSI в марте 2000.

Стандарт C99 ввел несколько новых особенностей, многие из которых были реализованы в нескольких компиляторах :

  • Вложенные функции
  • Переменные могут объявляться везде (как в C + +)
  • Введено несколько новых типов данных, в частности, long long int, явный логический (булев) тип данных и комплексный тип для представления комплексных чисел
  • Массивы с переменными длинами
  • Поддержка коротких однострочных комментариев, начинающихся с //, как в BCPL и C + +
  • Новые библиотечные функции, например sprintf
  • Новые заголовочные файлы, как stdbool.h и inttypes.h
  • Расширенная поддержка стандарта IEEE для работы с плавающей точкой
  • Исправлено печатные огрехи.

C99 совместим с C90, однако, имеет некоторые отличия: в частности, если в декларации идентификатора не хватает спецификатора типа, переменная или функция больше не воспринимается объявленной неявно как int. Комитет стандартов решил, что важнее, чтобы компиляторы диагностировали рассеянный упущения спецификатора типа, чем молча обрабатывали код. На практике, компиляторы, вероятно, диагностируют упущения, но и принимают переменную объявленной как int и продолжают перевод программы.

GCC и другие компиляторы C пока поддерживают многие из новых возможностей C99. Однако, они в меньшей степени поддерживаются компиляторами таких компаний, как Microsoft и Borland, которые сосредоточились преимущественно на C + +, с тех пор как C + + обеспечивает подобную функциональность.


3.5. Стандарт C11

Международная организация по стандартизации ( ISO) в декабре 2011 опубликовала обновленный вариант стандарта для языка Си - ISO / IEC 9899:2011 [8], который был создан под кодовым именем C1X и пришел на смену стандарту C99. Поскольку стандарт развивался довольно длительное время, пройдя стадии выпуска нескольких черновых редакций, современные компиляторы, такие как GCC 4.6 и LLVM 3.0, уже поддерживают большинство описанных в спецификации возможностей.

В новой спецификации увеличена совместимость с языком С + + и представлены некоторые новые возможности, такие как

  • поддержка багатонитевости,
  • поддержка Unicode,
  • изъята функция gets,
  • интерфейс для проверки допустимых границ и диапазонов значений,
  • анонимные структуры и объединения (например, можно вложить блок union в struct),
  • дополнительная функция для быстрого выхода из программы quick_exit,
  • статические утверждение (Static assertions)
  • задействования дополнительных макросов для проверки чисел с плавающей запятой.

Финальный текст стандарта не доступен для свободной загрузки (только платная загрузка), но можно загрузить последнюю черновую редакцию (PDF, 3.6 Мб, 701 стр.), которая почти не отличается от утвержденной спецификации.


4. Использование

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

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

  • Продуцируется текст программы на языке C параллельно с другим исходным кодом: машинным, объектным и / или двоичным. Например, такое поведение характерно для некоторых диалектов языка Lisp (Lush).
  • Производится исключительно текст на С. Примеры: Eiffel, Sather; Esterel.

Исходный текст программы на С передается компилятору С, который выдает конечный машинный или двоичный код. Это сделано для переносимости (компиляторы языка С существуют почти для всех платформ) и избегание необходимости развития специфических для машины генераторов команд.


5. Библиотеки

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

Общей библиотекой С является стандартная библиотека stdlib.h, указанной в ISO и ANSI C стандартах, и распространяется с каждым современным компилятором языка С.

Другим общим набором функций стандартной библиотеки С является то, что используется приложениями. Проектировались они для UNIX -подобных систем, в первую очередь, для обеспечения интерфейса к ядру. Эти функции детализируются в различных стандартах, вроде POSIX и Single UNIX Specification.

С тех пор, как С приобрела большую популярность, для нее было написано немало других библиотек. Библиотеки часто пишутся на С, так компиляторы C генерируют эффективный объектный код, позднее программисты создают интерфейсы к библиотекам таким образом, что они могут использоваться высокоуровневыми языками, вроде Java, Perl и Python.


6. Критика

Несмотря на ее популярность, С часто критикуется. В основном критика сосредоточена на том, что, используя C, трудно осуществить некоторые желаемые действия, и на том, что, используя C, легко осуществить некоторые нежелательные действия. Коротко говоря, эффективное использование С требует от программиста больше навыков, опыта и усилий, чем это требуется для других языков программирования.

7. Связанные языка

Когда объектно-ориентированные языки стали популярными, C + + и Objective-C были двумя разными продолжениями C, которые обеспечивали объектно-ориентированные возможности. Оба языка сначала функционировали, как препроцессора - написанный на них код сначала переводился на C, а затем компилювася компилятором C.

7.1. С + +

Язык программирования C + + разработана на основе С, и была получена в результате добавления Бьярни Страуструпом к ней объектно-ориентированной функциональности с C-подобным синтаксисом.

7.2. Objective-C

Objective-C - очень "тонкая" надстройка над С, который позволяет объектно-ориентированное программирование используя гибрид динамической / статической парадигмы типов. Основу синтаксиса Objective-C составил синтаксис языка С, однако, синтаксис для его объектно-ориентированных возможностей был заимствован у Smalltalk. Objective-C и C + + отличаются своей философией - для большей информации, читайте соответствующие статьи.


См.. также

Примечания

  1. Stewart, Bill (January 7, 2000). "History of the C Programming Language" - www.livinginternet.com / i / iw_unix_c.htm. Living Internet . http://www.livinginternet.com/i/iw_unix_c.htm - www.livinginternet.com / i / iw_unix_c.htm . Проверено 2006-10-31 .
  2. Patricia K. Lawlis, cj kemp systems, inc. (1997). "Guidelines for Choosing a Computer Language: Support for the Visionary Organization" - archive.adaic.com / docs / reports / lawlis / k.htm. Ada Information Clearinghouse . http://archive.adaic.com/docs/reports/lawlis/k.htm - archive.adaic.com / docs / reports / lawlis / k.htm . Проверено 2006-07-18 .
  3. "Programming Language Popularity" - www.langpop.com/. 2009 . http://www.langpop.com/ - www.langpop.com/ . Проверено 2009-01-16 .
  4. "TIOBE Programming Community Index" - www.tiobe.com / index.php / content / paperinfo / tpci / index.html. 2009 . http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html - www.tiobe.com / index.php / content / paperinfo / tpci / index.html . Проверено 2009-01-16 .
  5. . http://www.research.att.com/ ~ bs / bs_faq.html # really-say-that - www.research.att.com/ ~ bs / bs_faq.html # really-say-that Stroustrup: FAQ
  6. Dennis Ritchie. "The Development of the C Language" - cm.bell-labs.com/cm/cs/who/dmr/chist.html . http://cm.bell-labs.com/cm/cs/who/dmr/chist.html - cm.bell-labs.com/cm/cs/who/dmr/chist.html . Проверено 2006-07-26 .
  7. Brian W. Kernighan and Dennis M. Ritchie: The C Programming Language, 2 nd ed., Prentice Hall, 1988, c. 3.
  8. Опубликован новый международный стандарт для языка Си (C1X/C11) - www.opennet.ru/opennews/art.shtml?num=32644
п о р Язык программирования С
Библиотеки
Стандартная библиотека glibc Dietlibc uClibc Newlib
Возможности языка
Строки Синтаксис Препроцессор Variable types and declarations Функции
Потомки
C и другие языки
Совместимость C и C + + Операторы в C и C + + Сравнение C и Pascal C to Java byte-code compiler

код для вставки
Данный текст может содержать ошибки.

скачать

© Надо Знать
написать нам