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

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 14.06.2023

Просмотров: 194

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Фортран

Фортран (Fortran) — первый реализованный язык программирования высокого уровня (после Планкалкюля), правда, с одной небольшой оговоркой — для машин, построенных по классической схеме фон Неймана. Создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса (John Backus) в корпорации IBM. Через пару лет начались его коммерческие поставки. До этого программирование велось либо непосредственно в машинных кодах, либо на символических ассемблерах. Название Fortran является аббревиатурой от FORmula TRANslator, то есть, переводчик формул.

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

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

Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для эффективного программирования для новых вычислительных архитектур; позволяет применять современные технологии программирования, в частности, ООП.

Элементы синтаксиса у фортрана.

Комментарий до конца строки

! или * в первом символе строки

Регистрозависимость

Нет

Регулярное выражение идентификатора переменной

[a-zA-Z][_a-zA-Z0-9]{0-n}

Присваивание значения переменной

=

Объявление переменной

type :: variable

Объявление переменной с присваиванием значения

type :: variable = value

Группировка выражений

()

Блок

do ... end do

Равенство

= или .EQ.

Неравенство

/= или .NE.

Сравнение

== < > <= >= <> или .LT. .GT. .LE. .GE.

Вызов функции

CALL f(a,b...)

Вызов функции без параметров

CALL f

Последовательность

конец строки

Если - то

if condition then ... end if

Если - то - иначе

if condition then ... else ... endif

Цикл с постусловием

DO ... WHILE (condition)

Цикл for - next для диапазона целых чисел с инкрементом на 1

do label i = 1, 10

Цикл for - next для диапазона целых чисел с декрементом на 1

do label i = 10, 1, -1


Бейсик

Синтаксис языка напоминает Фортран и многие элементы — явные заимствования из него. Язык задумывался для обучения, поэтому его конструкции максимально просты. Как и в других языках программирования, ключевые слова взяты из английского языка. Основных типов данных два: строки и числа. С появлением версии Visual Basic, а также различных его модификаций (таких как VBA), в языке появились многие другие типы данных и дополнения, типичные для современных языков программирования (например, такие, как объектная модель). Объявление переменных не требует специальной секции (в отличие от Паскаля). Объявление переменной — это первое её использование.Одним из наиболее распространённых вариантов языка Бейсик стала реализация интерпретатора QBasic корпорации Microsoft. Долгие годы она включалась как бесплатное приложение, входящее в операционные системы MS-DOS и ранних Windows. В нём имелись довольно мощные графические и звуковые возможности, позволяющие создавать на этом языке даже игры.Бейсик поздних версий (начиная с Turbo Basic и Visual Basic) резко отличается от ранних вариантов. Фактически, это новый язык, который во многом ближе к Фортрану или Паскалю, чем к исходному Бейсику. Основные изменения версий 1990-х годов состоят в следующем:

  • Отказались от представления программы как неструктурированного набора пронумерованных строк. Номера строк превратились в обычные метки, которые стали необязательными и перестали влиять на порядок исполнения программы. Если ранее строка с номером 15 всегда шла в программе раньше строки с номером 20, то теперь порядок исполнения стал определяться порядком расположения строк в исходном коде. Метки перестали быть только числовыми.
  • В языке появились именованные подпрограммы с параметрами, механизм вызова подпрограмм стал обычным: подпрограмма вызывается по имени, с указанием списка фактических параметров.
  • Появилась рекурсия.
  • Были введены структурные управляющие конструкции, в результате для организации обычных ветвлений и циклов перестало быть необходимым использование оператора GOTO и меток строк.
  • Существенно расширилась номенклатура типов данных, появилась возможность явно описывать типы обычных переменных.
  • Стали необязательными типизирующие суффиксы в именах переменных, хотя их использование не запрещалось.
  • В более поздних версиях появилась обработка исключений и поддержка элементов ООП.
  • Были введены механизмы поддержки модульности — появилась возможность без «фокусов» (типа динамической загрузки модулей с помощью явных системных вызовов) разделять программу на несколько файлов исходного кода.
  • Появились средства для работы с цветной графикой и звуковой картой.
  • Visual Basic, ориентированный на разработку Windows-приложений с графическим интерфейсом пользователя, был выполнен интегрированным с графическим дизайнером интерфейса, что позволило быстро писать простые программы под Windows.
  • Появились кроссплатформенные реализации, например, FreeBASIC и PureBasic.

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

Фрагмент типичной программы на FreeBASIC:

# Lang "fb"

Dim as String n, s, t, n2, t2

Cls: Print "Добро пожаловать!" 'Заголовок в первой строке

Do

'Цикл, выводящий линию под заголовком, на всю ширину экрана

For i as Integer=1 to LoWord (Width)

Print "=";

Next i

'Ввод символьных данных от пользователя

Input «Имя:» n

Input «Фамилия:», s

Input «Отчество:», t

'Вырезаем копию первых символов из имени и отчества

n2=Left (n, 1)

t2=Left (t, 1)

'Выводим результат

Print "Ваше имя кратко: "; s ; " "; n2; ". "; t2; "."

Print "Повторить программу? (y/n) "

Loop While LCase(Input(1))="y"

End 0

Несмотря на популярность, в 2001 году Microsoft отказалась от дальнейшей поддержки Visual Basic в пользу принципиально нового языка Visual Basic .NET — в этой реализации язык был снова кардинально пересмотрен, и в текущем состоянии он практически совпадает по набору возможностей c языком C#, отличаются только детали синтаксиса и ключевые слова. Таким образом, Basic перерос из средства для создания программ любителям-непрофессионалам до полноценного средства создания программ.

Помимо написания полноценных программ, Бейсик широко применяется как основа для различных скриптовых языков (например, макросы в пакете Microsoft Office пишутся на диалекте VBA).

C++

C++ — компилируемый, статически типизированный язык программирования общего назначения.

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

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


Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.

Синтаксис

Громоздкость

Определение синтаксиса является одним из самых громоздких и продолжает расширяться. Стандарт 2003 г. содержал уже более 200 строк РБНФ, усложнённых наличием среди них массы неоднозначностей (англ. disambiguations). Даже семантически более мощные языки имеют существенно более простой синтаксис (например, РБНФ языка Scheme по стандарту R6RS составляет всего 12 основных строк плюс 11 строк т. н. «синтаксического сахара», то есть необязательных). Громоздкость синтаксиса С++ порождает массу проблем.

  • становится невозможным редактирование синтаксиса языка программистом для адаптации к требованиям предметной области (как это возможно, например, в OCaml посредством управления модулем camlpX компилятора, или в метаязыках посредством синтаксических макросов).
  • практически гарантированы (предсказуемы с очень высокой вероятностью в силу человеческого фактора) отклонения от стандарта в различных компиляторах, что обеспечивает низкую портируемость программ на C++ между компиляторами (см. раздел Особенности). Большинство промышленных языков (даже не стандартизированных) защищено от этого формальной семантикой .

Принуждение к избыточности

  • Многие языки предлагают избыточность — несколько перегружающих друг друга способов получить один и тот же результат, так что использующие их программисты оказываются свободны в выборе; при этом в иных ситуациях эти языковые элементы оказываются полезны каждый по своему. С++ вынуждает использовать необоснованно перегружающие друг друга элементы, что приводит к неделимому перемешиванию «что» и «как» в программировании (функциональности и её реализации). Доступ к данным («что»-операция) в С++ осуществляется двумя «как»-операциями: «.» и «->» в зависимости от того, как именно в данном контексте реализовано представление данных. Полиморфизм так же имеет две реализации: простую и виртуальную. Наряду с наследованным из Си управлением памятью через malloc/free добавляется управление памятью через new/delete и new[]/delete[], и не осуществляется никакого контроля за парность. Можно выделить блок с помощью new[], а затем высвободить с помощью delete или даже free — это приводит к скрытым ошибкам и нестабильной работе программ (так как new и new[] реализованы через malloc, но выполняют больше инициализаций, подчистка которых в этом случае не производится). То же касается приведения типов — наряду с наследованным из Си простым приведением типов, в С++ добавлены специальные операции — dynamic_cast, static_cast, const_cast, reinterpret_cast.

Тяжелое наследие

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

Сложное поведение между точками следования

  • Операции присваивания (=), инкремента (++), декремента (--) и др. являются в Си выражениями, возвращающими значение, а не формируют самостоятельную императивную команду, как в других императивных языках — и С++ унаследовал это свойство. Однако, в отличие от простых выражений, данные операции осуществляют изменение состояния. В нечистых ФЯ (Lisp, ML) изменение состояния обычно делается самостоятельной императивной командой, не возвращающей значения, что делает их как минимум хорошо заметными при чтении кода. В С++ же это позволяет создавать трудночитаемые выражения, размещая сложное поведение между точками следования, что влечёт труднообнаружимые ошибки и снижает портируемость. В Си такая семантика, несмотря на её опасность, была предназначена для обеспечения возможности ручной оптимизации кода (немедленное использование значения выражения позволяет избавиться от ненужных ассемблерных команд пересылки данных). Однако, в настоящее время оптимизирующие компиляторы обычно генерируют оптимальный код и на традиционных выражениях (устраняя ненужные ассемблерные команды автоматически)[24], так что выгода от этой возможности С++ более не компенсирует порождаемые ею проблемы в прикладном программировании.

Разрушающее присваивание вместо ветвления

  • Операции разрушающего присваивания (=) и логического сравнения (==) синтаксически схожи. Поскольку присваивание является в С++ операцией, возвращающей значение, то замена сравнения на присваивание в любом контексте является синтаксически и семантически корректным, но в корне изменяет поведение программы, что влечёт труднообнаружимые ошибки. Типичный пример подобной ошибки:
  • if (x=0) { операторы }
  • Здесь в условном операторе записан один символ равенства вместо двух, то есть операция присваивания вместо операции сравнения. В результате, вместо того, чтобы сравнить текущее значение x с нулём, программа присвоит x нулевое значение, затем возьмёт результат этого выражения (ноль), выполнит неявное приведение типа к булеву значению «ложь» (поскольку так того требует семантика оператора if), и блок операторов в условной конструкции не выполнится никогда. В развитых компиляторах С++ предлагается диагностика некоторых подобных синтаксических случаев с выдачей предупреждений, но реализация подобной диагностики для С++ весьма трудоёмка.