Введение

Подмножество языка программирования

Small C — это одновременно подмножество языка программирования C, предназначенное для микрокомпьютеров с ограниченными ресурсами и встраиваемых систем, и реализация этого подмножества. Изначально представлявший ценность как один из первых компиляторов для микрокомпьютерных систем, доступных в конце 1970-х и начале 1980-х годов, он также оказался полезен в качестве достаточно простого примера для обучения. Оригинальный компилятор, написанный Роном Кейном на Small C для Intel 8080, был опубликован в майском выпуске журнала Dr. Dobb's Journal за 1980 год. Джеймс Хендрикс улучшил и расширил оригинальный компилятор и написал "Руководство по Small C". Рон запустил Small C на Unix-системе SRI International PDP 11/45, используя учетную запись, предоставленную Джоном Бассом для разработки Small C. Предоставленный исходный код был выпущен в общественное достояние с разрешения руководства. Small C был важен для небольших компьютеров, примерно так же, как GCC важен для больших компьютеров. Подобно своим аналогам в Unix, компилятор генерирует ассемблерный код, который затем должен быть преобразован в машинный код доступным ассемблером. Small C — это переносимый компилятор. Для переноса Small C требуется лишь переписать генератор кода бэк-энда и библиотеку для вызовов интерфейса операционной системы для целевого процессора.

Подмножество языков

В мае 1980 года журнал Dr. Dobb's Journal опубликовал статью под названием "Маленький C-компилятор для 8080", в которой Рон Кейн представил небольшой компилятор для подмножества языка C. Самой интересной особенностью компилятора, помимо его малого размера, был язык, на котором он был написан – тот самый язык, который он компилировал. Это был самокомпилирующийся компилятор! (Хотя сегодня это обычное дело, в то время это было довольно новаторской идеей.) Используя простой однопроходный алгоритм, его компилятор генерировал ассемблерный код для процессора 8080. Однако, из-за своего малого размера, он имел свои ограничения. Он распознавал только символы, целые числа и одномерные массивы любого из этих типов. Единственным оператором управления циклом был оператор `while`. Булевых операторов не было, поэтому вместо них использовались побитовые логические операторы `&` (И) и `|` (ИЛИ). Но даже с этими ограничениями, это был очень удобный язык, особенно по сравнению с ассемблером. Понимая необходимость улучшений, Рон предложил мне создать вторую версию, и в декабре 1982 года она также появилась в журнале Dr. Dobb's Journal. Новый компилятор расширил Small C следующими возможностями: (1) оптимизация кода, (2) инициализация данных, (3) условная компиляция, (4) спецификатор хранения `extern`, (5) операторы `for`, `do/while`, `switch` и `goto`, (6) составные операторы присваивания, (7) булевы операторы, (8) оператор одночного дополнения, (9) локальные переменные блоков и (10) различные другие функции. Затем, в 1984 году, Эрнест Пейн и я разработали и опубликовали CP/M-совместимую библиотеку времени выполнения для этого компилятора. Она состояла из более чем 80 функций и включала большинство функций из стандартной библиотеки ввода/вывода UNIX C, применимых к среде CP/M. Это стало версией 2.1 и темой книги The Small C Handbook.