Файл: История возникновения и развития языка программирования Си (С++) и Java (История Unix).pdf
Добавлен: 30.03.2023
Просмотров: 471
Скачиваний: 2
• Несколько новых заголовков библиотек, включая stdint.h, <tgmath.h>, fenv.h, <complex.h>
• Улучшена совместимость с несколькими функциями C ++, включая встроенные функции, однострочные комментарии с //, смешанные объявления и код, а также универсальные имена символов в идентификаторах
• Удалены несколько опасных языковых функций C89, таких как неявные объявления функций и неявный int
ISO для C99 опубликовали три технических исправления:
• ISO/IEC 9899:1999/Cor.1:2001(E)
• ISO/IEC 9899:1999/Cor.2:2004(E)
• ISO/IEC 9899:1999/Cor.3:2007(E)
C11
C11 — стандарт языка С, принятый в 2011 году как ISO/IEC 9899:2011. Функции включают в себя улучшенную поддержку Unicode, с использованием нового ключевого слова _Generic, межплатформенный многопоточный API (threads.h) и поддержку атомных типов как на основном языке, так и на библиотеке (stdatomic.h).
С18 – текущий стандарт ISO/IEC 9899:2018 – версия скорее косметическая, новых функций нет, зато есть исправления ошибок из ISO/IEC 9899:2011.
Как видно, язык С продолжает своё развитие, использование более почти полвека, внесло множество изменений и корректив в особенности программирования.
Глава 3 Язык программирования С++
Язык С++ появился на свет всё в той же Bell Laboratories Бьёрном Страуструпом в начале 1980-х годов. Язык С++ базируется на С, но содержит ряд усовершенствований над языком С, позволяющих осуществлять разработки объектно-ориентированного кода. Это было сделано Б. Страуструпом для собственных нужд и поначалу даже назывался как "С с классами". Практически все, что есть в С, заложено и в С++.
Языку С++ планировалось стать лучше С, в него были добавлены новые возможности: виртуальные функции, перегрузка функций и операторов, ссылки, константы и многое другое. Он поддерживает такие парадигмы программирования: как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование, обеспечивает модульность, раздельную компиляцию, обработку исключений, абстракцию данных, объявление типов (классов) объектов, виртуальные функции.
Процедурное программирование – это последовательность действий, которая реализуется с помощью языка программирования.
Объектно-ориентированное программирование (ООП) – представляет собой способ организации кода программы, когда основными строительными блоками программы являются объекты и классы, а логика работы программы построена на их взаимодействии. Главной особенностью данного языка являются «классы», определяемый самим программистом. Класс в программировании — это универсальный конструктор описания объектов и терминов. ООП базируется на трех основных принципах. Это инкапсуляция, полиморфизм и наследование. Рассмотрим все при параметра:
Инкапсуляция — это понятие в объектно-ориентированном программирование, обозначающее защиту данных (сокрытие данных) от внешнего пользователя[17]. Если данные и код, управляющий этими данными объединяются вместе, создаётся объект. Или, объект — это то, что поддерживает инкапсуляцию.
Внутри объекта могут быть закрытые коды и данные, которые доступны только для других частей этого объекта, и не доступны для других частей программы. Если данные являются открытыми, соответственно другие част имеют доступ к данным внутри объекта. Характерной является ситуация, когда открытая часть объекта используется для того, чтобы обеспечить контролируемый интерфейс закрытых элементов объекта.
Наследование[18] — это второе свойство объектно-ориентированного программирования, позволяющее наследовать функционал (набор полей и методов) существующего класса (родительского класса) в другой. В общем случае порождённый класс наследует всё, от родительского и добавляет свои собственные характеристики. И всё это вместо того, чтобы создавать класс заново.
Полиморфизм — это свойство объектно-ориентированного программирования, позволяющее одному и тому же методу вести себя по-разному. Если очень кратко, можно выразить мысль следующей фразой: «Один интерфейс, множество реализаций». Полиморфизм снижает сложность программ и позволяет использовать повторно код. Общие свойства объектов объединяются в группу, именуемую интерфейс или класс. Обобщённое программирование имеет с ООП общие цели – упростит повторное использование кодов программ и методов абстрагирования общих понятий — упростить повторное использование кодов программ и методов абстрагирования общих понятий. Однако, в то время как в ООП основное внимание уделяется данным, в обобщенном программировании упор делается на алгоритмы. В отличии от ООП – которое является инструментом для разработки больших проектов, основное назначение обобщенного программирования - инструменты для задач общего характера. Сюда можно отнести такие как, сортировка данных или объединение списков.
Обобщённое программирование — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание.
Название С++ ( где С указывает на Язык С, как основу, а ++ операция наращивания в языке С) было дано Риком Маскитти летом 1983 г[19], подразумевая, что С++ следующая версия языка С.
Его первый коммерческий выпуск состоялся в октябре 1985 года.
Язык программирования C++ является свободным, то есть никто не обладает на него правами.
Достоинства языка:
1. Масштабируемость. На языке C++ разрабатывают программы для самых различных платформ и систем.
2. Возможность работы на низком уровне с памятью, адресами, портами.
3. Возможность создания обобщенных алгоритмов для разных типов данных, их специализация, и вычисления на этапе компиляции, используя шаблоны.
4. Кроссплатформенность. Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.
5. Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы.
Недостатки языка:
1. Наличие множества возможностей, нарушающих принципы безопасности, приводит к тому, что в С++ программы могут легко закрасться трудноуловимая ошибка.
2. Плохая поддержка модульности. Подключение интерфейса внешнего модуля через препроцессорную вставку заголовочного файла (#include) серьёзно замедляет компиляцию, при подключении большого количества модулей.
3. Язык C++ является сложным для изучения и для компиляции.
4. Некоторые преобразования типов неинтуитивны. В частности, операция над беззнаковым и знаковым числами выдаёт беззнаковый результат.
5. Некоторые считают недостатком языка C++ отсутствие встроенной системы сборки мусора. С другой стороны, в C++ имеется достаточно средств, позволяющих почти исключить использование опасных указателей, нет принципиальных проблем и в реализации и использовании сборки мусора (на уровне библиотек, а не языка). Отсутствие встроенной сборки мусора позволяет пользователю самому выбрать стратегию управления ресурсами.
Язык С++ являясь наследником языка С, выделился в отдельный язык, внеся необходимые дополнения, недостающие языку С. Благодаря этому программы на С++ могут быть более компактны, проще в программировании их проще читать и компилировать.
Глава 3.1 Стандарты С++
В 1998 году был опубликован стандарт языка ISO/IEC 14882:1998 «Standard for the C++ Programming Language»[20] (известный как C++98).
В 2003 году опубликован стандарт языка ISO/IEC 14882:2003, где были исправлены выявленные ошибки и недочёты предыдущей версии стандарта
В 2005 году выпущен отчёт Library Technical Report 1 (TR1). Не являясь официально частью стандарта, отчёт описывал расширения стандартной библиотеки, которые должны быть включены в следующую версию языка C++
В 2011 году выход нового стандарта – C++11 или ISO/IEC 14882:2011; новый стандарт включил дополнения в ядре языка и расширение стандартной библиотеки, в том числе большую часть TR1
Выход стандарта C++14 в 2014 («International Standard ISO/IEC 14882:2014(E) Programming Language C++»); C++14 можно рассматривать как небольшое расширение над C++11, содержащее в основном исправления ошибок и небольшие улучшения.
В 2017 году выход нового стандарта – C++1z (C++17) («International Standard ISO/IEC 14882:2017 Programming languages — C++»). Этот стандарт внес много изменений и дополнений. Например, в состав STD вошли библиотеки стандарта C11, файловой системы, основанная на boost::filesystem, большая часть экспериментальной библиотеки TSI.
Язык С++, тоже является стандартизованным и он продолжает развиваться, так же как и С.
Глава 4 Сравнение языков С и С++
Но за дополнительные возможности приходится платить. Поэтому объектный и исполнимый код на С, откомпилированный компилятором С++, как правило, тяжелее и неповоротливее, чем такой же, но полученный С-компилятором. И там, где компактность приложения и скорость его работы критична, там без колебаний отказываются от возможностей ООП и используют С вместо С++.
Прежде чем начать изучать язык программирования С++ вы должны понимать, что это отдельный язык. Хоть он и “сын” языка Си и многим на него похож, но также у них есть много различий. Си, ориентирован на системное программирование. С++, универсальный язык, на 99% совместим с С.
Все различия языков:
По большей части С++ представляет собой надстройку над стандартным ANSI С, и фактически все программы на С являются также программами и на С++. Тем не менее между этими языками имеется несколько различий.
В C++ появились классы и объекты. Технически класс C++ – это тип структуры в C, а объект – переменная такого типа. Разница только в том, что в C++ есть еще модификаторы доступа и полями могут быть не только данные, но и функции.
То, что в C++ – наследование, в C – это просто структура в структуре. При программировании в стиле C++ применяются такие красивые и звучные слова, как “класс Circle порожден от класса Point” или “класс Point наследуется от класса Circle и является производным от него”. При этом реальных усовершенствований два. Первое – поля Point считаются так же и полями Circle, в результате доступ к ним записывается короче, чем в C. Второе – в обоих структурах можно иметь функции-методы, у которых имена совпадают с точностью до имени структуры.
Одним из наиболее важных различий между С и С++ является тот факт, что в С функция, объявленная следующим образом:
int f();
ничего не говорит о своих параметрах. Это означает, что функция может иметь параметры или не иметь их вовсе. В отличие от этого, в С++ объявленная таким образом функция не имеет параметров. Иными словами, в С++ следующие два объявления эквивалентны:
int f();
int f(void);
В С++ ключевое слово void является факультативным. Многие программисты на С++ включают void в качестве средства, улучшающего читаемость программы и указывающего, что у функции нет параметров.
В С++ все функции должны иметь прототипы. В С это требование является факультативным (хотя хорошая программистская практика подразумевает использование прототипов и в С-программах).
Небольшая, но вместе с тем потенциально очень важная разница между С и С++ заключается в том, что в С символьная константа автоматически повышается до целого числа. В С++ это не так.
В С объявление глобальной переменной несколько раз не является ошибкой, хотя и не служит признаком хорошего программирования. В С++ это является ошибкой.
В С идентификатор имеет по крайней мере 31 значащий символ. В С++ все символы рассматриваются как значащие. Однако, как показывает практика, очень длинные идентификаторы редко нужны.
В С можно вызвать функцию main() из программы, хотя это и нетипично. В С++ это недопустимо.
В С нельзя взять адрес регистровой переменной. В С++ можно это сделать.
В C++ появились две новые операции: new и delete. При вызове new автоматически вызывается конструктор, а при вызове delete – деструктор. Нововведение можно описать формулой: new = malloc + конструктор, delete = free + деструктор.
В C++ появились функции, которые вызываются автоматически после создания переменной структуры (конструкторы) и перед ее уничтожением (деструкторы). Во всех остальных отношениях это – обычные функции, на которые наложен ряд ограничений. Некоторые из этих ограничений ничем не оправданы и мешают.
Разработчики C++ ввели слово var. А чтобы все это выглядел оригинально, “var” они переименовали в “&” и назвали “ссылкой”. Это вызвало большую путаницу, так как в C уже были понятия “указатель” и “адрес” (обозначался тем же символом &), а понятие “ссылка” звучит тоже как что-то указующе-адресующее.
Желание программистов C контролировать типы параметров в define-ах породило в C++ inline-функции. Такая функция – это обычный define с параметрами, только не надо мучиться с символами “\” и проверяются типы. Желание узаконить в параметрах define имя типа породило template. Главный плюс template – то, что #define с одинаковыми параметрами породит два одинаковых куска кода. А template в компиляторе скорее всего будет соптимизирован: одинаковые куски кода будут соединены в один.