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

История возникновения и развития языка программирования Си (С++) и Java. (Происхождение C хорошо известно: CPL -> BCPL -> B -> C)

Содержание:

Введение

Языки программирования неотъемлемая часть IT-индустрии. Довольно интересно узнать что привело их к текущему виду и как прогресс повлиял на их развитие. Какие этапы эволюции они прошли. Что у них общего а в чем они различны.

Глава 1. История создания языка программирования C

Происхождение C хорошо известно: CPL -> BCPL -> B -> C [1].

Но, чтобы понять, как и почему был создан C, нам нужно вернуться назад во времени, назад к EDSAC (электронной вычислительной машине, созданной в 1949 году в Кембриджском университете).

Со временем потребности возросли и мощностей EDSAC стало нехватать.

Тогда университетом, совместно с фирмой Ferranti, была положена разработка прототипа нового компьютера - Titan. В те времена и на тех типах машин уровень программирования был сильно зависим от железа. Поэтому появление нового компьютера сопровождалось

разработкой нового языка для него. Так появился CPL.

CPL, - язык программирования, разработанный совместно сотрудниками Математической лаборатории Университета Кембриджа и компьютерного подразделения Лондонского университета [2]. (CPL является сокращением Combined Programming Language). Целью разработки CPL было создание языка, который мог бы использоваться для всех типов задач, числовых и нечисловых, и позволял бы программистам использовать все возможности большого и мощного компьютера без необходимости “погружаться” в машинный код. CPL в значительной степени основан на Algol 60. Точное определение алгоритма еще не означает что его можно воплотить в компьютерной программе для выполнения описанного процесса. Показательным примером этого несовершенства является точность арифметических операций; алгоритм предполагает, что операции выполняются с достаточной точностью, в то время как фактическая компьютерная программа должна указывать точность для каждой операции, должна ли она выполняться одинарной длиной, двойной длиной и т. д. По этой причине Algol 60 не был удовлетворял запросам языка программирования того времени, и в CPL авторы языка стремились создать его таким, который позволит программисту сохранить связь, где это необходимо, с реалиями существующего компьютера.

Он был строг (если не строже, Algol 60) и достаточно общим, чтобы не зависеть от машинного кода. Он был гораздо более обширным, чем Algol, имел больше типов данных, поддерживал вызов по имени, вызов по значению и вызов по ссылке, а также полиморфные операторы, замыкания, лямбды и сборщик мусора во время выполнения (и это в 1963 году!). Он стал словно таблеткой, которая может вылечить любой тип болезни. К сожалению, создать компилятор для него оказалось слишком сложно.

Зная об этих проблемах, Мартин Ричардс хотел создать язык, который был бы простым для компиляции и предполагал, что программист знает, что он делает поэтому не стал сильно ограничивать язык. Это уже ближе к духу C и C ++. Так появился BCPL. Он имел разделение на две части: компилятор из языка в промежуточный код O-code и транслятор O-кода в машинный код. Чуть позже на нем был основан B. Кен Томпсон, создатель B, хотел уменьшить BCPL. Он признал, что B был переделкой BCPL. Да и их справочные руководства имеют много общего:

Глядя на синтаксис B, мы уже можем видеть C-подобные шаблоны.

Помимо того, что CPL является предком C, примечательно, что в свое время он был пожалуй первым языком, который широко критиковался как “слишком тяжелый”. Уже тогда существовали более лучшие языки и операционные системы, до которых дешевое оборудование просто не дотягивало. Ограничения этого дешевого оборудования, и только они, привели к архитектурным решениям, которые перекочевали из BCPL в B, а затем и C. Тому подтверждение, с историческими изысканиями, отлично продемонстрировал Олве Маудал в своем выступлении [3], [4]. В нем в подробностях рассказано какие цели были у создателей языка - Томпсона и Ритчи на самом деле. Что они использовали, проблемы, с которыми они столкнулись, и какие изменения внесли.

Перейдем непосредственно к языку программирования C. Что это? Лучший системный язык всех времен или же изначально неудачный замысел?

Язык Си был разработан Деннисом Ричи, когда он портировал Unix для работы на машине PDP-11. Это произошло в 1969 году, тогда как стандартизация началась намного позже (в 1983 году). Что примечательно - так как многие из более ранних языков были созданы комитетом, они стандартизировались с самого начала. В стандартизации же своего языка Деннис Ричи не участвовал.

Компьютеры, на которых работали B и BCPL были слово-ориентированы. Соответственно и в этих языках с одним типом данных, для удобства “ячейка” была приравнена к машино-слову [5]. PDP-11 был байт/символьно-ориентированным и программы написанные на B не работали корректно на этой архитектуре. В 1971 Ричи расшрил язык B добавив в него символьный тип и переписав компилятор, чтобы тот генерировал машинные инструкции компьютера PDP-11 вместо так называемого шитого кода [6]. Эволюция B в C была так же сопряжена с созданием компилятора, способного создавать программы настолько небольшого размера и настолько быстрые, чтоб они могли конкурировать с ассемблером. Этот видоизмененный язык получил название NB (New B - новый B).

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

Схема типового состава, принятая С, в значительной степени обязана Алголу 68, хотя, возможно, она бы не возникла в этой форме, которую одобрили бы приверженцы Алгола. Наряду с этими изменениями, но самым важным было введение препроцессора, отчасти по настоянию Алана Снайдера [6], но также в знак признания полезности механизмов включения файлов, доступных в BCPL и PL / I

Для полноты картины стоит кратко изложить роли непосредственных участников современного языка Си. Кен Томпсон создал язык B в 1969-70; это было получено непосредственно из BCPL Мартина Ричардса. Деннис Ритчи превратил B в C в 1971-73 гг., Сохранив большую часть синтаксиса B, добавив типы и многие другие изменения, и написав первый компилятор. Ritchie, Alan Snyder, Steven C. Johnson, Michael Lesk и Thompson представили языковые идеи в 1972-1977 годах, а портативный компилятор Johnson по-прежнему широко используется. За этот период коллекция библиотечных процедур значительно выросла благодаря этим и многим другим людям в Bell Laboratories. В 1978 году Брайан Керниган и Ричи написали книгу, которая стала языковым определением на несколько лет. Начиная с 1983 года комитет ANSI X3J11 стандартизировал язык. Особенно заметными в поддержании его усилий были Джим Броди, Том Плам и П. Дж. Плаугер, а также последующие редакторы проекта, Ларри Рослер и Дейв Проссер.

Глава 2. С++

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

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

Первый компилятор C with Classes назывался Cfront, который был создан на основе компилятора C под названием CPre. Это была программа, предназначенная для перевода C с кодом Classes в обычный C. Довольно интересный момент, который стоит отметить, это то, что Cfront был написан в основном на C с Классами, что делает его компилятором с автономным размещением (компилятором, который может компилироваться сам). Позже Cfront будет заброшен в 1993 году после того, как станет трудно интегрировать в него новые функции, а именно исключения C ++ [7]. Тем не менее, Cfront оказал огромное влияние на реализацию будущих компиляторов и на операционную систему Unix.

В 1983 году название языка было изменено с C с Классами на C ++. Оператор ++ в языке C - это оператор для увеличения переменной, который дает некоторое представление о том, как Страуструп рассматривал язык. В это время было добавлено много новых функций, наиболее заметными из которых являются виртуальные функции, перегрузка функций, ссылки с символом &, ключевое слово const и однострочные комментарии с использованием двух косых черт (эта функция взята из языка BCPL). ).

В 1985 году была опубликована ссылка Страуструпа на язык под названием «Язык программирования C ++». В том же году C ++ был реализован как коммерческий продукт. Язык еще не был официально стандартизирован, что делает книгу очень важной ссылкой. Язык был снова обновлен в 1989 году и теперь включает защищенные и статические члены, а также наследование от нескольких классов.

В 1990 году было выпущено Annotated C ++ Reference Manual. В том же году компилятор Borland Turbo C ++ будет выпущен в качестве коммерческого продукта. В Turbo C ++ добавлено множество дополнительных библиотек, которые окажут значительное влияние на развитие C ++. Хотя последний стабильный выпуск Turbo C ++ был в 2006 году, этот компилятор все еще широко используется.

В 1998 году комитет по стандартам C ++ опубликовал первый международный стандарт для C ++ ISO / IEC 14882: 1998, который неофициально будет известен как C++ 98. Как уже было сказано -

Annotated C ++ Reference Manual оказал большое влияние на разработку стандарта. В него также была включена Standard Template Library, концептуальная разработка которой началась в 1979 году. В 2003 году комитет отреагировал на многочисленные проблемы, о которых сообщалось в стандарте 1998 года, и соответствующим образом пересмотрел его. Измененный язык получил название C++ 03.

В 2005 году комитет по стандартам C ++ выпустил технический отчет (дублированный TR1), в котором подробно описываются различные функции, которые они планируют добавить в последний стандарт C++. Новый стандарт неофициально получил название C++ 0x, так как ожидалось, что он будет выпущен до конца первого десятилетия. По иронии судьбы, новый стандарт не будет выпущен до середины 2011 года. До тех пор было выпущено несколько технических отчетов, и некоторые компиляторы начали добавлять экспериментальную поддержку новых функций.

В середине 2011 года новый стандарт C ++ (названный C ++ 11) был закончен. Проект библиотеки Boost оказал значительное влияние на новый стандарт, и некоторые из новых модулей были получены непосредственно из соответствующих библиотек Boost. Некоторые из новых функций включали поддержку регулярных выражений, всеобъемлющую библиотеку рандомизации, новую библиотеку времени C ++, поддержку атомарности, стандартную библиотеку потоков (в которой до 2011 года не было ни в C, ни в C++) новый синтаксис цикла for, обеспечивающий функциональность, аналогичную циклам foreach в некоторых других языках, ключевое слово auto, новые классы контейнеров, улучшенную поддержку объединений и списков инициализации массива, а также шаблонов с переменными значениями. Нельзя также не упомянуть и фреймворк Qt, сделав разработку на C++ более реактивной, за счет революционного нововведения техники connects / slots.

 Глава 3. Язык программирования Java

В 1995 году Sun выпустила язык программирования Java как часть более широкой стратегии, известной как платформа Java. Девиз «Однажды, беги куда угодно» (WORA) изначально обещал сделать Java языком повсюду: от наручных часов до мобильных телефонов, ноутбуков и суперкомпьютеров.

Изначально критика Java была со смешанными оценками. За каждую промах Java евангелист пообещал, что это изменит мир, и тостеры на Java уже не за горами.

Поскольку Java развивалась, она накапливала больше багажа, поскольку боролась за сохранение принципа WORA. Устаревшие методы возникали повсюду, но Sun должна была поддерживать эти функции на месте, чтобы обеспечить обратную совместимость. Пакет java.util.DateTime стал синонимом дисфункционального дизайна, а неправильные соглашения об именах были исправлены на всю жизнь (это размер или длина?).

Microsoft .NET начал посягать на домен Java. Команда Microsoft представила делегатов - указатель на типобезопасную функцию, который значительно упрощает обработку событий. Java нужен был конкурент, и быстрый, поэтому в версии 1.1 в Java появились внутренние классы, способ достижения аналогичного эффекта, но в более ограниченном и трудоемком режиме. В официальном документе Java сделан вывод: «Связанные ссылки на методы просто не нужны ... Они умаляют простоту и единство языка Java». Между тем, до сих пор усилия Java по принятию связанных ссылок на методы продолжаются.

Когда Java достигла версии 1.4, Sun решила, что необходим новый подход, чтобы конкурировать со стратегией Microsoft .NET. ВС долго и трудно, и фирменные версии 1.4, как «5» в попытке двигаться вперед .NET 2.0

Это сопровождалось решением о внедрении дженериков, способ достижения дополнительной безопасности типов. К сожалению, безопасность типов достигается за счет набора текста. Поскольку инженеры приняли дженерики, их часто слышали, как они ругались, когда они наносили еще один оператор List <Foo> foos = new ArrayList <Foo>.

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

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

Целая индустрия развивалась, чтобы удовлетворить шаблонистов. Травмы RSI становились все более распространенным явлением среди ветеранов Java, поэтому была создана новая среда разработки. IntelliJ и Eclipse были созданы с целью минимизации ущерба для разработчиков. Расширенное завершение кода и рефакторинг означали, что разработчикам нужно было просто нажимать комбинации клавиш вместо того, чтобы вводить подробные конструкции кода для отсутствующих возможностей языка.

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

Снизив сопротивление угловым скобкам за счет использования дженериков, Java продвинулась вперед и вскочила на подножку XML. Используя XML, разработчики смогли выразить краткие концепции в виде огромных, подробных угловатых кошмаров. Преимущество этого заключается в том, что файлы XML (в отличие от других файлов) могут быть легко прочитаны другими компьютерами. Считалось, что стоит заплатить небольшую цену за то, что она не читается людьми. Такие службы, как Ant и JBoss, лидируют с исполняемым XML и мощными дескрипторами развертывания.

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

В августе 2006 года начался проект Java 7. Многие разработчики настаивают на возможности, известной как лямбда-выражения, которая, несомненно, упростит многие из распространенных задач кодирования, которые Java делает настолько болезненными. К сожалению, четыре года спустя комитет по Java все еще спорит о нюансах этой функции, и возможно, что это будет отброшено. Отсутствие движения в Java 7 привело к появлению новых, более сексуальных языков, таких как Clojure и Scala, предназначенных для работы в экосистеме Java, но без необходимости использования самого языка.

Последний гвоздь в гроб начали забивать в апреле 2009 года, когда Oracle объявила о планах приобретения Sun. Во главе с «Ларри, Принцем тьмы», Oracle - это машина для приобретения, которая специализируется на корпоративном ПО и зарабатывании денег. Когда юристы Oracle обнаружили ряд патентов на программное обеспечение, они выбрали большую цель и начали борьбу. Цели достигают не большего, чем Google (ведущая рекламная организация), поэтому юристы Oracle набросились и началась битва.

Где это оставить Java? С момента своего скромного начала 15 лет назад Java поднялась на вершину кучи популярных языков программирования под руководством Sun. В Oracle неясно, выйдет ли когда-нибудь следующая версия Java, не говоря уже о тех функциях, которые жаждут разработчики. Это начало конца для Java?

Заключение

Изучение истории языков программирования явило собой интересное занятие. Как видно создание таких разных языков имеет много общего - а именно они так или иначе видоизменялись под натиском все более высоких требований. А также так или иначе сопровождались ad-hoc решениями ввиду ограничений мощностей платформ тех времен. Однако невозможно не заметить тренд к переходу от объектно-ориентированных подходов к функциональным. С другой стороны несмотря на веяние этой моды и наличие таких, довольно взрослых, языков как Haskell, Lisp и Scala - OOP все еще остается необходимым в наше время подходом программирования.

Это следует из того, что

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

Однако доступ языкам Java, C и других к web’у как и бесчисленное множество Desktop приложений написанных на Electron позволяют делать выводы что в обществе востребован простой, OOP - функционально взвешенный язык.

8) Библиография.

[1] http://lambda-the-ultimate.org/node/4022

[2] 'The main features of CPL' (Barron et al, 1963)

[3] https://vimeo.com/132192250

[4] https://vimeo.com/256731302

[5] https://www.bell-labs.com/usr/dmr/www/chist.html

[6] A. Snyder, A Portable Compiler for the Language C, MIT: Cambridge, Mass., 1974.

[7] https://devblogs.microsoft.com/oldnewthing/?p=99855

9) Приложение