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