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 Cconstи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 →