Файл: История возникновения и развития языка программирования Си (С++) и Java. (Происхождение C хорошо известно: CPL -> BCPL -> B -> C).pdf
Добавлен: 16.02.2024
Просмотров: 23
Скачиваний: 0
Содержание:
Введение
Языки программирования неотъемлемая часть 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 стал синонимом дисфункционального дизайна, а неправильные соглашения об именах были исправлены на всю жизнь (это размер или длина?).