Открыть сервис

ANSI-89

ANSI-89 — это стандарт языка программирования C, разработанный Американским национальным институтом стандартов (ANSI) и принятый в 1989 году. Он представляет собой первую официальную стандартизацию языка C, которая закрепила синтаксис, семантику и библиотечные функции, став основой для последующих версий языка (C99, C11, C17) и обеспечив переносимость кода между различными платформами. Формальное обозначение стандарта — ANSI X3.159-1989, который также был принят как международный стандарт ISO/IEC 9899:1990 (часто обозначается как C89 или C90).

История

Предпосылки создания

Язык C был разработан Деннисом Ритчи в Bell Labs в 1972 году для операционной системы UNIX. К началу 1980-х годов он стал широко распространён, но существовало множество диалектов (например, от компаний Microsoft, Borland, AT&T), что затрудняло переносимость программ. В 1983 году ANSI сформировал комитет X3J11 под руководством Джима Броди (Jim Brodie) для разработки единого стандарта.

Процесс разработки

Комитет работал с 1983 по 1989 год, собирая предложения от производителей компиляторов, разработчиков и академических кругов. Основной задачей было сохранить совместимость с оригинальной реализацией Кернигана и Ритчи (K&R C), описанной в книге «Язык программирования C» (1978), но при этом устранить неоднозначности и добавить новые возможности, уже реализованные в некоторых компиляторах. В 1988 году был опубликован черновик, а 7 декабря 1989 года стандарт был официально утверждён.

Принятие и влияние

В 1990 году стандарт был принят Международной организацией по стандартизации (ISO) как ISO/IEC 9899:1990, что сделало его международным. Это привело к унификации языка: большинство компиляторов (например, GCC, Microsoft C, Borland Turbo C) перешли на ANSI-89, а код, написанный по этому стандарту, стал легко переноситься между системами. Стандарт оставался основным до выхода C99 в 1999 году.

Основные характеристики

Синтаксис и семантика

ANSI-89 закрепил синтаксис, основанный на K&R C, но с рядом уточнений:

  • Функции с прототипами — введено обязательное объявление типов параметров в заголовке функции (например, int func(int a, char b);), что улучшило проверку типов на этапе компиляции.
  • Типы данных — стандарт определил базовые типы: char, int, float, double, а также модификаторы short, long, signed, unsigned. Тип void был стандартизирован как указание на отсутствие возвращаемого значения.
  • Управляющие конструкции — закреплены операторы if, else, switch, while, for, do-while, goto, а также тернарный оператор ?:.
  • Препроцессор — стандартизированы директивы #include, #define, #ifdef, #ifndef, #endif, #else, #elif, #pragma, #error и макросы __LINE__, __FILE__, __DATE__, __TIME__, __STDC__.
  • Комментарии — поддерживались только многострочные комментарии / /; однострочные // были добавлены позже, в C99.

Библиотека стандартных функций

ANSI-89 определил набор заголовочных файлов и функций, которые должны быть доступны в любой реализации:

  • <stdio.h> — ввод-вывод: printf, scanf, fopen, fclose, fread, fwrite, fprintf, fscanf, getchar, putchar.
  • <stdlib.h> — общие утилиты: malloc, calloc, realloc, free, atoi, atof, rand, srand, exit, system.
  • <string.h>работа со строками: strcpy, strcat, strcmp, strlen, strchr, memcpy, memset.
  • <math.h> — математические функции: sin, cos, tan, sqrt, pow, fabs, ceil, floor.
  • <ctype.h> — классификация символов: isalpha, isdigit, isupper, tolower, toupper.
  • <time.h> — работа со временем: time, clock, difftime, strftime.
  • <assert.h>макрос assert для отладки.
  • <limits.h> и <float.h> — константы, определяющие диапазоны типов (например, INT_MAX, FLT_MIN).

Переносимость и ограничения

Стандарт гарантировал, что программа, написанная в соответствии с ANSI-89, будет компилироваться и работать на любой системе, реализующей стандарт, при условии отсутствия платформенно-зависимого кода. Однако были оговорены некоторые аспекты, зависящие от реализации (implementation-defined behavior), например, размер типа int (обычно 16 или 32 бита), порядок байтов (little-endian или big-endian), поведение при переполнении целых чисел.

Отличия от K&R C

ANSI-89 ввёл ряд изменений по сравнению с оригинальной версией языка:

  • Прототипы функций — в K&R C параметры объявлялись после закрывающей скобки (например, int func(a, b) int a; char b; { ... }). ANSI-89 сделал прототипы обязательными для новых функций.
  • Ключевые слова — добавлены const, volatile, signed, void, enum. В K&R C const и volatile отсутствовали, а enum был нестандартным.
  • Тип void — в K&R C функции без возвращаемого значения объявлялись как int по умолчанию. ANSI-89 ввёл void для явного указания.
  • Стандартная библиотека — в K&R C библиотека была минимальной и не стандартизированной; ANSI-89 определил полный набор функций.
  • Препроцессор — добавлены директивы #elif, #pragma, макросы __STDC__ и другие.

Критика и ограничения

Несмотря на успех, ANSI-89 подвергался критике за некоторые недостатки:

  • Отсутствие поддержки однострочных комментариев — это было неудобно для быстрого комментирования кода, что исправили в C99.
  • Ограниченная работа с памятью — стандарт не определял поведение при выделении памяти через malloc с нулевым размером, что приводило к неопределённому поведению в разных компиляторах.
  • Слабая типизация — неявное приведение типов (например, из int в char*) могло вызывать ошибки, которые не обнаруживались на этапе компиляции.
  • Отсутствие поддержки многопоточности — стандарт не учитывал параллельные вычисления, что стало актуально с развитием многоядерных процессоров.
  • Зависимость от реализации — многие аспекты (например, размер int, порядок байтов) оставались на усмотрение разработчиков компиляторов, что иногда приводило к несовместимости.

Применение

ANSI-89 использовался для разработки:

  • Операционных системядро Linux (первые версии), части Microsoft Windows, BSD-системы.
  • Встраиваемых систем — микроконтроллеры, промышленные контроллеры, благодаря минимальным требованиям к ресурсам.
  • Системного программного обеспечения — компиляторы, интерпретаторы, драйверы устройств.
  • Научных и инженерных расчётов — библиотеки численных методов (например, BLAS, LAPACK).
  • Игр и графических приложений — ранние версии id Tech (Doom, Quake) были написаны на C, близком к ANSI-89.

Наследие

ANSI-89 стал основой для всех последующих стандартов C. Хотя он был вытеснен C99 (1999) и C11 (2011), многие компиляторы и проекты (особенно в области встраиваемых систем) продолжают поддерживать ANSI-89 из-за его простоты и предсказуемости. Стандарт также повлиял на развитие языков C++ (первый стандарт C++98 во многом базировался на ANSI-89) и Objective-C.

Источники

  • ANSI X3.159-1989: American National Standard for Information Systems — Programming Language C.
  • ISO/IEC 9899:1990: Programming Languages — C.
  • Керниган Б., Ритчи Д. «Язык программирования C» (1-е издание, 1978; 2-е издание, 1988, описывающее ANSI-89).
  • Harbison S., Steele G. «C: A Reference Manual» (5-е издание, 2002).
  • Документация комитета X3J11 (1983–1989).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →