Jump to content

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

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

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

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

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

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

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

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

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

10 INPUT "How many numbers to average?", A
20 FOR I = 1 TO A
30 INPUT "Enter number:", B
40 LET C = C + B
50 NEXT I
60 LET D = C/A
70 PRINT "The average is", D
80 END

Как только механика базового компьютерного программирования будет изучена, станут доступны более сложные и мощные языки для создания больших компьютерных систем. [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). 2 ) и потреблял 650 долларов в час ( в валюте 1940-х годов ) электроэнергии в режиме простоя. [18] У него было 20 по основанию 10 аккумуляторов . Программирование ENIAC заняло до двух месяцев. [18] Три функциональные таблицы находились на колесиках, и их нужно было перекатывать до фиксированных функциональных панелей. Функциональные таблицы были подключены к функциональным панелям путем подключения к разъемным панелям тяжелых черных кабелей . В каждой функциональной таблице было 728 вращающихся ручек. Программирование ENIAC также включало настройку некоторых из 3000 переключателей. Отладка программы заняла неделю. [19] Он работал с 1947 по 1955 год на Абердинском полигоне , рассчитывая параметры водородной бомбы, прогнозируя погодные условия и создавая таблицы стрельбы для наведения артиллерийских орудий. [20]

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

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

Вместо того, чтобы подключать шнуры и поворачивать переключатели, компьютер с хранимой программой загружает свои инструкции в память точно так же, как он загружает в память свои данные. [21] В результате компьютер можно было быстро программировать и выполнять вычисления с очень высокой скоростью. [22] Преспер Эккерт и Джон Мочли построили ЭНИАК. Два инженера представили концепцию хранимой программы в трехстраничной записке, датированной февралем 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] Технология стала известна как Programmable ROM . В 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] У него был цветной дисплей и клавиатура, объединенные в одну консоль. Дисковая операционная система была запрограммирована с использованием базового языка ассемблера IBM (BAL) . Приложение медицинских записей было запрограммировано с использованием интерпретатора BASIC . [29] Однако компьютер оказался эволюционным тупиком, поскольку был чрезвычайно дорогим. Кроме того, он был построен в лаборатории государственного университета для определенной цели. [37] Тем не менее, проект способствовал развитию Intel 8080 (1974) набора команд . [29]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[ редактировать ]
Монитор машинного языка на W65C816S микропроцессоре

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

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

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

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

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

  • Объявление . вводит имя переменной в компьютерную программу и присваивает ее типу данных [53] - например: var x: integer;
  • Выражение возвращает значение , например: 2 + 2 дает 4
  • Оператор , может присваивать выражение переменной или использовать значение переменной для изменения потока управления программой например : x := 2 + 2; if x = 4 then do_something();

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

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

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

Однако поставщики, не принадлежащие 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;}[г]
  • Область стека — это непрерывный блок памяти, расположенный рядом с верхним адресом памяти. [61] Переменные, помещенные в стек, заполняются сверху вниз. [час] [61] Указатель стека специального назначения — это регистр , который отслеживает последний заполненный адрес памяти. [61] Переменные помещаются в стек с помощью инструкции PUSH языка ассемблера . Поэтому адреса этих переменных устанавливаются во время выполнения . Метод, позволяющий переменным стека потерять свою область видимости, заключается в использовании инструкции POP.
  • Локальные переменные, объявленные без static префикс, включая переменные формальных параметров, [62] называются автоматическими переменными [59] и сохраняются в стеке. [58] Они видны внутри функции или блока и теряют свою область действия при выходе из функции или блока.
  • Область кучи расположена под стеком. [58] Он заполняется снизу вверх. Операционная система управляет кучей, используя указатель кучи и список выделенных блоков памяти. [63] Как и в стеке, адреса переменных кучи устанавливаются во время выполнения. Ошибка нехватки памяти возникает, когда указатель кучи и указатель стека встречаются.
  • C обеспечивает malloc() библиотечная функция для выделения динамической памяти. [я] [64] Заполнение кучи данными — это дополнительная функция копирования. [Дж] Переменные, хранящиеся в куче, экономично передаются функциям с помощью указателей. Без указателей весь блок данных пришлось бы передавать в функцию через стек.

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

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

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

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

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

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

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

// Used to allow multiple source files to include
// this header file without duplication errors.
// ----------------------------------------------
#ifndef GRADE_H
#define GRADE_H

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

clean:
    rm student_dvr *.o

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

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

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

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

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

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

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

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

times_10(x) = 10 * x

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

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]

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

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

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

times_10 2

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

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

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

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

cat(tom).                        % tom is a cat
mouse(jerry).                    % jerry is a mouse

animal(X) :- cat(X).             % each cat is an animal
animal(X) :- mouse(X).           % each mouse is an animal

big(X)   :- cat(X).              % each cat is big
small(X) :- mouse(X).            % each mouse is small

eat(X,Y) :- mouse(X), cheese(Y). % each mouse eats each cheese
eat(X,Y) :- big(X),   small(Y).  % each big animal eats each small animal

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

Съест ли Том Джерри?
?- eat(tom,jerry).
true

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

numeric_grade('A', 4).
numeric_grade('B', 3).
numeric_grade('C', 2).
numeric_grade('D', 1).
numeric_grade('F', 0).
numeric_grade(X, -1) :- not X = 'A', not X = 'B', not X = 'C', not X = 'D', not X = 'F'.
grade('The Student', 'A').
?- grade('The Student', X), numeric_grade(X, Y).
X = 'A',
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(norberta).
is_a_creature(puff).
is_the_mother_of(norberta, puff).

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

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

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

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

 ?- billows_fire(X).

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

X = norberta
X = puff

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

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

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

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

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

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

/* Used to allow multiple source files to include */
/* this header file without duplication errors.   */
/* ---------------------------------------------- */
#ifndef GRADE_H
#define GRADE_H

typedef struct
{
    char letter;
} GRADE;

/* Constructor */
/* ----------- */
GRADE *grade_new( char letter );

int grade_numeric( char letter );
#endif

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

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

/* grade.c */
/* ------- */
#include "grade.h"

GRADE *grade_new( char letter )
{
    GRADE *grade;

    /* Allocate heap memory */
    /* -------------------- */
    if ( ! ( grade = calloc( 1, sizeof ( GRADE ) ) ) )
    {
        fprintf(stderr,
                "ERROR in %s/%s/%d: calloc() returned empty.\n",
                __FILE__,
                __FUNCTION__,
                __LINE__ );
        exit( 1 );
    }

    grade->letter = letter;
    return grade;
}

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_H

typedef struct
{
    char *name;
} PERSON;

/* Constructor */
/* ----------- */
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,
                "ERROR in %s/%s/%d: calloc() returned empty.\n",
                __FILE__,
                __FUNCTION__,
                __LINE__ );
        exit( 1 );
    }

    person->name = name;
    return person;
}

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

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

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

typedef struct
{
    /* A STUDENT is a subset of PERSON. */
    /* -------------------------------- */
    PERSON *person;

    GRADE *grade;
} STUDENT;

/* Constructor */
/* ----------- */
STUDENT *student_new( char *name );
#endif

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

/* student.c */
/* --------- */
#include "student.h"
#include "person.h"

STUDENT *student_new( char *name )
{
    STUDENT *student;

    if ( ! ( student = calloc( 1, sizeof ( STUDENT ) ) ) )
    {
        fprintf(stderr,
                "ERROR in %s/%s/%d: calloc() returned empty.\n",
                __FILE__,
                __FUNCTION__,
                __LINE__ );
        exit( 1 );
    }

    /* Execute the constructor of the PERSON superclass. */
    /* ------------------------------------------------- */
    student->person = person_new( name );
    return student;
}

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

/* student_dvr.c */
/* ------------- */
#include <stdio.h>
#include "student.h"

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

    printf( "%s: Numeric grade = %d\n",
            /* Whereas a subset exists, inheritance does not. */
            student->person->name,
            /* Functional programming is executing functions just-in-time (JIT) */
            grade_numeric( student->grade->letter ) );

	return 0;
}

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

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

clean:
    rm student_dvr *.o

student_dvr: student_dvr.c grade.o student.o person.o
    gcc student_dvr.c grade.o student.o person.o -o student_dvr

grade.o: grade.c grade.h
    gcc -c grade.c

student.o: student.c student.h
    gcc -c student.c

person.o: person.c person.h
    gcc -c person.c

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

  • Определите объекты. Скорее всего это будут существительные.
  • Определите атрибуты каждого объекта. Что помогает описать объект?
  • Определите действия каждого объекта. Скорее всего это будут глаголы.
  • Определите связи между объектами. Скорее всего это будут глаголы.

Например:

  • Человек – это человек, идентифицируемый по имени.
  • Оценка – это достижение, обозначаемое буквой.
  • Студент – это человек, получивший оценку.

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

[ редактировать ]
Продукционные правила состоят из набора терминальных и нетерминальных.

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

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

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

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

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

  • предложение
  • существительная-фраза глагол-фраза
  • артикль прилагательное существительное глагол-фраза
  • прилагательное существительное глагол -фраза
  • большое существительное - глагол-фраза
  • глагол «большой кот» -фраза
  • глагол « большой кот» - имя-фраза
  • большая кошка ест существительное
  • большой кот ест артикул прилагательное существительное
  • большой кот ест прилагательное существительное
  • большой кот ест маленькое существительное
  • большой кот ест маленькую мышку

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

  • маленькая мышь ест большого кота

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

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

  • ::= что переводится как состоит из [n] , когда нетерминал находится справа от него. Это переводится как « когда терминал находится справа».
  • | что переводится как или .
  • < и > которые окружают нетерминалы .

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

<sentence> ::= <noun-phrase><verb-phrase>
<noun-phrase> ::= <article><adjective><noun>
<verb-phrase> ::= <verb><noun-phrase>
<article> ::= the
<adjective> ::= big | small
<noun> ::= cat | mouse
<verb> ::= eats

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

<signed-integer> ::= <sign><integer>
<sign> ::= + | -
<integer> ::= <digit> | <digit><integer>
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

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

<integer> ::= <digit> | <digit><integer>

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

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

<integer> ::= <digit> | <digit><integer>
<digit> ::= 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]

  • Совпадающая сплоченность : модуль имеет случайную сплоченность, если он выполняет несколько функций, причем эти функции совершенно не связаны. Например, function read_sales_record_print_next_line_convert_to_float(). На практике случайная сплоченность возникает, если руководство навязывает глупые правила. Например: «Каждый модуль будет иметь от 35 до 50 исполняемых операторов». [119]
  • Логическая связность. Модуль обладает логической связностью, если ему доступен ряд функций, но выполняется только одна из них. Например, function perform_arithmetic( perform_addition, a, b ).
  • Временная сплоченность : модуль имеет временную сплоченность, если он выполняет функции, связанные со временем. Один пример, function initialize_variables_and_open_files(). Другой пример, stage_one(), stage_two(), ...
  • Процедурная связность . Модуль обладает процедурной связностью, если он выполняет несколько слабо связанных функций. Например, function read_part_number_update_employee_record().
  • Коммуникационная сплоченность . Модуль обладает коммуникационной сплоченностью, если он выполняет несколько тесно связанных функций. Например, function read_part_number_update_sales_record().
  • Информационная связность . Модуль обладает информационной связностью, если он выполняет несколько функций, но каждая функция имеет свои собственные точки входа и выхода. Более того, функции имеют одну и ту же структуру данных. На этом уровне работают объектно-ориентированные классы.
  • Функциональная сплоченность : модуль обладает функциональной сплоченностью, если он достигает единой цели, работая только с локальными переменными. Более того, его можно повторно использовать в других контекстах.

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

  • Связь контента : модуль имеет связь контента, если он изменяет локальную переменную другой функции. В COBOL это делалось с помощью альтер -глагола.
  • Общая связь : модуль имеет общую связь, если он изменяет глобальную переменную.
  • Связь управления : Модуль имеет связь управления, если другой модуль может изменить свой поток управления . Например, perform_arithmetic( perform_addition, a, b ). Вместо этого контроль должен осуществляться за составом возвращаемого объекта.
  • Stamp Coupling : модуль имеет штампованную связь, если элемент структуры данных, переданный в качестве параметра, изменен. На этом уровне работают объектно-ориентированные классы.
  • Связь данных : модуль имеет связь данных, если все его входные параметры необходимы и ни один из них не изменяется. Более того, результат функции возвращается как один объект.

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

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

Анализ потока данных — это метод проектирования, используемый для достижения модулей функциональной связности и связи данных . [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 и множество таблиц для каждого процесса (pregion) — по одной для каждого запущенного процесса . [133] Эти таблицы составляют виртуальное адресное пространство . Таблица master-region используется для определения расположения ее содержимого в физической памяти . Таблицы прегионов позволяют каждому процессу иметь свою собственную прегион программы (текста), прегион данных и прегион стека.
  • Программа pregion хранит машинные инструкции. Поскольку машинные инструкции не меняются, область программы может использоваться многими процессами одного и того же исполняемого файла. [133]
  • Для экономии времени и памяти ядро ​​может загружать с диска только блоки инструкций выполнения, а не весь исполняемый файл целиком. [132]
  • Ядро отвечает за преобразование виртуальных адресов в физические адреса . Ядро может запросить данные у контроллера памяти и вместо этого получить ошибку страницы . [134] Если это так, ядро ​​обращается к блоку управления памятью , чтобы заполнить физическую область данных и преобразовать адрес. [135]
  • Ядро выделяет память из кучи по запросу процесса. [64] Когда процесс завершает работу с памятью, процесс может запросить ее освобождение . Если процесс завершается, не запрашивая освобождение всей выделенной памяти, ядро ​​выполняет сбор мусора , чтобы освободить память.
  • Ядро также гарантирует, что процесс обращается только к своей памяти, а не к памяти ядра или других процессов. [132]
  • Программа ядра должна выполнять управление файловой системой . [132] Ядро имеет инструкции для создания, получения, обновления и удаления файлов.
  • Программа ядра должна выполнять управление устройствами . [132] Ядро предоставляет программы для стандартизации и упрощения интерфейса мыши, клавиатуры, дисководов, принтеров и других устройств. Более того, ядро ​​должно разрешать доступ к устройству, если два процесса запрашивают его одновременно.
  • Программа ядра должна выполнять управление сетью . [136] Ядро передает и получает пакеты от имени процессов. Одной из ключевых услуг является поиск эффективного маршрута к целевой системе.
  • Программа ядра должна предоставлять функции системного уровня . программистам [137]
    • Программисты получают доступ к файлам через относительно простой интерфейс, который, в свою очередь, выполняет относительно сложный низкоуровневый интерфейс ввода-вывода. Интерфейс низкого уровня включает в себя создание файлов, файловые дескрипторы , поиск файлов, физическое чтение и физическую запись.
    • Программисты создают процессы с помощью относительно простого интерфейса, который, в свою очередь, выполняет относительно сложный низкоуровневый интерфейс.
    • Программисты выполняют арифметические операции с датой и временем через относительно простой интерфейс, который, в свою очередь, выполняет относительно сложный низкоуровневый интерфейс времени. [138]
  • Программа ядра должна обеспечивать канал связи между выполняющимися процессами. [139] Для большой программной системы может быть желательно спроектировать систему на более мелкие процессы. Процессы могут взаимодействовать друг с другом, отправляя и получая сигналы .

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

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

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

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

[ редактировать ]
НЕ ворота
И-НЕ-ворота
НО-ворота
И ворота
ИЛИ ворота

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

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

  • Наличие одного транзистора образует вентиль НЕ .
  • Последовательное соединение двух транзисторов образует вентиль И-НЕ .
  • Параллельное соединение двух транзисторов образует вентиль ИЛИ-НЕ .
  • Соединение вентиля НЕ с вентилем И-НЕ образует И. вентиль
  • Соединение вентиля НЕ с вентилем ИЛИ образует вентиль ИЛИ .

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

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

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

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

Инструкции по выполнению арифметических действий передаются через арифметико-логическое устройство (АЛУ). [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. ^ «ИСО/МЭК 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. ^ Перейти обратно: а б с Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 31. ISBN  0-201-71012-9 .
  8. ^ Перейти обратно: а б с д и ж Уилсон, Лесли Б. (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 года », Annals of the History of Computing , 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). Введение в формальные языки и автоматы . Округ Колумбия Хит и компания. п. 234. ИСБН  978-0-669-17342-0 .
  17. ^ Линц, Питер (1990). Введение в формальные языки и автоматы . Округ Колумбия Хит и компания. п. 243. ИСБН  978-0-669-17342-0 . [Все] распространенные математические функции, какими бы сложными они ни были, вычислимы по Тьюрингу.
  18. ^ Перейти обратно: а б с Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера . Уокер и компания. п. 102 . ISBN  978-0-8027-1348-3 .
  19. ^ Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера . Уокер и компания. п. 94 . ISBN  978-0-8027-1348-3 .
  20. ^ Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера . Уокер и компания. п. 107 . ISBN  978-0-8027-1348-3 .
  21. ^ Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера . Уокер и компания. п. 120 . ISBN  978-0-8027-1348-3 .
  22. ^ Перейти обратно: а б Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера . Уокер и компания. п. 118 . ISBN  978-0-8027-1348-3 .
  23. ^ Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера . Уокер и компания. п. 119 . ISBN  978-0-8027-1348-3 .
  24. ^ Маккартни, Скотт (1999). ЭНИАК – Триумфы и трагедии первого в мире компьютера . Уокер и компания. п. 123 . ISBN  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. ^ Перейти обратно: а б с Зильбершац, Авраам (1994). Концепции операционной системы, четвертое издание . Аддисон-Уэсли. п. 6. ISBN  978-0-201-50480-4 .
  29. ^ Перейти обратно: а б с д и ж г час я «Билл Пентц — Немного предыстории: послевоенный марш к СБИС» . Компьютерный музей Диджибарн. Август 2008 г. Архивировано из оригинала 21 марта 2022 г. Проверено 31 января 2022 г.
  30. ^ Перейти обратно: а б В эпоху цифровых технологий: исследовательские лаборатории, стартапы и рост 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. ^ Перейти обратно: а б «Внутри давно потерянного первого в мире микрокомпьютера» . с/нет. 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. ^ Перейти обратно: а б с Страуструп, Бьярне (2013). Язык программирования C++, четвертое издание . Аддисон-Уэсли. п. 11. ISBN  978-0-321-56384-2 .
  41. ^ Перейти обратно: а б Лестница, Ральф М. (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. ^ Перейти обратно: а б с д и ж Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 160. ИСБН  0-619-06489-7 .
  46. ^ Перейти обратно: а б с Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание . Прентис Холл. п. 399 . ISBN  978-0-13-854662-5 .
  47. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание . Прентис Холл. п. 400 . ISBN  978-0-13-854662-5 .
  48. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание . Прентис Холл. п. 398 . ISBN  978-0-13-854662-5 .
  49. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 26. ISBN  0-201-71012-9 .
  50. ^ Перейти обратно: а б с д Уилсон, Лесли Б. (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. ^ Перейти обратно: а б с д Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 19. ISBN  0-201-71012-9 .
  58. ^ Перейти обратно: а б с д «Схема памяти программ на языке C» . 12 сентября 2011 г. Архивировано из оригинала 6 ноября 2021 г. Проверено 6 ноября 2021 г.
  59. ^ Перейти обратно: а б Керниган, Брайан В.; Ричи, Деннис М. (1988). Язык программирования C, второе издание . Прентис Холл. п. 31. ISBN  0-13-110362-8 .
  60. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 128. ИСБН  0-201-71012-9 .
  61. ^ Перейти обратно: а б с Керриск, Майкл (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. ^ Перейти обратно: а б с Уилсон, Лесли Б. (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. ^ Перейти обратно: а б с Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 230. ИСБН  0-201-71012-9 .
  77. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 240. ИСБН  0-201-71012-9 .
  78. ^ Перейти обратно: а б с Уилсон, Лесли Б. (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. doi : 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. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 290. ИСБН  0-201-71012-9 . Синтаксис (или грамматика) языка программирования описывает правильную форму, в которой могут быть написаны программы[.]
  97. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 78. ИСБН  0-201-71012-9 . Основными компонентами императивного языка являются объявления, выражения и операторы.
  98. ^ Перейти обратно: а б Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 290. ИСБН  0-201-71012-9 .
  99. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 294. ИСБН  0-201-71012-9 .
  100. ^ Розен, Кеннет Х. (1991). Дискретная математика и ее приложения . McGraw-Hill, Inc. с. 615 . ISBN  978-0-07-053744-6 .
  101. ^ Уилсон, Лесли Б. (2001). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 291. ИСБН  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). Языки сравнительного программирования, третье издание . Аддисон-Уэсли. п. 297. ИСБН  0-201-71012-9 .
  106. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. Предисловие. ISBN  0-256-08515-3 .
  107. ^ Перейти обратно: а б с Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 507. ИСБН  0-619-06489-7 .
  108. ^ Перейти обратно: а б Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 513. ИСБН  0-619-06489-7 .
  109. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 514. ИСБН  0-619-06489-7 .
  110. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 516. ИСБН  0-619-06489-7 .
  111. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 8. ISBN  0-256-08515-3 .
  112. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 517. ИСБН  0-619-06489-7 .
  113. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 345. ИСБН  0-256-08515-3 .
  114. ^ Перейти обратно: а б с д Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 319. ИСБН  0-256-08515-3 .
  115. ^ Перейти обратно: а б Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 331. ИСБН  0-256-08515-3 .
  116. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 216. ИСБН  0-256-08515-3 .
  117. ^ Перейти обратно: а б с Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 219. ИСБН  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. п. 258. ИСБН  0-256-08515-3 .
  121. ^ Шах, Стивен Р. (1990). Программная инженерия . Издательство Aksen Associates Incorporated. п. 259. ИСБН  0-256-08515-3 .
  122. ^ Перейти обратно: а б с Зильбершац, Авраам (1994). Концепции операционной системы, четвертое издание . Аддисон-Уэсли. п. 1. ISBN  978-0-201-50480-4 .
  123. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 147. ИСБН  0-619-06489-7 . Ключом к раскрытию потенциала любой компьютерной системы является прикладное программное обеспечение.
  124. ^ Перейти обратно: а б с д Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 147. ИСБН  0-619-06489-7 .
  125. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 147. ИСБН  0-619-06489-7 . [] Сторонняя фирма-разработчик программного обеспечения, часто называемая поставщиком программного обеспечения с добавленной стоимостью, может разрабатывать или модифицировать программное обеспечение для удовлетворения потребностей конкретной отрасли или компании.
  126. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 148. ИСБН  0-619-06489-7 . Рубрика: Собственное программное обеспечение; Подзаголовок: Преимущества; Цитата: Вы можете получить именно то, что вам нужно, с точки зрения функций, отчетов и так далее.
  127. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 148. ИСБН  0-619-06489-7 . Рубрика: Собственное программное обеспечение; Подзаголовок: Преимущества; Цитата: Участие в разработке обеспечивает дополнительный уровень контроля над результатами.
  128. ^ Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 147. ИСБН  0-619-06489-7 . Рубрика: Собственное программное обеспечение; Подзаголовок: Преимущества; Цитата: Появляется больше гибкости при внесении изменений, которые могут потребоваться для противодействия новой инициативе одного из ваших конкурентов или для удовлетворения новых требований поставщиков и/или клиентов.
  129. ^ Перейти обратно: а б с д Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 149. ИСБН  0-619-06489-7 .
  130. ^ Таненбаум, Эндрю С. (1990). Структурированная компьютерная организация, третье издание . Прентис Холл. п. 11 . ISBN  978-0-13-854662-5 .
  131. ^ Перейти обратно: а б Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 21. ISBN  978-1-59327-220-3 .
  132. ^ Перейти обратно: а б с д и Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 22. ISBN  978-1-59327-220-3 .
  133. ^ Перейти обратно: а б с Бах, Морис Дж. (1986). Проект операционной системы UNIX . Прентис-Холл, Инк. 152. ИСБН  0-13-201799-7 .
  134. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 443. ИСБН  978-0-13-291652-3 .
  135. ^ Камера, Даниэле (2018). Архитектура встроенных систем . Пакет. п. 8. ISBN  978-1-78883-250-2 .
  136. ^ Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 23. ISBN  978-1-59327-220-3 .
  137. ^ Керниган, Брайан В. (1984). Среда программирования Unix . Прентис Холл. п. 201. ИСБН  0-13-937699-2 .
  138. ^ Керриск, Майкл (2010). Программный интерфейс Linux . Нет крахмального пресса. п. 187. ИСБН  978-1-59327-220-3 .
  139. ^ Хэвиленд, Кейт (1987). Системное программирование Unix . Издательство Аддисон-Уэсли. п. 121. ИСБН  0-201-12919-1 .
  140. ^ Перейти обратно: а б с Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 145. ИСБН  0-619-06489-7 .
  141. ^ Перейти обратно: а б с Лестница, Ральф М. (2003). Принципы информационных систем, шестое издание . Томсон. п. 146. ИСБН  0-619-06489-7 .
  142. ^ Перейти обратно: а б Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 6. ISBN  978-0-13-291652-3 .
  143. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 243. ИСБН  978-0-13-291652-3 .
  144. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 147. ИСБН  978-0-13-291652-3 .
  145. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 148. ИСБН  978-0-13-291652-3 .
  146. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 253. ИСБН  978-0-13-291652-3 .
  147. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 255. ИСБН  978-0-13-291652-3 .
  148. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 161. ИСБН  978-0-13-291652-3 .
  149. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 166. ИСБН  978-0-13-291652-3 .
  150. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 249. ИСБН  978-0-13-291652-3 .
  151. ^ Таненбаум, Эндрю С. (2013). Структурированная компьютерная организация, шестое издание . Пирсон. п. 111. ИСБН  978-0-13-291652-3 .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: e12075bd7a30d26a6c4ddb032cd45927__1722654300
URL1:https://arc.ask3.ru/arc/aa/e1/27/e12075bd7a30d26a6c4ddb032cd45927.html
Заголовок, (Title) документа по адресу, URL1:
Computer program - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)