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

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

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

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

Добавлен: 29.03.2023

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

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

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

Введение

Для данной работы была выбрана тема «Основные правила работы с функциями: примеры и ограничения использования функций в различных языках программирования». Я нахожу данную тему значимой, так как функции помогают избавиться от множества проблем и ошибок в программировании.

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

Для достижения цели выделим следующие задачи:

- определить что такое функция;

- обосновать надобность функций, их достоинства и недостатки;

- определить основные характеристики функций;

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

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

- определить ограничения использования функций в различных языках программирования;

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

Источники, использованные в данной курсовой работе, являются в большей мере книгами, но также были использованы и учебники. Годы написания источников варьируются от 2002 до 2014. Авторами книг и учебников являются специалисты в области программирования, преподаватели, а также известные в it-среде теоретики и практики. Кроме того, используемые источники изданы в издательствах с хорошей репутацией, проверенной временем. В некоторых дисциплинах, связанных с программированием, эти источники считаются фундаментальными.

1. Функция в программировании

1.1. Определение функции, основные понятия

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

Говоря о функциях, важно определить 2 понятия: объявление функции и вызов функции. Объявление функции – это занесение в пространство имен программы имени функции, определение ее параметров и тела (или, говоря иначе, алгоритма действий). Вызов функции – это использование функции, при котором непосредственно выполняется ее код. Функции можно вызывать внутри других функций. Также функция может вызывать в своем теле себя же, такое явление называется рекурсией, а функция рекурсивной [6].


Если программа состоит из набора функций и их вызовов, то говорят, что такая программа создана с помощью процедурного подхода. При процедурном подходе программа подразделяется на главную функцию и вспомогательные. Для того, чтобы вспомогательные функции запустились, их нужно вызвать в главной. На рисунке 1 представлено дерево вызовов такой программы (Main – главная функция, FuncA, FuncB… – вспомогательные функции) [9].

Рисунок 1. Дерево вызовов

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

1.2. Характеристики функции

Рассмотрим основные характеристики функций:

1) Имя. Имя функции отражает ее непосредственное назначение. Обычно имя функции состоит из глагола, который описывает основное действие функции, или фразы, содержащей этот глагол. Например, имя функции подсчета среднего значения – computeAverage. Имя функции не должно быть длинным, оно должно быть кратким и понятным. Также существуют правила наименования функций, которые отличаются в зависимости от языка программирования. Например, в С название функции не должно начинаться с цифры или знака препинания, кроме нижнего подчеркивания. Если не следовать этим правилам, то код не скомпилируется, и программа не сможет быть запущена. Следует отметить, что в некоторых языках программирования есть возможность объявить анонимную функцию, то есть функцию, у которой нет имени (например, в JavaScript) [6].

2) Тело. Тело функции состоит из набора команд и выражений, которые определяют, что делает функция. Говоря иначе, тело функции отражает ее алгоритм действий [7].

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

4) Возвращаемое значение. Возвращаемое значение функции – это данные, которая функция возвращает в результате своего выполнения. Возвращаемое значение формируется на основе входных параметров и/или других данных, получаемых в теле функции. У функции может не быть выходного значения или их может быть несколько [6].


На рисунке 2 схематично представлена работа функции.

Рисунок 2. Схема функции

1.3. Преимущества и недостатки использования функций

Функции помогают писать более чистый код и избегать ошибок. Конкретизируем и обоснуем данное утверждение, представив список причин, по которым нужно использовать функции:

1) Использование функций позволяет избегать дублирования кода, а также ошибок, связанных с ним. Таким образом, если в алгоритме ошибка, то ее будет достаточно исправить один раз. Кроме того, для хоть сколько-нибудь большого количества вызовов написание одной функции будет гораздо экономнее по времени и трудозатратам, чем простое копирование и корректировка кода [4].

2) Уменьшается объем кода. Десятки строк заменяются одним вызовом функции, что облегчает восприятие и проверку кода.

3) При отсутствии дублирования кода и уменьшении его объема повышается читаемость кода. А чем выше читаемость, тем легче поддерживать код.

4) При помощи функций задача легче и нагляднее разбивается на подзадачи, что упрощает дальнейшее решение [5].

5) Функции дают возможность тестировать части программы независимо друг от друга. Кроме того, за счёт повышения атомарности (разбития на части) проще локализовать и найти ошибку [4].

6) Функции позволяют не «засорять» пространство имен переменных, так как локальные переменные «живут» только во время выполнения функции. Например, если в функции func1 объявлена переменная с названием i, то в функции func2 тоже можно объявить переменную с таким же названием и конфликта не будет. Также не тратится память на хранение значений переменных, которые не нужны вне функции [5].

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

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

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


2. Анализ языков программирования для приведения примеров использования функций

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

В зависимости от критерия, языки программирования могут делиться по:

- уровню – низкого или высокого уровня;

- типизации – типизированные и не типизированные языки [6].

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

2.1. Языки низкого и высокого уровня

Под «уровнем» в данном случае понимается уровень приближенности вычислений и в целом языка к непосредственно аппаратным процессам. Таким образом, язык низкого уровня – язык, взаимодействующий, например, с регистрами памяти, и оперирующий командами, свойственными архитектуре процессора. Очевидным случаем такого языка является машинно-ориентированный язык программирования Assembler. Все его команды являются адаптированными для человека командами процессора. Данный язык программирования имеет множество версий, синтаксис которых различен и зависит от архитектуры процессора, на работу с которым направлена конкретная версия [7].

Безусловным достоинством подобных языков является быстродействие – в силу максимальной близости инструкций к машинным, время проведение любых операций минимально [9]. Однако, это влечёт за собой следующие недостатки:

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

- сложная читаемость и большой объем кода – следствие того факта, что фактически программист должен оперировать машинными инструкциями, а значит, объём кода даже для простейшей операции может быть очень большим;

- из-за сильной зависимости языка от платформы переносимость программ практически не существует [6].

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


Условно языком высокого уровня можно считать С, однако он так же допускает прямую работу с памятью и ряд других возможностей, поэтому его следует отнести скорее к языкам «среднего» уровня. Более явными примерами языков высокого уровня являются С++, Java, JavaScript и т.д.

2.2. Типизированные и не типизированные языки программирования

Говоря о типизированных и не типизированных языках, корректнее будет говорить не только о наличии типизации, но и о видах типизации. Типизация бывает:

- статическая;

- динамическая;

- слабая;

- сильная;

- явная;

- неявная;

- отсутствующая [7].

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

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

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

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