Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

История возникновения и развития языка программирования Си (С++) и Java (История Unix)

Содержание:

Введение

Наиболее популярными языками программирования на данный момент остаются языки программирования: С, С++ и Java.

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

Язык Java, основанный на С++ так же явился революционным открытием, с появлением сети WWW, внеся свою лепту в развитие интернета. В технологии клиент-серверного программного обеспечения.

Существуют книги, от авторов языка к примеру: Брайан Керниган, Деннис Ритчи «Язык программирования Си» (или сокращённо K&R “C”), Бьёрн Страуструп «Язык программирования C++», так же Герберт Шилдт, известный программист и писатель.

Целью данной работы является проследить развитие наиболее популярных языков программирования. Их история, развитие и сравнить между собой, на сколько это возможно.

Глава 1 История Unix

В конце 60-х годов Bell Telephone Laboratoriesсовместно с компанией General Electric и Массачусетским технологическим институтом организовали совместный проект, целью которого была разработка операционной системы Multics[1]. ОС должна была стать многопользовательской, чтобы обеспечить большое число пользователей удобными и мощными средствами доступа к вычислительным ресурсам, обладала многоуровневой защитой. Виртуальная память должна была иметь сегментно-страничную организацию, где с каждым сегментом связывался уровень доступа. Для того, чтобы какая-либо программа могла вызвать другую программу или обратиться к данным, располагающимся в некотором сегменте, требовалось, чтобы уровень выполнения этой программы был не ниже уровня доступа соответствующего сегмента. Ещё планировалось в ОС Multics реализовать полностью централизованную файловую систему. Это когда, файлы находятся на разных физических устройствах, а логически они присутствуют на одном диске. Т.е. в директории указан не сам файл, а ссылка (или линк) на его физическое месторасположение и, если этого файла там не оказывается, система должна была попросить вставить соответствующее устройство, содержащее этот файл. Кроме всего этого, в ОС Multics планировался большой объем виртуальной памяти, что позволяло делать имэйджи файлов из внешней памяти в виртуальную. Все попытки наладить в системе относительно дружественный интерфейс провалились. В проект было вложено много сил, денег и времени, а результат не устраивал разработчиков из Bell Labs и они оставили его[2]. Кен Томпсон и Денис Ритчи были среди участников проекта, который оставил множество наработок[3]. Считается, что именно ОС Multics послужила толчком к появлению ОС Unix.

Кен с ребятами разрабатывал новую файловую систему, дабы облегчить себе жизнь и работу. Решил опробовать свое изобретение на заброшенной машине PDP-7[4]. Результату отдел патентов AT&T дружно радовался, т.к Unix система имела ряд преимуществ перед системой используемой ранее. Томпсону этого оказалось мало и он принялся ее усовершенствовать, включив такие функции как inodes (индексный дескриптор — это структура данных в традиционных для ОС UNIX файловых системах (ФС), таких как UFS, ext4. В этой структуре хранится метаинформация о стандартных  файлах,  каталогах или других объектах файловой системы, кроме непосредственно данных и имени), подсистему управления процессами и памятью, обеспечивающую использование системы двумя пользователями в режиме TimeSharingа (разделения времени) и простой командный интерпретатор. Кен даже разработал несколько утилит под систему. Сотрудники Кена еще помнили, как они мучались над ОС Multics, поэтому в честь старых заслуг один из них - Брайан Керниган - решил назвать ее похожим именем - UNICS. Через некоторое время название сократили до UNIX.

В ноябре 1971 года был опубликован первый выпуск полноценной документации по Юниксу. В соответствии с этим и ОС была названа «Первой редакцией UNIX», написанная на ассемблере для РDР-11[5]. Включала в себя язык B и много известных комманд и утилит, в том числе cat, chdir, chmod, cp, ed, find, mail, mkdir, mkfs, mount, mv, rm, rmdir, wc, who. В основном использовалась как инструментальное средство обработки текстов для патентного отдела Bell Labs.

12 июня 1972 года Кен Томпсон и Денис Ритчи представили вторую редакцию[6]. Система была полностью переписана на языке B, созданный Томпсоном под влиянием языка BCPL.

Третья редакция, вышедшая в феврале 1973, ничем особенным не отличалась. Единственное, что Денис Ритчи с головой уйти в работу над созданием нового языка программирования, вследствие чего тот написал собственный язык, известный сейчас как С и содержавшая компилятор языка С. Он позволял расширить функции своего предшественника - B[7], а 15 октября того же года была написана четвертая редакция UNIX с переписанным на С системным ядром. Операционная система UNIX первоначально распространялась в исходных кодах на С среди университетов и лабораторий[8], а получатель мог откомпилировать исходный код на С в машинный код с помощью подходящего компилятора С. Распространение исходного кода сделало операционную систему UNIX уникальной; программист мог изменить операционную систему, а исходный код мог быть перенесен с одной аппаратной платформы на другую. В июле 1974 года вышла пятая версия UNIX полностью переписанная на С. Шестая редакция UNIX (UNIX version 6), выпущенная в 1975 году, стала первым коммерчески распространяемым Юниксом. Большая ее часть была написана на С.

В 1979 году была представлена «Седьмая редакция» (UNIX version 7) как «последняя настоящая UNIX»[9], которая включала в себя компилятор языка C, командный интерпретатор sh, систему uucp, была перенесена на 32-разрядный VAX. При этом размер ядра составлял около 40 Кбайт. Позже была полностью переписана подсистема управления оперативной и виртуальной памятью, заодно изменили интерфейс драйверов внешних устройств. Все это позволило сделать систему легко переносимой на другие архитектуры.

Сегодня стандарт POSIX определяет обязательный набор системных вызовов UNIX, доступных в С, которые должны быть реализованы в версиях UNIX, являющихся POSIX-совместимыми.

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

Глава 2 История появления языка Си

1958 году в Цюрихе, в Швейцарской высшей технической школе прошла встреча между европейскими и американскими учёными в области компьютерных наук, с целью разработки нового языка программирования, лишённого недостатков языка Fortran. Так появился язык ALGOL (расшифровывается как ALGorithmic Language)[10]. Из названия прослеживается, что язык планировался для записи математических алгоритмов. С этой точки зрения язык соответствовал необходимым требованиям совершенно, а вот с текстом были определённые проблемы. Так что, язык представлял чисто технический интерес, чем практическое применение.

ALGOL-60[11] (являющийся продолжением совершенствования своего предка), дал вдохновение Математической лаборатории Кембриджского университета и Компьютерному отделу Лондонского университета на создание нового языка. В частности, он позволял использование для более широко круга задач.

Язык CPL так и не стал популярным из-за сложности и грамоздкости, но он послужил для написания языка BCPL (Basic Combined Programming Language), в 1966 году Мартином Ричардсоном студентом Кембриджского университета[12]. Предназначенный для написания компиляторов, он сыграл важную роль из-за хорошей переносимости.

В свою очередь, язык BCPL послужил для написания языка B (Би), в 1969 году в недрах AT&T Bell Lab, людьми уже упоминавшимися в главе про ОС UNIX. Это Кен Томпсоном и Денис Ритчи. Язык B использовался для написания ранних версий UNIX и он послужил родоначальником языка С.

Язык "C" не является языком со строгими типами в смысле паскаля или алгола 68. Он сравнительно снисходителен к преобразованию данных, хотя и не будет автоматически преобразовывать типы данных с буйной непринужденностью языка PL/1. Существующие компиляторы не предусматривают никакой проверки во время выполнения программы индексов массивов, типов аргументов и т.д. [13]

Как видим язык С появился не на ровном месте, он наследует в себе наработки от разных предыдущих языков программирования.

Глава 2.1 Достоинства и недостатки

С стал первым языком высокого уровня, который смог отнять лавры у ассемблера в разработке системного программного обеспечения, особенно в мире свободного программного обеспечения, реализованного на огромном количестве аппаратных платформ[14]. И всё-таки данный язык имеет свои недостатки.

Самое основное, язык очень сложный и небезопасный с силу своего рождения во времена прямого программирования под различные процессоры. Из-за различных допущений в языке, при компиляции программ могут возникать различные непредсказуемые ошибки, что может приводить к разным проблемам при выполнении программ. Несмотря на то, что современные компиляторы имеют опции для статического анализа кода, даже это не может выявить всех ошибок. Отсутствие обратной связи при компиляции, позволяют при программировании получить код с явными логическими ошибками. В результате такого неграмотного программирования, могут появляться всевозможные уязвимости безопасности исполнения кода.

Язык С не является легко обучаемым, чтобы изучить досконально, необходимо изучить документацию примерно в 500 страниц. И даже это не гарантирует отсутствия ошибок. К примеру, при автоматическом приведении операндов целочисленных выражений к типу int может давать трудно предсказуемые результаты при использовании бинарных операторов.

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

Проблемы при передаче функций, переменных и данных, из других файлов при помощи макроподстановки #include. При нарушении взаимосвязи между кодами файлов или в заголовках файлов, могут возникать всевозможные ошибки этапа компоновки или ошибки памяти (порчи стека или ошибок сегментирования). При автоматическом или динамическом создании объектов по умолчанию не инициализируются и значения остаются в памяти. На разных платформах результат непредсказуем и если будет пропущена по каким-то причинам будет пропущена инициализация, то данные могут оказать непредсказуемый результат.

Можно с уверенностью сказать, что «плюсы» языка С по работе с любыми адресами, данными и массивами памяти, при безграмотном использовании могут обернуться «минусами».

Глава 2.2 Стандарты языка С

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

С89[15]

В 1983г. ANSI (Американский Национальный Комитет Стандартов) сформировал технический комитет X3J11 для создания стандарта языка C (чтобы "обеспечить недвусмысленное и машинно-независимое определение языка"). В 1989 стандарт был утвержден и ратифицирован как ANSI X3.159-1989 «Язык программирования C». Через некоторое время стандарт был принят и ISO (Международной Организацией Стандартов), чтобы стандартизовать C в международном масштабе; совместный стандарт был опубликован в 1990 году и назван ANSI/ISO 9899:1990. Дальнейшие стандарты разрабатывала уже ISO, а ANSI уже принимала их. Несмотря на это стандарт до сих пор чаще называют «ANSI C», или «C89» (чтобы отличить её от C99), а не ISO C.

C90

В 1990 году, стандарт ANSI C был принят Международной организацией по стандартизации (ISO) как ISO/IEC 9899:1990, с изменениями форматирования. Эту версию иногда называют C90. Однако, термины C89 и C90 относятся, по сути, к одному языку.

Этот стандарт был отозван как ANSI/INCITS, так и ISO/IEC.

C95

В 1995 году ISO опубликовала расширение, названное Поправкой 1, для стандарта ANSI-C. Его полное имя было ISO / IEC 9899 / AMD1: 1995 или коротко - C95. Помимо исправления ошибок были внесены изменения в языковые возможности, такие как:

• Улучшена многобайтная и широкосимвольная поддержка символов в стандартной библиотеке, введены <wchar.h> и <wctype.h>

• Добавление диграфов

• Спецификация стандартных макросов для альтернативной спецификации операторов, например and для &&

• Спецификация стандартного макроса __STDC_VERSION__

В дополнение к поправке, два технических исправления были опубликованы ISO для C90:

• ISO/IEC 9899 TCOR1 в 1995 году

• ISO/IEC 9899 TCOR2 в 1996 году

C99[16]

В марте 2000 года ANSI принял стандарт ISO/IEC 9899:1999. Этот стандарт обычно называют C99. Включает некоторые примечательные дополнения к предыдущему стандарту:

• Новые встроенные типы данных: long long, _Bool, _Complex, и _Imaginary

• Несколько новых функций основного языка, включая индексы статического массива, назначенные инициализаторы, сложные литералы, массивы переменной длины, гибкие члены массива, переменные макросы и restrict ключевое cлово

• Несколько новых заголовков библиотек, включая 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 в компиляторе скорее всего будет соптимизирован: одинаковые куски кода будут соединены в один.

Разные стандартные расширения файлов. file.c – означает файл написан на языке С, а file.cpp – означает что файл написан на языке С++.

В С++ ключевое слово void является факультативным. Многие программисты на С++ включают void в качестве средства, улучшающего читаемость программы и указывающего, что у функции нет параметров.

В С++ все функции должны иметь прототипы. В С это требование является факультативным.

В С символьная константа автоматически повышается до целого числа. В С++ это не так.

В С объявление глобальной переменной несколько раз не является ошибкой, хотя и не служит признаком хорошего программирования. В С++ это является ошибкой.

В С идентификатор имеет по крайней мере 31 значащий символ. В С++ все символы рассматриваются как значащие.

В С можно вызвать функцию main() из программы, хотя это и нетипично. В С++ это недопустимо.

В С нельзя взять адрес регистровой переменной. В С++ можно это сделать.

В данной главе отражены не все различия между языками, их больше и со временем

Глава 5 История возникновения Java

История технологии Java начинается с 1991, когда компания Sun Microsystems c членом Совета директоров Джеймса Гослинга и группа инженеров под руководством Патрика Нотона приступила к разработке языка программирования для различных бытовых приборов. Т.к. Устройства могут быть построены на разных микросхемах и с разным количеством памяти, важно было не привязываться к архитектуре. Название проект получил "Green".

"Группе была поставлена задача создать распределенную систему, которую можно было бы в качестве современной программной технологии продавать производителям бытовой электроники," - вспоминает Гослинг.

Сначала разработку начали производить на языке С++, пытаясь расширить функции компилятора. Но потом, решили создать свой язык.

"В конце концов, язык — это средство, а не самоцель, - поясняет Гослинг. - Мы не собирались зацикливаться на С++, а хотели разработать систему, которая позволяла бы создавать большую распределенную разнородную сеть из бытовых электронных устройств, способных взаимодействовать между собой".

Так с середины 1991 года появился язык Oak. Как выяснилось позже, уже существовал язык программирования с таким именем и тогда название поменяли на Java.

В конце 1992 года, свет увидел утройство *7, это названное "ручным пультом дистанционного управления". Однако данное изобретение не заинтересовало производителей и группа принялась за разработку устройства для кабельного телевидения. Результат оказался тем же.

С середины 1994 начала набирать сеть World Wide Web. Для преобразования гипертекста в изображение использовался браузер. В то время популярным был браузер Mosaic, некоммерческим Web-броузером, разработанным в суперкомпьютерном центре Университета штата Иллинойс (University of Illinois) в 1993 году.

"Мы поняли, что сможем создать действительно первоклассный браузер, - говорит Гослинг. — Это один из немногих компонентов архитектуры клиент-сервер, который мы могли бы наделить такими необходимыми ему качествами, как независимость от архитектуры, работа в реальном времени, надежность, безопасность, не имеющие такого значения для рабочих станций. Поэтому мы и разработали браузер"[21]. К осени Нотон и его коллега по Sun Джонатан Пэйн закончили писать WebRunner - Web-браузер, написанный на языке Java. Эта первая реализация HotJava проявила Java-технологию в новом свете, и эта демонстрация была произведена на выставке Sun World '95 23 мая 1995 года. Получить вместо статической страницы, динамически изменяемую, выполняя Java-код внутри страницы, это производит сильный эффект. После выставки началось продвижение Java. Sun всячески поддерживала стремление разработчиков выпуская новые версии сред для разработки Java-приложений.

Глава 5.1 Этапы развития языка Java

В начале 1996 года появляется Java версии 1.0. Совершенно сырой продукт, не предназначенный для серьёзных проектов. Единственное в чём его предназначение, визуальные эффекты для браузера. Из данной версии даже нельзя было послать на печать. В следующей версии Java 1.1 добавили новые библиотечные элементы, новые средства для обработки событий, перекомпонованы библиотеки из Java 1.0[22]. От некоторых функций полностью отказались.

В 1998 на конференции JavaOne[23] была представлена версия 1.2 ставшая поворотным событием в судьбе продукта. В новой версии появились мощные средства создания графических интерфейсов и приложений. Практически сразу версия 1.2 была переименована в Java2 (Java 2 Standard Edition Software Development Kit Version 1.2). Вместе с этим появились ещё такие версии продуктов, как: Macro Edition для мобильных устройств, так и Enterprise Edition для корпоративных приложений.

Версия 1.3 подверглась изменениям, среду разработки «уплотнили», не сильно расширился функционал. В версии 1.4 на ряду с новыми командами, появились системы ввода-вывода на основе каналов. Внесены изменения в Collections Framework. Оказалось, что на Java удобно разрабатывать высококачественные серверные приложения.

Версия 5 вышедшая в сентябре 2004 принесла много новшеств. К примеру: обобщения, аннотации, автоупаковка и автораспаковка, перечисления, усовершенствованный цикл for в стиле foreach, аргументы переменной длины (varargs ), статический импорт, форматированный ввод-вывод, утилиты параллельной обработки. Это только глобальные, не считая косметических. Версия получилась на столько революционной, что разработчики приняли решение присвоить ей номер не 1.5, а версия J2SE 5.0, тем самым подняв значимость события

Декабрь 2006 ознаменован выходом Java SE версии 6, как видно из названия исчезла цифра 2. Серьёзных изменений не произошло. Были проведены работы направленные на улучшение производительности и расширения библиотек.

Испытывая финансовые трудности, компания Sun Microsystems была куплена компанией Oracle (этот процесс начался в апреле 2009 года и завершился в январе 2010 года). В 2009 году язык Java сменил своего владельца. И только летом 2011 года вышла 7 версия. Изменений было внесено много, но по сути они являлись «мелкими».

Версия SE 8 март 2014 принесла изменения с вводом лямбда-выражений, их внедрение принесло изменение в библиотеки Java.

Данная версия остаётся на сегодня самой последней. И за 5 лет новых революционных изменений не происходит. Складывается впечатление, что популярность язык постепенно снижается.

Глава 6 Сравнение Java c C++

Java и C++ — объектно-ориентированные языки программирования, но на этом их сходства, пожалуй, заканчиваются, а вот отличий между ними достаточно много.

Java — чистый объектно-ориентированный язык программирования; следовательно, в Java все является объектом (однокорневая иерархия, поскольку всё исходит от java.lang.Object).

В то время как в C++ не существует подобной корневой иерархии. C++ поддерживает как процедурное, так и объектно-ориентированное программирование; поэтому он называется гибридным. Ниже в таблице приведены основные характеристики этих языков и их отличия.

Основные отличия языков Java и C++:

Java не поддерживает указатели (pointers), шаблоны (templates), объединения (unions), перегрузку операторов (operator overloading), структур и т.д. Изначально было заявлено, что в языке Java нет никаких указателей, но многим программистам было непонятно, как можно работать без указателей, и тогда стали говорить, что их ограниченное количество. Java поддерживает так называемые «ссылки» (“references”). Ссылки имеют во многом схожую с указателями в С++ функцию, но на указателях в Java невозможно совершать арифметические действия. У ссылок есть типы, и они типобезопасны (type-safe). Их нельзя интерпретировать как адрес raw, а небезопасная конверсия запрещена.

C++ поддерживает структуры, объединения (unions), шаблоны (templates), перегрузку операторов (operator overloading), указатели (pointers) и адресную арифметику указателей (pointer aritdmetic).

Java поддерживает автоматическое управление освобождением динамической памяти. Она, в отличие от C++, не поддерживает деструкторы.

C++ поддерживает деструкторы. Эта функция автоматически активируется при уничтожении объекта.

Java не поддерживает условную компиляцию и включение.

Условное включение (#ifdef #ifndef type) – одна из основных функций C++.

Java обладает встроенной поддержкой потоков (tdreads). В Java есть класс потоков, который наследуется для создания нового потока и переопределения метода run.

C++ не имеет встроенной поддержки потоков. Для этих целей используются нестандартизированные библиотеки третьих сторон.

Java не поддерживает параметры по умолчанию. В Java нет оператора разрешения контекста (::). Определения метода должны происходить внутри класса, поэтому нет нужды в разрешении конфликта.

C++ поддерживает параметры по умолчанию. C++ имеет оператор разрешения контекста (::), используемый для определения метода вне класса и для доступа к глобальной переменной внутри из области действия идентификатора, где внутренняя переменная также существует с тем же именем.

В Java нет оператора перехода «goto». Сохраняются ключевые слова «const» and «goto» несмотря на то, что они не используются.

C++ обладает оператором перехода «goto». Однако, использование оператора перехода «goto» не приветствуется.

Java не предоставляет множественное наследование, по крайней мере, не так, как C++.

C++ поддерживает множественное наследование. Для устранения неоднозначности в случае её возникновения во время множественного наследования используется ключевое слово «virtual».

Обработка исключений «exceptions» в Java отличается, поскольку деструкторы отсутствуют. К тому же в Java команды «try/catch» должны определяться в том случае, если функция указывает, что может сгенерировать исключения «exception».

В то время, как в C++ может не включать команды «try/catch» несмотря на то, что эта функция генерирует исключения.

В Java есть метод перегрузки «metdod overloading», но отсутствует перегрузка операторов «operator overloading». Класс «Stringclass» не использует операторы + и += для соединения строк «strings», а строковые выражения «Stringexpressions» используют автоматическое преобразование типов, но это особенная встроенная опция (built-in case).

C++ поддерживает как перегрузку метода, так и перегрузку оператора.

Java имеет встроенную поддержку комментариев к документации (/** ... */); поэтому исходные файлы Java могут содержать собственную документацию, которая читается отдельным инструментом, обычно Javadoc, и переформатироваться в HTML. Это упрощает ведение документации.

C++ не поддерживает комментарии к документации.

Java, по большей мере, интерпретируется, поэтому не зависит от платформы.

C++ генерирует объектный код; тот же код может не запускаться на разных платформах.

Как видим, хоть и есть сходство Java c C++, они совершенно разные и преследуют разные задачи.

Заключение

Данная работа показала, что язык С появился на свет благодаря операционных систем Unix, послужил для развития многих ОС *nix и явился основоположником последующих языков, рассмотренных в этой курсовой. Как и для чего происходили этапы развития языка. Какое применение он нашёл и почему достиг такой популярности. С какими трудностями сталкиваются программисты, использующие данные инструменты для своей деятельности.

С++ демонстрирует те возможности, которых не хватало в С, за счёт добавления новых возможностей, язык С++ стал более популярным, чем С. Конечно поставленную задачу можно решить и с помощью языка С, но это может способствовать увеличению кода и возможно появлению всевозможных ошибок. Язык С++ не является совершенным, в нём тоже есть множество недочётов, которые стараются исправить с помощью правил и стандартов.

Но внимание к обоим языкам не ослабевает за счёт программного обеспечения с открытым кодом.

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

Библиография

Вахалия Ю. Unix изнутри / Ю. Вахалия. - М.: Питер, 2003 – 844 с.

Ершов А.П. Алгоритмический язык Алгол-60 / А.П. Ершов – М.: Мир, 1965. – 77 с.

Издательство «открытые системы» https://www.osp.ru/news/articles/1997/0511/13032038

Керниган Б. UNIX — универсальная среда программирования / Б. Керниган. – М.: Финансы и статистика, 1992 – 537 с.

Керниган Б., Ритчи Д. Язык программирования Си / Б. Керниган, Д. Ритчи, Б– С-П.: Невский Диалект, 2001. – 337 с.

Колисниченко Д. Н. LINUX: Полное руководство / Д. Н. Колисниченко – СПб.: Наука и Техника, 2006. – 784 с.

Материал из Национальной библиотеки им. Н. Э. Баумана, 2018. URL:https://ru.bmstu.wiki/ALGOL

Немет Э. Unix и Linux руководство системного администратора / Э. Не-мет. – М.: Вильямс, 2012. - C.1280.

Родобудько В. Рождение патриарха // Мой компьютер. – 2003. - №22/245. – С.50.

Столяров А.В. Язык Си и начальное обучение программированию // Сборник статей молодых учёных факультета ВМК МГУ. – 2010. - №7 – 109 с.

Страуструп Б. Язык программирования C++. Специальное издание / Б. Страуструп. – М.: Бином, 2011. – 1135 с.

Торвальдс Л., Дэвид Даймонд. Just for Fun. Рассказ нечаянного революционера / Л. Торвальдс, Д. Даймонд. - М.: Эксмо-Пресс, 2002. – 288 с.

Хорстман К. Java. Библиотека профессионала / К. Хорстман. – В 2 т. -Т. 1. – М.: Вильямс, 2014. – 864 с.

Шилдт Г. Java: руководство для начинающих / Г. Шилдт, 7-е изд. : Пер. с англ. - СПб. : ООО "Диалектика", 2019. - 816 с.

Шилдт Г. Полный справочник по С / Г. Шилдт – М.: Вильямс, 2002. – 704 с.

  1. Вахалия Ю. Unix изнутри / Ю. Вахалия. - М.: Питер, 2003 – С.31.

  2. Родобудько В. Рождение патриарха // Мой компьютер. – 2003. - №22/245. – С.50.

  3. Торвальдс Л., Дэвид Даймонд. Just for Fun. Рассказ нечаянного революционера / Л. Торвальдс, Д. Даймонд. - М.: Эксмо-Пресс, 2002. – C.28.

  4. Керниган Б. UNIX — универсальная среда программирования / Б. Керниган. – М.: Финансы и статистика, 1992 – С.3.

  5. Родобудько В. Рождение патриарха // Мой компьютер. – 2003. - №22/245. – С.50.

  6. Вахалия Ю. Unix изнутри / Ю. Вахалия. - М.: Питер, 2003 – С.23.

  7. Немет Э. Unix и Linux руководство системного администратора / Э. Немет. – М.: Вильямс, 2012. - C.1280.

  8. Торвальдс Л. Just for Fun. Рассказ нечаянного революционера / Л. Торвальдс. - М.: Эксмо-Пресс, 2002. – C.28.

  9. Колисниченко Д. Н. LINUX: Полное руководство / Д. Н. Колисниченко – СПб.: Наука и Техника, 2006. – С.23.

  10. Материал из Национальной библиотеки им. Н. Э. Баумана, 2018. URL:https://ru.bmstu.wiki/ALGOL

  11. Ершов А.П. Алгоритмический язык Алгол-60 / А.П. Ершов – М.: Мир, 1965. – С.5.

  12. Ритчи Д., Керниган Б. Язык программирования Си / Д. Ритчи, Б. Керниган – С-П.: Невский Диалект, 2001. – С.11.

  13. Ритчи Д., Керниган Б. Язык программирования Си / Д. Ритчи, Б. Керниган – С-П.: Невский Диалект, 2001. – С.11

  14. Столяров А.В. Язык Си и начальное обучение программированию // Сборник статей молодых учёных факультета ВМК МГУ. – 2010. - №7 – С.1

  15. Материал из Национальной библиотеки им. Н. Э. Баумана, 2018. URL: https://ru.bmstu.wiki/ANSI_C

  16. Шилдт Г. Полный справочник по С / Г. Шилдт – М.: Вильямс, 2002. - С.256.

  17. Страуструп Б. Язык программирования C++. Специальное издание / Б. Страуструп. – М.: Бином, 2011. – С.883.

  18. Шилдт Г. Java: руководство для начинающих / Г. Шилдт, 7-е изд. : Пер. с англ. - СПб. : ООО "Диалектика", 2019. - С.38.

  19. Страуструп Б. Язык программирования C++. Специальное издание / Б. Страуструп. – М.: Бином, 2011. – С.46.

  20. Страуструп Б. Язык программирования C++. Специальное издание / Б. Страуструп. – М.: Бином, 2011. – С.26

  21. Издательство «открытые системы» https://www.osp.ru/news/articles/1997/0511/13032038

  22. Шилдт Г. Java: руководство для начинающих / Г. Шилдт. - СПб.: ООО "Диалектика", 2019. – С.18.

  23. Хорстман К. Java. Библиотека профессионала / К. Хорстман. – В 2 т. -Т. 1. – М.: Вильямс, 2014. – С.31.