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

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

Содержание:

Введение

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

Языку программирования свойственные две связанные между собой цели: он дает программисту аппарат для того, чтобы задать действия, которые должны быть выполнены, и формируются концепции, используемые программистом, размышляя о том, что делать. Ответом на первую цель является язык, который настолько «близкий к машине», что все основные машинные аспекты могут легко и просто быть использованы для программиста очевидным образом. Для ответа на вторую цель идеальным является язык, который настолько «близкий к решаемой задаче», чтобы её концепция решения может быть выражена коротко и прямо. В настоящее время C++ считают господствующим языком, который используют для того, чтобы разработать коммерческие программные продукты. За последние годы данное господство поколебалось так как были аналогичные претензии от такого языка как Java, но при этом общественное мнение качнулось в другую сторону, и множество из программистов, которые бросили C++ ради Jаvа, за последнее время вернулись к своей прежней привязанности. При этом оба языка являются похожими, что, если вы изучаете один из них, то автоматически усваиваете 90% другого.

Цель настоящей работы: изучить историю языков программирования С, C++ и Java. Для достижения вышеозначенной цели необходимо выполнить ряд задач:

  • изучить источники информации по теме;
  • узнать историю языков Си (C++) и Java;
  • рассмотреть развитие языков Си (C++) и Java.

Объектом исследования являются объектно-ориентированные языки программирования С (C++) и Java, предметом – их история, эволюция и потенциал Выполненная работа состоит из введения, трех глав и заключения.

1. История возникновения языка C

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

Следует более подробно рассмотреть особенности языка С:

  1. Академичность. С(++) – классический язык, ознакомление начинающего программиста с которым вооружит его необходимой логикой объектно-ориентированного программирования и значительно упростит вхождение в прочие среды разработки, например, C#, где родственный синтаксис, нативная среда, встраиваемость позволят гораздо быстрее сориентироваться в новых условиях.
  2. Кроссплатформенность. Диалекты, версии, модификации существуют для каждой платформы.
  3. Минималистичность синтаксиса. Достаточно лаконичные записи и выражения обуславливают конкретность инструкций. Впрочем, с появлением языка Python данный пункт следует поправить на «относительная минималистичность».
  4. Диалектичность. С эволюцией языка C стали появляться новые операторы, призванные упростить написание инструкций. А открытость среды позволила добавить собственные операторы. Сразу же вспоминается история SQL, когда элементарный по сути и, практически, естественный язык с добавлением операторов и с каждой новой версией превратился в итоге в усложненное семейство диалектов с сотнями новых операторов в каждом.
  5. Эффективность. Следует отметить, что достаточно лаконичный синтаксис и эффективный компилятор способны произвести программы с высокой скоростью работы и небольшого размера.

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

Язык программирования C был разработан в начале 1970-х годов как язык реализации системы для зарождающейся операционной системы Unix. Происходя из языка без типов BCPL, он развил их структуру. Созданный на крошечной машине в качестве инструмента для улучшения скудной среды программирования, он стал одним из ключевых языков современности.

Конец 1960-х оказался бурной эпохой развития компьютерных систем в BellTelephoneLaboratories. Компаниявышлаизпроекта Multics, которыйначиналсякаксовместноепредприятие Massachusetts Institute of Technology, General Electric и Bell Labs. К 1969 неформальная группа проекта, возглавляемая Кеном Томпсоном, начала исследовать альтернативные решения.

Томпсон хотел создать удобную вычислительную среду, построенную в соответствии с его собственным вкусом и использованием всех доступных средств и инноваций проекта Multics, включая явное представление о процессе как о локусе управления, иерархическую файловую систему, интерпретатор команд на уровне пользователя, простое представление текстовых файлов и общий доступ к устройствам. Томпсон столкнулся с жесткой и скудной аппаратной средой даже на то время: DECPDP-7, на котором он начал свою работу в 1968 году, представлял собой машину с 8000 18-битными словами памяти и без какого-либо программного обеспечения. Желая использовать язык более высокого уровня, он написал оригинальную систему Unix на ассемблере PDP-7.

Ассемблер Томпсона PDP-7 превзошел даже DEC. Не было ни библиотек, ни загрузчика, ни редактора ссылок: весь исходный код программы был предоставлен ассемблеру, а полученный выходной файл с фиксированным именем был непосредственно исполняемым.

Вскоре после первого запуска Unix на PDP-7, в 1969 году, ДагласМакилрой создал первый язык высокого уровня для новой системы: реализацию TMG, языка для написания в стиле нисходящего рекурсивного спуска, который объединяет синтаксическую нотацию без контекста с процедурными элементами.

Попробовав компиляторМакилроя, Томпсон решил, что Unix нуждается в языке системного программирования. После провала Фортрана он создал собственный язык, который он назвал B, который уже чем-то походил на C, но без использования типов. А точнее, это был BCPL, сжатый до 8 Кбайт памяти и переосмысленный Томпсоном. Его названиепроисходит от Bon, несвязанного языка, созданного Томпсоном во времена Multics.

После того, как версия B для TMG заработала, Томпсон переписал этап начальной загрузки. Во время разработки он постоянно боролся с ограничениями памяти: каждое добавление языка перегружало компилятор, но каждая новая версия уменьшала его размер. Томпсон экспериментировал с операторами, например, с инкрементами и декрементами, устраняя проблему перегрузки памяти и обогащая язык новыми операторами, призванными облегчить написание полезного кода.

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

В 1971 году Томпсон начал расширять язык B, добавив символьный тип, а также переписал его компилятор для генерации машинных инструкций вместо многопоточного кода. Таким образом, переход от B к C был совмещен с созданием компилятора, способного создавать небольшие программы достаточно быстро, чтобы конкурировать с ассемблером. Новый язык был назван «Новым B» - NB.

NB существовал настолько кратко, что не было написано полное описание. Он предоставляет типы int и char, их массивы и указатели на них.

int i, j;

char c, d;

int iarray [10];

int ipointer [];

сhar сarray [10];

charcpointer [];

Семантика массивов осталась точно такой же, как в B и BCPL: объявления iarray и carray создают ячейки, динамически инициализируемые со значением, указывающим на первое из последовательности из 10 целых чисел и символов соответственно. Значения, хранящиеся в ячейках, привязанных к именам массивов и указателей, были машинными адресами, измеренными в байтах, соответствующей области хранения. Следовательно, косвенное обращение к указателю подразумевает отсутствие затрат времени выполнения для масштабирования указателя от смещения до байта.

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

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

Это изобретение позволило большинству существующих B-кодов продолжать работать, несмотря на изменения в семантике языка. Новый язык сохранил последовательное и работоспособное (если необычное) объяснение семантики массивов, одновременно открывая путь к более полной структуре типов.

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

Многие другие изменения произошли в 1972-1973 годах, но самым важным было введение препроцессора, отчасти по настоянию Алана Снайдера, но также в знак признания полезности механизмов включения файлов, доступных в BCPL и PL/I. Его оригинальная версия была чрезвычайно простой и содержала только включенные файлы и простые замены строк: #include и#define-макросов без параметров. Вскоре после этого он был расширен, главным образом Майком Леском, а затем Джоном Рейзером, для включения макросов с аргументами и условной компиляцией. Препроцессор изначально считался необязательным дополнением к самому языку. Действительно, в течение нескольких лет он даже не вызывался, если исходная программа не содержала специального сигнала в своем начале. Такое отношение сохранялось довольно долго и объясняет как неполную интеграцию синтаксиса препроцессора с остальным языком, так и неточность его описания в ранних справочных руководствах.

К началу 1973 года основы современного языка С были завершены. И он, и компилятор были достаточно сильны, чтобы позволить переписать ядро ​​Unix для PDP-11 на C. Написание ядра Unix на C вселило в Томпсона достаточную уверенность в полезности и эффективности языка, и он с коллегами начал перекодировать системные утилиты и инструменты, а затем перенести наиболее интересные из них на другие платформы. Команда обнаружила, что самые сложные проблемы при распространении инструментов Unix заключаются не во взаимодействии языка C с новым оборудованием, а в адаптации к существующему программному обеспечению других операционных систем. Таким образом, Стив Джонсон начал работать над новым компилятором для С – pcc, а Томпсон переносил переписанный Unix на машину Interdata 8/32.

Успех эксперимента по переносимости на Interdata 8/32 вскоре привел к использованию машины DECVAX 11/780. Эта машина стала намного более популярной, чем Interdata, и Unix, и язык C начали быстро распространяться как внутри AT&T, так и за пределами компании. Хотя к середине 1970-х годов Unix использовался различными проектами в системе BellSystem, а также небольшой группой ориентированных на исследования промышленных, академических и государственных организаций за пределами нашей компании, его реальный рост начался только после того, как была достигнута определенная его переносимость. Особо следует отметить версии системы SystemIII и SystemV из нового подразделения AT&TComputerSystems, основанные на работе групп разработчиков и исследователей компании.

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

Ниже на рисунке 1 представлена иллюстрация истории языка С.

Язык В (1970)

Кен Томпсон

BPCL (1967)

Мартин Ричардс

ALGOL (1960)

Международная

группа

ANSI C (1989)

Объединение ANSI

K&RC (1978)

Керниган и Ритчи

Язык С (1972)

Деннис Ритчи

С11 (2011)

Объединение по стандартизации

С99 (1999)

Объединение по стандартизации

ANSI/ISOC (1990)

Стандартизация качества

Рисунок 1 – Иллюстрация истории языка С

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

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

2. История возникновения языка C++

Бьерн Страуструпизобрел С++, написал его первые определения и создал его первую реа­лизацию. Он выбрал и сформулировал критерии проектирования для С++, раз­работал основные языковые функции, разработал или помогал разрабатывать многие ранние библиотеки и в течение 30 лет отвечал за обработку предложе­ний по расширению в комитете по стандартам С++[1].

С++ был разработан для предоставления возможностей Simula по организации программ в сочетании с эффективностью и гибкостью С для системного программирования. Язык программирования Simula был первоначальным источником механизмов абстракции С++. Понятие класса (с производными классами и виртуальными функциями) было заимствовано именно из него. Однако позже в С++ появились шаблоны и исключения с со­всем другими источниками вдохновения.

Эволюция С++ всегда находилась в контексте его применения. Страуструп провел много времени, слушая пользователей и выясняя мнения опытных программистов. В частности, его коллеги из AT&TBellLaboratories были просто не­обходимы для развития С++ во времена его первого десятилетия.

Первоначально Страуструп разработал и реализовал язык, потому что хотел распре­делить службы ядра Unix по многопроцессорным и локальным сетям (которые в 2019 году называются многоядерными и кластерными). Для этого ему нужно было точно указать части системы и то, как они взаимодействовали и нужно было иметь дело непосредственно с аппарат­ным обеспечением, предоставить высокопроизводительные механизмы па­раллельного программирования, для которых С был бы идеальным, если бы не его слабая поддержка модульности и проверки типов. Результат добавле­ния классов в стиле Simula к С дал «С с классами», который использовался для крупных проектов, в которых его возможности для написания программ, минимально использующих время и память, были подвергнуты жестким испытаниям. В нем отсутствовали перегрузка операторов, ссылки, виртуальные функции, шаблоны, исключения и многие другие детали. Первое использование С++ вне исследовательской организации началось в июле 1983 года[2].

Название «С++» было придумано Риком Маскитти летом 1983 года и выбрано Страуструпом в качестве замены названия «С с классами». Назва­ние обозначает эволюционную природу изменений от предшественника, ведь "++" – это оператор инкремента в С. Немного более короткое имя "С+" является синтаксической ошибкой; кроме того, оно уже использовалось как название языка, не связанного с С++. Язык не был назван «D», потому что был расши­рением С, не пытался исправить проблемы, удаляя функциональные возмож­ности, и уже существовало несколько потенциальных наследников С с именем «D».

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

Первый дизайн С++ включал объяв­ления функций с проверкой типов аргументов и неявными преобразования­ми, классы с различием между publicинтерфейсом и privateреализаци­ей, производные классы, а также конструкторы и деструкторы. Страуструписпользовал макросы для обеспечения примитивной параметризации. В конце 1980 года он смог представить набор языковых средств, поддерживающих со­гласованный набор стилей программирования и считает наиболее важным введение конструкторов и деструкторов. В этом – корень стратегий С++ по управ­лению ресурсами (вызвавших потребность в исключениях) и ключ ко многим технологиям, делающим код пользователя коротким и понятным. Если в то время и были другие языки, которые поддерживали несколько конструкторов, способных выполнять общий код, Страуструпих не знал. Деструкто­ры оказались новинкой С++.

С++ был выпущен в продажу в октябре 1985 года. К тому времени Страуструп доба­вил встраивание, const, перегрузку функций, указатели, перегрузку операторов и виртуальные функции. Из этих возможностей, безусловно, наиболее противоречивой была поддержка полиморфизма времени выполнения в форме виртуальных функций. Страуструп долго не мог убедить программистов в его ценнос­ти. Системные программисты склонны рассматривать косвенные вызовы функций с подо­зрением, а людям, знакомым с другими языками, поддерживающими объек­тно-ориентированное программирование, было трудно поверить, что вирту­альные функции могут быть достаточно быстрыми, чтобы быть полезными в системном коде. И наоборот, многим программистам с объектно-ориенти­рованным опытом пришлось привыкнуть (а многие до сих пор испытывают трудности) к идее, что вызовы виртуальных функций используются только для выражения выбора, который должен быть сделан во время выполнения. Сопротивление виртуальным функциям может быть связано с сопротивлени­ем идее о том, что ре­гулярная структура кода даст лучший результат.

В ранних документах С++ описывался следую­щим образом:

С++ – язык программирования общего назначения, который

  • лучше С;
  • поддерживает абстракцию данных;
  • поддерживает объектно-ориентированное программирование.

Обратите внимание: не «С++ является объектно-ориентированным язы­ком программирования». Здесь «поддерживает абстракцию данных» означает сокрытие информации, классы, не являющиеся частью иерархии классов, и обобщенное программирование. Изначально обобщенное программирование поддерживалось очень слабо, с использованием макросов. Шаблоны и концепты появились намного позже.

Во второй половине 1980-х годов Страуструппродолжал добавлять языковые воз­можности в ответ на комментарии пользователей. Наиболее важными из них были шаблоны и обработка исключений, которые на момент начала разработки стандарта считались экспериментальными. При разработке ша­блонов он был вынужден выбирать между гибкостью, эффективностью и ран­ней проверкой типов. В то время никто не знал, как одновременно получить все три свойства. Страуструп чувствовал, что, чтобы конкурировать с кодом в стиле С для требовательных системных приложений, он должен был выбрать первые два свойства. Проектирование исключений было сосредоточено на многоуровневом распространении исключений, передаче произвольной информации обработчику ошибок и интеграции исключений и управления ресурсами с использованием локаль­ных объектов с деструкторами для представления и освобождения ресурсов[3].

Страуструпобобщил механизмы наследования С++ для поддержки нескольких ба­зовых классов. Это называлось множественным наследованием и счи­талось трудным и противоречивым. Он считал эту возможность гораздо ме­нее важной, чем шаблоны или исключения. Многократное наследование абстрактных классов (часто называемых интерфейсами) в настоящее время широко распространено в языках, поддерживающих статическую проверку типов и объектно-ориентированное программирование.

Взрывной рост использования С++ вызвал некоторые изменения. В 1987 го­ду стало ясно, что неизбежна формальная стандартизация С++. Результатом стало сознательное стремление поддерживать связь между разработчиками компиляторов С++ и их основными пользователями. Это было сделано с по­мощью бумажной и электронной почты и личных встреч на конференциях по С++ и в других местах.

AT&TBellLabs внесла большой вклад в развитие С++, позволив Страуструпу по­делиться проектами пересмотренных версий справочного руководства по С++ с разработчиками и пользователями. Комитет X3J16 ANSI был созван в де­кабре 1989 года по инициативе Hewlett-Packard. В июне 1991 года ANSI (американская национальная) стандартизация С++ стала частью ISO (меж­дународной) стандартизации С++. Комитет ISO С++ называется "WG21". С 1990 года эти совместные комитеты по стандартам С++ стали основным форумом для развития С++ и уточнения его определения.

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

Основными целями С++11 были:

  • сделать С++ лучшим языком для системного программирования и построения библиотек;
  • сделать С++ проще для обучения и изучения[4].

Принятый трехлетний цикл обновления стандарта предопределил вектор развития C++. Так, сначала С++14, а затем С++17 становится основным диктатом функционального набор языка. Следующий раз комитет соберется для пересмотра стандарта в 2020 году.

Стандарт говорит о том, что будет работать и как именно. С ростом языка и его стандартной библиотеки проблема популяризации эффективных стилей программирования стала критической. До сих пор есть люди, которые считают С++ незначительным дополнением к С, и люди, которые считают объектно-ориентированные стили программирования 1980-х годов, основанные на массивной иерархии классов, вершиной развития. Многие пытаются использовать С++11 в средах с большим количеством старого кода С++. С другой сторо­ны, есть также много тех, кто с энтузиазмом использует новые возможности. Например, некоторые программисты убеждены, что истинным С++ является только код, использующий огромное количество шаблонного метапрограммирования.

В настоящее время С++– очень широко используемый язык программирования. Количество его пользователей быстро увеличилось с одного в 1979 году до 400 тысяч в 1991 году, т.е. число пользователей удваивалось при­мерно каждые 7,5 месяца в течение более десяти лет. Естественно, с момен­та первоначального всплеска роста темпы роста замедлились, но, по моим оценкам, в 2019 году имеется около 4,5 миллиона программистов на С++. Большая часть этого роста приходится на время после 2005 года, когда экспо­ненциальный рост скорости процессора прекратился, так что очень важным фактором стала производительность языка. Этот рост был достигнут без ка­кого-либо маркетинга или организованного сообщества пользователей.

Ниже на рисунке 2 представлена иллюстрация истории языка С++.

(1985)

Первая коммерческая редакция

(1984)

Официальное имя С++

(1982)

Публикация

языка С с классами

(2003)

Выход С++ 3.0 c исправлениями

(1997)

Сертификация ISO

C++ 98 ISO

(1989)

Выход С++ 2.0

(2014)

Выход С++ 14

(2011)

Выход С++ 11

(2009)

Выход С++ OX

(2020)

Разработка С++ 20

(2017)

Выход С++ 17

Рисунок 2 – Иллюстрация истории языка С++

С++ – язык, прежде всего, индустриальный, т.е. более заметен в производственной сфере, чем в образовании или при изучении языков программирования. Он вырос в BellLabs, инспирированный разнообразными жесткими потребностями в области телекоммуникаций и системного программирова­ния (включая драйверы устройств, сети и встроенные системы). Оттуда ис­пользование С++ распространилось практически на все отрасли: микроэлек­троника, веб-приложения и инфраструктура, операционные системы, финан­совые, медицинские, автомобильные, аэрокосмические приложения, физика высоких энергий, биология, производство энергии, машинное обучение, видеоигры, графика, анимация, виртуальная реальность и многое другое. Он в основном используется там, где стоящие перед разработчиками задачи тре­буют сочетания способности эффективно использовать оборудование и при этом управлять сложностью проекта. Множество применений С++ постоянно растет.

3. История возникновения языка Java

Java – это объектно-ориентированный язык программирования, разработанный Джеймсом Гослингом и его коллегами из SunMicrosystems в начале 1990-х годов. В отличие от обычных языков, которые обычно предназначены для компиляции в собственный (машинный) код или для интерпретации из исходного кода во время выполнения, Java предназначена для компиляции в байт-код, который затем запускается виртуальная машина Java. Сам язык заимствует много синтаксиса из C и C++, но имеет более простую объектную модель и меньше средств низкого уровня. Java только отдаленно связана с JavaScript, хотя они имеют схожие имена и имеют общий синтаксис[5].

Java был разработан Джеймсом Гослингом как проект под названием «Oak» в июне 1991 года. Цели Гослинга заключались в том, чтобы реализовать виртуальную машину и язык, который имел бы знакомую C-подобную нотацию, но с большей однородностью и простотой, чем C/C++. Первой публичной реализацией была Java 1.0 в 1995 году. Она обещала «WriteOnce, RunAnywhere» с бесплатными средами исполнения на популярных платформах. Это было довольно безопасно, и его безопасность была настраиваемой, позволяя ограничить доступ к сети и файлам. Основные веб-браузеры вскоре включили его в свои стандартные конфигурации. Вскоре вместе с появлением «Java 2» были разработаны новые версии для больших и малых платформ (J2EE и J2ME). 

В 1997 году Sun обратилась к органу по стандартизации ISO / IEC JTC1, а затем к EcmaInternational, чтобы формализовать Java. Сейчас язык де-факто остается проприетарным стандартом, который контролируется с помощью процесса сообщества Java. Sun, а теперь Oracle делает большинство своих реализаций Java бесплатными, а доход генерируется специализированными продуктами, такими как JavaEnterpriseSystem. Вендор проводит различие между своим комплектом разработки программного обеспечения (SDK) и средой выполнения (JRE), которая является подмножеством SDK, главное отличие в том, что в JRE отсутствует компилятор.

В создании языка Java было пять основных целей:

  1. Он должен использовать методологию объектно-ориентированного программирования.
  2. Он должен позволять запускать одну и ту же программу в нескольких операционных системах. 
  3. Он должен содержать встроенную поддержку для использования компьютерных сетей.
  4. Он должен быть предназначен для безопасного выполнения кода из удаленных источников.
  5. Он мог легко встраивать удачные элементы из других языков. 

Для достижения целей сетевой поддержки и удаленного выполнения кода программисты на Java иногда считают необходимым использовать такие расширения, как CORBA, InternetCommunicationsEngine или OSGi[6]

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

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

Независимость от платформы означает, что программы, написанные на языке Java, должны работать одинаково на разнородном оборудовании. Нужно уметь писать программу один раз и запускать ее где угодно. Это достигается большинством компиляторов Java путем компиляции кода в байт-код – упрощенные машинные инструкции, специфичные для платформы Java. Затем код запускается на виртуальной машине (ВМ), программе, написанной в собственном коде на оборудовании хоста, которая интерпретирует и выполняет общий байт-код Java. Кроме того, предоставляются стандартизированные библиотеки, чтобы обеспечить доступ к функциям хост-машин (таким как графика, многопоточность и работа в сети) унифицированными способами. Хотя существует явная стадия компиляции, в какой-то момент байт-код Java интерпретируется или преобразуется в машинные инструкции JIT-компилятором.

Лицензия Sun/Oracle на Java настаивает на том, чтобы все реализации были «совместимыми». Это привело к судебному спору с Microsoft после того, как Sun заявила, что реализация Microsoft не поддерживает интерфейсы RMI и JNI и добавила собственные специфичные для платформы функции. В ответ Microsoft больше не поставляет Java с Windows, и в последних версиях WindowsInternetExplorer не может поддерживать Java-апплеты без стороннего подключаемого модуля. Тем не менее, Sun и другие разработчики бесплатно предоставили системы исполнения Java для этих и других версий Windows.

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

Переносимость – технически сложная цель, и успех Java в этой цели был неоднозначным. Хотя действительно возможно написать программы для платформы Java, которые ведут себя согласованно на многих хост-платформах, большое количество доступных платформ с небольшими ошибками или несогласованностями привело к тому, что некоторые из них пародировали лозунг Sun «WriteOnce, RunAnywhere», как «WriteOnce, DebugAnywhere»[7]

(1997)

JDK 1.1

Внутренние классы

(1996)

Java 1 (JDK 1.0)

(1995)

Бета-версияJava Development Kit (JDK)

(2002)

J2SE 1.4

XML и регулярные выражения

(2000)

J2SE 1.3

Виртуальная машина

(1998)

J2SE 1.2

Графический API

(2011)

JAVA SE 7

Поддержка 64-битной архиктуры

(2006)

JAVA SE 6

Работа с интеграцией

(2004)

J2SE5.0

Цикл For-each и работа с переменными

(2018)

JAVASE10

Единый JDK-репозиторий

(2017)

JAVASE9

Мультизадачная платформа

(2014)

JAVASE8

Работа с данными, машинным обучением

(2019)

JAVA SE 12

Унификация платформы

(2018)

JAVASE11

Веб-протоколы и сборщик мусора

Рисунок 3 – Иллюстрация истории языка Java

Одна из идей модели автоматического управления памятью в Java заключается в том, что программисты должны быть избавлены от необходимости выполнять ручное управление памятью. На некоторых языках программист выделяет память для создания любого объекта, хранящегося в куче, и отвечает за последующее ручное освобождение этой памяти для удаления любых таких объектов. Если программист забывает освободить память или пишет код, который не может это сделать своевременно, может произойти утечка памяти: программа будет использовать потенциально произвольно большой объем памяти. Кроме того, если область памяти освобождается дважды, программа может работать нестабильно и зависать. Наконец, в средах без сбора мусора существует определенная степень издержек и сложности пользовательского кода для отслеживания и завершения распределения.

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

4. Различия между C++ и Java

Как С++, так и Java являются объектно-ориентированными языками программирования. От С Javaполучил в наследства синтаксис, а от С++ - объектную модель.

Академизм С и С++ помогает программистам быстрее освоить гибкий Java.Обратный эффект также имеет место быть, но реже.Есть еще одно сходство – среда как С++, так и Javaпредлагает программисту полный контроль над компилируемым кодом.

Оценим различия в коде на примере простейшей программы.

Код на С

#include <stdio.h> //стандартная библиотека С
int main() //объявление главной функции
{ //начало тела функции
  printf("Hello, world!"); //вывод сообщения на экран

getchar(); //задержка открытого окна консоли
  return 0; //возврат значения функции
} //конец тела функции

Код на С++

#include <iostream> //стандартная библиотека С++
int main() //объявление главной функции
{ //начало тела функции
  cout<<"Hello, world!"; //вывод сообщения на экран

system("pause"); //задержка открытого окна консоли
  return 0; //возврат значения функции
} //конец тела функции

Кодна Java

publicclassMain //объявлениекласса

{ //начало тела описания класса

publicstaticvoidmain(String[]args)//объявление метода

{ //начало тела описания метода

System.out.println("Helloworld"); //оператор выводавнутри метода
} //конец тела описания метода
} //конец тела описания класса

Как можно заметить, объектная логика осталась без изменений, однако архитектурно С и Java–различные языки. В С требуется вызывать библиотеки, которые содержат необходимую логику и операторы. Функция mainв С выполняется силами содержащих в ней операторов, а класс Mainв Javaнаходит метод main (заметим разницу в регистре: с точки зрения синтаксиса Java– эторазные имена) и передает ему управление. Здесь незаметно, но при наличии другого объекта, объявленные методы начали бы очень просто взаимодействовать друг с другом, чего в Cдобиться сложнее.

С++ сегодня – сугубо академический язык, который если и используется, то для оттачивания логики программиста и освоения объектного синтаксиса. Это язык, который уже достаточно давно уступил место более продвинутым, мощным и гибким решениям. И он больше не нужен.

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

Синтаксис Java в значительной степени является производным от C++. Однако, в отличие от C++, который сочетает в себе синтаксис для структурированного, универсального и объектно-ориентированного программирования, Java изначально создавалась практически полностью объектно-ориентированной: все в Java является объектом с исключениями атомарных типов данных (порядковых и действительные числа, логические значения и символы) и все на Java написано внутри класса. Рассмотрим отличия более подробно (таблица 1).

Таблица 1 – Различия в архитектурах и синтаксисе Javaи C++

#

Java

C++

1

Не поддерживает указатели, перегрузку операторов, объединения и шаблоны. Вместо этого используют «ссылки»

Поддерживает указатели, перегрузку операторов, объединения и шаблоны

2

Не поддерживает деструкторы объектов. Поддерживает динамическое высвобождение памяти

Поддерживает и использует деструкторы объектов

3

Не использует условную компиляцию

#ifdef #ifndeftype–

одна из ключевых возможностей С++

4

Использует встроенную поддержку потоков

Не имеет встроенной поддержки потоков

5

Методы, описывающие классы, определяются в нем же

Методы определяются вне классов с помощью оператора разрешения (::)

6

Есть оператор перехода, но он не используется

Есть оператор перехода goto

7

Не поддерживает множественное наследование

Поддерживает множественное наследование

8

Имеет встроенную поддержку комментирования

Не поддерживает комментирование

9

Интерпретируемый язык, т.е. не зависит от используемой платформы

Генерирует код, который может и не запускаться на прочих платформах

10

Есть сборщик мусора

Память очищается вручную

11

Запускается на собственной виртуальной машине, что автоматически делает исполняемый код кроссплатформенным

С++-код может компилироваться еще только под Linux, но не без дополнительного конфигурирования

Вообще, следует отметить, что все зависит от задач, решаемых выбранным языком программирования. Анализ, предложенный выше, является объективным, однако, все еще существуют задачи, в основном, академического плана, с которыми Javaсправляется значительно хуже. С++ в свое время годился для написания производительных приложений, для которых требовалось управлять выделяемой памятью. Однако в конце второго десятилетия 21 века необходимо учесть, что настольные приложения давно уступили место корпоративным, мобильным и интернет-сервисам, для чего у C++ просто нет ни возможностей, ни библиотек.

Заключение

Как было обещано в первом издании книги «Бьерн Страуструп. Язык программирования С++», запросы пользователей определили развитие С++. Его направлял опыт широкого круга пользователей, которые трудились в различных сферах программирования. За 6 лет, которые отделяли нас от первого издания описания С++, количество пользователей увеличилось в сотни раз. За этот небольшой период усвоились множество уроков, рассмотрены в теории и применено на практике достаточное число приемов программирования.

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

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

Свойства языка Java:

  • язык программирования объектно-ориентирован, оснащён богатой библиотекой классов и одновременно довольно прост для освоения;
  • цикл разработки приложений сокращен при помощи того, что система построена на основе интерпретатора;
  • приложение получается автоматически переносимым между множеством платформ и ОС;
  • за счет встроенной системы сборки неиспользуемого кода программист освобождается от необходимости явного управления памятью;
  • приложение легко сопровождается и модифицируется, т.к. модули могут быть загружены с сети;
  • в приложения встроена система безопасности, не допускающая незаконного доступа и проникновения вирусов.

Список использованной литературы

  1. Беркунський Е.Ю. Объектно-ориентированное программирование на языке Java: Методические указания для студентов направления «Компьютерные науки». - М.: НУК, 2006. - 52 с.
  2. «Бьерн Страуструп. Язык программирования С++», изд. Диалектика, М-СПб.2019 –332 с.
  3. Вязовик Н.А. Программирование на Java. Курс лекций, Интернет-университет информационных технологий, 2003. 592 с.
  4. Грэхем Иан. Объектно-ориентированные методы. Принципы и практика. — 3-е изд. — М.: «Вильямс», 2004. 800 с.
  5. Джесс Либерти, «Освой самостоятельно C++ за 21 день», изд. Дом «Вильямс», Москва - Санкт-Петербург - Киев, 2001. – 834с.
  6. Джон Родли Создание Java-апплетов.-TheCoriolis Group,Inc.,1996, Издательство НИПФ "ДиаСофт Лтд.",1996 – 654с.
  7. Майкл Эферган. Java: справочник.- QUE Corporation, 1997, Издательство «Питер Ком», 1998. – 687с.
  8. ДейтелП.Дж., Дейтел Х.М. Как программировать на С++. Введение в объектно-ориентированное проектирование с использованием UML. / Пер. с англ. - М.: Издательство <Бином>, 2009. 1454 с.
  9. Пол Ирэ, «ООП с использованием С++», Киев, «ДиаСофт», 2010. 480 с.
  10. Секунов Н. Самоучитель Visual C++ 6. изд. «БХВ-Петербург», Санкт-Петербург, 2003. 925 с.
  11. Синтес Антони. Освой самостоятельно объектно-ориентированное программирование за 21 день. — М.: «Вильямс», 2002. 372 с.
  12. Хабибуллин И.Ш. Самоучитель Java 2. СПб.: БХВ-Петербург, 2007. 720 с.
  13. Эккель Б. Философия Java. Библиотека программиста. СПб.: Питер, 2001. 640 с.
  14. ГербертШилдт, Холмс Джеймс, Искусство программирования на Java, 2005.
  15. Герберт Шилдт. C + + для начинающих. Пер. с англ. М: ЭКОМПаблишерз 2007. – 546с.
  16. Герберт Шилдт. Полный справочник по C + + 4-е издание. Пер. с англ. М: издательский дом « Вильямс » 2010. – 543с.
  1. «Бьерн Страуструп. Язык программирования С++», изд. Диалектика, М-СПб.2019 – с.279.

  2. «Бьерн Страуструп. Язык программирования С++», изд. Диалектика, М-СПб.2019 – с.282

  3. Герберт Шилдт. C + + для начинающих. Пер. с англ. М: ЭКОМПаблишерз 2007. – с.42.

  4. Джесс либерти, «Освой самостоятельно C++ за 21 день», изд. Дом «Вильямс», Москва - Санкт-Петербург - Киев, 2001. – С.14.

  5. Джон Родли Создание Java-апплетов .- TheCoriolis Group,Inc.,1996, Издательство НИПФ "ДиаСофт Лтд.",1996 – С.35-37.

  6. Джон Родли Создание Java-апплетов .- TheCoriolis Group,Inc.,1996, Издательство НИПФ "ДиаСофт Лтд.",1996 – С.32

  7. Майкл Эферган. Java: справочник.- QUE Corporation, 1997, Издательство «Питер Ком», 1998. – с.89