Jump to content

Императивное программирование

(Перенаправлено из Императивной парадигмы )

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

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

Процедурное программирование

[ редактировать ]

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

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

Обоснование и основы императивного программирования

[ редактировать ]

Парадигма программирования, используемая для создания программ почти для всех компьютеров, обычно соответствует императивной модели. [примечание 1] Цифровое компьютерное оборудование предназначено для выполнения машинного кода существуют низкоуровневые компиляторы и интерпретаторы, использующие другие парадигмы , который является собственным для компьютера и обычно пишется в императивном стиле, хотя для некоторых архитектур, таких как Lisp-машины, .

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

Операторы присваивания в императивной парадигме выполняют операцию над информацией, расположенной в памяти, и сохраняют результаты в памяти для последующего использования. Кроме того, императивные языки высокого уровня позволяют вычислять сложные выражения , которые могут состоять из комбинации арифметических операций и оценок функций , а также присваивать полученное значение памяти. Операторы цикла (например циклы , while, do while и for ) позволяют выполнять последовательность операторов несколько раз. Циклы могут либо выполнять содержащиеся в них операторы заданное количество раз, либо выполнять их повторно, пока не будет выполнено какое-либо условие. Операторы условного ветвления позволяют выполнять последовательность операторов только при выполнении некоторого условия. В противном случае операторы пропускаются, и последовательность выполнения продолжается с следующего за ними оператора. Операторы безусловного ветвления позволяют перенести последовательность выполнения в другую часть программы. К ним относятся прыжок (называемый goto на многих языках), переключатель и вызов подпрограммы, подпрограммы или процедуры (который обычно возвращается к следующему оператору после вызова).

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

Многие императивные языки программирования (такие как Fortran , BASIC и C ) являются абстракциями языка ассемблера . [3]

История императивных и объектно-ориентированных языков

[ редактировать ]

Самыми ранними императивными языками были машинные языки первых компьютеров. Инструкции на этих языках были очень простыми, что упрощало аппаратную реализацию, но затрудняло создание сложных программ. FORTRAN , разработанный Джоном Бэкусом в компании International Business Machines (IBM) в 1954 году, был первым крупным языком программирования, устранившим препятствия, создаваемые машинным кодом при создании сложных программ. ФОРТРАН был компилируемым языком , который допускал именованные переменные, сложные выражения, подпрограммы и многие другие функции, которые сейчас распространены в императивных языках. В следующие два десятилетия появилось множество других крупных императивных языков программирования высокого уровня. В конце 1950-х и 1960-х годах АЛГОЛ был разработан для облегчения выражения математических алгоритмов и даже служил целевым языком операционной системы для некоторых компьютеров. MUMPS (1966) довел императивную парадигму до логического предела, вообще не имея никаких операторов, полагаясь исключительно на команды, вплоть до того, что команды IF и ELSE стали независимыми друг от друга, связанными только внутренней переменной с именем $. ТЕСТ. COBOL (1960) и BASIC (1964) были попытками сделать синтаксис программирования более похожим на английский. В 1970-х годах Pascal был разработан Никлаусом Виртом , а C был создан Деннисом Ритчи , когда он работал в Bell Laboratories . Вирт продолжил разработку Модулы-2 и Оберона . Для нужд Министерства обороны США и Джин Ичбиа команда Honeywell начали разработку Ada в 1978 году, после 4-летнего проекта по определению требований к языку. Спецификация была впервые опубликована в 1983 году с изменениями в 1995, 2005 и 2012 годах.

В 1980-е годы наблюдался быстрый рост интереса к объектно-ориентированному программированию . Эти языки были императивными по стилю, но добавляли возможности для поддержки объектов . За последние два десятилетия 20-го века появилось множество таких языков. Smalltalk -80, первоначально задуманный Аланом Кеем в 1969 году, был выпущен в 1980 году Исследовательским центром Xerox в Пало-Альто ( PARC ). Опираясь на концепции другого объектно-ориентированного языка — Simula (который считается первым в мире объектно-ориентированным языком программирования , разработанным в 1960-х годах), — Бьёрн Страуструп разработал C++ , объектно-ориентированный язык, основанный C. на Разработка C++ началась в 1979 году, а первая реализация была завершена в 1983 году. В конце 1980-х и 1990-х годах известными императивными языками, основанными на объектно-ориентированных концепциях, были Perl , выпущенный Ларри Уоллом в 1987 году; Python , выпущенный Гвидо ван Россумом в 1990 году; Visual Basic и Visual C++ (включая Microsoft Foundation Class Library (MFC) 2.0), выпущенные Microsoft в 1991 и 1993 годах соответственно; PHP , выпущенный Расмусом Лердорфом в 1994 году; Java от Джеймса Гослинга ( Sun Microsystems ) в 1995 году, JavaScript от Брендана Эйха ( Netscape ) и Ruby от Юкихиро «Маца» Мацумото, оба выпущенные в 1995 году. Microsoft .NET Framework (2002) по своей сути является императивной, поскольку являются его основными целевыми языками: VB.NET и C# , которые на нем работают; Microsoft F# однако функциональный язык также работает на нем.

ФОРТРАН (1958 г.) был представлен как «Система ПЕРЕВОДА математических формул IBM». Он был разработан для научных расчетов без средств для работы со струнами . Наряду с объявлениями , выражениями и операторами он поддерживал:

Это удалось, потому что:

  • затраты на программирование и отладку были ниже затрат на эксплуатацию компьютера
  • это было поддержано IBM
  • приложения в то время были научными. [4]

Однако поставщики, не относящиеся к IBM, также написали компиляторы Fortran, но с синтаксисом, который, скорее всего, не сработает с компилятором IBM. [4] Американский национальный институт стандартов (ANSI) разработал первый стандарт Фортрана в 1966 году. В 1978 году Фортран 77 стал стандартом до 1991 года. Фортран 90 поддерживает:

COBOL (1959) означает «Общий бизнес-ориентированный язык». Фортран манипулировал символами. Вскоре стало понятно, что символы не обязательно должны быть числами, поэтому были введены строки. [5] Министерство обороны США повлияло на разработку COBOL, при этом Грейс Хоппер внесла основной вклад. Заявления были английскими и многословными. Целью было разработать язык, на котором менеджеры могли бы читать программы. Однако отсутствие структурированных заявлений помешало достижению этой цели. [6]

Развитие COBOL строго контролировалось, поэтому не возникло диалектов, требующих стандартов ANSI. Как следствие, он не менялся в течение 15 лет до 1974 года. Версия 1990-х годов действительно внесла существенные изменения, такие как объектно-ориентированное программирование . [6]

АЛГОЛ (1960) означает «АЛГОРИТМИЧЕСКИЙ ЯЗЫК». Это оказало глубокое влияние на дизайн языков программирования. [7] Разработанный комитетом европейских и американских экспертов по языкам программирования, он использовал стандартные математические обозначения и имел удобочитаемый структурированный дизайн. Алгол был первым, кто определил свой синтаксис, используя форму Бэкуса-Наура . [7] Это привело к появлению компиляторов , управляемых синтаксисом . Он добавил такие функции, как:

Прямые потомки Алгола включают Паскаль , Модулу-2 , Аду , Дельфи и Оберон на одной ветке. В другой ветке есть C , C++ и Java . [7]

BASIC (1964) означает «Универсальный код символических инструкций для начинающих». Он был разработан в Дартмутском колледже для обучения всех его студентов. [8] Если бы ученик не перешел на более мощный язык, он все равно помнил бы Бейсик. [8] Интерпретатор Basic устанавливался в микрокомпьютеры , выпущенные в конце 1970-х годов. По мере роста индустрии микрокомпьютеров рос и язык. [8]

Компания Basic стала пионером интерактивных сеансов . [8] Он предлагал команды операционной системы в своей среде:

  • Команда «новая» создала пустой лист
  • Заявления оцениваются немедленно
  • Операторы можно запрограммировать, указав перед ними номер строки.
  • Команда «список» отобразила программу
  • Команда «Выполнить» выполнила программу

Однако синтаксис Basic был слишком простым для больших программ. [8] В последние диалекты добавлена ​​структура и объектно-ориентированные расширения. Microsoft Visual Basic до сих пор широко используется и обеспечивает графический интерфейс пользователя . [9]

Язык программирования C (1973 г.) получил свое название потому, что язык BCPL был заменен на B , а компания AT&T Bell Labs назвала следующую версию «C». Его целью было написать UNIX операционную систему . [10] C — относительно небольшой язык, поэтому на нем легко писать компиляторы. Его рост отражал рост аппаратного обеспечения в 1980-х годах. [10] Его рост также обусловлен тем, что он обладает возможностями языка ассемблера , но использует синтаксис высокого уровня . В него добавлены расширенные функции, такие как:

Карта памяти компьютера

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

  • Область глобальных и статических данных расположена чуть выше области программы . (Программная область технически называется текстовой областью. Здесь хранятся машинные инструкции.)
  • Область глобальных и статических данных технически представляет собой две области. [11] Одна область называется сегментом инициализированных данных , где хранятся переменные, объявленные со значениями по умолчанию. Другая область называется блоком, начатым сегментом , где хранятся переменные, объявленные без значений по умолчанию.
  • переменных, хранящихся в глобальной и статической области Адреса данных, устанавливаются во время компиляции. Они сохраняют свои значения на протяжении всего процесса.
  • Глобальная и статическая область хранят глобальные переменные , объявленные поверх (вне) main() функция. [12] Глобальные переменные видны main() и все остальные функции в исходном коде.
С другой стороны, объявления переменных внутри main(), другие функции или внутри { } разделители блоков являются локальными переменными . Локальные переменные также включают формальных параметров переменные . Переменные параметров заключаются в круглые скобки определений функций. [13] Они обеспечивают интерфейс для функции.
  • Локальные переменные, объявленные с помощью static префикс также хранятся в глобальной и статической области данных. [11] В отличие от глобальных переменных, статические переменные видны только внутри функции или блока. Статические переменные всегда сохраняют свое значение. Примером использования может быть функция int increment_counter(){ static int counter = 0; counter++; return counter;}
  • Область стека — это непрерывный блок памяти, расположенный рядом с верхним адресом памяти. [14] Переменные, помещенные в стек, заполняются сверху вниз. [14] Указатель стека специального назначения — это регистр , который отслеживает последний заполненный адрес памяти. [14] Переменные помещаются в стек с помощью инструкции PUSH языка ассемблера . Поэтому адреса этих переменных устанавливаются во время выполнения . Метод, позволяющий переменным стека потерять свою область видимости, заключается в использовании инструкции POP.
  • Локальные переменные, объявленные без static префикс, включая переменные формальных параметров, [15] называются автоматическими переменными [12] и сохраняются в стеке. [11] Они видны внутри функции или блока и теряют свою область действия при выходе из функции или блока.
  • Область кучи расположена под стеком. [11] Он заполняется снизу вверх. Операционная система управляет кучей, используя указатель кучи и список выделенных блоков памяти. [16] Как и в стеке, адреса переменных кучи устанавливаются во время выполнения. Ошибка нехватки памяти возникает, когда указатель кучи и указатель стека встречаются.
  • C обеспечивает malloc() библиотечная функция для выделения динамической памяти. [17] Заполнение кучи данными — это дополнительная функция копирования. Переменные, хранящиеся в куче, экономично передаются функциям с помощью указателей. Без указателей весь блок данных пришлось бы передавать в функцию через стек.

В 1970-х годах инженерам-программистам требовалась языковая поддержка, чтобы разбивать большие проекты на модули . [18] разложение больших проектов Одной из очевидных особенностей было физическое на отдельные файлы . разложение больших проектов Менее очевидной особенностью было логическое на абстрактные типы данных . [18] В то время языки поддерживали конкретные ( скалярные ) типы данных, такие как числа , числа с плавающей запятой и строки символов целые . Конкретные типы данных имеют представление как часть своего имени. [19] Абстрактные типы данных — это структуры конкретных типов данных с присвоенным новым именем. Например, список целых чисел можно назвать integer_list.

На объектно-ориентированном жаргоне абстрактные типы данных называются классами . Однако класс — это всего лишь определение; память не выделяется. Когда память выделяется классу, она называется объектом . [20]

Объектно-ориентированные императивные языки, разработанные путем объединения потребности в классах и необходимости безопасного функционального программирования . [21] Функция в объектно-ориентированном языке присваивается классу. Назначенная функция тогда называется методом , функцией -членом или операцией . Объектно-ориентированное программирование — это выполнение операций над объектами . [22]

Объектно-ориентированные языки поддерживают синтаксис для моделирования отношений подмножества/надмножества . В теории множеств элемент . подмножества наследует все атрибуты, содержащиеся в надмножестве Например, студент – это человек. Следовательно, множество студентов является подмножеством множества людей. В результате студенты наследуют все признаки, общие для всех людей. Кроме того, студенты обладают уникальными качествами, которых нет у других людей. Объектно-ориентированные языки моделируют подмножества/надмножества отношения с помощью наследования . [23] Объектно-ориентированное программирование стало доминирующей языковой парадигмой к концу 1990-х годов. [18]

C++ (1985) первоначально назывался «C с классами». [24] Он был разработан для расширения возможностей C за счет добавления объектно-ориентированных средств языка Simula . [25]

Объектно-ориентированный модуль состоит из двух файлов. Файл определений называется файлом заголовка . Вот заголовочный файл C++ для класса GRADE в простом школьном приложении:

// grade.h
// -------

// Used to allow multiple source files to include
// this header file without duplication errors.
// See: https://en.wikipedia.org/wiki/Include_guard
// ----------------------------------------------
#ifndef GRADE_H
#define GRADE_H

class GRADE {
public:
    // This is the constructor operation.
    // ----------------------------------
    GRADE ( const char letter );

    // This is a class variable.
    // -------------------------
    char letter;

    // This is a member operation.
    // ---------------------------
    int grade_numeric( const char letter );

    // This is a class variable.
    // -------------------------
    int numeric;
};
#endif

Операция конструктора — это функция с тем же именем, что и имя класса. [26] Он выполняется, когда вызывающая операция выполняет new заявление.

Другой файл модуля — это исходный файл . Вот исходный файл C++ для класса GRADE в простом школьном приложении:

// grade.cpp
// ---------
#include "grade.h"

GRADE::GRADE( const char letter )
{
    // Reference the object using the keyword 'this'.
    // ----------------------------------------------
    this->letter = letter;

    // This is Temporal Cohesion
    // -------------------------
    this->numeric = grade_numeric( letter );
}

int GRADE::grade_numeric( const char letter )
{
    if ( ( letter == 'A' || letter == 'a' ) )
        return 4;
    else
    if ( ( letter == 'B' || letter == 'b' ) )
        return 3;
    else
    if ( ( letter == 'C' || letter == 'c' ) )
        return 2;
    else
    if ( ( letter == 'D' || letter == 'd' ) )
        return 1;
    else
    if ( ( letter == 'F' || letter == 'f' ) )
        return 0;
    else
        return -1;
}

Вот заголовочный файл C++ для класса PERSON в простом школьном приложении:

// person.h
// --------
#ifndef PERSON_H
#define PERSON_H

class PERSON {
public:
    PERSON ( const char *name );
    const char *name;
};
#endif

Вот исходный файл C++ для класса PERSON в простом школьном приложении:

// person.cpp
// ----------
#include "person.h"

PERSON::PERSON ( const char *name )
{
    this->name = name;
}

Вот заголовочный файл C++ для класса STUDENT в простом школьном приложении:

// student.h
// ---------
#ifndef STUDENT_H
#define STUDENT_H

#include "person.h"
#include "grade.h"

// A STUDENT is a subset of PERSON.
// --------------------------------
class STUDENT : public PERSON{
public:
    STUDENT ( const char *name );
    ~STUDENT();
    GRADE *grade;
};
#endif

Вот исходный файл C++ для класса STUDENT в простом школьном приложении:

// student.cpp
// -----------
#include "student.h"
#include "person.h"

STUDENT::STUDENT ( const char *name ):
    // Execute the constructor of the PERSON superclass.
    // -------------------------------------------------
    PERSON( name )
{
    // Nothing else to do.
    // -------------------
}

STUDENT::~STUDENT() 
{
    // deallocate grade's memory
    // to avoid memory leaks.
    // -------------------------------------------------
    delete this->grade;
}

Вот программа-драйвер для демонстрации:

// student_dvr.cpp
// ---------------
#include <iostream>
#include "student.h"

int main( void )
{
    STUDENT *student = new STUDENT( "The Student" );
    student->grade = new GRADE( 'a' );

    std::cout 
        // Notice student inherits PERSON's name
        << student->name
        << ": Numeric grade = "
        << student->grade->numeric
        << "\n";

    // deallocate student's memory
    // to avoid memory leaks.
    // -------------------------------------------------
    delete student;

	return 0;
}

Вот make-файл для компиляции всего:

# makefile
# --------
all: student_dvr

clean:
    rm student_dvr *.o

student_dvr: student_dvr.cpp grade.o student.o person.o
    c++ student_dvr.cpp grade.o student.o person.o -o student_dvr

grade.o: grade.cpp grade.h
    c++ -c grade.cpp

student.o: student.cpp student.h
    c++ -c student.cpp

person.o: person.cpp person.h
    c++ -c person.cpp

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Реконфигурируемые вычисления являются заметным исключением.
  1. ^ Джайн, Аниша (10 декабря 2022 г.). «Обещания Javascript — есть ли лучший подход?» . Середина . Проверено 20 декабря 2022 г.
  2. ^ «Императивное программирование: Обзор старейшей парадигмы программирования» . Цифровой гид IONOS . 21 мая 2021 г. Проверено 3 мая 2022 г.
  3. ^ Брюс Экель (2006). Думаем на Java . Образование Пирсона . п. 24. ISBN  978-0-13-187248-6 .
  4. ^ Перейти обратно: а б Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 16. ISBN  0-201-71012-9 .
  5. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 24. ISBN  0-201-71012-9 .
  6. ^ Перейти обратно: а б Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 25. ISBN  0-201-71012-9 .
  7. ^ Перейти обратно: а б с д Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 19. ISBN  0-201-71012-9 .
  8. ^ Перейти обратно: а б с д и Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 30. ISBN  0-201-71012-9 .
  9. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 31. ISBN  0-201-71012-9 .
  10. ^ Перейти обратно: а б с Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 37. ИСБН  0-201-71012-9 .
  11. ^ Перейти обратно: а б с д «Схема памяти программ на языке C» . 12 сентября 2011 г.
  12. ^ Перейти обратно: а б Керниган, Брайан В.; Ричи, Деннис М. (1988). Язык программирования C, второе издание . Прентис Холл. п. 31. ISBN  0-13-110362-8 .
  13. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 128. ИСБН  0-201-71012-9 .
  14. ^ Перейти обратно: а б с Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 121. ИСБН  978-1-59327-220-3 .
  15. ^ Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 122. ИСБН  978-1-59327-220-3 .
  16. ^ Керниган, Брайан В.; Ричи, Деннис М. (1988). Язык программирования C, второе издание . Прентис Холл. п. 185. ИСБН  0-13-110362-8 .
  17. ^ Керниган, Брайан В.; Ричи, Деннис М. (1988). Язык программирования C, второе издание . Прентис Холл. п. 187. ИСБН  0-13-110362-8 .
  18. ^ Перейти обратно: а б с Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 38. ISBN  0-201-71012-9 .
  19. ^ Страуструп, Бьярне (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 65. ИСБН  978-0-321-56384-2 .
  20. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 193. ИСБН  0-201-71012-9 .
  21. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 39. ИСБН  0-201-71012-9 .
  22. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 35. ISBN  0-201-71012-9 .
  23. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 192. ИСБН  0-201-71012-9 .
  24. ^ Страуструп, Бьярне (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 22. ISBN  978-0-321-56384-2 .
  25. ^ Страуструп, Бьярне (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 21. ISBN  978-0-321-56384-2 .
  26. ^ Страуструп, Бьярне (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 49. ИСБН  978-0-321-56384-2 .
  • Пратт, Терренс В. и Марвин В. Зелковиц . Языки программирования: проектирование и реализация , 3-е изд. Энглвуд Клиффс, Нью-Джерси: Прентис Холл, 1996.
  • Себеста, Роберт В. Концепции языков программирования , 3-е изд. Ридинг, Массачусетс: Издательство Addison-Wesley, 1996.
Первоначально основано на статье Стэна Зайберта «Императивное программирование» из Nupedia , под лицензией GNU Free Documentation License .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 7e224c48649c8c970b4e5f750afafe89__1720340220
URL1:https://arc.ask3.ru/arc/aa/7e/89/7e224c48649c8c970b4e5f750afafe89.html
Заголовок, (Title) документа по адресу, URL1:
Imperative programming - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)