Файл: История возникновения и развития языков для программирования Си (С++) и Java.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 15.05.2023

Просмотров: 162

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Введение

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

В этой работе будет описано становление одного из самых крупных языков и пары выходцев из него.

1. Язык «С»

Язык «С» зародился в 1969 году, изначально планировавшийся как обновление предыдущего языка используемого на операционной системе Unix «B». Основное его развитие проходило до 1973 года. Также существенные изменения были внесены с 1977 по 1979 год, связанны они были в обновлением Unix, которое давало возможность переноса ОС на новые машины. Стандартизация языка проведена была в 80-х годах. Занимался этим комитет ANSI X3J11. Это дало возможность изучения языка гораздо большей аудитории и привело в достаточно высокой популярности языка, которая актуальна и сегодня.

Кен Томпсон, сотрудник компании Bell Telephone Laboratories, а так же группа его коллег работают над созданием операционной системы которая будет удовлетворять их запросам. Так появилась первая версия Unix написанная на ассемблере PDP-7, который все еще использовал бумажную ленту как способ ввода информации. Даже первая версия Unix уже была самодостаточной и позволяла писать и тестировать программы внутри себя. Вскоре после создания Unix, Дуг Макилрой сделал для него новый высокоуровневый системный язык TGM. Этот язык дал Томпсону идею что Unix нуждается в системном языке программирования. Так был придуман «В». Точнее говоря «В» не был придуман. «В» это модифицированный BCPL.

BCPL (Basic Combined Programming Language) создан Мартином Ричардсоном в 1967 году. Основная его цель – написание компиляторов для других языков. Структура языка дает возможность легкого переноса готовых компиляторов между машинами. Она разделена на две основные части: первая генерирует код в виртуальной машине, вторая переводит его для восприятия компьютером. Из-за того требуется переписывать лишь небольшую часть кода при переносе на новую технику.

Еще одна особенность языка, в нем есть только один тип данных: 16 битное слово (машинное слово). Она так же была основной проблемой при использовании на машинах где самый малый тип данных был байт и на машинах с большим размером слов (32 бита, 64 бита и т. д.). Несоответствие между ориентацией слов BCPL и байт-ориентированным оборудованием было рассмотрено несколькими способами. Один из них обеспечивал стандартные библиотечные процедуры для упаковки и распаковки слов в байтовые строки. Позже были добавлены две языковые функции: оператор выбора битового поля и оператор индексации байтов.


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

Основная причина модификации была ограниченная память машин, доступно было лишь 8 кбайт памяти, для BCPL этого было недостаточно. Даже после переписи «В» на компиляторе TGM это оставалось проблемой, после каждого обновления языка компилятор требовал все больше памяти. Но расширения языка давали возможность в будущем уменьшить размеры, путем изменения и добавления операторов. Так же были эксперименты с виртуальным компилятором «В»: программы внутри неё занимали меньше места (код и данные подкачивались внутри интерпретатора). Только это сильно замедляло работу программ, поэтому от этой идеи отказались. Томпсон сделал еще один шаг, добавив операторы ++ и – (увеличение и уменьшение). Они определяют, происходит ли изменение до или после значения операнда.

В системе Unix на PDP-7 только несколько вещей были написаны в B, кроме самого B, потому что машина была слишком маленькой и слишком медленной, чтобы делать больше, чем эксперимент. Переписывание операционной системы и утилит полностью в B тоже было слишком дорогим. Тем не менее, появились некоторые утилиты, написанные на B, включая раннюю версию DC-калькулятора с переменной точностью.

К 1970 году Томпсон и его команда смогли получить новый DEC PDP-11. Но процессор был доставлен на три месяца чем его диск. Для работы программ на B с шитым кодом, требовалось лишь написать фрагменты кода для операторов и простой ассемблер, который был закодирован на B. Ещё до какой-либо операционной системы, DC стала первой программой на PDP-11, которую можно было тестировать. В ожидание диска, Томпсон перекодировал ядро Unix и некоторые основные команды на языке ассемблера PDP-11.Из 24K байт памяти на самой ранней PDP-11 Unix использовалось 12K байт для операционной системы, небольшая часть для пользовательских программ, а остальное - как RAM-диск. Эта версия Unix была предназначена только для тестирования, а не для работы. Как только появился его диск, они быстро перешли к нему после перевода команд на языке ассемблера на язык PDP-11 и портирования тех, которые уже были в B.

Машины, на которых впервые использовались BCPL и B, имели язык с одним типом данных – ячейкой, которая совпадала с аппаратным машинным словам. Появление PDP-11 выявило несколько неудачных решений в семантической модели B. Его механизмы обработки символов, оставшиеся с небольшими изменениями от BCPL, были непродуктивны: использование библиотечных процедур для распространения строк в отдельные ячейки для последующей переупаковки или для доступа к отдельным символам. Так же исходный PDP-11 не предусматривал арифметику с плавающей запятой. Операции с плавающей точкой были добавлены в BCPL в компиляторах Multics и GCOS путем определения специальных операторов, но это работало только потому, что на соответствующих машинах одно слово было достаточно большим, чтобы содержать число с плавающей запятой, что не было возможно на 16-разрядном PDP-11. Еще построение B и BCPL создавало проблемы при работе с указателями: языковые правила, определяя указатель как индекс в массиве слов, принуждали указатели представляться индексами слов. Каждое обращение к указателю при исполнении генерировало масштабирование указателя в адрес байта, который ожидал процессор.


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

В 1971 с уже более мощными машинами «В» был расширен до «NB» (new B). Он добавил типы int и char, массивы из них и указатели на них. Семантика массивов оставалась такой же, как в B и BCPL: iarray и carray создают ячейки, указывающие на первую последовательность из 10 целых чисел и символов, ipointer и cpointer пропускают размер, чтобы память не выделялась автоматически. Значения в ячейках, привязанных к именам массива и указателя, были адресами машин, в байтах, в соответствующих областях хранения. Так косвенное использование указателя не имело накладных расходов во время выполнения, и указатель масштабировался от смещения от слова до байта. Но код для индексирования массива и вычислений указателя теперь зависит от типа массива и указателя: для вычисления iarray [i] или ipointer + i требуется масштабирование сложения i по размеру упомянутого объекта.

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

Это стало решающим шагом в цепочке между BCPL и C. Он устранил материализацию указателя в хранилище и вместо этого вызвал создание указателя, когда имя массива упоминается в выражении. Когда значения–массивы упоминаются в выражении, они конвертируются в указатели на первый из объектов, составляющих этот массив. Это позволило большинству существующих кодов на В продолжать работать, несмотря на смещение в семантике языка. Что еще более важно, новый язык сохранил последовательное и выполнимое (если не необычное) объяснение семантики массивов, открывая путь к более всеобъемлющей структуре типов.

Еще одно новшество, которое наиболее четко отличает C от В, - это более полная структура типа и особенно его выражение в синтаксисе деклараций. NB предложил базовые типы int и char, а также массивы из них и указатели на них, но никаких дополнительных способов составления. С учетом объекта любого типа должно быть возможно описать новый объект, который собирает несколько в массив, выводит его из функции или является указателем на него.


Для каждого объекта скомпонованного типа уже существовал способ упоминания базового объекта: индексирование массива, вызов функции, использование оператора указателя на указателе. По тому же принципу был сделан синтаксис объявления для имен, отражающих синтаксис выражения, в котором появляются имена.

Основная схема компоновки типа C, была позаимствована у Algol 68. Основной идеей была структура типов, построенная на элементарных типах, объединениях в массивы, указателях и функциях. Понятия объединения и приведения типа тоже повлияли на то, что появилось позже.

После создания системы типов, связанного синтаксиса и компилятора для нового языка Томпсон почувствовал, что он заслужил новое имя; NB казался недостаточно отличительным. Он решил продолжить однобуквенный стиль и назвал его C.

К началу 1973 года основа современного была почти полной. Язык и компилятор были достаточно сильными для переписи ядра Unix для PDP-11 в C летом этого года. Также в течение этого периода компилятор был перенесен на похожие машины, потому что язык не мог жить изолированно, были разработаны варианты для современных библиотек. Например, был написан переносимый пакет ввода и вывода, позже переработанный в стандартную процедуру ввода и вывода C.

В 1973-1980 годах язык понемногу расширялся. В структура типов появились объединение, перечисление типы, беззнаковые и длинные типы, сами структуры стали похожи на объект-классы (не имеющими только обозначений для литералов). Не менее важные разработки проводились в его среде и сопутствующих технологиях. После написания ядра Unix на C началось перекодировка утилит и инструментов системы, атак же перенос интересных среди них на другие платформы. Основная сложность с распространением Unix-инструментов заключались не в взаимодействии языка C с новым оборудованием, а в адаптации к существующему программному обеспечению других операционных систем. Из за этого Стив Джонсон и начал работать над компилятором C, который мог легко переноситься на новые машины. В 1980-е годы использование C сильно распространилось. Компиляторы стали доступны практически для каждой архитектуры машин и операционных систем. В начале 80-х почти все компиляторы были основаны на pcc Джонсона, к середине уже стали появляться независимые.

К 1982 году было ясно, что C требуется формальная стандартизация. Лучшее приближение к стандарту, первое издание K&R, больше не описывает реальное использование языка; он не упоминал типа void или enum. Хотя он предвещал новый подход к структурам, только после того, как он был опубликован, поддержка языков назначала их, передавала их в функции и из них и связывала имена членов с категорией или объединением, содержащим их.


Первое издание K&R не было достаточно точным, и становится все более нецелесообразным рассматривать pcc как «ссылочный компилятор»; он не полностью воплощал язык, описанный K&R, не говоря уже о последующих расширениях. Наконец, начальное использование C в проектах, подпадающих под коммерческий и правительственный контракт, означало важность важности официального стандарта. Таким образом (по настоянию М. Д. Макилроя) ANSI учредил комитет X3J11 под руководством CBEMA летом 1983 года для создания стандарта C. X3J11 подготовил свой отчет в конце 1989 года, и впоследствии этот стандарт был принят ISO в соответствии с ISO / IEC 9899-1990.

В начале комитет X3J11 осторожно относился к языковым расширениям. Но они серьезно отнеслись к своей цели: «разработать ясный, целостный и однозначный стандарт для языка C, который кодирует общее существующее определение C и способствует переносимости пользовательских программ в средах языка C». Комитет понял, что простое обнародование стандарта не поможет. X3J11 представил только одно действительно важное изменение для самого языка: он включил типы формальных аргументов в сигнатуру типа функции, используя синтаксис, взятый из C ++.X3J11 также представила множество небольших дополнений и настроек, например, типы классификаторов const и volatile, а также несколько разные правила продвижения по типу.

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

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

X3J11 знал, что полное и тщательное описание стандартной библиотеки C важно так же, как и работа над самим языком. Сам язык C не предусматривает ввода-вывода или любого другого взаимодействия с внешним миром и, следовательно, зависит от набора стандартных процедур. Во время публикации K&R C считался главным образом языком системного программирования Unix; хотя были представлены примеры библиотечных подпрограмм, предназначенные для легкой переносимости в другие операционные системы, явно понималось что сделаны для поддержки Unix. Таким образом, комитет X3J11 потратил большую часть своего времени на разработку и документирование набора библиотечных процедур, которые должны быть доступны во всех соответствующих реализациях.