stringtranslate.com

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

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

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

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

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

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

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

"Привет, мир!" программа Брайана Кернигана (1978)

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

10 ВВОД «Сколько чисел усреднять?» , A 20 FOR I = 1 TO A 30 INPUT «Введите число:» , B 40 LET C = C + B 50 NEXT I 60 LET D = C / A 70 PRINT «Среднее значение» , D 80 КОНЕЦ                            

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

История

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

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

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

В 1837 году ткацкий станок Жаккарда вдохновил Чарльза Бэббиджа на попытку создать аналитическую машину . [10] Названия компонентов счетного устройства были заимствованы из текстильной промышленности. В текстильной промышленности пряжу привозили из магазина на помол. Устройство имело «хранилище», состоящее из памяти для хранения 1000 чисел по 50 десятичных цифр каждое. [11] Номера из «магазина» были переданы на «мельницу» для обработки. Он был запрограммирован с использованием двух наборов перфорированных карт. Один набор управлял операцией, а другой вводил переменные. [10] [12] Однако тысячи зубчатых колес и шестеренок так и не работали полностью вместе, даже после того, как Бэббидж потратил более 17 000 фунтов стерлингов государственных денег. [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 . Целью было разработать всеобъемлющий, простой в использовании, расширяемый язык, который заменит Кобол и Фортран. [26] В результате получился большой и сложный язык, компиляция которого заняла много времени . [27]

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

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

Очень крупномасштабная интеграция

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

Важной вехой в разработке программного обеспечения стало изобретение схемы очень большой интеграции (СБИС) (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] Его целью было хранение медицинских карт пациентов. Компьютер поддерживал дисковую операционную систему для работы с 3- мегабайтным жестким диском Memorex . [29] Он имел цветной дисплей и клавиатуру, объединенные в одну консоль. Дисковая операционная система была запрограммирована с использованием базового языка ассемблера IBM (BAL) . Приложение медицинских записей было запрограммировано с использованием интерпретатора 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 — это семейство обратно совместимых машинных инструкций . Машинные инструкции, созданные в более ранних микропроцессорах, сохранялись при обновлении микропроцессоров. Это позволило потребителям приобретать новые компьютеры без необходимости приобретать новое прикладное программное обеспечение . Основные категории инструкций: [b]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Фортран

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

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

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

КОБОЛ

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

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

Алголь

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

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

Базовый

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

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

Однако синтаксис Basic был слишком простым для больших программ. [8] В последних диалектах добавлена ​​структура и объектно-ориентированные расширения. Microsoft Visual Basic до сих пор широко используется и обеспечивает графический интерфейс пользователя . [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;}[e]
  • Локальные переменные, объявленные без staticпрефикса, включая переменные формальных параметров, [62] называются автоматическими переменными [59] и сохраняются в стеке. [58] Они видны внутри функции или блока и теряют свою область действия при выходе из функции или блока.
  • C предоставляет malloc()библиотечную функцию для выделения динамической памяти. [64] Заполнение кучи данными является дополнительной функцией копирования. Переменные, хранящиеся в куче, экономично передаются функциям с помощью указателей. Без указателей весь блок данных пришлось бы передавать в функцию через стек.

С++

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

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

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

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

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

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

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

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

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

//grade.cpp // --------- #include "grade.h" GRADE :: GRADE ( const char Letter ) { // Ссылаемся на объект, используя ключевое слово 'this'. // ---------------------------------------------- этот - > буква = буква ;          // Это временная сплоченность // ------------------------- this -> numeric = Grade_numeric ( Letter ); }      int GRADE :: Grade_numeric ( const char Letter ) { if ( ( Letter == 'A' || Letter == 'a' ) ) return 4 ; else if ( ( буква == 'B' || буква == 'b' ) ) return 3 ; else if ( ( буква == 'C' || буква == 'c' ) ) return 2 ; else if ( ( буква == 'D' || буква == 'd' ) ) return 1 ; else if ( ( буква == 'F' || буква == 'f' ) ) return 0 ; иначе вернуть -1 ; }                                                                                  

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

// person.h // -------- #ifndef PERSON_H #define PERSON_Hкласс PERSON { public : PERSON ( 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 : public PERSON { public : STUDENT ( const char * name ); ОЦЕНКА * оценка ; }; #endif            

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

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

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

// Student_dvr.cpp // --------------- #include <iostream> #include "student.h"  int main ( void ) { СТУДЕНТ * студент = новый СТУДЕНТ ( «Студент» ); студент -> оценка = новая GRADE ( 'a' );                 std :: cout // Обратите внимание, что студент наследует имя ЧЕЛОВЕКА << студент -> имя << ": Числовая оценка = " << студент -> оценка -> числовая << " \n " ; вернуть 0 ; }           

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

# makefile # -------- все : Student_dvr очистить :  rm  Student_dvr  *.oстудент_двр : студент_двр . уровень cpp . о студент . о человек . o c++ Student_dvr.cpp Grade.o Student.o Person.o -o Student_dvr           Grade.o : Оценка . оценка cpp . ч С++ -c ранг.cpp     студент.о : студент . студент ЦПП . ч С++ -c студент.cpp     person.o : человек . cpp человек . ч С++ -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))

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

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

МЛ

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

fun  times_10 ( n  :  int )  :  int  =  10  *  n ;

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

раз_10 2

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

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

Пролог

Пролог (1972) означает «Программирование в ЛОГИКЕ». Это язык логического программирования , основанный на формальной логике . Язык был разработан Аленом Кольмерауэром и Филиппом Русселем в Марселе, Франция. Это реализация метода выборочного линейного определенного предложения , впервые предложенного Робертом Ковальски и другими в Эдинбургском университете . [89]

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

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

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

Съест ли Том Джерри?
?-  есть ( том , Джерри ). истинный

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

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

Вот подробный пример: [90]

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

billows_fire ( X )  :-  is_a_dragon ( X ).

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

billows_fire ( X )  : -  is_a_creature ( X ),  is_a_parent_of ( Y , X ),  billows_fire ( Y ).

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

 is_a_parent_of ( X ,  Y ): -  is_the_mother_of ( X ,  Y ). is_a_parent_of ( X ,  Y ): -  is_the_father_of ( X ,  Y ).

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

is_a_creature ( X )  :-  is_a_dragon ( X ).

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

is_a_dragon ( норберта ).  is_a_creature ( слойка ). is_the_mother_of ( норберта ,  слойка ).

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

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

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

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

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

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

X  =  норберта X  =  слойка

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

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

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

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

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

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

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

/*grade.c */ /* ------- */ #include "grade.h" GRADE * grade_new ( символьная буква ) { GRADE * grade ;       /* Выделение динамической памяти */ /* -------------------- */ if ( ! ( grade = calloc ( 1 , sizeof ( GRADE ) ) ) ) { fprintf ( stderr , "ОШИБКА в %s/%s/%d: calloc() вернул пустое значение. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); выход ( 1 ); }                            оценка -> буква = буква ; возвратный балл ; }    intgrade_numeric ( символьная буква ) { if ( ( буква == 'A' || буква == ' a' ) ) return 4 ; else if ( ( буква == 'B' || буква == 'b' ) ) return 3 ; else if ( ( буква == 'C' || буква == 'c' ) ) return 2 ; else if ( ( буква == 'D' || буква == 'd' ) ) return 1 ; else if ( ( буква == 'F' || буква == 'f' ) ) return 0 ; иначе вернуть -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 * person_new ( char * name ) { PERSON * person ;       if ( ! ( 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 * person ;      ОЦЕНКА * оценка ; } СТУДЕНТ ;  /* Конструктор */ /* ----------- */ STUDENT * Student_new ( char * name ); #endif    

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

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

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

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

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

# makefile # -------- все : Student_dvr очистить :  rm  Student_dvr  *.oстудент_двр : студент_двр . класс в . о студент . о человек . o gcc Student_dvr.c Grade.o Student.o Person.o -o Student_dvr           Grade.o : Оценка . класс в . ч gcc -c класс.c     студент.о : студент . в, студент . ч gcc -c студент.c     person.o : человек . в человек . ч gcc -c человек.c     

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

Например:

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

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

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

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

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

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

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

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

Один из методов составления списка продукционных правил называется формой Бэкуса – Наура (BNF). [102] BNF описывает синтаксис языка и сам имеет синтаксис . Это рекурсивное определение является примером метаязыка . [96] Синтаксис BNF включает :

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Целью системного аналитика является предоставление нужной информации нужному человеку в нужное время. [107] Решающими факторами для достижения этой цели являются: [107]

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

Целевые затраты

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Связь

Уровни связи от худшего к лучшему таковы: [117]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Утилита

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

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

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

НЕ ворота
И-НЕ-ворота
НО-ворота
И ворота
ИЛИ ворота

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

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

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

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

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

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

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

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

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

Примечания

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

Рекомендации

  1. ^ «ISO/IEC 2382:2015». ИСО . 03.09.2020. Архивировано из оригинала 17 июня 2016 г. Проверено 26 мая 2022 г. [Программное обеспечение включает] все или часть программ, процедур, правил и связанной с ними документации системы обработки информации.
  2. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 7. ISBN 0-201-71012-9. Альтернативой компиляции исходной программы является использование интерпретатора. Интерпретатор может напрямую выполнять исходную программу[.]
  3. ^ Зильбершац, Авраам (1994). Концепции операционной системы, четвертое издание . Аддисон-Уэсли. п. 98. ИСБН 978-0-201-50480-4.
  4. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Прентис Холл. п. 32. ISBN 978-0-13-854662-5.
  5. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 7. ISBN 0-201-71012-9.
  6. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 30. ISBN 0-201-71012-9. Их намерением было создать язык, который был бы очень простым для изучения студентами[.]
  7. ^ abc Wilson, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 31. ISBN 0-201-71012-9.
  8. ^ abcdef Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 30. ISBN 0-201-71012-9.
  9. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 30. ISBN 0-201-71012-9. Идея заключалась в том, что студенты могут быть просто случайными пользователями или переходить от базового языка к более сложным и мощным языкам[.]
  10. ^ Аб Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера. Уокер и компания. п. 16. ISBN 978-0-8027-1348-3.
  11. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Прентис Холл. п. 14. ISBN 978-0-13-854662-5.
  12. ^ Бромли, Аллан Г. (1998). «Аналитическая машина Чарльза Бэббиджа, 1838 год» (PDF) . IEEE Анналы истории вычислений . 20 (4): 29–45. дои : 10.1109/85.728228. S2CID  2285332. Архивировано (PDF) из оригинала 4 марта 2016 г. Проверено 30 октября 2015 г.
  13. ^ аб Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Прентис Холл. п. 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. ИСБН 978-0-07-053744-6. Машины Тьюринга могут моделировать все вычисления, которые могут быть выполнены на вычислительной машине.
  16. ^ Линц, Питер (1990). Введение в формальные языки и автоматы . Округ Колумбия Хит и компания. п. 234. ИСБН 978-0-669-17342-0.
  17. ^ Линц, Питер (1990). Введение в формальные языки и автоматы . Округ Колумбия Хит и компания. п. 243. ИСБН 978-0-669-17342-0. [Все] распространенные математические функции, какими бы сложными они ни были, вычислимы по Тьюрингу.
  18. ^ abc Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера. Уокер и компания. п. 102. ИСБН 978-0-8027-1348-3.
  19. ^ Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера. Уокер и компания. п. 94. ИСБН 978-0-8027-1348-3.
  20. ^ Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера. Уокер и компания. п. 107. ИСБН 978-0-8027-1348-3.
  21. ^ Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера. Уокер и компания. п. 120. ИСБН 978-0-8027-1348-3.
  22. ^ Аб Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера. Уокер и компания. п. 118. ИСБН 978-0-8027-1348-3.
  23. ^ Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера. Уокер и компания. п. 119. ИСБН 978-0-8027-1348-3.
  24. ^ Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера. Уокер и компания. п. 123. ИСБН 978-0-8027-1348-3.
  25. ^ аб Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание . Прентис Холл. п. 21. ISBN 978-0-13-854662-5.
  26. ^ Аб Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 27. ISBN 0-201-71012-9.
  27. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 29. ISBN 0-201-71012-9.
  28. ^ abc Зильбершац, Авраам (1994). Концепции операционной системы, четвертое издание . Аддисон-Уэсли. п. 6. ISBN 978-0-201-50480-4.
  29. ^ abcdefghi «Билл Пентц - Немного предыстории: послевоенный марш к СБИС». Компьютерный музей Диджибарн. Август 2008 г. Архивировано из оригинала 21 марта 2022 г. Проверено 31 января 2022 г.
  30. ^ ab В эпоху цифровых технологий: исследовательские лаборатории, стартапы и рост MOS. Издательство Университета Джонса Хопкинса. 2002. ISBN 9780801886393. Архивировано из оригинала 2 февраля 2023 года . Проверено 3 февраля 2022 г.
  31. ^ Чаламала, Бабу (2017). «Производство кремниевых материалов для микроэлектроники и солнечных фотоэлектрических систем». Сандианские национальные лаборатории. Архивировано из оригинала 23 марта 2023 года . Проверено 8 февраля 2022 г.
  32. ^ «Изготовление микросхем. Изготовление базовой пластины». Британника. Архивировано из оригинала 8 февраля 2022 года . Проверено 8 февраля 2022 г.
  33. ^ «Введение в NMOS и PMOS транзисторы». Любой кремний. 4 ноября 2021 года. Архивировано из оригинала 6 февраля 2022 года . Проверено 5 февраля 2022 г.
  34. ^ «Определение микропроцессора» . Британника. Архивировано из оригинала 1 апреля 2022 года . Проверено 1 апреля 2022 г.
  35. ^ «Зал славы чипов: микропроцессор Intel 4004» . Институт инженеров электротехники и электроники. 2 июля 2018 г. Архивировано из оригинала 7 февраля 2022 г. Проверено 31 января 2022 г.
  36. ^ «Революция 360» (PDF) . Отец, сын и компания, 1990 г. Архивировано (PDF) из оригинала 10 октября 2022 г. Проверено 5 февраля 2022 г.
  37. ^ ab «Внутри давно потерянного первого в мире микрокомпьютера». с/нет. 8 января 2010 г. Архивировано из оригинала 1 февраля 2022 г. Проверено 31 января 2022 г.
  38. ^ «Билл Гейтс, Microsoft и персональный компьютер IBM». ИнфоМир. 23 августа 1982 года. Архивировано из оригинала 18 февраля 2023 года . Проверено 1 февраля 2022 г.
  39. ^ аб Страуструп, Бьярн (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 10. ISBN 978-0-321-56384-2.
  40. ^ abc Страуструп, Бьярн (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 11. ISBN 978-0-321-56384-2.
  41. ^ ab Stair, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 159. ИСБН 0-619-06489-7.
  42. ^ аб Линц, Питер (1990). Введение в формальные языки и автоматы . Округ Колумбия Хит и компания. п. 2. ISBN 978-0-669-17342-0.
  43. ^ Вайс, Марк Аллен (1994). Структуры данных и алгоритмический анализ в C++ . Бенджамин/Каммингс Паблишинг Компани, Инк. с. 29. ISBN 0-8053-5443-3.
  44. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Прентис Холл. п. 17. ISBN 978-0-13-854662-5.
  45. ^ abcdef Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 160. ИСБН 0-619-06489-7.
  46. ^ abc Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Прентис Холл. п. 399. ИСБН 978-0-13-854662-5.
  47. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Прентис Холл. п. 400. ИСБН 978-0-13-854662-5.
  48. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Прентис Холл. п. 398. ИСБН 978-0-13-854662-5.
  49. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 26. ISBN 0-201-71012-9.
  50. ^ abcd Wilson, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 37. ИСБН 0-201-71012-9.
  51. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 160. ИСБН 0-619-06489-7. В языках программирования третьего поколения и более высокого уровня каждое выражение языка преобразуется в несколько инструкций на машинном языке.
  52. ^ Уилсон, Лесли Б. (1993). Языки сравнительного программирования, второе издание . Аддисон-Уэсли. п. 75. ИСБН 978-0-201-56885-1.
  53. ^ Страуструп, Бьярн (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 40. ИСБН 978-0-321-56384-2.
  54. ^ Аб Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 16. ISBN 0-201-71012-9.
  55. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 24. ISBN 0-201-71012-9.
  56. ^ Аб Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 25. ISBN 0-201-71012-9.
  57. ^ abcd Wilson, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 19. ISBN 0-201-71012-9.
  58. ^ abcd «Схема памяти программ на C». 12 сентября 2011 г. Архивировано из оригинала 6 ноября 2021 г. Проверено 6 ноября 2021 г.
  59. ^ аб Керниган, Брайан В.; Ричи, Деннис М. (1988). Язык программирования C, второе издание . Прентис Холл. п. 31. ISBN 0-13-110362-8.
  60. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 128. ИСБН 0-201-71012-9.
  61. ^ abc Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 121. ИСБН 978-1-59327-220-3.
  62. ^ Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 122. ИСБН 978-1-59327-220-3.
  63. ^ Керниган, Брайан В.; Ричи, Деннис М. (1988). Язык программирования C, второе издание . Прентис Холл. п. 185. ИСБН 0-13-110362-8.
  64. ^ аб Керниган, Брайан В.; Ричи, Деннис М. (1988). Язык программирования C, второе издание . Прентис Холл. п. 187. ИСБН 0-13-110362-8.
  65. ^ abc Wilson, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 38. ISBN 0-201-71012-9.
  66. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 193. ИСБН 0-201-71012-9.
  67. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 39. ИСБН 0-201-71012-9.
  68. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 35. ISBN 0-201-71012-9.
  69. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 192. ИСБН 0-201-71012-9.
  70. ^ Страуструп, Бьярн (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 22. ISBN 978-0-321-56384-2.
  71. ^ Страуструп, Бьярн (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 21. ISBN 978-0-321-56384-2.
  72. ^ Страуструп, Бьярн (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 49. ИСБН 978-0-321-56384-2.
  73. ^ Аб Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 218. ИСБН 0-201-71012-9.
  74. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 217. ИСБН 0-201-71012-9.
  75. ^ Вайс, Марк Аллен (1994). Структуры данных и алгоритмический анализ в C++ . Бенджамин/Каммингс Паблишинг Компани, Инк. с. 103. ИСБН 0-8053-5443-3. При вызове функции необходимо сохранить всю важную информацию, такую ​​как значения регистров (соответствующие именам переменных) и адрес возврата (который можно получить из счетчика программы)[.] ... Когда функция захочет чтобы вернуться, он... восстанавливает все регистры. Затем он совершает обратный прыжок. Очевидно, что всю эту работу можно выполнить с помощью стека, и именно это происходит практически в каждом языке программирования, реализующем рекурсию.
  76. ^ abc Wilson, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 230. ИСБН 0-201-71012-9.
  77. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 240. ИСБН 0-201-71012-9.
  78. ^ abc Wilson, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 241. ИСБН 0-201-71012-9.
  79. ^ Джонс, Робин; Мейнард, Клайв; Стюарт, Ян (6 декабря 2012 г.). Искусство программирования на Лиспе . Springer Science & Business Media. п. 2. ISBN 9781447117193.
  80. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 220. ИСБН 0-201-71012-9.
  81. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 221. ИСБН 0-201-71012-9.
  82. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 229. ИСБН 0-201-71012-9.
  83. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 227. ИСБН 0-201-71012-9.
  84. ^ Аб Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 222. ИСБН 0-201-71012-9.
  85. ^ Гордон, Майкл Дж. К. (1996). «От LCF до HOL: краткая история». Архивировано из оригинала 5 сентября 2016 г. Проверено 30 октября 2021 г.
  86. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 233. ИСБН 0-201-71012-9.
  87. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 235. ИСБН 0-201-71012-9.
  88. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 55. ИСБН 0-201-71012-9.
  89. ^ Кольмерауэр, А.; Руссель, П. (1992). «Рождение Пролога» (PDF) . Уведомления ACM SIGPLAN . Ассоциация вычислительной техники. 28 (3): 5. дои : 10.1145/155360.155362.
  90. ^ Ковальски Р., Давила Дж., Сартор Г. и Калехо М., 2023. Логический английский для права и образования. В Прологе: Следующие 50 лет (стр. 287–299). Чам: Springer Nature, Швейцария.
  91. ^ Аб Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 35. ISBN 0-201-71012-9. Simula была основана на Algol 60 с одним очень важным дополнением — концепцией класса. ... Основная идея заключалась в том, что данные (или структура данных) и выполняемые над ними операции принадлежат друг другу[.]
  92. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 39. ИСБН 0-201-71012-9. Первоначально было разработано большое количество экспериментальных языков, многие из которых сочетали в себе объектно-ориентированное и функциональное программирование.
  93. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 284. ИСБН 0-256-08515-3. Хотя это правда, что ООД [(объектно-ориентированное проектирование)] как таковое не поддерживается большинством популярных языков, можно использовать большое подмножество ООД.
  94. ^ Вайс, Марк Аллен (1994). Структуры данных и алгоритмический анализ в C++ . Бенджамин/Каммингс Паблишинг Компани, Инк. с. 57. ИСБН 0-8053-5443-3.
  95. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 285. ИСБН 0-256-08515-3.
  96. ^ abc Wilson, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 290. ИСБН 0-201-71012-9.
  97. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 78. ИСБН 0-201-71012-9. Основными компонентами императивного языка являются декларации, выражения и операторы.
  98. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 294. ИСБН 0-201-71012-9.
  99. ^ Розен, Кеннет Х. (1991). Дискретная математика и ее приложения. McGraw-Hill, Inc. с. 615. ИСБН 978-0-07-053744-6.
  100. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 291. ИСБН 0-201-71012-9.
  101. ^ Розен, Кеннет Х. (1991). Дискретная математика и ее приложения. McGraw-Hill, Inc. с. 616. ИСБН 978-0-07-053744-6.
  102. ^ Розен, Кеннет Х. (1991). Дискретная математика и ее приложения. McGraw-Hill, Inc. с. 623. ИСБН 978-0-07-053744-6.
  103. ^ Розен, Кеннет Х. (1991). Дискретная математика и ее приложения. McGraw-Hill, Inc. с. 624. ИСБН 978-0-07-053744-6.
  104. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 297. ИСБН 0-201-71012-9.
  105. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. Предисловие. ISBN 0-256-08515-3.
  106. ^ abc Stair, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 507. ИСБН 0-619-06489-7.
  107. ^ ab Stair, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 513. ИСБН 0-619-06489-7.
  108. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 514. ИСБН 0-619-06489-7.
  109. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 516. ИСБН 0-619-06489-7.
  110. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 8. ISBN 0-256-08515-3.
  111. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 517. ИСБН 0-619-06489-7.
  112. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 345. ИСБН 0-256-08515-3.
  113. ^ abcd Schach, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 319. ИСБН 0-256-08515-3.
  114. ^ аб Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 331. ИСБН 0-256-08515-3.
  115. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 216. ИСБН 0-256-08515-3.
  116. ^ abc Schach, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 219. ИСБН 0-256-08515-3.
  117. ^ аб Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 226. ИСБН 0-256-08515-3.
  118. ^ аб Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 220. ИСБН 0-256-08515-3.
  119. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 258. ИСБН 0-256-08515-3.
  120. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 259. ИСБН 0-256-08515-3.
  121. ^ abc Зильбершац, Авраам (1994). Концепции операционной системы, четвертое издание . Аддисон-Уэсли. п. 1. ISBN 978-0-201-50480-4.
  122. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 147. ИСБН 0-619-06489-7. Ключом к раскрытию потенциала любой компьютерной системы является прикладное программное обеспечение.
  123. ^ abcd Stair, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 147. ИСБН 0-619-06489-7.
  124. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 147. ИСБН 0-619-06489-7. [] Сторонняя фирма-разработчик программного обеспечения, часто называемая поставщиком программного обеспечения с добавленной стоимостью, может разрабатывать или модифицировать программное обеспечение для удовлетворения потребностей конкретной отрасли или компании.
  125. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 148. ИСБН 0-619-06489-7. Рубрика: Собственное программное обеспечение; Подзаголовок: Преимущества; Цитата: Вы можете получить именно то, что вам нужно, с точки зрения функций, отчетов и так далее.
  126. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 148. ИСБН 0-619-06489-7. Рубрика: Собственное программное обеспечение; Подзаголовок: Преимущества; Цитата: Участие в разработке обеспечивает дополнительный уровень контроля над результатами.
  127. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 147. ИСБН 0-619-06489-7. Рубрика: Собственное программное обеспечение; Подзаголовок: Преимущества; Цитата: Появляется больше гибкости при внесении изменений, которые могут потребоваться для противодействия новой инициативе одного из ваших конкурентов или для удовлетворения новых требований поставщиков и/или клиентов.
  128. ^ abcd Stair, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 149. ИСБН 0-619-06489-7.
  129. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание. Прентис Холл. п. 11. ISBN 978-0-13-854662-5.
  130. ^ Аб Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 21. ISBN 978-1-59327-220-3.
  131. ^ abcde Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 22. ISBN 978-1-59327-220-3.
  132. ^ abc Бах, Морис Дж. (1986). Проект операционной системы UNIX . Prentice-Hall, Inc. с. 152. ИСБН 0-13-201799-7.
  133. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 443. ИСБН 978-0-13-291652-3.
  134. ^ Лакамера, Даниэле (2018). Архитектура встроенных систем . Пакет. п. 8. ISBN 978-1-78883-250-2.
  135. ^ Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 23. ISBN 978-1-59327-220-3.
  136. ^ Керниган, Брайан В. (1984). Среда программирования Unix . Прентис Холл. п. 201. ИСБН 0-13-937699-2.
  137. ^ Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 187. ИСБН 978-1-59327-220-3.
  138. ^ Хэвиленд, Кейт (1987). Системное программирование Unix . Издательство Аддисон-Уэсли. п. 121. ИСБН 0-201-12919-1.
  139. ^ abc Stair, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 145. ИСБН 0-619-06489-7.
  140. ^ abc Stair, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 146. ИСБН 0-619-06489-7.
  141. ^ аб Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 6. ISBN 978-0-13-291652-3.
  142. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 243. ИСБН 978-0-13-291652-3.
  143. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 147. ИСБН 978-0-13-291652-3.
  144. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 148. ИСБН 978-0-13-291652-3.
  145. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 253. ИСБН 978-0-13-291652-3.
  146. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 255. ИСБН 978-0-13-291652-3.
  147. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 161. ИСБН 978-0-13-291652-3.
  148. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 166. ИСБН 978-0-13-291652-3.
  149. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 249. ИСБН 978-0-13-291652-3.
  150. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 111. ИСБН 978-0-13-291652-3.