stringtranslate.com

Компьютерная программа

Исходный код компьютерной программы, написанной на языке JavaScript

Компьютерная программа — это последовательность или набор [a] инструкций на языке программирования для выполнения компьютером . Это один из компонентов программного обеспечения , который также включает документацию и другие нематериальные компоненты. [1 ]

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

Если исполняемый файл запрошен для выполнения, то операционная система загружает его в память и запускает процесс . [3] Центральный процессор вскоре переключится на этот процесс, чтобы иметь возможность извлекать, декодировать, а затем выполнять каждую машинную инструкцию. [4]

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

Пример компьютерной программы

Программа «Hello, World!» используется для иллюстрации базового синтаксиса языка . Синтаксис языка BASIC (1964) был намеренно ограничен, чтобы сделать язык простым для изучения. [6] Например, переменные не объявляются перед использованием. [7] Кроме того, переменные автоматически инициализируются нулем. [7] Вот пример компьютерной программы на языке Basic для усреднения списка чисел: [8]

10 ВВОД "Сколько чисел нужно усреднить?" , A 20 ДЛЯ I = 1 ДЛЯ A 30 ВВОД "Введите число:" , B 40 ПУСТЬ C = C + B 50 ДАЛЕЕ I 60 ПУСТЬ D = C / A 70 ПЕЧАТЬ "Среднее равно" , D 80 КОНЕЦ                            

После изучения механизмов базового компьютерного программирования становятся доступными более сложные и мощные языки для создания больших компьютерных систем. [9]

История

Улучшения в разработке программного обеспечения являются результатом усовершенствований компьютерного оборудования . На каждом этапе истории оборудования задача компьютерного программирования кардинально менялась.

Аналитическая машина

Описание Лавлейс из Note G

В 1837 году ткацкий станок Жаккарда вдохновил Чарльза Бэббиджа на попытку построить аналитическую машину . [10] Названия компонентов вычислительного устройства были заимствованы из текстильной промышленности. В текстильной промышленности пряжа приносилась из магазина для измельчения. Устройство имело магазин , который состоял из памяти для хранения 1000 чисел по 50 десятичных знаков каждое. [11] Числа из магазина переносились на мельницу для обработки. Он был запрограммирован с помощью двух наборов перфорированных карт. Один набор управлял работой, а другой вводил переменные. [10] [12] Однако тысячи зубчатых колес и шестеренок никогда полностью не работали вместе. [13]

Ада Лавлейс работала с Чарльзом Бэббиджем над описанием Аналитической машины (1843). [14] Описание содержало Примечание G, в котором полностью описывался метод вычисления чисел Бернулли с использованием Аналитической машины. Некоторые историки признают это примечание первой в мире компьютерной программой . [13]

Универсальная машина Тьюринга

В 1936 году Алан Тьюринг представил универсальную машину Тьюринга , теоретическое устройство, которое может моделировать любое вычисление. [15] Это конечный автомат , который имеет бесконечно длинную ленту для чтения/записи. Машина может перемещать ленту вперед и назад, изменяя ее содержимое по мере выполнения алгоритма . Машина начинает работу в начальном состоянии, проходит последовательность шагов и останавливается, когда сталкивается с состоянием остановки. [16] Все современные компьютеры являются полными по Тьюрингу . [17]

ЭНИАК

Гленн А. Бек меняет лампу в ENIAC

Электронный числовой интегратор и компьютер (ENIAC) был построен в период с июля 1943 года по осень 1945 года. Это был полный по Тьюрингу компьютер общего назначения, который использовал 17 468 электронных ламп для создания схем . По своей сути это была серия Паскалинов , соединенных вместе. [18] Его 40 единиц весили 30 тонн, занимали 1800 квадратных футов (167 м 2 ) и потребляли 650 долларов в час ( в валюте 1940-х годов ) электроэнергии в режиме ожидания. [18] Он имел 20 аккумуляторов с основанием 10. Программирование ENIAC занимало до двух месяцев. [18] Три таблицы функций были на колесах и их нужно было катить к фиксированным панелям функций. Таблицы функций были подключены к панелям функций путем подключения толстых черных кабелей к коммутационным панелям . Каждая таблица функций имела 728 вращающихся ручек. Программирование ENIAC также включало настройку некоторых из 3000 переключателей. Отладка программы заняла неделю. [19] Она работала с 1947 по 1955 год на Абердинском испытательном полигоне , рассчитывая параметры водородной бомбы, предсказывая погодные условия и составляя таблицы стрельбы для наведения артиллерийских орудий. [20]

Компьютеры с хранимой программой

Вместо того, чтобы подключать шнуры и поворачивать переключатели, компьютер с хранимой программой загружает свои инструкции в память так же, как он загружает свои данные в память. [21] В результате компьютер можно было быстро программировать и выполнять вычисления с очень высокой скоростью. [22] Преспер Экерт и Джон Мочли построили ENIAC. Два инженера представили концепцию хранимой программы в трехстраничной записке, датированной февралем 1944 года. [23] Позже, в сентябре 1944 года, Джон фон Нейман начал работать над проектом ENIAC. 30 июня 1945 года фон Нейман опубликовал первый черновик отчета по EDVAC , в котором структуры компьютера приравнивались к структурам человеческого мозга. [22] Проект стал известен как архитектура фон Неймана . Архитектура была одновременно развернута в конструкциях компьютеров EDVAC и EDSAC в 1949 году. [24]

IBM System/360 (1964) представляла собой семейство компьютеров, каждое из которых имело одинаковую архитектуру набора команд . Модель 20 была самой маленькой и недорогой. Клиенты могли обновлять и сохранять то же самое прикладное программное обеспечение . [25] Модель 195 была самой дорогой. Каждая модель System/360 имела многопрограммирование [25] — наличие нескольких процессов в памяти одновременно. Когда один процесс ожидал ввода/вывода , другой мог выполнять вычисления.

IBM планировала программировать каждую модель с использованием PL/1 . [26] Был сформирован комитет, в который вошли программисты COBOL , Fortran и ALGOL . Целью было разработать язык, который был бы всеобъемлющим, простым в использовании, расширяемым и заменил бы Cobol и Fortran. [26] Результатом стал большой и сложный язык, компиляция которого заняла много времени . [27]

Переключатели для ручного ввода на Data General Nova 3, выпущенном в середине 1970-х годов

Компьютеры, выпускавшиеся до 1970-х годов, имели переключатели на передней панели для ручного программирования. [28] Компьютерная программа была написана на бумаге для справки. Инструкция была представлена ​​конфигурацией настроек включения/выключения. После установки конфигурации нажималась кнопка выполнения. Затем этот процесс повторялся. Компьютерные программы также автоматически вводились с помощью бумажной ленты , перфокарт или магнитной ленты . После загрузки носителя начальный адрес устанавливался с помощью переключателей, и нажималась кнопка выполнения. [28]

Интеграция очень большого масштаба

Кристалл интегральной схемы СБИС

Важной вехой в разработке программного обеспечения стало изобретение схемы сверхбольшой интеграции (VLSI) (1964). [29] После Второй мировой войны ламповая технология была заменена транзисторами с точечным контактом ( 1947) и биполярными транзисторами (конец 1950-х), установленными на печатной плате . [29] В 1960-х годах аэрокосмическая промышленность заменила печатную плату интегральной микросхемой . [29]

Роберт Нойс , соучредитель Fairchild Semiconductor (1957) и Intel (1968), добился технологического усовершенствования для усовершенствования производства полевых транзисторов (1963). [30] Цель состоит в том, чтобы изменить электрическое сопротивление и проводимость полупроводникового перехода . Сначала природные силикатные минералы преобразуются в стержни поликремния с использованием процесса Сименса . [31] Затем процесс Чохральского преобразует стержни в монокристаллический кремний, кристалл були. [32] Затем кристалл тонко нарезается для формирования подложки пластины . Затем планарный процесс фотолитографии интегрирует униполярные транзисторы , конденсаторы , диоды и резисторы на пластине для создания матрицы транзисторов металл-оксид-полупроводник (МОП). [33] [34] МОП-транзистор является основным компонентом в чипах интегральных схем . [30]

Первоначально интегральные микросхемы имели свои функции, установленные во время производства. В 1960-х годах управление электрическим потоком перешло к программированию матрицы постоянной памяти (ПЗУ). Матрица напоминала двумерный массив предохранителей. [29] Процесс внедрения инструкций в матрицу заключался в сжигании ненужных соединений. [29] Было так много соединений, что программисты прошивки написали компьютерную программу на другом чипе, чтобы контролировать сжигание. [29] Технология стала известна как программируемое ПЗУ . В 1971 году Intel установила компьютерную программу на чип и назвала его микропроцессором Intel 4004. [35]

Центральный процессор IBM System/360 (1964) не был микропроцессором.

Термины микропроцессор и центральный процессор (ЦП) теперь используются как взаимозаменяемые. Однако ЦП появились раньше микропроцессоров. Например, IBM System/360 (1964) имела ЦП, сделанный из печатных плат, содержащих дискретные компоненты на керамических подложках . [36]

Сак Стейт 8008

Художественное изображение микрокомпьютера Intel 8008 Университета штата Сакраменто (1972 г.)

Intel 4004 (1971) был 4- битным микропроцессором, разработанным для работы калькулятора Busicom . Через пять месяцев после его выпуска Intel выпустила Intel 8008 , 8-битный микропроцессор. Билл Пентц возглавил команду в Университете Сакраменто , чтобы построить первый микрокомпьютер , использующий Intel 8008: Sac State 8008 (1972). [37] Его целью было хранение медицинских карт пациентов. Компьютер поддерживал дисковую операционную систему для запуска жесткого диска Memorex объемом 3 мегабайта . [29] Он имел цветной дисплей и клавиатуру, которые были упакованы в одну консоль. Дисковая операционная система была запрограммирована с использованием языка Basic Assembly Language (BAL) компании IBM . Приложение для работы с медицинскими картами было запрограммировано с использованием интерпретатора BASIC . [29] Однако компьютер был эволюционным тупиком, поскольку был чрезвычайно дорогим. Кроме того, он был построен в лаборатории государственного университета для определенной цели. [37] Тем не менее, проект внес вклад в разработку набора инструкций Intel 8080 (1974) . [29]

серия x86

В оригинальном персональном компьютере IBM (1981) использовался микропроцессор Intel 8088.

В 1978 году современная среда разработки программного обеспечения началась, когда Intel обновила Intel 8080 до Intel 8086. Intel упростила Intel 8086, чтобы производить более дешевый Intel 8088. [ 38] IBM приняла Intel 8088, когда они вышли на рынок персональных компьютеров (1981). По мере того, как потребительский спрос на персональные компьютеры рос, росла и разработка микропроцессоров Intel. Последовательность разработки известна как серия x86 . Язык ассемблера x86 представляет собой семейство обратно совместимых машинных инструкций . Машинные инструкции, созданные в более ранних микропроцессорах, сохранялись во время модернизации микропроцессоров. Это позволило потребителям приобретать новые компьютеры без необходимости приобретать новое прикладное программное обеспечение . Основные категории инструкций: [c]

Изменение среды программирования

DEC VT100 (1978 ) был широко используемым компьютерным терминалом .

Схемы VLSI позволили среде программирования перейти от компьютерного терминала (до 1990-х годов) к компьютеру с графическим пользовательским интерфейсом (GUI). Компьютерные терминалы ограничивали программистов одной оболочкой , работающей в среде командной строки . В 1970-х годах стало возможным полноэкранное редактирование исходного кода с помощью текстового пользовательского интерфейса . Независимо от доступной технологии, цель состоит в том, чтобы программировать на языке программирования .

Парадигмы и языки программирования

Возможности языка программирования существуют для того, чтобы предоставлять строительные блоки, которые можно объединять для выражения идеалов программирования. [39] В идеале язык программирования должен: [39]

Стиль программирования языка программирования, обеспечивающий эти строительные блоки, можно разделить на парадигмы программирования . [40] Например, различные парадигмы могут различаться: [40]

Каждый из этих стилей программирования внес свой вклад в синтез различных языков программирования . [40]

Язык программирования — это набор ключевых слов , символов , идентификаторов и правил, с помощью которых программисты могут передавать инструкции компьютеру. [41] Они следуют набору правил, называемых синтаксисом . [41]

Языки программирования берут свою основу из формальных языков . [42] Целью определения решения в терминах его формального языка является создание алгоритма для решения основной проблемы. [42] Алгоритм это последовательность простых инструкций, которые решают проблему. [43]

Поколения языков программирования

Монитор машинного языка на микропроцессоре W65C816S

Эволюция языков программирования началась, когда EDSAC (1949) использовал первую сохраненную компьютерную программу в своей архитектуре фон Неймана . [44] Программирование EDSAC было в первом поколении языков программирования .

  • Базовая структура оператора языка ассемблера — это метка, операция , операнд и комментарий. [47]
  • Метки позволяют программисту работать с именами переменных . Ассемблер позже преобразует метки в адреса физической памяти .
  • Операции позволяют программисту работать с мнемоникой. Ассемблер позже переведет мнемонику в номера инструкций.
  • Операнды сообщают ассемблеру, какие данные будет обрабатывать операция.
  • Комментарии позволяют программисту четко изложить свое повествование, поскольку инструкции сами по себе неопределенны.
Ключевой характеристикой программы на языке ассемблера является то, что она формирует однозначное соответствие соответствующему целевому машинному языку. [48]

Императивные языки

Компьютерная программа, написанная на императивном языке.

Императивные языки определяют последовательный алгоритм с помощью деклараций , выражений и операторов : [52]

Фортран

FORTRAN (1958) был представлен как "Система IBM Mathematical FORmula TRANslating". Он был разработан для научных расчетов, без возможности обработки строк . Наряду с объявлениями , выражениями и операторами он поддерживал:

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

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

КОБОЛ

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

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

Алгол

ALGOL (1960) означает «ALGOrithmic Language». Он оказал глубокое влияние на разработку языков программирования. [57] Возникнув из комитета европейских и американских экспертов по языкам программирования, он использовал стандартную математическую нотацию и имел читабельный, структурированный дизайн. Algol был первым, кто определил свой синтаксис с помощью формы Бэкуса–Наура . [57] Это привело к появлению синтаксически-управляемых компиляторов. Он добавил такие функции, как:

Прямые потомки Algol включают Pascal , Modula-2 , Ada , Delphi и Oberon на одной ветви. На другой ветви потомки включают C , C++ и Java . [57]

Базовый

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

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

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

С

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

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

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

  • Глобальная и статическая область данных технически представляет собой две области. [58] Одна область называется инициализированным сегментом данных , где хранятся переменные, объявленные со значениями по умолчанию. Другая область называется блоком, начатым сегментом , где хранятся переменные, объявленные без значений по умолчанию.
  • Переменные, хранящиеся в глобальной и статической области данных, имеют свои адреса, установленные во время компиляции. Они сохраняют свои значения на протяжении всего жизненного цикла процесса.
  • Глобальная и статическая область хранит глобальные переменные , которые объявлены поверх (вне) функции main(). [59] Глобальные переменные видны main()любой другой функции в исходном коде.
С другой стороны, объявления переменных внутри main(), других функций или внутри { } разделителей блоков являются локальными переменными . Локальные переменные также включают формальные переменные параметров . Переменные параметров заключаются в скобки определения функции. [60] Параметры предоставляют интерфейс к функции.
  • Локальные переменные, объявленные с использованием staticпрефикса, также хранятся в глобальной и статической области данных. [58] В отличие от глобальных переменных, статические переменные видны только внутри функции или блока. Статические переменные всегда сохраняют свое значение. Примером использования может служить функция int increment_counter(){static int counter = 0; counter++; return counter;}[g]
  • Локальные переменные, объявленные без staticпрефикса, включая формальные переменные параметров, [62] называются автоматическими переменными [59] и хранятся в стеке. [58] Они видны внутри функции или блока и теряют свою область действия при выходе из функции или блока.
  • C предоставляет malloc()библиотечную функцию для выделения памяти кучи. [i] [64] Заполнение кучи данными — это дополнительная функция копирования. [j] Переменные, хранящиеся в куче, экономично передаются функциям с помощью указателей. Без указателей весь блок данных пришлось бы передавать функции через стек.

С++

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

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

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

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

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

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

// сорт.h // -------// Используется для того, чтобы разрешить нескольким исходным файлам включать // этот заголовочный файл без ошибок дублирования. // ---------------------------------------------- #ifndef GRADE_H #define GRADE_Hclass GRADE { public : // Это операция конструктора. // ---------------------------------- GRADE ( const char letter );           // Это переменная класса. // ------------------------- символ буква ;    // Это операция-член. // --------------------------- int grade_numeric ( const char letter );        // Это переменная класса. // ------------------------- int numeric ; }; #endif   

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

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

// grade.cpp // --------- #include "grade.h" GRADE :: GRADE ( const char letter ) { // Ссылаемся на объект, используя ключевое слово 'this'. // ---------------------------------------------- this -> letter = letter ;          // Это временная связность // -------------------------- это -> числовое = 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класс ПЕРСОНА { public : ПЕРСОНА ( const char * name ); const char * name ; }; #endif           

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

// person.cpp // ---------- #include "person.h" ЧЕЛОВЕК :: ЧЕЛОВЕК ( const char * name ) { this -> name = name ; }        

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

// student.h // --------- #ifndef STUDENT_H #define STUDENT_H#include "person.h" #include "grade.h"  // STUDENT является подмножеством PERSON. // -------------------------------- class STUDENT : public PERSON { public : STUDENT ( const char * name ); GRADE * grade ; }; #endif            

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

// student.cpp // ----------- #include "student.h" #include "person.h"  STUDENT :: STUDENT ( const char * name ) : // Выполнить конструктор суперкласса PERSON. // ------------------------------------------------- PERSON ( name ) { // Больше ничего не нужно делать. // ------------------- }            

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

// student_dvr.cpp // --------------- #include <iostream> #include "student.h"  int main ( void ) { СТУДЕНТ * студент = new СТУДЕНТ ( "Студент" ); студент -> оценка = new GRADE ( 'a' );                 std :: cout // Обратите внимание, что student наследует имя PERSON << student -> name << ": Числовая оценка = " << student -> grade -> numeric << " \n " ; return 0 ; }          

Вот makefile для компиляции всего:

# makefile # -------- все : student_dvr очистить :  rm  student_dvr  *.ostudent_dvr : student_dvr . cpp оценка . o student . o персона . o c++ student_dvr. cpp оценка.o student.o персона.o -o student_dvr           класс.o : класс . cpp класс . h c++ -c класс.cpp     студент.o : студент .cpp студент .h c ++ -c студент.cpp     person.o : person . cpp person . h c++ -c person.cpp     

Декларативные языки

Императивные языки имеют одно важное замечание: присваивание выражения нелокальной переменной может привести к непреднамеренному побочному эффекту . [73] Декларативные языки обычно опускают оператор присваивания и поток управления. Они описывают, какое вычисление должно быть выполнено, а не как его вычислить. Две широкие категории декларативных языков — это функциональные языки и логические языки .

Принцип функционального языка заключается в использовании лямбда-исчисления в качестве руководства для четко определенной семантики . [74] В математике функция — это правило, которое отображает элементы из выражения в диапазон значений . Рассмотрим функцию:

times_10(x) = 10 * x

Выражение отображается функцией в диапазон значений . Одно значение равно 20. Это происходит , когда x равен 2. Таким образом, применение функции математически записывается как:10 * xtimes_10()

times_10(2) = 20

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

Императивные языки поддерживают функции. Следовательно, функциональное программирование может быть достигнуто в императивном языке, если программист использует дисциплину. Однако функциональный язык навязывает эту дисциплину программисту через свой синтаксис. Функциональные языки имеют синтаксис, специально разработанный для подчеркивания того, что . [76]

Функциональная программа разрабатывается с набором примитивных функций, за которыми следует одна функция драйвера. [73] Рассмотрим фрагмент :

function max( a, b ){/* code omitted */}

function min( a, b ){/* code omitted */}

function range( a, b, c ) {

return max( a, max( b, c ) ) - min( a, min( b, c ) );

}

Примитивы — max()и min(). Функция драйвера — range(). Выполнение:

put( range( 10, 4, 7) );выведет 6.

Функциональные языки используются в исследованиях в области компьютерных наук для изучения новых языковых возможностей. [77] Более того, отсутствие побочных эффектов сделало их популярными в параллельном и конкурентном программировании . [78] Однако разработчики приложений предпочитают объектно-ориентированные возможности императивных языков . [ 78]

Лисп

Lisp (1958) означает «LISt Processor» (процессор списка). [79] Он предназначен для обработки списков . Полная структура данных формируется путем построения списков списков. В памяти строится древовидная структура данных . Внутри древовидная структура прекрасно подходит для рекурсивных функций. [80] Синтаксис для построения дерева заключается в заключении разделенных пробелами элементов в скобки. Ниже приведен список из трех элементов. Первые два элемента сами по себе являются списками из двух элементов:

((A B) (HELLO WORLD) 94)

В Lisp есть функции для извлечения и реконструкции элементов. [81] Функция head()возвращает список, содержащий первый элемент в списке. Функция tail()возвращает список, содержащий все, кроме первого элемента. Функция cons()возвращает список, который является конкатенацией других списков. Поэтому следующее выражение вернет список x:

cons(head(x), tail(x))

Одним из недостатков Lisp является то, что когда много функций вложены, скобки могут выглядеть запутанными. [76] Современные среды Lisp помогают гарантировать соответствие скобок. Кстати, Lisp поддерживает императивные языковые операции оператора присваивания и циклов goto. [82] Кроме того, Lisp не заботится о типе данных элементов во время компиляции. [83] Вместо этого он назначает (и может переназначать) типы данных во время выполнения . Назначение типа данных во время выполнения называется динамическим связыванием . [84] В то время как динамическое связывание увеличивает гибкость языка, ошибки программирования могут задерживаться до поздних стадий процесса разработки программного обеспечения . [84]

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

МЛ

ML (1973) [85] означает «Meta Language». ML проверяет, сравниваются ли друг с другом только данные одного типа. [86] Например, эта функция имеет один входной параметр (целое число) и возвращает целое число:

развлечение_10  ( n : int ) : int = 10 * n ;        

ML не является эксцентричным по скобкам, как Lisp . Ниже приведен пример применения times_10():

раз_10 2

Возвращает «20 : int». (Возвращаются как результаты, так и тип данных.)

Как и Lisp , ML предназначен для обработки списков. В отличие от Lisp , каждый элемент имеет один и тот же тип данных. [87] Более того, ML назначает тип данных элемента во время компиляции . Назначение типа данных во время компиляции называется статическим связыванием . Статическое связывание повышает надежность, поскольку компилятор проверяет контекст переменных перед их использованием. [88]

Пролог

Prolog (1972) означает "PROgramming in LOGic". Это язык логического программирования , основанный на формальной логике . Язык был разработан Аленом Кольмерауэром и Филиппом Русселем в Марселе, Франция. Это реализация селективного линейного разрешения определенных предложений , впервые предложенная Робертом Ковальски и другими в Эдинбургском университете . [89]

Строительными блоками программы Prolog являются факты и правила . Вот простой пример:

кот ( том ).  % том — кот, мышь ( джерри ) .  % джерри — мышьживотное ( X )  :-  кошка ( X ).  % каждая кошка является животным животное ( X )  :-  мышь ( X ).  % каждая мышь является животнымбольшой ( X )  :-  кот ( X ).  % каждый кот большой маленький ( X )  :-  мышь ( X ).  % каждая мышь маленькаяешьте ( X , Y )  :-  мышь ( X ),  сыр ( Y ).  % каждая мышь ест каждый сыр ешьте ( X , Y )  :-  большой ( X ),  маленький ( Y ).  % каждое большое животное ест каждое маленькое животное

После того, как все факты и правила введены, можно задать вопрос:

Том съест Джерри?
?-  есть ( том , джерри ). правда

В следующем примере показано, как Prolog преобразует буквенную оценку в ее числовое значение:

numeric_grade ( 'A' ,  4 ). numeric_grade ( 'B' ,  3 ). numeric_grade ( 'C' ,  2 ). numeric_grade ( 'D' ,  1 ). numeric_grade ( 'F' ,  0 ). numeric_grade ( X ,  -1 ) :- не X = 'A' , не X = 'B' , не X = 'C' , не X = ' D ' , не X = ' F' . grade ( 'Студент' , 'A' ).                      
?-  оценка ( 'Студент' ,  X ),  числовая_оценка ( X ,  Y ). X  =  'A' , Y  =  4

Вот исчерпывающий пример: [90]

1) Все драконы извергают огонь, или, что то же самое, вещь извергает огонь, если эта вещь является драконом:

огонь_волн ( X )  :-  это_дракон ( X ).

2) Существо извергает огонь, если один из его родителей извергает огонь:

огонь_взрывов ( X )  :-  является_существом ( X ),  является_родителем_ ( Y , X ),  огонь_взрывов ( Y ).

3) Вещь X является родителем вещи Y, если X является матерью Y или X является отцом Y:

является_родителем_для ( X ,  Y ):-  является_матерью_для ( X ,  Y ). является_родителем_для ( X ,  Y ):-  является_отцом_для ( X ,  Y ).

4) Вещь является существом, если она является драконом:

это_существо ( X )  :-  это_дракон ( X ).

5) Норберта — дракон, а Пафф — существо. Норберта — мать Паффа.

это_дракон ( норберта ). это_существо ( пуф ). это_мать_чего-либо ( норберта ,  пуф ).

Правило (2) — это рекурсивное (индуктивное) определение. Его можно понять декларативно, без необходимости понимать, как оно выполняется.

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

Пролог — нетипизированный язык. Тем не менее, наследование может быть представлено с помощью предикатов. Правило (4) утверждает, что существо является суперклассом дракона.

На вопросы отвечают с помощью обратного рассуждения . Учитывая вопрос:

 ?-  огонь_волн ( X ).

Пролог генерирует два ответа:

X  =  норберта X  =  пухляш

Практическими приложениями Prolog являются представление знаний и решение задач в области искусственного интеллекта .

Объектно-ориентированное программирование

Объектно-ориентированное программирование — это метод программирования для выполнения операций ( функций ) над объектами . [91] Основная идея заключается в группировке характеристик явления в контейнер объектов и присвоении контейнеру имени. Операции над явлением также группируются в контейнер. [91] Объектно-ориентированное программирование, разработанное путем объединения потребности в контейнерах и потребности в безопасном функциональном программировании . [92] Этот метод программирования не обязательно должен ограничиваться объектно-ориентированным языком . [93] В объектно-ориентированном языке контейнер объектов называется классом . В необъектно-ориентированном языке структура данных (которая также известна как запись ) может стать контейнером объектов. Чтобы превратить структуру данных в контейнер объектов, операции должны быть написаны специально для структуры. Полученная структура называется абстрактным типом данных . [94] Однако наследование будет отсутствовать. Тем не менее, этот недостаток можно преодолеть.

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

/* сорт.h */ /* ------- *//* Используется для включения нескольких исходных файлов */ /* этот заголовочный файл без ошибок дублирования. */ /* ---------------------------------------------- */ #ifndef GRADE_H #define GRADE_Htypedef struct { char letter ; } GRADE ;    /* Конструктор */ /* ----------- */ GRADE * grade_new ( char letter );    int grade_numeric ( символьная буква ); #endif    

Функция grade_new()выполняет тот же алгоритм, что и операция конструктора C++ .

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

/* оценка.c */ /* ------- */ #include "оценка.h" GRADE * grade_new ( буква символа ) { GRADE * grade ;       /* Выделение памяти кучи */ /* -------------------- */ if ( ! ( grade = calloc ( 1 , sizeof ( GRADE ) ) ) ) { fprintf ( stderr , "ОШИБКА в %s/%s/%d: calloc() вернул пустой. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); exit ( 1 ); }                            оценка -> буква = буква ; вернуть оценку ; }    int grade_numeric ( 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 ; }                                                                                 

В конструкторе calloc()вместо используется функция malloc(), поскольку каждая ячейка памяти будет установлена ​​в ноль.

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

/* person.h */ /* -------- */ #ifndef PERSON_H #define PERSON_Htypedef struct { char * name ; } ПЕРСОНА ;    /* Конструктор */ /* ----------- */ PERSON * person_new ( char * name ); #endif    

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

/* person.c */ /* -------- */ #include "person.h" ПЕРСОНА * персона_новый ( символ * имя ) { ПЕРСОНА * персона ;       если ( ! ( person = calloc ( 1 , sizeof ( PERSON ) ) ) ) { fprintf ( stderr , "ОШИБКА в %s/%s/%d: calloc() вернул пустой. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); выход ( 1 ); }                          персона -> имя = имя ; вернуть персону ; }    

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

/* student.h */ /* --------- */ #ifndef STUDENT_H #define STUDENT_H#include "person.h" #include "grade.h"  typedef struct { /* УЧАЩИЙСЯ является подмножеством ЧЕЛОВЕКА. */ /* -------------------------------- */ ЧЕЛОВЕК * person ;      ОЦЕНКА * оценка ; } СТУДЕНТ ;  /* Конструктор */ /* ----------- */ СТУДЕНТ * student_new ( char * name ); #endif    

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

/* student.c */ /* --------- */ #include "student.h" #include "person.h"  СТУДЕНТ * студент_новый ( символ * имя ) { СТУДЕНТ * студент ;       если ( ! ( student = calloc ( 1 , sizeof ( STUDENT ) ) ) ) { fprintf ( stderr , "ОШИБКА в %s/%s/%d: calloc() вернул пустой. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); выход ( 1 ); }                          /* Выполнить конструктор суперкласса PERSON. */ /* ------------------------------------------------- */ student -> person = person_new ( name ); return student ; }        

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

/* student_dvr.c */ /* ------------- */ #include <stdio.h> #include "student.h"  int main ( void ) { STUDENT * student = student_new ( "Студент" ); student -> grade = grade_new ( 'a' );               printf ( "%s: Числовая оценка = %d \n " , /* В то время как подмножество существует, наследование не существует. */ student -> person -> name , /* Функциональное программирование — это выполнение функций точно в срок (JIT) */ grade_numeric ( student -> grade -> letter ) );        вернуть 0 ; } 

Вот makefile для компиляции всего:

# makefile # -------- все : student_dvr очистить :  rm  student_dvr  *.ostudent_dvr : student_dvr .c оценка .o студент .o персона .o gcc student_dvr.c оценка.o студент.o персона.o -o student_dvr           сорт.o : сорт . c сорт . h gcc -c сорт.c     студент.o : студент .c студент .h gcc -c студент.c     персона.о : персона .c персона .h gcc -c персона.c     

Формальная стратегия создания объектно-ориентированных объектов заключается в следующем: [95]

Например:

Синтаксис и семантика

Правила производства состоят из набора терминалов и нетерминалов.

Синтаксис компьютерной программы представляет собой список правил производства , которые формируют ее грамматику . [96] Грамматика языка программирования правильно размещает свои объявления , выражения и операторы . [97] Дополнением к синтаксису языка является его семантика . Семантика описывает значения, придаваемые различным синтаксическим конструкциям. [ 98] Синтаксическая конструкция может нуждаться в семантическом описании, поскольку правило производства может иметь недопустимую интерпретацию. [99] Кроме того, разные языки могут иметь одинаковый синтаксис; однако их поведение может быть разным.

Синтаксис языка формально описывается перечислением правил производства. В то время как синтаксис естественного языка чрезвычайно сложен, подмножество английского языка может иметь этот список правил производства: [100]

  1. предложение состоит из существительного, за которым следует глагольное словосочетание ;
  2. существительное -фраза состоит из артикля , за которым следует прилагательное, за которым следует существительное ;
  3. Глагольная группа состоит из глагола, за которым следует существительная группа ;
  4. артикль - «the»;
  5. прилагательное - «большой» или
  6. прилагательное — «маленький» ;
  7. существительное - «кошка» или
  8. существительное «мышь»;
  9. глагол — «ест» ;

Слова, выделенные жирным шрифтом, называются нетерминалами . Слова в «одинарных кавычках» называются терминалами . [101]

Из этого списка правил производства можно сформировать полные предложения, используя ряд замен. [102] Процесс заключается в замене нетерминалов либо допустимым нетерминалом , либо допустимым терминалом . Процесс замены повторяется до тех пор, пока не останутся только терминалы . Одно допустимое предложение:

Однако другая комбинация приводит к недействительному предложению:

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

Один из методов листинга правил производства называется формой Бэкуса–Наура (БНФ). [103] БНФ описывает синтаксис языка и сама имеет синтаксис . Это рекурсивное определение является примером метаязыка . [ 98] Синтаксис БНФ включает:

Используя BNF, подмножество английского языка может иметь следующий список правил продукции :

< предложение >  ::=  < существительное-фраза >< глагол-фраза > < существительное-фраза >  ::=  < статья >< прилагательное >< существительное > < глагол -фраза >  ::=  < глагол >< существительное-фраза > < статья >  ::= < прилагательное > ::= большой | маленький < существительное > ::= кошка | мышь < глагол > ::= ест   

Используя BNF, знаковое целое число имеет следующий листинг правил производства : [104]

< знаковое целое >  ::=  < знак >< целое > < знак >  ::= + | - < целое >  ::=  < цифра > | < цифра >< целое > < цифра >  ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Обратите внимание на правило рекурсивного производства:

< целое число >  ::=  < цифра > | < цифра >< целое число >

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

Обратите внимание на возможность наличия начального нуля в правилах производства:

< целое число >  ::=  < цифра > | < цифра >< целое число > < цифра >  ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Поэтому необходима семантика, описывающая, что начальные нули следует игнорировать.

Для описания семантики доступны два формальных метода : денотационная семантика и аксиоматическая семантика . [105]

Программная инженерия и компьютерное программирование

До появления языков программирования Бетти Дженнингс и Фрэн Билас программировали ENIAC, передвигая кабели и устанавливая переключатели.

Программная инженерия — это множество методов создания качественных компьютерных программ . [106] Компьютерное программирование — это процесс написания или редактирования исходного кода . В формальной среде системный аналитик собирает информацию от менеджеров обо всех процессах организации, которые необходимо автоматизировать. Затем этот специалист готовит подробный план для новой или модифицированной системы. [107] План аналогичен чертежу архитектора. [107]

Цели производительности

Системный аналитик ставит перед собой цель доставить нужную информацию нужному человеку в нужное время. [108] Критические факторы для достижения этой цели: [108]

  1. Качество выходных данных. Полезен ли выходной сигнал для принятия решений?
  2. Точность вывода. Отражает ли он истинную ситуацию?
  3. Формат вывода. Легко ли понять вывод?
  4. Скорость вывода. Информация, чувствительная ко времени, важна при общении с клиентом в режиме реального времени.

Цели затрат

Достижение целевых показателей эффективности должно быть сбалансировано со всеми затратами, включая: [109]

  1. Затраты на разработку.
  2. Уникальность стоит денег. Многоразовая система может быть дорогой. Однако она может быть предпочтительнее системы ограниченного использования.
  3. Расходы на оборудование.
  4. Эксплуатационные расходы.

Применение процесса разработки систем смягчит аксиому: чем позже в процессе обнаруживается ошибка, тем дороже ее исправление. [110]

Модель водопада

Модель водопада представляет собой реализацию процесса разработки систем . [111] Как следует из названия водопада , основные фазы перекрывают друг друга: [112]

  1. Фаза исследования направлена ​​на понимание основной проблемы.
  2. Фаза анализа направлена ​​на понимание возможных решений.
  3. Фаза проектирования заключается в планировании наилучшего решения.
  4. Фаза внедрения заключается в программировании наилучшего решения.
  5. Фаза обслуживания длится в течение всего срока службы системы. Могут потребоваться изменения в системе после ее развертывания. [113] Могут существовать ошибки, включая ошибки спецификации, ошибки проектирования или ошибки кодирования. Могут потребоваться улучшения. Может потребоваться адаптация для реагирования на изменяющуюся среду.

Программист

Программист — это специалист , ответственный за написание или изменение исходного кода для реализации подробного плана. [107] Вероятно, понадобится команда программистов, поскольку большинство систем слишком велики, чтобы их мог завершить один программист. [114] Однако добавление программистов в проект может не сократить время завершения. Вместо этого оно может снизить качество системы. [114] Чтобы быть эффективными, программные модули должны быть определены и распределены между членами команды. [114] Кроме того, члены команды должны взаимодействовать друг с другом осмысленным и эффективным образом. [114]

Программисты могут программировать в малом : программирование в пределах одного модуля. [115] Есть вероятность, что модуль будет выполнять модули, расположенные в других файлах исходного кода. Поэтому программисты могут программировать в большом : программные модули, чтобы они эффективно соединялись друг с другом. [115] Программирование в большом включает в себя вклад в интерфейс прикладного программирования (API).

Программные модули

Модульное программирование — это метод совершенствования программ на императивном языке . Совершенствование программ может уменьшить размер программного обеспечения, разделить обязанности и тем самым смягчить старение программного обеспечения . Программный модуль — это последовательность операторов, которые ограничены блоком и вместе идентифицируются именем. [116] Модули имеют функцию , контекст и логику : [117]

Имя модуля должно быть получено сначала из его функции , а затем из его контекста . Его логика не должна быть частью имени. [117] Например, function compute_square_root( x )или function compute_square_root_integer( i : integer )являются подходящими именами модулей. Однако function compute_square_root_by_division( x )не является.

Степень взаимодействия внутри модуля — это уровень его связности . [117] Связность — это суждение о связи между именем модуля и его функцией . Степень взаимодействия между модулями — это уровень связи . [118] Связь — это суждение о связи между контекстом модуля и элементами, над которыми он выполняется.

Сплоченность

Уровни сплоченности от худшего к лучшему: [119]

Муфта

Уровни связи от худшего к лучшему следующие: [118]

Анализ потока данных

Пример диаграммы потока данных на уровне функций

Анализ потока данных — это метод проектирования, используемый для достижения модулей функциональной связности и связи данных . [120] Входными данными для метода является диаграмма потока данных . Диаграмма потока данных — это набор овалов, представляющих модули. Имя каждого модуля отображается внутри его овала. Модули могут находиться на уровне исполняемых файлов или на уровне функций.

На схеме также есть стрелки, соединяющие модули друг с другом. Стрелки, указывающие на модули, представляют собой набор входов. Каждый модуль должен иметь только одну стрелку, выходящую из него, чтобы представлять его единственный выходной объект. (По желанию, дополнительная стрелка исключения указывает.) Гирляндная цепь овалов будет передавать весь алгоритм . Входные модули должны начинать схему. Входные модули должны подключаться к модулям преобразования. Модули преобразования должны подключаться к выходным модулям. [121]

Функциональные категории

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

Компьютерные программы можно классифицировать по функциональным признакам. Основными функциональными категориями являются прикладное программное обеспечение и системное программное обеспечение . Системное программное обеспечение включает операционную систему , которая связывает компьютерное оборудование с прикладным программным обеспечением. [122] Цель операционной системы — обеспечить среду, в которой прикладное программное обеспечение выполняется удобным и эффективным образом. [122] Как прикладное программное обеспечение, так и системное программное обеспечение выполняют служебные программы . На аппаратном уровне программа микрокода управляет цепями по всему центральному процессору .

Прикладное программное обеспечение

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

Корпоративные приложения могут быть разработаны внутри компании как уникальное в своем роде фирменное программное обеспечение . [124] В качестве альтернативы они могут быть приобретены как готовое программное обеспечение . Приобретенное программное обеспечение может быть изменено для предоставления индивидуального программного обеспечения . Если приложение настраивается, то либо используются ресурсы компании, либо ресурсы передаются на аутсорсинг. Разработка программного обеспечения на аутсорсинге может осуществляться как исходным поставщиком программного обеспечения, так и сторонним разработчиком. [125]

Потенциальные преимущества внутреннего программного обеспечения заключаются в том, что функции и отчеты могут быть разработаны точно в соответствии со спецификацией. [126] Руководство также может быть вовлечено в процесс разработки и предлагать определенный уровень контроля. [127] Руководство может принять решение противодействовать новой инициативе конкурента или реализовать требования клиента или поставщика. [128] Слияние или поглощение может потребовать изменений корпоративного программного обеспечения. Потенциальные недостатки внутреннего программного обеспечения заключаются в том, что затраты времени и ресурсов могут быть значительными. [124] Кроме того, могут нависнуть риски, касающиеся функций и производительности.

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

Один из подходов к экономически выгодному получению настраиваемого корпоративного приложения — через поставщика услуг приложений . [129] Специализированные компании предоставляют оборудование, настраиваемое программное обеспечение и поддержку конечных пользователей. Они могут ускорить разработку новых приложений, поскольку у них есть квалифицированный персонал по информационным системам. Самое большое преимущество заключается в том, что это освобождает внутренние ресурсы от кадрового обеспечения и управления сложными компьютерными проектами. [129] Многие поставщики услуг приложений нацелены на небольшие, быстрорастущие компании с ограниченными ресурсами информационных систем. [129] С другой стороны, более крупные компании с крупными системами, скорее всего, будут иметь свою техническую инфраструктуру. Один из рисков — необходимость доверять внешней организации конфиденциальную информацию. Другой риск — необходимость доверять надежности инфраструктуры поставщика. [129]

Операционная система

Программа против процесса против планирования потоков , вытеснение , переключение контекста

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

В 1950-х годах программист, который также был оператором, писал программу и запускал ее. После того, как программа завершала выполнение, вывод мог быть распечатан или мог быть пробит на бумажной ленте или картах для последующей обработки. [28] Чаще всего программа не работала. Затем программист смотрел на индикаторы консоли и возился с переключателями консоли. Если повезло меньше, делалась распечатка памяти для дальнейшего изучения. В 1960-х годах программисты сократили количество потерянного времени, автоматизировав работу оператора. Программа, называемая операционной системой, все время хранилась в компьютере. [130]

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

Программа ядра

Ядро подключает прикладное программное обеспечение к аппаратному обеспечению компьютера.

Основное назначение ядра — управление ограниченными ресурсами компьютера:

Физическая память разбросана по ОЗУ и жесткому диску. Виртуальная память — это один непрерывный блок.
  • Когда ядро ​​изначально загружает исполняемый файл в память, оно логически делит адресное пространство на регионы . [133] Ядро поддерживает таблицу master-region и множество таблиц per-process-region (pregion) — по одной для каждого запущенного процесса . [133] Эти таблицы составляют виртуальное адресное пространство . Таблица master-region используется для определения того, где ее содержимое находится в физической памяти . Таблицы pregion позволяют каждому процессу иметь свой собственный program (text) pregion, data pregion и stack pregion.
  • Программный pregion хранит машинные инструкции. Поскольку машинные инструкции не изменяются, программный pregion может совместно использоваться многими процессами одного и того же исполняемого файла. [133]
  • Для экономии времени и памяти ядро ​​может загружать с диска только блоки инструкций по выполнению, а не весь исполняемый файл целиком. [132]
  • Ядро отвечает за преобразование виртуальных адресов в физические адреса . Ядро может запросить данные из контроллера памяти и вместо этого получить ошибку страницы . [134] Если это так, ядро ​​обращается к блоку управления памятью , чтобы заполнить область физических данных и преобразовать адрес. [135]
  • Ядро выделяет память из кучи по запросу процесса. [64] Когда процесс завершает работу с памятью, он может запросить ее освобождение . Если процесс завершается без запроса на освобождение всей выделенной памяти, ядро ​​выполняет сборку мусора , чтобы освободить память.
  • Ядро также гарантирует, что процесс обращается только к своей собственной памяти, а не к памяти ядра или других процессов. [132]

Первоначально операционные системы программировались на ассемблере ; однако современные операционные системы обычно пишутся на языках более высокого уровня, таких как C , Objective-C и Swift . [k]

Программа утилит

Утилиты предназначены для помощи в системном администрировании и выполнении программного обеспечения. Операционные системы выполняют аппаратные утилиты для проверки состояния дисководов, памяти, динамиков и принтеров. [140] Утилиты могут оптимизировать размещение файла на переполненном диске. Системные утилиты контролируют производительность оборудования и сети. Когда показатель выходит за пределы допустимого диапазона, генерируется триггерное оповещение. [141]

Вспомогательные программы включают в себя программы сжатия, поэтому файлы данных хранятся на меньшем дисковом пространстве. [140] Сжатые программы также экономят время при передаче файлов данных по сети. [140] Вспомогательные программы могут сортировать и объединять наборы данных. [141] Вспомогательные программы обнаруживают компьютерные вирусы . [141]

Программа микрокода

НЕ ворота
NAND-ворота
NOR-вентиль
И ворота
ИЛИ-ворота

Программа микрокода — это интерпретатор нижнего уровня, который управляет путем передачи данных программно-управляемых компьютеров. [142] (Достижения в области аппаратного обеспечения перенесли эти операции в аппаратные схемы выполнения .) [142] Инструкции микрокода позволяют программисту легче реализовать цифровой логический уровень [143] — реальное аппаратное обеспечение компьютера. Цифровой логический уровень — это граница между компьютерной наукой и компьютерной инженерией . [144]

Логический вентиль — это крошечный транзистор , который может возвращать один из двух сигналов: включено или выключено. [145]

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

Инструкции микрокода — это мнемоники, которые программисты могут использовать для выполнения цифровых логических функций вместо их формирования в двоичной алгебре. Они хранятся в управляющем хранилище центрального процессора (ЦП) . [146] Эти инструкции аппаратного уровня перемещают данные по всему пути данных .

Цикл микрокоманд начинается, когда микросеквенсор использует свой микропрограммный счетчик для извлечения следующей машинной инструкции из оперативной памяти . [147] Следующий шаг — декодирование машинной инструкции путем выбора правильной выходной линии для аппаратного модуля. [148] Последний шаг — выполнение инструкции с использованием набора вентилей аппаратного модуля.

Символическое представление АЛУ

Инструкции для выполнения арифметических действий передаются через арифметико-логическое устройство (АЛУ). [149] АЛУ имеет схемы для выполнения элементарных операций сложения, сдвига и сравнения целых чисел. Объединяя и циклически выполняя элементарные операции через АЛУ, ЦП выполняет свою сложную арифметику.

Инструкции микрокода перемещают данные между ЦП и контроллером памяти . Инструкции микрокода контроллера памяти манипулируют двумя регистрами . Регистр адреса памяти используется для доступа к адресу каждой ячейки памяти. Регистр данных памяти используется для установки и чтения содержимого каждой ячейки. [150]

Инструкции микрокода перемещают данные между ЦП и множеством компьютерных шин . Шина контроллера диска записывает и считывает данные с жестких дисков . Данные также перемещаются между ЦП и другими функциональными блоками через экспресс-шину периферийных компонентов. [151]

Примечания

  1. ^ Язык Пролог позволяет вводить базу данных фактов и правил в любом порядке. Однако вопрос о базе данных должен быть в самом конце.
  2. ^ Исполняемый файл содержит все машинные инструкции, готовые для ЦП .
  3. ^ Для получения дополнительной информации посетите страницу Язык ассемблера X86#Типы инструкций .
  4. ^ введено в 1999 году
  5. ^ Такие операторыx++ обычно компилируются в одну инструкцию.
  6. ^ Номера строк обычно увеличивались на 10, чтобы оставить место на случай, если впоследствии будут добавлены дополнительные операторы.
  7. ^ Эту функцию можно записать более кратко как int increment_counter(){ static int counter; return ++counter;}. 1) Статические переменные автоматически инициализируются нулем. 2) ++counter— префиксный оператор инкремента .
  8. ^ И это несмотря на метафору стека , который обычно растет снизу вверх.
  9. ^ C также предоставляет calloc()функцию выделения памяти кучи. Она предоставляет две дополнительные услуги: 1) Позволяет программисту создавать массив произвольного размера. 2) Устанавливает каждую ячейку памяти в ноль.
  10. ^ Для строковых переменных C предоставляет strdup()функцию. Она выполняет как функцию выделения, так и функцию копирования.
  11. ^ Операционная система UNIX была написана на языке C, macOS — на языке Objective-C, а Swift заменил Objective-C.

Ссылки

  1. ^ "ISO/IEC 2382:2015". ISO . 2020-09-03. Архивировано из оригинала 2016-06-17 . Получено 2022-05-26 . [Программное обеспечение включает] все или часть программ, процедур, правил и связанной с ними документации системы обработки информации.
  2. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 7. ISBN 0-201-71012-9. Альтернативой компиляции исходной программы является использование интерпретатора. Интерпретатор может напрямую выполнить исходную программу[.]
  3. ^ Зильбершатц, Абрахам (1994). Концепции операционных систем, четвертое издание . Addison-Wesley. стр. 98. ISBN 978-0-201-50480-4.
  4. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Prentice Hall. стр. 32. ISBN 978-0-13-854662-5.
  5. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 7. ISBN 0-201-71012-9.
  6. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 30. ISBN 0-201-71012-9. Их намерением было создать язык, который был бы очень прост для изучения студентами[.]
  7. ^ abc Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 31. ISBN 0-201-71012-9.
  8. ^ abcdef Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 30. ISBN 0-201-71012-9.
  9. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 30. ISBN 0-201-71012-9. Идея заключалась в том, что студенты могли быть просто обычными пользователями или переходить от базового уровня к более сложным и мощным языкам[.]
  10. ^ ab McCartney, Scott (1999). ENIAC – Триумфы и трагедии первого в мире компьютера. Walker and Company. стр. 16. ISBN 978-0-8027-1348-3.
  11. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Prentice Hall. стр. 14. ISBN 978-0-13-854662-5.
  12. ^ Бромли, Аллан Г. (1998). «Аналитическая машина Чарльза Бэббиджа, 1838» (PDF) . IEEE Annals of the History of Computing . 20 (4): 29–45. doi :10.1109/85.728228. S2CID  2285332. Архивировано (PDF) из оригинала 2016-03-04 . Получено 2015-10-30 .
  13. ^ ab Tanenbaum, Andrew S. (1990). Структурированная компьютерная организация, третье издание. Prentice Hall. стр. 15. ISBN 978-0-13-854662-5.
  14. ^ Дж. Фуэги; Дж. Фрэнсис (октябрь–декабрь 2003 г.), «Лавлейс и Бэббидж и создание «заметок» 1843 г.»", Анналы истории вычислительной техники , 25 (4): 16, 19, 25, doi :10.1109/MAHC.2003.1253887
  15. ^ Розен, Кеннет Х. (1991). Дискретная математика и ее приложения. McGraw-Hill, Inc. стр. 654. ISBN 978-0-07-053744-6Машины Тьюринга могут моделировать все вычисления, которые могут быть выполнены на вычислительной машине.
  16. ^ Линц, Питер (1990). Введение в формальные языки и автоматы . DC Heath and Company. стр. 234. ISBN 978-0-669-17342-0.
  17. ^ Линц, Питер (1990). Введение в формальные языки и автоматы . DC Heath and Company. стр. 243. ISBN 978-0-669-17342-0. [В]се общие математические функции, независимо от их сложности, вычислимы по Тьюрингу.
  18. ^ abc Маккартни, Скотт (1999). ENIAC – Триумфы и трагедии первого в мире компьютера. Walker and Company. стр. 102. ISBN 978-0-8027-1348-3.
  19. ^ Маккартни, Скотт (1999). ENIAC – Триумфы и трагедии первого в мире компьютера. Walker and Company. стр. 94. ISBN 978-0-8027-1348-3.
  20. ^ Маккартни, Скотт (1999). ENIAC – Триумфы и трагедии первого в мире компьютера. Walker and Company. стр. 107. ISBN 978-0-8027-1348-3.
  21. ^ Маккартни, Скотт (1999). ENIAC – Триумфы и трагедии первого в мире компьютера. Walker and Company. стр. 120. ISBN 978-0-8027-1348-3.
  22. ^ ab McCartney, Scott (1999). ENIAC – Триумфы и трагедии первого в мире компьютера. Walker and Company. стр. 118. ISBN 978-0-8027-1348-3.
  23. ^ Маккартни, Скотт (1999). ENIAC – Триумфы и трагедии первого в мире компьютера. Walker and Company. стр. 119. ISBN 978-0-8027-1348-3.
  24. ^ Маккартни, Скотт (1999). ENIAC – Триумфы и трагедии первого в мире компьютера. Walker and Company. стр. 123. ISBN 978-0-8027-1348-3.
  25. ^ ab Tanenbaum, Andrew S. (1990). Структурированная компьютерная организация, третье издание . Prentice Hall. стр. 21. ISBN 978-0-13-854662-5.
  26. ^ ab Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 27. ISBN 0-201-71012-9.
  27. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 29. ISBN 0-201-71012-9.
  28. ^ abc Silberschatz, Abraham (1994). Концепции операционных систем, четвертое издание . Addison-Wesley. стр. 6. ISBN 978-0-201-50480-4.
  29. ^ abcdefghi «Билл Пентц — Немного предыстории: послевоенный марш к СБИС». Музей компьютеров Digibarn. Август 2008 г. Архивировано из оригинала 21 марта 2022 г. Получено 31 января 2022 г.
  30. ^ ab В цифровую эпоху: исследовательские лаборатории, стартапы и рост MOS. Johns Hopkins University Press. 2002. ISBN 9780801886393. Архивировано из оригинала 2 февраля 2023 г. . Получено 3 февраля 2022 г. .
  31. ^ Chalamala, Babu (2017). «Производство кремниевых материалов для микроэлектроники и солнечных фотоэлектрических систем». Sandia National Laboratories. Архивировано из оригинала 23 марта 2023 г. Получено 8 февраля 2022 г.
  32. ^ "Fabricating ICs Making a base wafer". Britannica. Архивировано из оригинала 8 февраля 2022 г. Получено 8 февраля 2022 г.
  33. ^ "Введение в NMOS и PMOS транзисторы". Anysilicon. 4 ноября 2021 г. Архивировано из оригинала 6 февраля 2022 г. Получено 5 февраля 2022 г.
  34. ^ "microprocessor definition". Britannica. Архивировано из оригинала 1 апреля 2022 г. Получено 1 апреля 2022 г.
  35. ^ "Chip Hall of Fame: Intel 4004 Microprocessor". Institute of Electrical and Electronics Engineers. 2 июля 2018 г. Архивировано из оригинала 7 февраля 2022 г. Получено 31 января 2022 г.
  36. ^ "360 Revolution" (PDF) . Father, Son & Co. 1990. Архивировано (PDF) из оригинала 2022-10-10 . Получено 5 февраля 2022 .
  37. ^ ab "Внутри давно потерянного первого микрокомпьютера в мире". c/net. 8 января 2010 г. Архивировано из оригинала 1 февраля 2022 г. Получено 31 января 2022 г.
  38. ^ «Билл Гейтс, Microsoft и персональный компьютер IBM». InfoWorld. 23 августа 1982 г. Архивировано из оригинала 18 февраля 2023 г. Получено 1 февраля 2022 г.
  39. ^ ab Stroustrup, Bjarne (2013). Язык программирования C++, четвертое издание . Addison-Wesley. стр. 10. ISBN 978-0-321-56384-2.
  40. ^ abc Страуструп, Бьярне (2013). Язык программирования C++, четвертое издание . Addison-Wesley. стр. 11. ISBN 978-0-321-56384-2.
  41. ^ ab Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 159. ISBN 0-619-06489-7.
  42. ^ ab Linz, Peter (1990). Введение в формальные языки и автоматы . DC Heath and Company. стр. 2. ISBN 978-0-669-17342-0.
  43. ^ Вайс, Марк Аллен (1994). Структуры данных и анализ алгоритмов в C++ . Benjamin/Cummings Publishing Company, Inc. стр. 29. ISBN 0-8053-5443-3.
  44. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Prentice Hall. стр. 17. ISBN 978-0-13-854662-5.
  45. ^ abcdef Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 160. ISBN 0-619-06489-7.
  46. ^ abc Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Prentice Hall. стр. 399. ISBN 978-0-13-854662-5.
  47. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Prentice Hall. стр. 400. ISBN 978-0-13-854662-5.
  48. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Prentice Hall. стр. 398. ISBN 978-0-13-854662-5.
  49. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 26. ISBN 0-201-71012-9.
  50. ^ abcd Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 37. ISBN 0-201-71012-9.
  51. ^ Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 160. ISBN 0-619-06489-7. В языках программирования третьего поколения и более высокого уровня каждое выражение в языке транслируется в несколько инструкций на машинном языке.
  52. ^ Уилсон, Лесли Б. (1993). Сравнительные языки программирования, второе издание . Addison-Wesley. стр. 75. ISBN 978-0-201-56885-1.
  53. ^ Страуструп, Бьярне (2013). Язык программирования C++, четвертое издание . Addison-Wesley. стр. 40. ISBN 978-0-321-56384-2.
  54. ^ ab Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 16. ISBN 0-201-71012-9.
  55. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 24. ISBN 0-201-71012-9.
  56. ^ ab Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 25. ISBN 0-201-71012-9.
  57. ^ abcd Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 19. ISBN 0-201-71012-9.
  58. ^ abcd "Memory Layout of C Programs". 12 сентября 2011 г. Архивировано из оригинала 6 ноября 2021 г. Получено 6 ноября 2021 г.
  59. ^ ab Керниган, Брайан В.; Ритчи, Деннис М. (1988). Язык программирования Си, второе издание . Prentice Hall. стр. 31. ISBN 0-13-110362-8.
  60. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 128. ISBN 0-201-71012-9.
  61. ^ abc Керриск, Майкл (2010). Интерфейс программирования Linux . No Starch Press. стр. 121. ISBN 978-1-59327-220-3.
  62. ^ Керриск, Майкл (2010). Интерфейс программирования Linux . No Starch Press. стр. 122. ISBN 978-1-59327-220-3.
  63. ^ Керниган, Брайан В.; Ритчи, Деннис М. (1988). Язык программирования Си, второе издание . Prentice Hall. стр. 185. ISBN 0-13-110362-8.
  64. ^ ab Керниган, Брайан В.; Ритчи, Деннис М. (1988). Язык программирования Си, второе издание . Prentice Hall. стр. 187. ISBN 0-13-110362-8.
  65. ^ abc Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 38. ISBN 0-201-71012-9.
  66. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 193. ISBN 0-201-71012-9.
  67. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 39. ISBN 0-201-71012-9.
  68. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 35. ISBN 0-201-71012-9.
  69. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 192. ISBN 0-201-71012-9.
  70. ^ Страуструп, Бьярне (2013). Язык программирования C++, четвертое издание . Addison-Wesley. стр. 22. ISBN 978-0-321-56384-2.
  71. ^ Страуструп, Бьярне (2013). Язык программирования C++, четвертое издание . Addison-Wesley. стр. 21. ISBN 978-0-321-56384-2.
  72. ^ Страуструп, Бьярне (2013). Язык программирования C++, четвертое издание . Addison-Wesley. стр. 49. ISBN 978-0-321-56384-2.
  73. ^ ab Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 218. ISBN 0-201-71012-9.
  74. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 217. ISBN 0-201-71012-9.
  75. ^ Вайс, Марк Аллен (1994). Структуры данных и анализ алгоритмов в C++ . Benjamin/Cummings Publishing Company, Inc. стр. 103. ISBN 0-8053-5443-3. При вызове функции необходимо сохранить всю важную информацию, например, значения регистров (соответствующие именам переменных) и адрес возврата (который можно получить из счетчика программы)[.] ... Когда функция хочет вернуться, она ... восстанавливает все регистры. Затем она выполняет возврат. Очевидно, что всю эту работу можно выполнить с помощью стека, и именно это происходит практически в каждом языке программирования, реализующем рекурсию.
  76. ^ abc Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 230. ISBN 0-201-71012-9.
  77. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 240. ISBN 0-201-71012-9.
  78. ^ abc Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 241. ISBN 0-201-71012-9.
  79. ^ Джонс, Робин; Мейнард, Клайв; Стюарт, Ян (6 декабря 2012 г.). Искусство программирования на языке Lisp . Springer Science & Business Media. стр. 2. ISBN 9781447117193.
  80. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 220. ISBN 0-201-71012-9.
  81. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 221. ISBN 0-201-71012-9.
  82. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 229. ISBN 0-201-71012-9.
  83. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 227. ISBN 0-201-71012-9.
  84. ^ ab Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 222. ISBN 0-201-71012-9.
  85. ^ Гордон, Майкл Дж. К. (1996). «От LCF к HOL: краткая история». Архивировано из оригинала 2016-09-05 . Получено 2021-10-30 .
  86. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 233. ISBN 0-201-71012-9.
  87. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 235. ISBN 0-201-71012-9.
  88. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 55. ISBN 0-201-71012-9.
  89. ^ Колмерауэр, А.; Руссель, П. (1992). "Рождение Пролога" (PDF) . Уведомления ACM SIGPLAN . 28 (3). Ассоциация вычислительной техники: 5. doi :10.1145/155360.155362.
  90. ^ Ковальски, Р., Давила, Дж., Сартор, Г. и Калехо, М., 2023. Логический английский для права и образования. В Prolog: The Next 50 Years (стр. 287-299). Cham: Springer Nature Switzerland.
  91. ^ ab Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 35. ISBN 0-201-71012-9. Simula была основана на Algol 60 с одним очень важным дополнением — концепцией класса. ... Основная идея заключалась в том, что данные (или структура данных) и операции, выполняемые над ними, связаны друг с другом[.]
  92. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 39. ISBN 0-201-71012-9Первоначально было разработано большое количество экспериментальных языков, многие из которых сочетали объектно-ориентированное и функциональное программирование.
  93. ^ Шах, Стивен Р. (1990). Программная инженерия . Aksen Associates Incorporated Publishers. стр. 284. ISBN 0-256-08515-3. Хотя верно, что OOD [(объектно-ориентированное проектирование)] как таковое не поддерживается большинством популярных языков, можно использовать большое подмножество OOD.
  94. ^ Вайс, Марк Аллен (1994). Структуры данных и анализ алгоритмов в C++ . Benjamin/Cummings Publishing Company, Inc. стр. 57. ISBN 0-8053-5443-3.
  95. ^ Шах, Стивен Р. (1990). Программная инженерия . Aksen Associates Incorporated Publishers. стр. 285. ISBN 0-256-08515-3.
  96. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 290. ISBN 0-201-71012-9. Синтаксис (или грамматика) языка программирования описывает правильную форму, в которой могут быть написаны программы[.]
  97. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 78. ISBN 0-201-71012-9Основными компонентами императивного языка являются декларации, выражения и утверждения .
  98. ^ ab Wilson, Leslie B. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 290. ISBN 0-201-71012-9.
  99. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 294. ISBN 0-201-71012-9.
  100. ^ Розен, Кеннет Х. (1991). Дискретная математика и ее приложения. McGraw-Hill, Inc. стр. 615. ISBN 978-0-07-053744-6.
  101. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 291. ISBN 0-201-71012-9.
  102. ^ Розен, Кеннет Х. (1991). Дискретная математика и ее приложения. McGraw-Hill, Inc. стр. 616. ISBN 978-0-07-053744-6.
  103. ^ Розен, Кеннет Х. (1991). Дискретная математика и ее приложения. McGraw-Hill, Inc. стр. 623. ISBN 978-0-07-053744-6.
  104. ^ Розен, Кеннет Х. (1991). Дискретная математика и ее приложения. McGraw-Hill, Inc. стр. 624. ISBN 978-0-07-053744-6.
  105. ^ Уилсон, Лесли Б. (2001). Сравнительные языки программирования, третье издание . Addison-Wesley. стр. 297. ISBN 0-201-71012-9.
  106. ^ Шах, Стивен Р. (1990). Программная инженерия . Aksen Associates Incorporated Publishers. стр. Предисловие. ISBN 0-256-08515-3.
  107. ^ abc Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 507. ISBN 0-619-06489-7.
  108. ^ ab Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 513. ISBN 0-619-06489-7.
  109. ^ Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 514. ISBN 0-619-06489-7.
  110. ^ Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 516. ISBN 0-619-06489-7.
  111. ^ Шах, Стивен Р. (1990). Программная инженерия . Aksen Associates Incorporated Publishers. стр. 8. ISBN 0-256-08515-3.
  112. ^ Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 517. ISBN 0-619-06489-7.
  113. ^ Шах, Стивен Р. (1990). Программная инженерия . Aksen Associates Incorporated Publishers. стр. 345. ISBN 0-256-08515-3.
  114. ^ abcd Шах, Стивен Р. (1990). Программная инженерия . Aksen Associates Incorporated Publishers. стр. 319. ISBN 0-256-08515-3.
  115. ^ аб Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 331. ИСБН 0-256-08515-3.
  116. ^ Шах, Стивен Р. (1990). Программная инженерия . Aksen Associates Incorporated Publishers. стр. 216. ISBN 0-256-08515-3.
  117. ^ abc Schach, Stephen R. (1990). Программная инженерия . Aksen Associates Incorporated Publishers. стр. 219. ISBN 0-256-08515-3.
  118. ^ аб Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 226. ИСБН 0-256-08515-3.
  119. ^ аб Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 220. ИСБН 0-256-08515-3.
  120. ^ Шах, Стивен Р. (1990). Программная инженерия . Aksen Associates Incorporated Publishers. стр. 258. ISBN 0-256-08515-3.
  121. ^ Шах, Стивен Р. (1990). Программная инженерия . Aksen Associates Incorporated Publishers. стр. 259. ISBN 0-256-08515-3.
  122. ^ abc Silberschatz, Abraham (1994). Концепции операционных систем, четвертое издание . Addison-Wesley. стр. 1. ISBN 978-0-201-50480-4.
  123. ^ Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 147. ISBN 0-619-06489-7. Ключом к раскрытию потенциала любой компьютерной системы является прикладное программное обеспечение.
  124. ^ abcd Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 147. ISBN 0-619-06489-7.
  125. ^ Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 147. ISBN 0-619-06489-7. [Сторонняя фирма-разработчик программного обеспечения, часто называемая поставщиком программного обеспечения с добавленной стоимостью, может разрабатывать или модифицировать программное обеспечение для удовлетворения потребностей конкретной отрасли или компании.
  126. ^ Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 148. ISBN 0-619-06489-7. Заголовок: Проприетарное программное обеспечение; Подзаголовок: Преимущества; Цитата: Вы можете получить именно то, что вам нужно с точки зрения функций, отчетов и т. д.
  127. ^ Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 148. ISBN 0-619-06489-7. Заголовок: Проприетарное программное обеспечение; Подзаголовок: Преимущества; Цитата: Участие в разработке обеспечивает дополнительный уровень контроля над результатами.
  128. ^ Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 147. ISBN 0-619-06489-7. Заголовок: Проприетарное программное обеспечение; Подзаголовок: Преимущества; Цитата: Существует большая гибкость при внесении изменений, которые могут потребоваться для противодействия новой инициативе одного из ваших конкурентов или для удовлетворения новых требований поставщиков и/или клиентов.
  129. ^ abcd Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 149. ISBN 0-619-06489-7.
  130. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Prentice Hall. стр. 11. ISBN 978-0-13-854662-5.
  131. ^ ab Kerrisk, Michael (2010). Интерфейс программирования Linux . No Starch Press. стр. 21. ISBN 978-1-59327-220-3.
  132. ^ abcde Керриск, Майкл (2010). Интерфейс программирования Linux . No Starch Press. стр. 22. ISBN 978-1-59327-220-3.
  133. ^ abc Бах, Морис Дж. (1986). Проектирование операционной системы UNIX . Prentice-Hall, Inc. стр. 152. ISBN 0-13-201799-7.
  134. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. стр. 443. ISBN 978-0-13-291652-3.
  135. ^ Лакамера, Даниэле (2018). Архитектура встроенных систем . Пакет. п. 8. ISBN 978-1-78883-250-2.
  136. ^ Керриск, Майкл (2010). Интерфейс программирования Linux . No Starch Press. стр. 23. ISBN 978-1-59327-220-3.
  137. ^ Керниган, Брайан В. (1984). Среда программирования Unix . Prentice Hall. стр. 201. ISBN 0-13-937699-2.
  138. ^ Керриск, Майкл (2010). Интерфейс программирования Linux . No Starch Press. стр. 187. ISBN 978-1-59327-220-3.
  139. ^ Haviland, Keith (1987). Программирование систем Unix . Addison-Wesley Publishing Company. стр. 121. ISBN 0-201-12919-1.
  140. ^ abc Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 145. ISBN 0-619-06489-7.
  141. ^ abc Stair, Ralph M. (2003). Принципы информационных систем, шестое издание . Томсон. стр. 146. ISBN 0-619-06489-7.
  142. ^ ab Tanenbaum, Andrew S. (2013). Структурированная компьютерная организация, шестое издание . Pearson. стр. 6. ISBN 978-0-13-291652-3.
  143. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. стр. 243. ISBN 978-0-13-291652-3.
  144. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. стр. 147. ISBN 978-0-13-291652-3.
  145. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. стр. 148. ISBN 978-0-13-291652-3.
  146. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. стр. 253. ISBN 978-0-13-291652-3.
  147. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. стр. 255. ISBN 978-0-13-291652-3.
  148. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. стр. 161. ISBN 978-0-13-291652-3.
  149. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. стр. 166. ISBN 978-0-13-291652-3.
  150. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. стр. 249. ISBN 978-0-13-291652-3.
  151. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. стр. 111. ISBN 978-0-13-291652-3.