Программная функция и программный аспект. Что такое функция? – язык программирования Си Функции включенные в язык программирования


Если вы такой же разработчик, как и я, то наверняка сперва изучали парадигму ООП. Первым вашим яыком были Java или C++ - или, если вам повезло, Ruby, Python или C# - поэтому вы наверняка знаете, что такое классы, объекты, экземпляры и т.д. В чём вы точно не особо разбираетесь, так это в основах той странной парадигмы, называющейся функциональным программированием, которая существенно отличается не только от ООП, но и от процедурного, прототипно-ориентированного и других видов программирования.

Функциональное программирование становится популярным - и на то есть причины. Сама парадигма не нова: Haskell , пожалуй, является самым функциональным языком, а возник он в 90-ых. Такие языки, как Erlang, Scala, Clojure также попадают под определение функциональных. Одним из основных преимуществ функционального программирования является возможность написания программ, работающих конкурентно (если вы уже забыли, что это - освежите память прочтением ), причём без ошибок - то есть взаимные блокировки и потокобезопасность вас не побеспокоят.

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

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

1. Все функции - чистые

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

  • Функция, вызываемая от одних и тех же аргументов, всегда возвращает одинаковое значение.
  • Во время выполнения функции не возникают побочные эффекты .
  • Первое правило понятно - если я вызываю функцию sum(2, 3) , то ожидаю, что результат всегда будет равен 5. Как только вы вызываете функцию rand() , или обращаетесь к переменной, не определённой в функции, чистота функции нарушается, а это в функциональном программировании недопустимо.

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

    2. Все функции - первого класса и высшего порядка

    Эта концепция - не особенность ФП (она используется в Javascript, PHP и других языках) - но его обязательное требование. На самом деле, на Википедии есть целая статья, посвящённая функциям первого класса . Для того, чтобы функция была первоклассной, у неё должна быть возможность быть объявленной в виде переменной. Это позволяет управлять функцией как обычным типом данных и в то же время исполнять её.

    3. Переменные неизменяемы

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

    4. Относительная прозрачность функций

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

    Пусть у нас есть Java-функция, которая складывает 3 и 5:

    Public int addNumbers(){ return 3 + 5; } addNumbers() // 8 8 // 8

    Очевидно, что любой вызов этой функции можно заменить на 8 - значит, функция относительно прозрачна. Вот пример непрозрачной функции:

    Public void printText(){ System.out.println("Hello World"); } printText() // Returns nothing, but prints "Hello World"

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

    5. Функциональное программирование основано на лямбда-исчислении

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

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

    Заключение

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

    Если вы хотите узнать о функциональном программировании побольше, то советуем вам ознакомиться с примерами использования принципов ФП в JavaScript ( , ), а также с , посвящённым функциональному C#.

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

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

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

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

    Funсtion имя_функции(список_парамeтров) { блок кода }

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

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

    Имя_функции(список_параметров)

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

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

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

    Результат работы функции

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

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

    Return \возвращаемое значение\;

    Приведу пример:

    Оклад = 10000; Процент = 15; Выплата = Оклад + Премия(Оклад, Процент); function Премия (Оклад, Процент) { return Оклад * Процент / 100; }

    В этом примере Оклад и Процент сначала присваивают некоторые числовые значения. Затем вычисляют выражение, определяющее объем выплаты некоторому сотруднику с учетом его оклада и премии. Премия рассчитывается с помощью функции Премия (Оклад, Процент) , принимающей два параметра: оклад и процент от оклада; данная функция возвращает величину премии (символом * обозначен оператор арифметического умножения). Возвращаемое значение прибавляется к значению переменной Оклад, а полученный результат присваивается переменной Выплата. Определение функции Премия (Оклад, Процент) размещено в конце текста программы.

    Данный программный код написан на вымышленном (абстрактном) языке. Я хотел сказать, что рассмотренный пример иллюстрирует принцип применения функции, а потому не важно, какой именно язык выбрать. Главное, что все изложенное ранее должно позволить вам понять данный код. Тем не менее, признаюсь, что приведенный мной пример написан и на языке JavaScript. Напишите в обычном текстовом редакторе, например, в Блокноте Windows следующие строки:

    Оклад = 10000; function Премия(Оклад, Процент) { return Оклад * Процент / 100; } alert("Выплата = " + Выплата);

    Это HTML-код с внедренным в него сценарием на JavaScript. Код сценария заключен между тегами и отличается от рассмотренного ранее только встроенной функцией alert () для вывода сообщений в диалоговом окне. Сохраните данный код в файле с расширением htm или html, а затем откройте его в Web-браузере, например, Microsoft Internet Explorer или Mozilla Firefox. В результате появится диалоговое окно с сообщением "Выплата =11500".

    Назначение

    Появление в 1960-х годах в языках (например, ALGOL и FORTRAN) функций позволило писать программы, более ясные в структурном отношении и компактные по объему кода. В идеале основная программа могла состоять из одних только вызовов функций, перемежаемых, возможно, операторами управления (условными переходами и/или циклами). Разрабатывать и отлаживать такие программы стало и быстрее и легче. Программист при желании мог писать программы, широко используя вызовы функций, тела которых еще не написаны.

    Чтобы такая программа как-то работала без зависаний и выдачи системных сообщений об ошибках, вместо настоящего кода функции можно было временно поставить так называемые заглушки, например, выво­ды специальных сообщений программиста, например, "работает функция mуfunc".

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

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

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

    Приведение типов

    Возможно, вы заметили одно странное обстоятельство: функции аlert() в качестве параметра передается выражение в виде суммы разнотипных данных (символьного и числового значения):

    "Выплата = " + Выплата

    Здесь "Выплата =" - символьная строка, а Выплата - переменная числового типа. Ведь ранее упоминалось, что типы данных для того и придуманы, чтобы выполнять операции над однотипными данными. Тем не менее, сообщений об ошибках не было, а результат оказался правильным!

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

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

    Методы окружения

    Также может вызвать недоумение функция alert() , которая использовалась для вывода на экран диалогового окна с некоторым сообщением. А откуда она взялась? В сценарии же нет ее определения.

    Если быть точным, то alert() - не функция языка JavaScript, а метод объекта window , который принадлежит объектной модели браузера. Методами называют внутренние функции объектов. Иначе говоря, этот метод, как и множество других объектов браузера и загруженного в него документа, составляют внешнее окружение сценария на JavaScript. К объектам этого окружения можно обратиться из сценария, т. е. прочитать и даже изменить значения их свойств. Тем самым обеспечивается возможность управлять внешним видом и информационным содержанием Web-страницы.

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

    Так, что же такое "программная функция" ?

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

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

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

    Программная функция - это:

    - "функция осознанных преимуществ",

    - "функция врожденного профессионализма",

    - "функция основных ценностей, основных задач и целей".

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

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

    Программная функция определяет предел допустимых уступок.

    - Ну хорошо, - вставляет Читатель, - но если есть в нашей психике "функция целей и задач" , то должна же быть и какая-то функция их достижений?

    Такая функция действительно есть, и с "программной" она тесно сотрудничает, а потому в "Модели "А" находится справа от нее, на 2-й позиции уровня ЭГО (т. е. занимает второй кабинет верхнего этажа). Эта функция называется "творческой" , или "созидательной функцией" .

    Творческая функция и творческий аспект.

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

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

    А теперь вспомним нашу первую классификацию - "сенсорик - этический ","интуит - логический "и т.д. Что мы видим?

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

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

    - А можно это показать на каком-нибудь примере? - интересуется Читатель.

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

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

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

    - Но почему так происходит?

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

    "Элементарная модель" типа ИМ.

    Аспекты, вынесенные на уровень ЭГО ,выражают основные ценности типа .Именно поэтому они вынесены в его название.

    Например, название типа "этико-сенсорный экстраверт" означает, что его "программная" ценность - экстравертная этика ("этика эмоций"), а "творческая" ценность - интровертная сенсорика ("сенсорика ощущений") .

    На уровне ЭГО это выглядит так:

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

    У интроверта, соответственно, наоборот: программная функция будет интровертной (белый символ), а реализационная - экстравертной (черный).

    И еще следует отметить: если программный аспект - рациональный (этика или логика), то он реализуется иррациональным аспектом .

    - Почему?

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

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

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

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

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

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

    Все функции языка Си подразделяются на две группы: встроенные и определяемые пользователем . Встроенные (стандартные) функции могут вызываться по имени без предварительного определения. Встроенные функции хранятся в виде объектного кода в специальных файлах (библиотеках ) с расширением . lib . Для работы с библиотеками имеются специальные средства, в том числе программа lib . exe . Функции пользователя организовываются самим программистом в соответствии с синтаксисом языка. Предварительное определение функций пользователя обязательно. Программист может собрать разработанные им функции в библиотеки и затем использовать их наравне со встроенными функциями.

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

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

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

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

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

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

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