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

Изучение классификации языков программирования и их развития

Содержание:

Введение

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

История, предпосылки к созданию языка программирования

Начнём с самого начала. В самом начале у компьютеров не было даже клавиатуры. То есть всё было так - у них не было ни клавиатуры, ни экрана, были перфокарты. Если есть дырочка (или наоборот нет) - это означало ноль или единицу. И программы в то время писали с помощью машинных кодов - у каждой операции в компьютере (сложение, вычитание, более сложные операции) был машинный код. Люди сами по таблице выбирали этот код, адреса в памяти, всё это выбивали руками и засовывали в считыватель - и всё считалось. Это была эра программирования непосредственно в машинных кодах, а основным носителем информации были перфокарты и перфоленты. Программисты обязаны были знать архитектуру машины досконально. Программы были достаточно простыми, что обуславливалось, во-первых, весьма ограниченными возможностями этих машин, и, во-вторых, большой сложностью разработки и, главное, отладки программ непосредственно на машинном языке. Становилось возможным использование таких хитроумных алгоритмов и способов организации программ, какие и не знали современные разработчики. Например, применялась такая возможность, как самомодифицирующийся код. Знание двоичного представления команд позволяло иногда не хранить некоторые данные отдельно, а встраивать их в код как команды. И это далеко не полный список приемов, владение хотя бы одним из которых сейчас сразу же продвигает вас до уровня экстра-класса. Работа программиста была, наверное, тогда не особо интересной - проделывать дырочки в перфокартах.[1]

Появление первых языков программирования

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

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

Вместо запоминания того, что есть код у команды, использовались слова, похожие на английский язык и затем перечислялись регистры или области памяти, переменные, с которыми нужно эти операции производить. Но понятное дело, что это тоже требовало достаточно немалого количества ума, чтобы держать у себя в голове, в каком регистре что находится и где какие переменные. Чтобы собрать из ассемблера машинный код тоже требует времени, памяти (по тем временам было мало её).

Постепенно, становилось понятно, что разрабатывать так большие сложные программы очень сложно. Производительность программиста в этих командах была предельно низкой - то есть он писал несколько строк в день, и каждая строка означала простые арифметические действия. И людям хотелось сделать языки гораздо более похожими на человеческий язык, на английский, в частности, чтобы писать программы было легче и удобнее. Можно перечислить основные требования, предъявляемые к языкам программирования:

  • Наглядность. Использование в языке по возможности уже существующих символов, хорошо известных и понятных как программистам, так и пользователям ЭВМ;
  • Единство. Использование одних и тех же символов для обозначения родственных понятий в разных частях алгоритма. Количество этих символов должно быть по возможности минимальным;
  • Гибкость. Возможность относительно удобного, несложного описания распространенных приемов математических вычислений с помощью имеющегося в языке ограниченного набора выразительных средств;
  • Модульность. Возможность описания сложных алгоритмов в виде совокупности простых модулей, которые могут быть составлены отдельно и использованы в различных сложных алгоритмах;
  • Однозначность. Только одна запись любого алгоритма. Отсутствие ее могло бы привести к неправильным ответам.

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

  • машинные;
  • машинно-ориентированные (ассемблеры);
  • машинно-независимые (языки высокого уровня).

Машинные языки и машинно-ориентированные языки - это языки низкого уровня, требующие указания мелких деталей процесса обработки данных. Языки же высокого уровня имитируют естественные языки, используя некоторые слова разговорного языка и общепринятые математические символы. Эти языки более удобны для человека. Разные типы процессоров имеют разные наборы команд. Если язык программирования ориентирован на конкретный тип процессора и учитывает его особенности, то он называется языком программирования низкого уровня. В данном случае низкий уровень не значит плохой. Имеется в виду, что операторы языка близки к машинному коду и ориентированы на конкретные команды процессора. При программировании на машинном языке программист может держать под своим контролем каждую команду и каждую ячейку памяти, использовать все возможности имеющихся машинных операций. Но процесс написания программы на машинном языке очень трудоемкий и утомительный. Программа получается громоздкой, её трудно отлаживать, изменять и развивать. Поэтому в случае, когда нужно иметь эффективную программу, в максимальной степени учитывающую специфику конкретного компьютера, вместо машинных языков используют близкие к ним машинно-ориентированные языки (ассемблеры).

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

Одним из первых языков стал Fortran. Это первый компилируемый язык, созданный в корпорации IBM группой разработчиков во главе с Джоном Бэкусом (John Backus) в 1954 году. Его тоже ещё выбивали на перфокартах - были специальные перфокарты для выбивания программ на Фортране. Программисты, разрабатывавшие программы исключительно на ассемблере, выражали сомнение в возможности появления высокопроизводительного языка высокого уровня, поэтому основным критерием при разработке компиляторов Фортрана являлась эффективность исполняемого кода. Хотя в Фортране впервые был реализован ряд важнейших понятий программирования, удобство создания программ было принесено в жертву возможности получения эффективного машинного кода. Однако для этого языка было создано огромное количество библиотек, начиная от статистических комплексов и заканчивая пакетами управления спутниками, поэтому Фортран продолжает использоваться в некоторых организациях, хотя уже довольно сильно отличается от того, что было раньше.

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

PL/1. В 1964 году все та же корпорация IBM создала язык PL/1, который был призван заменить Cobol и Fortran в большинстве приложений. Язык обладал исключительным богатством синтаксических конструкций. В нем впервые появилась обработка исключительных ситуаций. Надо заметить, что синтаксическая структура языка была очень непростой. Пробелы уже использовались как синтаксические разделители, но ключевые слова не были зарезервированы. В частности, следующая строка - это вполне нормальный оператор на PL/1: IF ELSE=THEN THEN THEN; ELSE ELSE. В силу таких особенностей разработка компилятора для PL/1 была исключительно сложным делом. Язык так и не стал популярен вне мира IBM.

Есть ещё язык, он назывался Алгол. Компилируемый язык, созданный в 1960 году. Он был призван заменить Фортран, но из-за более сложной структуры не получил широкого распространения. В 1968 году была создана версия Алгол 68, по своим возможностям опережающая многие языки программирования, однако из-за отсутствия достаточно эффективных компьютеров для этой версии не удалось своевременно создать хорошие компиляторы. Алгол придумали в Европе, а Фортраном пользовались в основном в Штатах - больших отличий нет. Примерно в конце этого периода (между периодами Алгол и Кобол) начинают появляться языки, которые в каком-то смысле существуют в наши дни.

Современные языки программирования

Понятия о языках программирования

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

Трансляция - это перевод. По принципу действия различают два вида трансляторов: компиляторы и интерпретаторы. Поэтому можно выделить два класса языков программирования: компилируемые и интерпретируемые. Интерпретаторы работают как синхронные переводчики. Они берут один оператор из программы, транслируют его в машинный код и исполняют его. Если какой-то оператор многократно используется в программе, интерпретатор всякий раз будет добросовестно выполнять его перевод так, как будто встретил его впервые. Компиляторы обрабатывают программу в несколько приемов. Сначала они несколько раз просматривают исходный код, находят общие места, выполняют проверку на отсутствие ошибок синтаксиса и внутренних противоречий, и лишь потом переводят текст в машинный код. В результате программа получается компактной и эффективной. Если программа написана на интерпретируемом языке программирования, то ее можно выполнить только на том компьютере, на котором предварительно будет установлен интерпретатор, ведь он должен участвовать в исполнении программы. Программы, написанные на компилируемых языках программирования, после компиляции уже получается машинный код, в котором есть всё необходимое для работы процессора. Поэтому такие программы работают на любом компьютере и делают это в сотни раз быстрее. Это достоинство компилируемых языков программирования. Однако у программ, написанных на интерпретируемом компиляторе, есть другое преимущество. Так как можно исполнять их только под управлением интерпретатора, то соответственно можно без всяких проблем в любое время остановить работу программы, посмотреть ее операторы, внести нужные изменения и вновь запустить. Из этого следует, что содержание программы открыто для пользователя. Для откомпилированных программ всё это сделать практически невозможно. После компиляции программы её исходный текст остается только у автора. Все остальные пользователи получают машинный код, который можно исполнять, но практически нельзя ни посмотреть, ни изменить.

Языки программирования высокого уровня

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

Достоинства языков программирования высокого уровня:

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

Низкоуровневый язык программирования – это Ассемблер. Следующие высокоуровневые языки рассмотрены выше: Fortran, COBOL, Алгол.

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

Pascal. Язык Паскаль, созданный в конце 70-х годов основоположником множества идей современного программирования, ученым, теоретиком Никлаусом Виртом, во многом напоминает Алгол. Широко известный в вузовских кругах, в основном в России и в странах бывшего Советского Союза. Он использовался и продолжает использоваться как учебный язык. Во всём остальном мире он поменьше распространён, но тоже живёт и им пользуются.

C. Си придумали инженеры в 1972 году. Если Паскаль придумал учёный, то Си придумали Керниган и Ритчи, они работали инженерами в компании Bell. В то время на языках Fortran, COBOL и Algol ничего системного написать было нельзя. Например, операционную систему, драйвера и т.д. Эти языки предназначались для математических расчётов и для бизнес-расчётов. А всё остальное писали на Ассемблере. Керниган и Ритчи любили играть в игрушку Asteroids - летающий космический корабль, есть астероиды, он в них стреляет, и они разлетаются на части. У них был сервер, на котором они играли, но там было много народу, поэтому игрушка тормозила. И они обнаружили у себя где-то в кабинете, что у них стоит какой-то компьютер, которым никто не пользуется. Но было проблема - он другой архитектуры, а игра была написана на Ассемблере. Они её переписали. Но это навело их на мысль, что переписывать под новую архитектуру каждый раз – дело не из легких. И они решили написать такой язык высокого уровня, который будет подходить для системного программирования, то есть, в котором можно будет управлять памятью, в котором можно будет узнать, где, что лежит и как обращаться к памяти. Так появился язык Си, который оказал огромное влияние на всё дальнейшее. Соответственно, это был основной язык в Unix - операционной системе, которая в то время была ещё популярнее, чем сейчас. И примерно к 80-м годам ситуация была такая. Допустим, что всё это у нас уже уходит (упоминания об Ассемблере, Фортране и Алголе). И в 80-е годы компьютеры стали меньше, производительнее, дешевле, и людям захотелось всяких странностей, чтобы жить стало ещё лучше, ещё веселее.

Появление объектно-ориентированных языков программирования

Принято считать, что объектно-ориентированное программирование строится на 4 основных принципах[2]:

  • Абстракция
  • Инкапсуляция
  • Наследование
  • Полиморфизм

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

Инкапсуляция - это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.

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

Полиморфизм - это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Одна из первых странностей - был язык C++. Язык Си имеет огромное количество недостатков, особенно проблемы с памятью, а точнее её утечки. C++ создавался сначала как набор дополнений к языку Си, который облегчит разработку. В то время стало модно объектно-ориентированное программирование и люди решили, что всё можно описать в виде иерархии. C++ в каком-то смысле реализовывал этот объектный подход - это не был первый язык объектно-ориентированного программирования, но он стал достаточно популярным и в нём начали появляться всякие полезные функции. При этом C++ сохранял почти полную совместимость с языком Си, программа, написанная на Си в 99% случаев, успешно компилировалась и даже работала также. Это было задумано, чтобы с Си было легко перейти на C++. Помимо объектного подхода в C++, достаточно быстро появилась стандартная библиотека шаблонов STL. Кто ещё учил Паскаль, обнаруживали, что там, во-первых, нет встроенной сортировки. Но если понадобиться отсортировать в одном месте целые числа, в другом вещественные числа, а в третьем - строки, которые можно между собой сравнивать, приходилось писать три разные сортировки, которые делают абсолютно одно и тоже, просто у них разные типы данных. Это, конечно, не очень хорошо и шаблоны, которые не сразу появились в C++, эту проблему облегчили. В 90-х годах C++ применялся для всего, что нужно было писать не для веб-приложений, не для обработки текста, а для просто приложений, для операционных систем, в общем, для чего угодно. Но C++ это всё еще проблемный язык. Во-первых, он наследовал из-за обратной совместимости все проблемы языка Си. При этом, если писать всё хорошо и правильно, как было задумано авторами C++, то старыми способами, используемые в Си, убиться было нельзя, и вроде как их стало поменьше. Тем не менее разбиение программы на модули, вообще пришло из Си. В общем, недостатков у C++ очень много. Квалификация у программиста должна была быть высокая, чтобы писать на C++, и стоили такие программисты дорого. А компьютеры у нас всё быстрее и быстрее считают, становятся всё дешевле, люди покупают себе новые компьютеры и хотят больше приложений.

Но на рубеже 80-х и 90-х гг. компьютеры стали настолько хороши, что делали очень неэффективные вещи. И это были скриптовые языки, которые не компилировались в машинный код, а интерпретировались. Бейсик тоже в какое-то время интерпретировался, но эти скриптовые языки были предназначены в основном для обработки текстов - это Perl, Python (он был тогда не очень популярен), PHP, Ruby - вот те скриптовые языки, которые в той или иной степени используются до сих пор.

Perl был предназначен для обработки текстов - в те времена уже памяти стало настолько много в компьютерах, что туда можно было оставить какой-нибудь текст и с этим текстом сделать что-то полезное (например, считать слова, поиск и т.д.). Но его проектировали люди, которые были немного не в себе, потому что на нём можно только писать, читать его нельзя. Если посмотреть на код на Перле и пытаться что-то понять, то будет ничего не понятно. То есть, программы получаются коротки и проще переписать заново, чем разобраться с тем, что там есть и исправить. Примерно в то время, в середине 90-х, появился интернет. Сначала это были почта, сайты со статичным HTML, но людям захотелось добавить туда динамику, чтобы всё происходило динамично. Соответственно это требовало взаимодействия, придумали протокол, как это взаимодействует, и, самое главное, генерацию этих статических (условно) страниц, которые будут появляться пользователю в ответ на его запрос. В общем, ничего кроме языка Перла на тот момент не подходило. Писать на чистом Си или на C++ обработчик было плохой идеей. Перл был популярным языком для веб-разработки. Конечно, масштабы не сравнятся с тем, что сейчас происходит.

PHP появился случайно. Один человек довольно быстро перестал заниматься этим - делал свою страничку, была у него гостевая книга. И он написал набор макросов для Перла, которые были похожи на Си, потому что он на Си умел, просто потому что ему было так удобно. И назвал это Personal HomePage. Отправил в сеть и написал, что здесь всё намного понятнее, чем на Перле и можно править. Людям, конечно же, это понравилось. Потом он это дело бросил. В итоге этот PHP стал жить и со временем стал гораздо популярнее, чем Perl. Но вот эта его задумка как набор макросов для Перла с ним сыграла довольно злую шутку. Язык получился не лучший. То есть он развивался сам по себе, его никто не проектировал, никто не администрировал процесс развития, а было много групп, каждая из которых разрабатывала то, что им нравится. В итоге там функции называются по-разному, стиля нет, всё через подчёркивания, как попало, и как всё это будет работать не очень понятно. Зато можно сесть и через два часа писать на PHP, потому что он так задумывался.

Python и Ruby: Ruby сейчас менее популярен, Python получше. Интерпретируемый объектно-ориентированный язык программирования. По структуре и области применения близок к Perl, однако менее распространен, более строг и логичен. Имеются реализации для большинства существующих платформ. Понятное дело, что в те времена это были сильно специализированные языки для сильно специализированных целей. В общем случае никакого системного программирования, никакой бизнес-логики никто на них не писал в то время и сейчас не очень много это делает.

Java был создан компанией Sun в начале 90-х годов на основе C++. Язык Java зародился как часть проекта создания передового программного обеспечения для различных бытовых приборов. Реализация проекта была начата на языке С++, но вскоре возник ряд проблем, наилучшим средством борьбы с которыми было изменение самого инструмента - языка программирования. Стало очевидным, что необходим платформо-независимый язык программирования, позволяющий создавать программы, которые не приходилось бы компилировать отдельно для каждой архитектуры и можно было бы использовать на различных процессорах под различными операционными системами. Язык Java потребовался для создания интерактивных продуктов для сети Internet. Фактически, большинство архитектурных решений, принятых при создании Java, было желание предоставить синтаксис, сходный с Си и C++. В Java используются практически идентичные соглашения для объявления переменных, передачи параметров, операторов и для управления потоком выполнением кода. В Java добавлены все хорошие черты C++. Три ключевых элемента объединились в технологии языка Java:

  • Java предоставляет для широкого использования свои апплеты (applets) - небольшие, надежные, динамичные, не зависящие от платформы активные сетевые приложения, встраиваемые в страницы Web. Апплеты Java могут настраиваться и распространяться потребителям с такой же легкостью, как любые документы HTML.
  • Java высвобождает мощь объектно-ориентированной разработки приложений, сочетая простой и знакомый синтаксис с надежной и удобной в работе средой разработки. Это позволяет широкому кругу программистов быстро создавать новые программы и новые апплеты.
  • Java предоставляет программисту богатый набор классов объектов для ясного абстрагирования многих системных функций, используемых при работе с окнами, сетью и для ввода-вывода. Ключевая черта этих классов заключается в том, что они обеспечивают создание независимых от используемой платформы абстракций для широкого спектра системных интерфейсов.

Так вот, этот язык был хорошим по написанию и сразу же завоевал популярность. Во-первых, избавились от наследия Си, полностью, никаких указателей. Во-вторых, внедрили гораздо более свежие идеи в плане объектной модели - то есть C++ появился значительно раньше, чем Java и использовал более архаичную объектную модель. И третье, программы на Джаве собирались не в машинный код, а в код для виртуальной машины. То есть, у вас была виртуальная машина (VM) JVM – Джaвовская, программы собирались в промежуточное представление и затем, с помощью этой машины уже выполнялись. Отсюда и преимущества этого языка со своими недостатками, во-первых, он тормозил, во-вторых, он использовало память со страшной силой, в-третьих он был переносим куда угодно (теоретически) - хоть на кофеварку, хоть на кофемолку, хоть на компьютер, хоть на мобильный телефон. Это, с одной стороны хорошо, то есть можно написать просто реализацию виртуальной машины, потом джавовские программы запускаеть везде. Но, с другой стороны, плохо, что на том же телефоне тогда было мало памяти, отсюда была низкая производительность и всё это ещё дополнительно начинало тормозить. Но даже не это главное. Язык Джава придумывался чтобы снизить требования к квалификации программистов.

Следующее, что появилось - это .Net (дотнет), ну и в частности C# (Си Шарп). В конце 90-х годов в компании Microsoft под руководством Андерса Хейльсберга был разработан язык С#. В нем воплотились лучшие идеи Си и С++, а также достоинства Java. Правда, С#, как и другие технологии Microsoft, ориентирован на платформу Windows. Однако он не отличается от прочих универсальных языков. Язык С# предназначен для быстрой разработки .NET-приложений, и его реализация в системе Microsoft Visual Studio .NET содержит множество особенностей, привязывающих С# к внутренней архитектуре Windows и платформы .NET.

И ещё одна штука - JavaScript. Не имеет никакого отношения к языку Java, появился в том же году. Язык был создан в компании Netscape Communications в качестве языка для описания сложного поведения веб-страниц. Первоначально назывался LiveScript, причиной смены названия получили маркетинговые соображения. Интерпретируется браузером во время отображения веб-страницы. По синтаксису схож с Java и отдаленно с C/C++. Имеет возможность использовать встроенную в браузер объектную функциональность, однако подлинно объектно-ориентированным языком не является.

VBScript. Язык был создан в корпорации Microsoft во многом в качестве альтернативы JavaScript. Имеет схожую область применения. Синтаксически схож с языком Visual Basic. Так же, как и JacaScript, исполняется браузером при отображении веб-страниц и имеет ту же степень объектно- ориентированности.

Языки параллельного программирования

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

Язык Оccam. Этот язык был создан в 1982 году и предназначен для программирования транспьютеров - многопроцессорных систем распределенной обработки данных. Он описывает взаимодействие параллельных процессов в виде каналов - способов передачи информации от одного процесса к другому. Отмечается особенность синтаксиса языка Occam - в нем последовательный и параллельный порядки выполнение операторов равноправны, и их необходимо явно указывать ключевыми словами PAR и SEQ.

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

Неимперативные языки

[4]Все языки, о которых шла речь ранее, имеют одно общее свойство: они императивны. Это означает, что программы на них, в конечном итоге, представляют собой пошаговое описание решения той или иной задачи. Можно попытаться описывать лишь постановку проблемы, а решать задачу поручить компилятору. Существует два основных подхода, развивающие эту идею: функциональное и логическое программирование.

Функциональные языки. Основная идея, лежащая в основе функционального программирования - это представление программы в виде математических функций. Оператор присваивания в таких языках не используется (он там просто не нужен). Императивные возможности, как правило, имеются, но их применение обуславливается серьезными ограничениями. Динамическое программирование является довольно важным подходом в решении многих сложных задач, основанным на разбиении задачи на подзадачи и решении этих подзадач единожды, даже если они являются частью нескольких других подзадач. Это также относится к функциональному программированию. Существует одна особенность такого программирования - отсутствие переменных - мешает кешировать результаты решения подзадач, но другая особенность поможет - ленивые вычисления. Поэтому и создали языки с ленивой и с энергичной семантикой. В обычных, не ленивых, языках программирования вычисления строгие - то есть аргументы функции вычисляются перед выполнением самой функции. А в ленивых языках, вычисления отложенные. Все вычисления (кроме некоторых функций ввода-вывода), не выполняются сразу, а откладываются до надобности. Первые языки имеют более эффективную реализацию, в то время как вторые - лучшую семантику. Из языков с энергичной семантикой существует ML и два его современных диалекта - Standard ML (SML) и CaML. Последний имеет объектно-ориентированного потомка - Objective CaML (O’CaML). Среди языков с ленивой семантикой наиболее распространены два: Haskell и его более простой диалект Clean.

[5]Ленивые функции. Функции бывают ленивыми и строгими в своих аргументах. Ленивые - не вычисляют свои аргументы, а строгие - вычисляют, до какого-либо ограничения. Стоит отметить, что функция может быть ленивой в одном аргументе и строгой в другом. Большинству функций нужно использовать свои аргументы, что подразумевает их вычисление. [6]Есть простой способ проверить ленива ли функция в каком-либо аргументе. Нужно просто передать аргумент undefined, и если результатом будет ошибка, то функция строга в этом аргументе, а если нет, то ленива.

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

Языки логического программирования. Программы на языках логического программирования выражены как формулы математической логики, а компилятор пытается получить следствия из них. Родоначальником большинства языков логического программирования является язык Prolog (1971). У него есть ряд потомков - Parlog. Создан в 1983, ориентирован на параллельные вычисления. Также Delta Prolog и др. Логическое программирование, как и функциональное — это отдельная область программирования.

ЗАКЛЮЧЕНИЕ

Можно выделить общую тенденцию в развитии языков программирования. Языки развиваются в сторону всё большей абстракции. И это сопровождается падением эффективности. Повышение уровня абстракции следует за собой повышение уровня надёжности программирования. С низкой эффективностью можно справиться путём создания более быстрых компьютеров. Если требования к памяти слишком высоки, можно увеличить её объем. Это, конечно, требует времени и средств, но это всё возможно сделать. А вот с ошибками в программах можно справиться только одним способом: их необходимо исправлять. А ещё лучше - написать идеальный код и максимально затруднить их совершение. И именно на это направлены все исследования в области языков программирования.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Богазова З. Разные языки программирования и их области применения. Лекция в Яндексе / Блог компании Яндекс. URL: https://habr.com/ru/company/yandex/blog/272759/. (Дата обращения 27.04.19).
  2. Омский Государственный Технический Университет. URL: https://studfiles.net/preview/1397961/page:2/ (Дата обращения 29.04.19).
  3. К.А. Хайдаров. Основы алгоритмизации и языков программирования. URL: http://bourabai.ru/alg/classification04.htm (Дата обращения 29.04.19).
  4. А.Я. Архангельский. Программирование в Borland C++ - М., Бином, 2003.
  5. Эволюция языков программирования. URL: http://langprog.far.ru/historylangprog.html (Дата обращения 30.04.19).
  6. Real World Haskell by Bryan O'Sullivan, Don Stewart, and John Goerzen. URL: http://book.realworldhaskell.org/read/profiling-and-optimization.html
  7. Haskell. URL: https://habr.com/ru/post/131910/ (Дата обращения 30.04.19).
  8. Курносов А.П., Кулев С.А., Улезько А.В. Информатика. -М.: КолосС, 2005.-272 с.
  9. Малышев Р.А. Локальные вычислительные сети: Учебное пособие, РГАТА. – Рыбинск, 2005. – 83 с.

Приложения

Приложение

Рисунок 1

История развития языков программирования

[7]

Рисунок 2

Структура программы на языке Java

[8]

  1. Богазова З. Разные языки программирования и их области применения. Лекция в Яндексе / Блог компании Яндекс. URL: https://habr.com/ru/company/yandex/blog/272759/. (Дата обращения 27.04.19).

  2. Принципы объектно-ориентированного программирования. URL: https://habr.com/ru/post/147927/

  3. Эволюция языков программирования. URL: http://langprog.far.ru/historylangprog.html (Дата обращения 30.04.19).

  4. Эволюция языков программирования. (Дата обращения 30.04.19)

  5. Haskell. URL: https://habr.com/ru/post/131910/ (Дата обращения 30.04.19).

  6. Real World Haskell by Bryan O'Sullivan, Don Stewart, and John Goerzen. URL: http://book.realworldhaskell.org/read/profiling-and-optimization.html

  7. История развития языков программирования. URL: https://en.ppt-online.org/41161

  8. Структура программы на языке Java. URL: http://bourabai.ru/alg/classification04.htm