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

Классификация языков программирования высокого уровня. (Классификация языков программирования)

Содержание:

ВВЕДЕНИЕ

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

Актуальность данной темы обусловлена тем, что прогресс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов – языков программирования.

Целью курсовой работы является изучение классификации языков программирования высокого уровня и их развития.

Цели исследования:

  • Просмотреть общее сведения и уровни языков программирования.
  • Просмотреть историю развития языков программирования.
  • Рассмотреть критерии классификации языков программирования высокого уровня.

Задачи исследования:

  • Ознакомление с языками программирования.
  • Рассмотрение истории развития языков программирования.
  • Рассмотрение критериев классификации языков программирования высокого уровня.

В первой главе рассматриваются общие сведения о языках программирования и история их развития.

Во второй главе рассматривается классификация языков программирования высокого уровня.

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

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

Можно сформулировать ряд требований к языкам программирования и классифицировать языки по их особенностям.

Основные требования, предъявляемые к языкам программирования:

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

В настоящее время в мире существует несколько сотен реально используемых языков программирования. Для каждого есть своя область применения.

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

По этому критерию можно выделить следующие уровни языков программирования:

машинные;

машинно-ориентированные (ассемблеры);

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

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

Разные типы процессоров имеют разные наборы команд. Если язык программирования ориентирован на конкретный тип процессора и учитывает его особенности, то он называется языком программирования низкого уровня. В данном случае “низкий уровень” не значит “плохой”. Имеется в виду, что операторы языка близки к машинному коду и ориентированы на конкретные команды процессора. [2]

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

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

Язык ассемблера — это машинно-зависимый язык низкого уровня, в котором короткие мнемонические имена соответствуют отдельным машинным командам. Используется для представления в удобочитаемой форме программ, записанных в машинном коде. [2]

Язык ассемблера позволяет программисту пользоваться текстовыми мнемоническими (то есть легко запоминаемыми человеком) кодами, по своему усмотрению присваивать символические имена регистрам компьютера и памяти, а также задавать удобные для себя способы адресации. Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант, использовать в программе комментарии и др.

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

Классификация языков программирования

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

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

Процедурные языки разделяются на языки низкого и высокого уровня.

Если язык программирования ориентирован на конкретный тип процессора, то он зазывается языком программирования низкого уровня.

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

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

Однако, некоторые семейства ЭВМ (например, EC ЭВМ, IBM/370/ и др.) имеют единый машинный язык для ЭВМ разной мощности. В команде любого из них сообщает информацию о местонахождении операндов и типе выполняемой операции.

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

Языком низкого уровня (машинно-ориентированным) являются Ассемблер, который просто представляет собой каждую команду машинного кода, но не в виде чисел, а с помощью условных символьных обозначений, называемых мнемониками. [6]

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

  • Высокое качество создаваемых программ;
  • Возможность использования конкретных аппаратных ресурсов;
  • Предсказуемость объектного кода и заказов памяти;
  • Для составления эффективных программ необходимо знать систему команд и особенности функционирования данной ЭВМ;
  • Трудоемкость процесса составления программ, плохо защищенного от появления ошибок;
  • Низкая скорость программирования;
  • Невозможность непосредственно использования программ, составленных на этих языках, на ЭВМ и других типов. [4]

Языки программирования высокого уровня значительно ближе и понятнее человеку, нежели компьютеру.[1]

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

Особенности конкретных компьютерных архитектур в них не учитываются, поэтому создаваемые программы на уровне исходных текстов легко переносимы на другие платформы, для которых создан транслятор этого языка. Разрабатывать программы на языках высокого уровня с помощью понятных и мощных команд значительно проще, а ошибок при создании программ допускается гораздо меньше. Для перевода исходных программ допускается с языка высокого уровня на машинный язык используются специальные программы – трансляторы. [6]

Работа всех трансляторов строиться по одному из двух принципов: интерпретация и компиляция. [6]

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

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

Компиляция программы включает два действия: анализ – определение правильности записи исходной программы в соответствии с правилами построения языковых конструкций выходного языка, и синтез – генерирование эквивалентной программы в машинных кодах. [6]

Высокоуровневые языки используются в машинно-независимых системах программирования. Такие системы программирования в сравнении с машинно-ориентированными системами представляют более простыми в использовании.

Языка программирования высокого уровня подразделяют на процедурно-ориентированные, проблемно-ориентированные и объективно-ориентированные.

Процедурно-ориентированные языки применяются для записи процедур или алгоритмов обработки информации на каждом переделённом круге задач. К ним относятся:

  • Язык Фортран (Fortran), название которого происходит от слов Formulae Translation – «преобразование формул». Фортран представляет собой один из старейших языков программирования высокого уровня. Длительность его существования и применения можно объяснить простотой структуры данного языка.
  • Язык Бэйсик (Basic), который расшифровывается как Beginner All-purpose Symbolic Code, что в переводе означает – «многоцелевой символический обучающий код для начинающих», разработан в 1964 г. Как язык для обучения программирования.
  • Язык Си (С), применяемый с 1970-х гг. как язык системного программирования специально для написания OC UNIX. В 1980-е гг. на основе языка С был создан язык С++, практически включающий в себя язык С и дополнительный средствами объективно-ориентированного программирования.
  • Язык Паскаль (Pascal), который назван в честь французского ученого Б. Паскаля, начал применятся с 1968-1971 гг. Н. Виртом. При создании Паскаль использовался для обучения программированию, но со временем стал широко применяться для разборки программных средств в профессиональном программировании. [10]

Проблемно-ориентированные языки используются для решения целых классов новых задач, возникших в связи с постоянным расширением области применения вычислительной техники:

  • Язык Лисп (Lisp – List information Symbol Processing), который был изобретен в 1962г. Дж. Маккарти. Первоначально он применялся как средство для работы со строками символов. Лисп употребляется в экспертных системах аналитических вычислений и т.п.
  • Язык Пролог (Prolog – Programming in Loginc), используемый для логического программирования в системах искусственного интеллекта. [10]

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

  • Visual Basic (-Basic)
  • Delphi (-Pascal)
  • Visual Fortran (-Fortran)
  • C++ (-C)
  • Prolog++ (-Prolog)

Алгоритм, записанный на языке программирования, называется программой. В алгоритме обязательно должны быть предусмотрены все ситуации, которые могут возникнуть в процессе решения задач. [7]

Программирование – теоретическая и практическая деятельность, связанная с созданием программы.

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

История развития

Программирование появлюсь за долго до 50-х годов XX века. Первые идеи высказал ещё Чарльз Эббидж, которого по праву считают отцом компьютера. Он не знал о транзисторах,, микросхемах и мониторах, о достаточно точно описал основные принципы, на которых будут строится все вычислительные машины. Развила идею графина Ада Лавлейс. Её место в истории до сих пор вызывает немало споров, но одно обсалютно точно – именно Ада фактически стала первым известным программистом. Благодаря её трудам стало понятно, что путь к эффективному использованию машин – алгоритмы, описанные в коде. [10]

Процесс компьютерных технологий определил процесс появления новых разнообразных знаковых систем для записи алгоритмов языков программирования. Смысл появления такого языка – упрощение программного кода.

История создания и развития языков программирования довольно захватывающая и интересная тема. Рассмотрим же основные этапы становления этой важнейшей сферы деятельности и вспомним некоторые языки программирования, которые в свое время сыграли решающую роль в развитии всей ИТ-индустрии.

Современное общество просто не может нормально существовать без программирования. Практически все, что нас окружает, является копьютеризированным, а значит – работает на определенного рода программного обеспечении. Сейчас большинство языков программирования, которые активно используются, доведены до высокого уровня совершенства и способы решать практически любые возлоденные на них задачи. Но ещё несколько десятилетий назад это было совершенно не так – программирование только начинало зарождаться и совершенствоваться и для большинства программистов того времени создать какое-либо подобие игры в шахматы было очень большим достижением. [10]

Приблизительно в 50-е года начались активные разработки более совершенных вариантов языков программирования, нежели простые сигналы из нулей и единиц. Американские ученые разработали довольно успешный язык Ada, который используется для управления военной техникой. Также очень большую роль в ИТ-индустрии внес язык под названием Fortran. Он возник в глубинах компании IBM – главного компьютерного гиганта того времени, и активно используется для решения научных и технических задач.

Европейские ученые не на шутку взволновались успехами американцев и решили создавать свой язык программирования, дабы не дать США доминировать в области программирования. Благодаря их решению история развития языков программирования дополнилась ещё одним представителем – языком Algol, который решил примерно те же задачи, что и его американский конкурент. [10]

Одним из участников работы над упомянутым выше. Аголом по имени Никлаус Вирт решил создать более универсальный и продвинутый язык. В итоге он представил миру такой легендарный язык программирования, как Паскаль. Именно он внес существенный вклад в развитие данной области знаний и прочной основной для появления других, более совершенных языков. Паскаль стал одним из первых языков, использующих структурное программирование, довольно простой и легко запоминающийся синтаксис. В будущем многие компании и индивидуальные программисты создавали на базе Паскаль свои варианты языков. К примеру, известная Apple создала расширение Паскаля под названием Object Pascal, а компания Borland – очень популярную и удачную интегрированную среду разработки Turbo Pascal.

В 70-х годах велись активные разработки языка С, который в будущем послужил надежной праформой для создания целого ряда своих более совершенных вариантов: Си Шарп, С++ и другие. С был уже полноценным высокоуровневым языком программирования, на которого возможно реализовывать практически любые задачи по созданию самого разнообразного ПО. Известный и популярный в наше время язык Objective-C, который разработан компанией Apple и активно используется для написания программного обеспечения на их гаджеты и другие продукты, создан именно на основе того самого языка С из далеких 70-х.

История создания языков программирования была бы не полной, если не упоминать еще и о таких важнейших языках, как Java, PHP, HTML. Java возник в середине 90-х годов и сразу получил широкое применение и популярность. С его помощью одинаково легко пишутся как программы на ПК, так и различные скрипты, веб-приложения, и многое другое. HTML язык был разработан британским программистом Т. Бернерсом-Ли в начале 90-х., именно он стал основной всей сети интернет и имеющихся сейчас в не миллионов сайтов. Что касается PHP, то этот популярный нынче язык также возник в 1995 года имел открытый исходный код и способность реализовать практически любую задумку в сфере создания динамических вебсайтов.

2. Классификация языков программирования высокого уровня

Языки программирования высокого уровня не зависят от среды вычислений, поскольку они ориентированы не на систему низкоуровневых команд конкретного аппаратного решения, а представляют собой систему операторов, характерных для записи определенного класса алгоритмов. [1; c. 9] Такой подход к реализации позволяет существенно облегчить задачу разработки программного обеспечения, за счет абстрагирования от деталей аппаратного обеспечения. А также позволяет легко использовать написанный ранее код для различных архитектур и операционных систем. [8]

Однако программы, написанные на языках высокого уровня, как правило, занимают больше памяти и медленнее выполняются, чем программы на машинных языках, требуют наличия специализированных программ-трансляторов. По этой причине языки высокого уровня преимущественно используют для создания программного обеспечения для компьютеров и вычислительных устройств с большим объемом памяти. [1; с. 9]

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

рис. 1

2.1. Классификация по парадигме программирования

Основывается на их принадлежности к одному из оформившихся к настоящему времени стилей программирования, каждому из которых соответствует своя собственная модель вычислений. [1; с. 9]

Императивные (процедурные): основными объектами в таких языках являются переменные, операторы присваивания, стандартные алгоритмические конструкции. Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих те или иные действия, которые должен выполнить компьютер. [6; с. 43]

Фрагмент программы может выглядеть таким образом:

<оператор 1>

<оператор 2>

<оператор n>

Программы на процедурных языках, как правило, содержат также описательную (декларативную) часть, содержащую описание данных над которыми будут производится вычисления. Декларативные части программы чаще всего находятся в ее начале, а также в начале каждой подпрограммы. Иногда декларативная часть может быть вынесена в отдельные исходные файлы специального типа. [11]

Процедурная часть программы заключается внутри подпрограмм, называемых функциями, процедурами или классами в зависимости от языка.

Пример описания функции на языке C:

int foo(int x, int y)

{

тело функции

}

где int foo(int x, int y) — описание функции содержащее ее имя и имена типов данных с которыми она работает,

{ и } — символы, определяющие начало и конец функции.

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

<оператор 1>; <оператор 2>;

<оператор 3>

<оператор n>

Однако, независимо от того, как записаны операторы, мы имеем дело с так называемой, линейной программой или линейным участком (рис. 2).

рис. 2

Основным, в императивной парадигме является оператор присваивания, меняющий значение переменной в памяти ЭВМ. [11]

Пример на языке C:

y = 3; x = 2 * sin(y);

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

Для того чтобы расширить возможности программ, необходимы условные операторы и операторы выбора. Условный оператор позволяет поставить выполнение тех или иных действий в зависимость от выполнения некоторых условий. [11]

рис 3.

В упрощенной форме условный оператор содержит условие (предикат) P, в зависимости от которого будет выполнена последовательность действий S1 или S2 (рис. 3).

Пример на языке C:

if (x == 4)

exit();

else

x++;

В программах также может возникать необходимость повторяющегося выполнения некоторых действий. Для этого используются два механизма — итерация и рекурсия. [11]

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

Пример рекурсивного вычисления факториала на языке C:

long int factorial(int n) {

if (n == 0) return 1;

return n*(factorial — 1);

}

Конструкции, обеспечивающие итерацию, называются циклическими конструкциями. Примером может служить цикл ПОКА (while loop), обеспечивающий выполнение последовательности действий (тела цикла) S, до тех пор, пока верно логическое условие P (рис. 4).

рис. 4

Пример циклической конструкции на языке C:

while (a < 10) {

a++;

}

Основная идея процедурного программирования заключается в разделении крупной задачи на несколько более мелких, вычисляемых отдельными процедурами (функциями). Такой подход позволяет легко повторно использовать ранее написанные процедуры для решения новых задач. [5; с. 48-49]

Функциональные: программа описывает вычисление некоторой функции, значения которой определяются по заданным параметрам; предназначены для решения задач нечисленного характера. Примером функционального языка является язык LISP (List Processing — обработка списков). Разработан и реализован в Массачусетском технологическом институте в 1959 г. Рассматривается специалистами как основной язык программирования систем искусственного интеллекта.

Логические: программы на таких языках не описывают действия, они задают данные и отношения между ними, после этого можно задавать вопросы. Языком логического программирования является Prolog — Programming in Logic.

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

2. По модели выполнения [3]

Компилируемые: языки, исходный код которых преобразуется компилятором в объектные модули, которые затем собираются при помощи программы сборки в единый загружаемый модуль. Этот модуль представляет собой выполняемую программу.

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

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

Интерпретируемые: к этой группе относят языки программирования, исходный код которых считывается и выполняется программой-интерпретатором инструкция за инструкцией.

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

  • Независимость от платформы;
  • Рефлексия;
  • Динамическая типизация;
  • Меньший размер исполняемых файлов;
  • Динамические области видимости.

Основным недостатком интерпретируемым языком являются их невысокая скорость исполнения. Тем не менее, JIT-компиляция позволяет ускорить процесс благодаря переводу часто используемых последовательностей инструкции в машинный код.

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

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

3. По системе типов

Тип – это коллекция возможных значений. Целое число может обладать значениями 0, 1, 2, 3 и так далее. Булево может быть истиной и ложью. Можно придумать свой тип, например, тип «ДайПять», котором возможны значения «дай» и «5», и больше ничего. Это не строка и не число, это новый, отдеьный тип.

Статическая типизация: переменные, параметры подпрограммы, возвращаемое значение функции связывается с типом в момент объявления и тип не может быть изменен позже. Примеры статически типизированных языков — Ада, C++, C#, D, Java, ML, Pascal, Nim.

Статически типизированные языки ограничивают типы переменных: язык программирования может знать, например, что х – это Integer/ В этом случае программисту запрещается делать x = true, это будет некорректный код. Компилятор откажется компилировать его, так что мы не сможем даже запустить такой код. Другой статически типизированный язык может обладать другими выразительными возможностями, и никакая из популярных систем типов не способна выразить наш тип ДайПять.

Статические языки проверяют типы в программе во время компиляции, еще до запуска программы. Любая программа, в которой типы нарушают правила языка, считается некорректной. Например, большинство статических языков отклонит выражение "a" + 1 (язык Си — это исключение из этого правила). Компилятор знает, что "a" — это строка, а 1 — это целое число, и что + работает только когда левая и правая часть относятся к одному типу. Так что ему не нужно запускать программу чтобы понять, что существует проблема. Каждое выражение в статически типизированном языке относится к определенному типу, который можно определить без запуска кода.

Многие статически типизированные языки требуют обозначать тип. Функция в Java public int add(int x, int y) принимает два целых числа и возвращает третье целое число. Другие статически типизированные языки могут определить тип автоматически. Та же самая функция сложения в Haskell выглядит так: add x y = x + y. Мы не сообщаем языку типы, но он может определить их сам, потому что знает, что + работает только на числах, так что x и y должны быть числами, значит функция add принимает два числа как аргументы

Это не уменьшает "статичность" системы типов. Система типов в Haskell знаменита своей статичностью, строгостью и мощностью, и по всем этим фронтам Haskell опережает Java.

Динамическая типизация: переменные связываются с типом в момент присваивания значения, а не в момент объявления переменной. Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов. Примеры языков с динамической типизацией — Smaltalk, Python, Objective-C, Ruby, PHP, Perl, JavaScript, Lisp, xBase, Erlang, Visual Basic.

Динамически типизированные языка не требуют указывать тип, но и не определяют его сами. Типы переменных неизвестны до того момента, когда у них есть конкретные значения при запуске. Например, функция Python

def f(x, y):

return x + y

может складывать два целых числа, склеивать строки, списки и так далее, и мы не можем понять, что именно происходит, пока не запустим программу. Возможно, в какой-то момент функцию f вызовут с двумя строками, и с двумя числами в другой момент. В таком случае x и y будут содержать значения разных типов в разное время. Поэтому говорят, что значения в динамических языках обладают типом, но переменные и функции — нет. Значение 1 это определенно integer, но x и y могут быть чем угодно.

Большинство динамических языков выдадут ошибку, если типы используются некорректно (JavaScript — известное исключение; он пытается вернуть значение для любого выражения, даже когда оно не имеет смысла). При использовании динамически типизированных языков даже простая ошибка вида "a" + 1 может возникнуть в боевом окружении. Статические языки предотвращают такие ошибки, но, конечно, степень предотвращения зависит от мощности системы типов.

Статические и динамические языки построены на фундаментально разных идеях о корректности программ. В динамическом языке "a" + 1 это корректная программа: код будет запущен и появится ошибка в среде исполнения. Однако, в большинстве статически типизированных языков выражение "a" + 1 — это не программа: она не будет скомпилирована и не будет запущена. Это некорректный код, так же, как набор случайных символов !&%^@*&%^@* — это некорректный код. Это дополнительное понятие о корректности и некорректности не имеет эквивалента в динамических языках.

Понятия "сильный" и "слабый" — очень неоднозначные. Вот некоторые примеры их использования:

  • Иногда "сильный" означает "статический".
    Тут все просто, но лучше использовать термин "статический", потому что большинство используют и понимают его
  • Иногда "сильный" означает "не делает неявное преобразование типов".
    Например, JavaScript позволяет написать "a" + 1, что можно назвать "слабой типизацией". Но почти все языки предоставляют тот или иной уровень неявного преобразования, которое позволяет автоматически переходить от целых чисел к числам с плавающей запятой вроде 1 + 1.1. В реальности, большинство людей используют слово "сильный" для определения границы между приемлемым и неприемлемым преобразованием. Нет какой-то общепринятой границы, они все неточные и зависят от мнения конкретного человека.
  • Иногда "сильный" означает, что невозможно обойти строгие правила типизации в языке.
  • Иногда "сильный" означает безопасный для памяти (memory-safe).
    Си — это пример небезопасного для памяти языка. Если xs — это массив четырех чисел, то Си с радостью выполнит код xs[5] или xs[1000], возвращая какое-то значение из памяти, которая находится сразу за xs.

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

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

ЗАКЛЮЧЕНИЕ

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

В ходе написания курсовой работы были подробно рассмотрены наиболее часто употребляемые критерии классификации языков программирования высокого уровня, история их появления и развития.

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

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

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

  1. Основы алгоритмизации и программирования/Т.А. Жданова, Ю.С. Бузыкова. Издательство ТОГУ 2011г.
  2. Информатика/Курсанов А. П., Кулев С. А., Улезько А. В. и др. Под ред. А. П. Курсанова. –М: КолосС, 2005 г.
  3. Программирование и основы алгоритмизации/ В. Л. Макаров. С-Пб: 2003г.
  4. Информатика. Часть 1. / Ю. Ю. Громов, О. Г. Иванова, Н. А. Земской, А. В. Лагутин, В. М. Тютюнник, В. Н. Точка, Н. Г. Шахов. Издательство ТГТУ. –Т: 2007г.
  5. Основы программирования. Учебное пособие. Часть 1 / А. А. Тюгашев. –С-Пб: 2016г.
  6. Основы алгоритмизации и программирования / Г. Р. Кадырова. –У: УлГТУ, 2014г.
  7. Волкова, Т.И. Введение в программирование : учебное пособие / Т.И. Волкова. - Москва ; Берлин : Директ-Медиа, 2018. - 139 с. : ил., схем., табл. - Библиогр. в кн. - ISBN 978-5-4475-9723-8 ; То же [Электронный ресурс]. - URL: http://biblioclub.ru/index.php?page=book&id=493677 (07.09.2019)
  8. Роганов Е. А. Основы информатики и программирования / Учебное пособие - М.: МГИУ, 2001 - 315 с., ил. ISBN 5-276-00187-1
  9. Парадигма программирования : курс лекций / Л. В. Городняя ; Новосиб. гос. ун-т. – Новосибирск : РИЦ НГУ, 2015. – 206 с
  10. Пратт Т., Зелковиц М. Языки программирования: разработка и реализация. / Под общей ред. А. Матросова. — СПб.: Питер, 2002. — 688 с.; ип. ISBN 5-318-00189-0
  11. А.А. Тюгашев. Основы программирования. Часть I. – СПб: Университет ИТМО, 2016. – 160 с.