Компьютерная программа — это последовательность или набор инструкций на языке программирования , которые должен выполнять компьютер . Это один из компонентов программного обеспечения , который также включает в себя документацию и другие нематериальные компоненты. [1]
Компьютерная программа в ее удобочитаемой форме называется исходным кодом . Для выполнения исходного кода требуется другая компьютерная программа , поскольку компьютеры могут выполнять только свои собственные машинные инструкции . Следовательно, исходный код можно преобразовать в машинные инструкции с помощью компилятора , написанного для этого языка. ( Программы на языке ассемблера переводятся с помощью ассемблера .) Полученный файл называется исполняемым файлом . Альтернативно, исходный код может выполняться в интерпретаторе , написанном для этого языка. [2]
Если исполняемый файл запрашивается на выполнение, то операционная система загружает его в память и запускает процесс . [3] Центральный процессор вскоре переключится на этот процесс, чтобы он мог выбирать, декодировать и затем выполнять каждую машинную инструкцию. [4]
Если исходный код запрашивается на исполнение, то операционная система загружает в память соответствующий интерпретатор и запускает процесс. Затем интерпретатор загружает исходный код в память для перевода и выполнения каждого оператора . Запуск исходного кода происходит медленнее, чем запуск исполняемого файла. [5] [a] При этом на компьютере должен быть установлен переводчик.
Программа «Привет, мир!» Программа используется для иллюстрации основного синтаксиса языка . Синтаксис языка BASIC (1964 г.) был намеренно ограничен, чтобы облегчить изучение языка. [6] Например, переменные не объявляются перед использованием. [7] Кроме того, переменные автоматически инициализируются нулями. [7] Вот пример компьютерной программы на языке Basic для усреднения списка чисел: [8]
10 ВВОД «Сколько чисел усреднять?» , A 20 FOR I = 1 TO A 30 INPUT «Введите число:» , B 40 LET C = C + B 50 NEXT I 60 LET D = C / A 70 PRINT «Среднее значение» , D 80 КОНЕЦ
Как только механика базового компьютерного программирования будет изучена, станут доступны более сложные и мощные языки для создания больших компьютерных систем. [9]
Улучшения в разработке программного обеспечения являются результатом усовершенствований компьютерного оборудования . На каждом этапе истории аппаратного обеспечения задачи компьютерного программирования кардинально менялись.
В 1837 году ткацкий станок Жаккарда вдохновил Чарльза Бэббиджа на попытку создать аналитическую машину . [10] Названия компонентов счетного устройства были заимствованы из текстильной промышленности. В текстильной промышленности пряжу привозили из магазина на помол. Устройство имело «хранилище», состоящее из памяти для хранения 1000 чисел по 50 десятичных цифр каждое. [11] Номера из «магазина» были переданы на «мельницу» для обработки. Он был запрограммирован с использованием двух наборов перфорированных карт. Один набор управлял операцией, а другой вводил переменные. [10] [12] Однако тысячи зубчатых колес и шестеренок так и не работали полностью вместе, даже после того, как Бэббидж потратил более 17 000 фунтов стерлингов государственных денег. [13]
Ада Лавлейс работала на Чарльза Бэббиджа над описанием аналитической машины (1843 г.). [14] В описании содержится примечание G, в котором полностью подробно описан метод расчета чисел Бернулли с использованием аналитической машины. Эта заметка признана некоторыми историками первой в мире компьютерной программой. [13]
В 1936 году Алан Тьюринг представил универсальную машину Тьюринга — теоретическое устройство, способное моделировать любые вычисления. [15] Это конечный автомат с бесконечно длинной лентой чтения/записи. Машина может перемещать ленту вперед и назад, изменяя ее содержимое по мере выполнения алгоритма . Машина запускается в исходном состоянии, выполняет последовательность шагов и останавливается, когда достигает состояния остановки. [16] Все современные компьютеры полны по Тьюрингу . [17]
Электронный числовой интегратор и компьютер (ENIAC) был построен в период с июля 1943 года по осень 1945 года. Это был полный по Тьюрингу компьютер общего назначения, в котором для создания схем использовалось 17 468 электронных ламп . По своей сути это была серия Паскалин , связанных вместе. [18] Его 40 единиц весили 30 тонн, занимали 1800 квадратных футов (167 м 2 ) и потребляли 650 долларов в час ( в валюте 1940-х годов ) электроэнергии в режиме простоя. [18] У него было 20 аккумуляторов с основанием 10 . Программирование ENIAC заняло до двух месяцев. [18] Три функциональные таблицы находились на колесиках, и их нужно было перекатывать до фиксированных функциональных панелей. Функциональные таблицы были подключены к функциональным панелям путем подключения к разъемным панелям тяжелых черных кабелей . В каждой функциональной таблице было 728 вращающихся ручек. Программирование ENIAC также включало настройку некоторых из 3000 переключателей. Отладка программы заняла неделю. [19] С 1947 по 1955 год он работал на Абердинском полигоне , рассчитывая параметры водородной бомбы, прогнозируя погодные условия и создавая таблицы стрельбы для наведения артиллерийских орудий. [20]
Вместо того, чтобы подключать шнуры и поворачивать переключатели, компьютер с хранимой программой загружает свои инструкции в память точно так же, как он загружает в память свои данные. [21] В результате компьютер можно было быстро программировать и выполнять вычисления с очень высокой скоростью. [22] Преспер Эккерт и Джон Мочли построили ENIAC. Два инженера представили концепцию хранимой программы в трехстраничной записке, датированной февралем 1944 года. [23] Позже, в сентябре 1944 года, доктор Джон фон Нейман начал работать над проектом ENIAC. 30 июня 1945 года фон Нейман опубликовал первый проект отчета о EDVAC , в котором структуры компьютера приравнивались к структурам человеческого мозга. [22] Проект стал известен как архитектура фон Неймана . Архитектура была одновременно использована в конструкциях компьютеров EDVAC и EDSAC в 1949 году. [24]
IBM System/360 (1964) представляла собой семейство компьютеров, каждый из которых имел одинаковую архитектуру набора команд . Модель 20 была самой маленькой и дешевой. Клиенты могли обновить и сохранить то же прикладное программное обеспечение . [25] Модель 195 была самой премиальной. Каждая модель System/360 отличалась мультипрограммированием [25] — наличием в памяти одновременно нескольких процессов . Когда один процесс ожидал ввода/вывода , другой мог выполнять вычисления.
IBM планировала программировать каждую модель с использованием PL/1 . [26] Был сформирован комитет, в который вошли программисты COBOL , Fortran и ALGOL . Целью было разработать всеобъемлющий, простой в использовании, расширяемый язык, который заменит Кобол и Фортран. [26] В результате получился большой и сложный язык, компиляция которого заняла много времени . [27]
Компьютеры, выпускавшиеся до 1970-х годов, имели переключатели на передней панели для ручного программирования. [28] Компьютерная программа была написана на бумаге для справки. Инструкция представляла собой конфигурацию настроек включения/выключения. После настройки конфигурации была нажата кнопка выполнения. Затем этот процесс повторился. Компьютерные программы также автоматически вводились с помощью бумажной ленты , перфокарт или магнитной ленты . После загрузки носителя с помощью переключателей устанавливался начальный адрес и нажималась кнопка выполнения. [28]
Важной вехой в разработке программного обеспечения стало изобретение схемы очень большой интеграции (СБИС) (1964 г.). [29] После Второй мировой войны ламповая технология была заменена транзисторами с точечным контактом (1947 г.) и транзисторами с биполярным переходом (конец 1950-х гг.), Установленными на печатной плате . [29] В 1960-х годах аэрокосмическая промышленность заменила печатную плату интегральной микросхемой . [29]
Роберт Нойс , сооснователь компаний Fairchild Semiconductor (1957 г.) и Intel (1968 г.), добился технологического усовершенствования для усовершенствования производства полевых транзисторов ( 1963 г.). [30] Цель состоит в том, чтобы изменить удельное электрическое сопротивление и проводимость полупроводникового перехода . Во-первых, природные силикатные минералы преобразуются в поликремниевые стержни с использованием процесса Сименс . [31] Процесс Чохральского затем преобразует стержни в монокристаллический кремниевый кристалл буля . [32] Затем кристалл нарезают тонкими ломтиками, чтобы сформировать подложку пластины . Затем планарный процесс фотолитографии объединяет униполярные транзисторы, конденсаторы , диоды и резисторы на пластине для создания матрицы транзисторов металл-оксид-полупроводник (МОП). [33] [34] МОП-транзистор является основным компонентом интегральных микросхем . [30]
Первоначально функции микросхем интегральных схем устанавливались во время производства. В 1960-е годы управление электрическим потоком перешло к программированию матрицы постоянного запоминающего устройства ( ПЗУ). Матрица напоминала двумерный массив предохранителей. [29] Процесс внедрения инструкций в матрицу заключался в удалении ненужных связей. [29] Соединений было так много, что программисты прошивок написали компьютерную программу на другом чипе, чтобы контролировать горение. [29] Технология стала известна как Программируемое ПЗУ . В 1971 году Intel установила на чип компьютерную программу и назвала его микропроцессором Intel 4004 . [35]
Термины «микропроцессор» и « центральный процессор » (ЦП) теперь используются как взаимозаменяемые. Однако процессоры предшествовали микропроцессорам. Например, процессор IBM System/360 (1964 г.) был изготовлен из печатных плат, содержащих дискретные компоненты на керамических подложках . [36]
Intel 4004 (1971 г.) представлял собой 4- битный микропроцессор, предназначенный для работы калькулятора Busicom . Через пять месяцев после выпуска Intel выпустила Intel 8008 , 8-битный микропроцессор. Билл Пентц возглавил команду в штате Сакраменто по созданию первого микрокомпьютера на базе Intel 8008: Sac State 8008 (1972). [37] Его целью было хранение медицинских карт пациентов. Компьютер поддерживал дисковую операционную систему для работы с 3- мегабайтным жестким диском Memorex . [29] Он имел цветной дисплей и клавиатуру, объединенные в одну консоль. Дисковая операционная система была запрограммирована с использованием базового языка ассемблера IBM (BAL) . Приложение медицинских записей было запрограммировано с использованием интерпретатора BASIC . [29] Однако компьютер оказался эволюционным тупиком, поскольку был чрезвычайно дорогим. Кроме того, он был построен в лаборатории государственного университета для определенной цели. [37] Тем не менее, проект способствовал развитию набора команд Intel 8080 (1974) . [29]
В 1978 году современная среда разработки программного обеспечения началась, когда Intel обновила Intel 8080 до Intel 8086 . Intel упростила Intel 8086 для производства более дешевого Intel 8088 . [38] IBM приняла Intel 8088, когда вышла на рынок персональных компьютеров (1981 г.). По мере роста потребительского спроса на персональные компьютеры росла и разработка микропроцессоров Intel. Последовательность развития известна как серия x86 . Язык ассемблера x86 — это семейство обратно совместимых машинных инструкций . Машинные инструкции, созданные в более ранних микропроцессорах, сохранялись при обновлении микропроцессоров. Это позволило потребителям приобретать новые компьютеры без необходимости приобретать новое прикладное программное обеспечение . Основные категории инструкций: [b]
Схемы СБИС позволили среде программирования перейти от компьютерного терминала (до 1990-х годов) к компьютеру с графическим интерфейсом пользователя (GUI). Компьютерные терминалы ограничивали программистов одной оболочкой , работающей в среде командной строки . В 1970-х годах полноэкранное редактирование исходного кода стало возможным через текстовый пользовательский интерфейс . Независимо от доступной технологии, цель состоит в том, чтобы программировать на языке программирования .
Функции языка программирования существуют для того, чтобы обеспечить строительные блоки, которые можно объединить для выражения идеалов программирования. [39] В идеале язык программирования должен: [39]
Стиль программирования языка программирования, обеспечивающий эти строительные блоки, можно разделить на парадигмы программирования . [40] Например, разные парадигмы могут различаться: [40]
Каждый из этих стилей программирования внес свой вклад в синтез различных языков программирования . [40]
Язык программирования — это набор ключевых слов , символов , идентификаторов и правил, с помощью которых программисты могут передавать инструкции компьютеру. [41] Они следуют набору правил, называемых синтаксисом . [41]
Языки программирования берут свою основу из формальных языков . [42] Целью определения решения на формальном языке является создание алгоритма для решения проблемы подчеркивания. [42] Алгоритм — это последовательность простых инструкций, которые решают проблему . [43]
Эволюция языка программирования началась, когда EDSAC (1949) использовал первую хранимую компьютерную программу в своей архитектуре фон Неймана . [44] Программирование EDSAC осуществлялось на языке программирования первого поколения .
Императивные языки определяют последовательный алгоритм с использованием объявлений , выражений и операторов : [52]
var x: integer;
2 + 2
x := 2 + 2; if x = 4 then do_something();
ФОРТРАН (1958 г.) был представлен как «Система ПЕРЕВОДА математических формул IBM». Он был разработан для научных расчетов без средств для работы со струнами . Наряду с объявлениями , выражениями и операторами он поддерживал:
Это удалось, потому что:
Однако поставщики, не принадлежащие IBM, также написали компиляторы Fortran, но с синтаксисом, который, скорее всего, не сработает с компилятором IBM. [54] Американский национальный институт стандартов (ANSI) разработал первый стандарт Фортрана в 1966 году. В 1978 году Фортран 77 стал стандартом до 1991 года. Фортран 90 поддерживает:
COBOL (1959) означает «Общий бизнес-ориентированный язык». Фортран манипулировал символами. Вскоре стало понятно, что символы не обязательно должны быть числами, поэтому были введены строки . [55] Министерство обороны США повлияло на разработку COBOL, при этом Грейс Хоппер внесла основной вклад. Заявления были английскими и многословными. Целью было разработать язык, на котором менеджеры могли бы читать программы. Однако отсутствие структурированных заявлений помешало достижению этой цели. [56]
Развитие COBOL строго контролировалось, поэтому не возникло диалектов, требующих стандартов ANSI. Как следствие, он не менялся в течение 15 лет до 1974 года. Версия 1990-х годов действительно внесла существенные изменения, такие как объектно-ориентированное программирование . [56]
АЛГОЛ (1960) означает «АЛГОРИТМИЧЕСКИЙ ЯЗЫК». Это оказало глубокое влияние на дизайн языков программирования. [57] Разработанный комитетом европейских и американских экспертов по языкам программирования, он использовал стандартные математические обозначения и имел удобочитаемый, структурированный дизайн. Алгол был первым, кто определил свой синтаксис , используя форму Бэкуса-Наура . [57] Это привело к появлению компиляторов , управляемых синтаксисом . Он добавил такие функции, как:
Прямые потомки Алгола включают Паскаль , Модулу-2 , Аду , Дельфи и Оберон на одной ветке. В другой ветке потомки включают C , C++ и Java . [57]
BASIC (1964) означает «Универсальный код символических инструкций для начинающих». Он был разработан в Дартмутском колледже для обучения всех его студентов. [8] Если бы ученик не перешел на более мощный язык, он все равно помнил бы Бейсик. [8] Интерпретатор Basic устанавливался в микрокомпьютеры , выпущенные в конце 1970-х годов. По мере роста индустрии микрокомпьютеров рос и язык. [8]
Компания Basic стала пионером интерактивных сеансов . [8] Он предлагал команды операционной системы в своей среде:
Однако синтаксис Basic был слишком простым для больших программ. [8] В последних диалектах добавлена структура и объектно-ориентированные расширения. Microsoft Visual Basic до сих пор широко используется и обеспечивает графический интерфейс пользователя . [7]
Язык программирования C (1973 г.) получил свое название потому, что язык BCPL был заменен на B , а компания AT&T Bell Labs назвала следующую версию «C». Его целью было написать операционную систему UNIX . [50] C — относительно небольшой язык, что позволяет легко писать компиляторы. Его рост отражал рост аппаратного обеспечения в 1980-х годах. [50] Его рост также обусловлен тем, что он имеет возможности языка ассемблера , но использует синтаксис высокого уровня . В него добавлены расширенные функции, такие как:
C позволяет программисту контролировать, в какой области памяти следует хранить данные. Для хранения глобальных переменных и статических переменных требуется наименьшее количество тактов . Стек автоматически используется для стандартных объявлений переменных . Куча памяти возвращается в переменную-указатель из malloc()
функции.
main()
. [59] Глобальные переменные видны всем main()
остальным функциям исходного кода.main()
, других функций или внутри {
}
разделителей блоков являются локальными переменными . Локальные переменные также включают переменные формальных параметров . Переменные параметров заключаются в круглые скобки определений функций. [60] Они обеспечивают интерфейс для функции.static
префикса, также хранятся в глобальной и статической области данных. [58] В отличие от глобальных переменных, статические переменные видны только внутри функции или блока. Статические переменные всегда сохраняют свое значение. Примером использования может быть функция int increment_counter(){static int counter = 0; counter++; return counter;}
[e]static
префикса, включая переменные формальных параметров, [62] называются автоматическими переменными [59] и сохраняются в стеке. [58] Они видны внутри функции или блока и теряют свою область действия при выходе из функции или блока.malloc()
библиотечную функцию для выделения динамической памяти. [64] Заполнение кучи данными является дополнительной функцией копирования. Переменные, хранящиеся в куче, экономично передаются функциям с помощью указателей. Без указателей весь блок данных пришлось бы передавать в функцию через стек.В 1970-х годах инженерам-программистам требовалась языковая поддержка, чтобы разбивать большие проекты на модули . [65] Одной из очевидных особенностей было физическое разложение больших проектов на отдельные файлы . Менее очевидной особенностью было логическое разложение больших проектов на абстрактные типы данных . [65] В то время языки поддерживали конкретные (скалярные) типы данных, такие как целые числа, числа с плавающей запятой и строки символов . Абстрактные типы данных — это структуры конкретных типов данных, которым присвоено новое имя. Например, список целых чисел можно назвать .integer_list
На объектно-ориентированном жаргоне абстрактные типы данных называются классами . Однако класс — это всего лишь определение; память не выделяется. Когда память выделяется классу и привязана к идентификатору , она называется объектом . [66]
Объектно-ориентированные императивные языки , разработанные путем объединения потребности в классах и необходимости безопасного функционального программирования . [67] В объектно-ориентированном языке функция присваивается классу. Назначенная функция тогда называется методом , функцией -членом или операцией . Объектно-ориентированное программирование — это выполнение операций над объектами . [68]
Объектно-ориентированные языки поддерживают синтаксис для моделирования отношений подмножества/надмножества . В теории множеств элемент подмножества наследует все атрибуты, содержащиеся в надмножестве . Например, студент – это человек. Следовательно, множество студентов является подмножеством множества людей. В результате студенты наследуют все признаки, общие для всех людей. Кроме того, студенты обладают уникальными качествами, которых нет у других людей. Объектно-ориентированные языки моделируют отношения подмножества/надмножества с помощью наследования . [69] Объектно-ориентированное программирование стало доминирующей языковой парадигмой к концу 1990-х годов. [65]
C++ (1985) первоначально назывался «C с классами». [70] Он был разработан для расширения возможностей C за счет добавления объектно-ориентированных средств языка Simula . [71]
Объектно-ориентированный модуль состоит из двух файлов. Файл определений называется файлом заголовка . Вот заголовочный файл C++ для класса GRADE в простом школьном приложении:
// оценка.h // -------// Используется, чтобы позволить нескольким исходным файлам включать // этот файл заголовка без ошибок дублирования. // ---------------------------------------------- #ifndef GRADE_H #define GRADE_Hclass GRADE { public : // Это операция конструктора. // ---------------------------------- GRADE ( const char Letter ); // Это переменная класса. // ------------------------- char Letter ; // Это операция-член. // --------------------------- intgrade_numeric ( const char Letter ) ; // Это переменная класса. // ------------------------- int numeric ; }; #endif
Операция конструктора — это функция с тем же именем, что и имя класса. [72] Он выполняется, когда вызывающая операция выполняет new
оператор.
Другой файл модуля — это исходный файл . Вот исходный файл C++ для класса GRADE в простом школьном приложении:
//grade.cpp // --------- #include "grade.h" GRADE :: GRADE ( const char Letter ) { // Ссылаемся на объект, используя ключевое слово 'this'. // ---------------------------------------------- этот - > буква = буква ; // Это временная сплоченность // ------------------------- this -> numeric = Grade_numeric ( Letter ); } int GRADE :: Grade_numeric ( const char Letter ) { if ( ( Letter == 'A' || Letter == 'a' ) ) return 4 ; else if ( ( буква == 'B' || буква == 'b' ) ) return 3 ; else if ( ( буква == 'C' || буква == 'c' ) ) return 2 ; else if ( ( буква == 'D' || буква == 'd' ) ) return 1 ; else if ( ( буква == 'F' || буква == 'f' ) ) return 0 ; иначе вернуть -1 ; }
Вот заголовочный файл C++ для класса PERSON в простом школьном приложении:
// person.h // -------- #ifndef PERSON_H #define PERSON_Hкласс PERSON { public : PERSON ( const char * name ); константный символ * имя ; }; #endif
Вот исходный файл C++ для класса PERSON в простом школьном приложении:
// person.cpp // ---------- #include "person.h" ЧЕЛОВЕК :: ЧЕЛОВЕК ( const char * name ) { this -> name = name ; }
Вот заголовочный файл C++ для класса STUDENT в простом школьном приложении:
// Student.h // --------- #ifndef STUDENT_H #define STUDENT_H#include "person.h" #include "grade.h" // СТУДЕНТ — это подмножество ЧЕЛОВЕКА. // -------------------------------- класс STUDENT : public PERSON { public : STUDENT ( const char * name ); ОЦЕНКА * оценка ; }; #endif
Вот исходный файл C++ для класса STUDENT в простом школьном приложении:
// Student.cpp // ----------- #include "student.h" #include "person.h" STUDENT :: STUDENT ( const char * name ) : // Выполняем конструктор суперкласса PERSON. // ---------------------------------------------------------------- - ЧЕЛОВЕК ( имя ) { // Больше нечего делать. // ------------------- }
Вот программа-драйвер для демонстрации:
// Student_dvr.cpp // --------------- #include <iostream> #include "student.h" int main ( void ) { СТУДЕНТ * студент = новый СТУДЕНТ ( «Студент» ); студент -> оценка = новая GRADE ( 'a' ); std :: cout // Обратите внимание, что студент наследует имя ЧЕЛОВЕКА << студент -> имя << ": Числовая оценка = " << студент -> оценка -> числовая << " \n " ; вернуть 0 ; }
Вот make-файл для компиляции всего:
# makefile # -------- все : Student_dvr очистить : rm Student_dvr *.oстудент_двр : студент_двр . уровень cpp . о студент . о человек . o c++ Student_dvr.cpp Grade.o Student.o Person.o -o Student_dvr Grade.o : Оценка . оценка cpp . ч С++ -c ранг.cpp студент.о : студент . студент ЦПП . ч С++ -c студент.cpp person.o : человек . cpp человек . ч С++ -c person.cpp
У императивных языков есть одна серьезная критика: присвоение выражения нелокальной переменной может привести к непредвиденному побочному эффекту . [73] Декларативные языки обычно опускают оператор присваивания и поток управления. Они описывают , какие вычисления следует выполнить, а не как их вычислять. Двумя широкими категориями декларативных языков являются функциональные языки и логические языки .
Принцип функционального языка заключается в использовании лямбда-исчисления в качестве руководства для четко определенной семантики . [74] В математике функция — это правило, которое сопоставляет элементы выражения с диапазоном значений . Рассмотрим функцию:
times_10(x) = 10 * x
Выражение сопоставляется функцией с диапазоном значений . Одно из значений равно 20. Это происходит, когда x равно 2. Таким образом, применение функции математически записывается как:10 * x
times_10()
times_10(2) = 20
Компилятор функционального языка не сохранит это значение в переменной. Вместо этого оно помещает значение в стек компьютера , прежде чем вернуть программный счетчик вызывающей функции. Вызывающая функция затем извлекает значение из стека. [75]
Императивные языки поддерживают функции. Следовательно, функциональное программирование может быть достигнуто на императивном языке, если программист соблюдает дисциплину. Однако функциональный язык навязывает эту дисциплину программисту посредством своего синтаксиса. Функциональные языки имеют синтаксис, специально предназначенный для подчеркивания того, что . [76]
Функциональная программа разрабатывается с набором примитивных функций, за которыми следует одна функция драйвера. [73] Рассмотрим фрагмент :
function max( a, b ){/* code omitted */}
function min( a, b ){/* code omitted */}
function range( a, b, c ) {
return max( a, max( b, c ) ) - min( a, min( b,c ) );
}
Примитивы — это max()
и min()
. Функция драйвера range()
. Выполнение:
put( range( 10, 4, 7) );
выведет 6.
Функциональные языки используются в исследованиях в области информатики для изучения новых возможностей языка. [77] Более того, отсутствие побочных эффектов сделало их популярными в параллельном и параллельном программировании . [78] Однако разработчики приложений предпочитают объектно-ориентированные возможности императивных языков . [78]
Lisp (1958) означает «LISt Processor». [79] Он предназначен для обработки списков . Полная структура данных формируется путем построения списков. В памяти строится древовидная структура данных . Внутри древовидная структура прекрасно подходит для рекурсивных функций. [80] Синтаксис построения дерева заключается в заключении элементов, разделенных пробелами, в круглые скобки. Ниже приводится список из трех элементов. Первые два элемента сами по себе являются списками из двух элементов:
((A B) (HELLO WORLD) 94)
В Lisp есть функции для извлечения и восстановления элементов. [81] Функция head()
возвращает список, содержащий первый элемент списка. Функция tail()
возвращает список, содержащий все, кроме первого элемента. Функция cons()
возвращает список, который представляет собой объединение других списков. Следовательно, следующее выражение вернет список x
:
cons(head(x), tail(x))
Одним из недостатков Лиспа является то, что когда много функций вложены, круглые скобки могут сбивать с толку. [76] Современные среды Lisp помогают обеспечить совпадение скобок. Кроме того, Лисп поддерживает императивные языковые операции оператора присваивания и циклов перехода. [82] Кроме того, Лисп не заботится о типах данных элементов во время компиляции. [83] Вместо этого он назначает (и может переназначать) типы данных во время выполнения . Назначение типа данных во время выполнения называется динамической привязкой . [84] Хотя динамическое связывание повышает гибкость языка, ошибки программирования могут сохраняться до самого конца процесса разработки программного обеспечения . [84]
Написание больших, надежных и читаемых программ на Лиспе требует предусмотрительности. При правильном планировании программа может оказаться намного короче, чем эквивалентная программа императивного языка . [76] Lisp широко используется в области искусственного интеллекта . Однако его использование было принято только потому, что оно содержит императивные языковые операции, что делает возможными непредвиденные побочные эффекты. [78]
ML (1973) [85] означает «Метаязык». ML проверяет, сравниваются ли друг с другом только данные одного типа. [86] Например, эта функция имеет один входной параметр (целое число) и возвращает целое число:
fun times_10 ( n : int ) : int = 10 * n ;
ML не является эксцентричным по отношению к скобкам, как Lisp . Ниже приводится применение times_10()
:
раз_10 2
Он возвращает «20: int». (Возвращаются как результаты, так и тип данных.)
Как и Lisp , ML адаптирован для списков процессов. В отличие от Lisp , каждый элемент имеет один и тот же тип данных. [87] Более того, ML присваивает тип данных элемента во время компиляции . Назначение типа данных во время компиляции называется статической привязкой . Статическая привязка повышает надежность, поскольку компилятор проверяет контекст переменных перед их использованием. [88]
Пролог (1972) означает «Программирование в ЛОГИКЕ». Это язык логического программирования , основанный на формальной логике . Язык был разработан Аленом Кольмерауэром и Филиппом Русселем в Марселе, Франция. Это реализация метода выборочного линейного определенного предложения , впервые предложенного Робертом Ковальски и другими в Эдинбургском университете . [89]
Строительными блоками программы на Прологе являются факты и правила . Вот простой пример:
кот ( Том ). % Том — кот -мышь ( Джерри ). % Джерри — мышьживотное ( X ) :- кошка ( X ). % каждая кошка является животным ( X ) : - мышь ( X ). % каждая мышь является животнымбольшой ( X ) :- кот ( X ). % каждая кошка большая маленькая ( X ) :- мышь ( X ). % каждая мышь маленькаясъесть ( X , Y ) :- мышь ( X ), сыр ( Y ). % каждой мыши съедает каждый съеденный сыр ( X , Y ) : - большой ( X ), маленький ( Y ). % каждого крупного животного поедает каждого мелкого животного
После того как все факты и правила введены, можно задать вопрос:
?- есть ( том , Джерри ). истинный
Следующий пример показывает, как Пролог преобразует буквенную оценку в ее числовое значение:
numeric_grade ( 'A' , 4 ). числовой_сорт ( 'B' , 3 ). числовой_сорт ( 'C' , 2 ). numeric_grade ( 'D' , 1 ). numeric_grade ( 'F' , 0 ). numeric_grade ( X , - 1 ) : - не X = 'A' , не X = 'B' , не X = 'C' , не X = 'D' , не X = 'F' . оценка ( «Студент» , «А» ).
?- оценка ( «Студент» , X ), numeric_grade ( X , Y ). Х = 'А' , Y = 4
Вот подробный пример: [90]
1) Все драконы излучают огонь или, что то же самое, предмет излучает огонь, если это дракон:
billows_fire ( X ) :- is_a_dragon ( X ).
2) Существо извергает огонь, если один из его родителей излучает огонь:
billows_fire ( X ) : - is_a_creature ( X ), is_a_parent_of ( Y , X ), billows_fire ( Y ).
3) Вещь X является родителем вещи Y, если X является матерью Y или X является отцом Y:
is_a_parent_of ( X , Y ): - is_the_mother_of ( X , Y ). is_a_parent_of ( X , Y ): - is_the_father_of ( X , Y ).
4) Вещь является существом, если вещь — дракон:
is_a_creature ( X ) :- is_a_dragon ( X ).
5) Норберта – дракон, а Пафф – существо. Норберта — мать Паффа.
is_a_dragon ( норберта ). is_a_creature ( слойка ). is_the_mother_of ( норберта , слойка ).
Правило (2) представляет собой рекурсивное (индуктивное) определение. Его можно понять декларативно, без необходимости понимать, как он выполняется.
Правило (3) показывает, как функции представляются с помощью отношений. Здесь функции матери и отца гарантируют, что у каждого человека есть только одна мать и только один отец.
Пролог — нетипизированный язык. Тем не менее, наследование можно представить с помощью предикатов. Правило (4) утверждает, что существо является суперклассом дракона.
На вопросы отвечают с использованием обратного рассуждения . Учитывая вопрос:
?- валы_огонь ( X ).
Пролог генерирует два ответа:
X = норберта X = слойка
Практическое применение Пролога — представление знаний и решение задач в области искусственного интеллекта .
Объектно-ориентированное программирование — это метод программирования для выполнения операций ( функций ) над объектами . [91] Основная идея состоит в том, чтобы сгруппировать характеристики явления в контейнер объекта и дать контейнеру имя. Операции над явлением также группируются в контейнер. [91] Объектно-ориентированное программирование, разработанное путем объединения потребности в контейнерах и необходимости безопасного функционального программирования . [92] Этот метод программирования не обязательно ограничивается объектно-ориентированным языком . [93] В объектно-ориентированном языке объектный контейнер называется классом . В необъектно-ориентированном языке структура данных (также известная как запись ) может стать контейнером объекта. Чтобы превратить структуру данных в контейнер объектов, необходимо написать операции специально для этой структуры. Полученная структура называется абстрактным типом данных . [94] Однако наследование будет отсутствовать. Тем не менее, этот недостаток можно преодолеть.
Вот заголовочный файл языка программирования C для абстрактного типа данных GRADE в простом школьном приложении:
/* Grade.h */ /* ------- *//* Используется, чтобы позволить нескольким исходным файлам включать */ /* этот заголовочный файл без ошибок дублирования. */ /* ---------------------------------------------- */ #ifndef GRADE_H #define GRADE_Htypedef struct { символьная буква ; } ОЦЕНКА ; /* Конструктор */ /* ----------- */ GRADE * grade_new ( char Letter ); intgrade_numeric ( символьная буква ) ; #endif
Функция grade_new()
выполняет тот же алгоритм, что и операция конструктора C++ .
Вот исходный файл языка программирования C для абстрактного типа данных GRADE в простом школьном приложении:
/*grade.c */ /* ------- */ #include "grade.h" GRADE * grade_new ( символьная буква ) { GRADE * grade ; /* Выделение динамической памяти */ /* -------------------- */ if ( ! ( grade = calloc ( 1 , sizeof ( GRADE ) ) ) ) { fprintf ( stderr , "ОШИБКА в %s/%s/%d: calloc() вернул пустое значение. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); выход ( 1 ); } оценка -> буква = буква ; возвратный балл ; } intgrade_numeric ( символьная буква ) { if ( ( буква == 'A' || буква == ' a' ) ) return 4 ; else if ( ( буква == 'B' || буква == 'b' ) ) return 3 ; else if ( ( буква == 'C' || буква == 'c' ) ) return 2 ; else if ( ( буква == 'D' || буква == 'd' ) ) return 1 ; else if ( ( буква == 'F' || буква == 'f' ) ) return 0 ; иначе вернуть -1 ; }
В конструкторе функция calloc()
используется вместо malloc()
потому, что каждая ячейка памяти будет установлена в ноль.
Вот заголовочный файл языка программирования C для абстрактного типа данных PERSON в простом школьном приложении:
/* person.h */ /* -------- */ #ifndef PERSON_H #define PERSON_Htypedef struct { char * name ; } ЧЕЛОВЕК ; /* Конструктор */ /* ----------- */ PERSON * person_new ( char * name ); #endif
Вот исходный файл языка программирования C для абстрактного типа данных PERSON в простом школьном приложении:
/* person.c */ /* -------- */ #include "person.h" PERSON * person_new ( char * name ) { PERSON * person ; if ( ! ( person = calloc ( 1 , sizeof ( PERSON ) ) ) ) { fprintf ( stderr , "ОШИБКА в %s/%s/%d: calloc() вернул пустое значение. \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ; выход ( 1 ); } человек -> имя = имя ; вернуть человек ; }
Вот заголовочный файл языка программирования C для абстрактного типа данных STUDENT в простом школьном приложении:
/* Student.h */ /* --------- */ #ifndef STUDENT_H #define STUDENT_H#include "person.h" #include "grade.h" typedef struct { /* СТУДЕНТ — это подмножество ЧЕЛОВЕКА. */ /* -------------------------------- */ PERSON * person ; ОЦЕНКА * оценка ; } СТУДЕНТ ; /* Конструктор */ /* ----------- */ STUDENT * Student_new ( char * name ); #endif
Вот исходный файл языка программирования C для абстрактного типа данных STUDENT в простом школьном приложении:
/* Student.c */ /* --------- */ #include "student.h" #include "person.h" СТУДЕНТ * студент_новый ( символ * имя ) { СТУДЕНТ * студент ; if ( ! ( Student = calloc ( 1 , sizeof ( STUDENT ) ) ) ) { fprintf ( stderr , "ОШИБКА в %s/%s/%d: calloc() вернул пустое значение. \n " , __FILE__ , __FUNCTION__ , __LINE__ ) ; выход ( 1 ); } /* Выполняем конструктор суперкласса PERSON. */ /* ---------------------------------------------- --- */ студент -> person = person_new ( имя ); вернуть студента ; }
Вот программа-драйвер для демонстрации:
/* Student_dvr.c */ /* ------------- */ #include <stdio.h> #include "student.h" int main ( void ) { STUDENT * Student = Student_new ( «Студент» ); студент -> оценка = grade_new ( 'a' ); printf ( "%s: Числовая оценка = %d \n " , /* Хотя подмножество существует, наследование отсутствует. */ студент -> человек -> имя , /* Функциональное программирование — это своевременное выполнение функций (JIT ) */ grade_numeric ( студент -> оценка -> буква ) ); вернуть 0 ; }
Вот make-файл для компиляции всего:
# makefile # -------- все : Student_dvr очистить : rm Student_dvr *.oстудент_двр : студент_двр . класс в . о студент . о человек . o gcc Student_dvr.c Grade.o Student.o Person.o -o Student_dvr Grade.o : Оценка . класс в . ч gcc -c класс.c студент.о : студент . в, студент . ч gcc -c студент.c person.o : человек . в человек . ч gcc -c человек.c
Формальная стратегия создания объектно-ориентированных объектов заключается в следующем: [95]
Например:
Синтаксис языка программирования представляет собой список правил производства , которые управляют его формой . [96] Форма языка программирования — это правильное размещение его объявлений , выражений и операторов . [97] Синтаксис языка дополняет его семантика . Семантика описывает значения, приписываемые различным синтаксическим конструкциям . [96] Синтаксической конструкции может потребоваться семантическое описание, поскольку форма может иметь неверную интерпретацию. [98] Кроме того, разные языки могут иметь одинаковый синтаксис; однако их поведение может быть разным.
Синтаксис языка формально описывается путем перечисления правил производства . Хотя синтаксис естественного языка чрезвычайно сложен, подмножество английского языка может иметь следующий список правил производства: [99]
Слова, выделенные жирным шрифтом , известны как «нетерминалы». Слова в одинарных кавычках известны как «терминалы». [100]
Из этого списка правил производства можно составить полные предложения с помощью серии замен. [101] Процесс заключается в замене нетерминалов либо действительным нетерминалом , либо действительным терминалом . Процесс замены повторяется до тех пор, пока не останутся только клеммы . Одно допустимое предложение:
Однако другая комбинация приводит к недопустимому предложению:
Следовательно, для правильного описания значения пищевого действия необходима семантика .
Один из методов составления списка продукционных правил называется формой Бэкуса – Наура (BNF). [102] BNF описывает синтаксис языка и сам имеет синтаксис . Это рекурсивное определение является примером метаязыка . [96] Синтаксис BNF включает :
::=
что переводится как состоит из [n], когда нетерминал находится справа от него. Это переводится как « когда терминал находится справа».|
что переводится как или .<
и >
которые окружают нетерминалы .Используя BNF, подмножество английского языка может иметь следующий список правил продукции :
< предложение > ::= < именная фраза >< глагольная фраза > < существительная фраза > ::= < статья >< прилагательное >< существительное > < глагольная фраза > ::= < глагол >< существительная фраза > < статья > :: = < прилагательное > ::= большой | маленький < имя существительное > ::= кот | мышь < глагол > ::= ест
Используя BNF, целое число со знаком имеет список правил продукции : [103]
< целое число со знаком > ::= < знак >< целое число > < знак > ::= + | - < целое число > ::= < цифра > | < цифра >< целое число > < цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Обратите внимание на правило рекурсивного производства:
< целое число > ::= < цифра > | < цифра >< целое число >
Это открывает бесконечное количество возможностей. Следовательно, необходима семантика для описания ограничения количества цифр.
Обратите внимание на возможность ведущего нуля в правилах производства:
< целое число > ::= < цифра > | < цифра >< целое число > < цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Следовательно, необходима семантика , чтобы описать, что ведущие нули следует игнорировать.
Для описания семантики доступны два формальных метода . Это денотативная семантика и аксиоматическая семантика . [104]
Программная инженерия – это различные методы создания качественных компьютерных программ . [105] Компьютерное программирование — это процесс написания или редактирования исходного кода . В формальной среде системный аналитик будет собирать информацию от менеджеров обо всех процессах организации, которые необходимо автоматизировать. Затем этот специалист готовит подробный план новой или модифицированной системы. [106] План аналогичен проекту архитектора. [106]
Целью системного аналитика является предоставление нужной информации нужному человеку в нужное время. [107] Решающими факторами для достижения этой цели являются: [107]
Достижение целевых показателей должно быть сбалансировано со всеми затратами, включая: [108]
Применение процесса разработки систем смягчит аксиому: чем позже в процессе обнаруживается ошибка, тем дороже ее исправить. [109]
Водопадная модель представляет собой реализацию процесса разработки систем . [110] Как следует из обозначения каскада , основные фазы перекрывают друг друга: [111]
Программист — это специалист, ответственный за написание или изменение исходного кода для реализации подробного плана. [106] Вероятно, потребуется группа программистов, поскольку большинство систем слишком велики, чтобы их мог выполнить один программист. [113] Однако добавление программистов в проект не может сократить время завершения. Вместо этого это может снизить качество системы. [113] Чтобы быть эффективными, программные модули должны быть определены и распространены среди членов команды. [113] Кроме того, члены команды должны взаимодействовать друг с другом осмысленно и эффективно. [113]
Компьютерные программисты могут программировать в малом : программировать в рамках одного модуля. [114] Скорее всего, модуль будет выполнять модули, расположенные в других файлах исходного кода. Следовательно, программисты могут программировать большие программные модули, чтобы они эффективно сочетались друг с другом. [114] Программирование в целом включает в себя участие в разработке интерфейса прикладного программирования (API).
Модульное программирование — это метод усовершенствования программ на императивном языке . Усовершенствованные программы могут уменьшить размер программного обеспечения, разделить обязанности и тем самым смягчить старение программного обеспечения . Программный модуль — это последовательность операторов, ограниченных внутри блока и вместе идентифицируемых именем. [115] Модули имеют функцию , контекст и логику : [116]
Имя модуля должно определяться сначала по его функции , а затем по его контексту . Его логика не должна быть частью названия. [116] Например, function compute_square_root( x )
или function compute_square_root_integer( i : integer )
— соответствующие имена модулей. Однако function compute_square_root_by_division( x )
это не так.
Степень взаимодействия внутри модуля — это уровень его сплоченности . [116] Связность — это оценка связи между именем модуля и его функцией . Степень взаимодействия между модулями — это уровень связанности . [117] Связывание — это оценка взаимосвязи между контекстом модуля и элементами, над которыми выполняется выполнение.
Уровни сплоченности от худшего к лучшему таковы: [118]
function read_sales_record_print_next_line_convert_to_float()
. На практике случайная сплоченность возникает, если руководство навязывает глупые правила. Например: «Каждый модуль будет иметь от 35 до 50 исполняемых операторов». [118]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()
.Уровни связи от худшего к лучшему таковы: [117]
perform_arithmetic( perform_addition, a, b )
. Вместо этого контроль должен осуществляться за составом возвращаемого объекта.Анализ потока данных — это метод проектирования, используемый для достижения модулей функциональной связности и связи данных . [119] Входными данными для метода является диаграмма потока данных . Диаграмма потока данных представляет собой набор овалов, представляющих модули. Имя каждого модуля отображается внутри его овала. Модули могут находиться на уровне исполняемого файла или уровне функции.
На схеме также есть стрелки, соединяющие модули друг с другом. Стрелки, указывающие на модули, представляют собой набор входных данных. Каждый модуль должен иметь только одну стрелку, указывающую из него, чтобы представить его единственный выходной объект. (Необязательно, дополнительная стрелка исключения указывает.) Цепочка овалов будет отображать весь алгоритм . Модули ввода должны начинать диаграмму. Модули ввода должны подключаться к модулям преобразования. Модули преобразования должны подключаться к модулям вывода. [120]
Компьютерные программы можно разделить по функциональным признакам. Основными функциональными категориями являются прикладное программное обеспечение и системное программное обеспечение . Системное программное обеспечение включает в себя операционную систему , которая объединяет аппаратное обеспечение компьютера с прикладным программным обеспечением. [121] Целью операционной системы является создание среды, в которой прикладное программное обеспечение выполняется удобным и эффективным образом. [121] Как прикладное, так и системное программное обеспечение выполняют служебные программы . На аппаратном уровне программа микрокода управляет схемами центрального процессора .
Прикладное программное обеспечение является ключом к раскрытию потенциала компьютерной системы. [122] Программное обеспечение предприятия объединяет приложения бухгалтерского учета, персонала, клиентов и поставщиков. Примеры включают планирование ресурсов предприятия , управление взаимоотношениями с клиентами и программное обеспечение для управления цепочками поставок .
Корпоративные приложения могут разрабатываться собственными силами как единственное в своем роде проприетарное программное обеспечение . [123] Альтернативно их можно приобрести как готовое программное обеспечение . Приобретенное программное обеспечение может быть модифицировано для предоставления специального программного обеспечения . Если приложение кастомизировано, то используются либо ресурсы компании, либо ресурсы передаются на аутсорсинг. Аутсорсинговая разработка программного обеспечения может осуществляться исходным поставщиком программного обеспечения или сторонним разработчиком. [124]
Потенциальными преимуществами собственного программного обеспечения являются функциональные возможности и возможность разработки отчетов в точном соответствии со спецификациями. [125] Руководство также может участвовать в процессе разработки и обеспечивать определенный уровень контроля. [126] Руководство может принять решение противодействовать новой инициативе конкурента или реализовать требования клиента или поставщика. [127] Слияние или поглощение может потребовать внесения изменений в корпоративное программное обеспечение. Потенциальными недостатками собственного программного обеспечения являются значительные затраты времени и ресурсов. [123] Кроме того, могут возникнуть риски, связанные с характеристиками и производительностью.
Потенциальные преимущества готового программного обеспечения заключаются в том, что первоначальные затраты можно определить, основные потребности должны быть удовлетворены, а его производительность и надежность имеют послужной список. [123] Потенциальные недостатки готового программного обеспечения заключаются в том, что оно может иметь ненужные функции, которые сбивают с толку конечных пользователей, в нем могут отсутствовать функции, необходимые предприятию, а поток данных может не соответствовать рабочим процессам предприятия. [123]
Один из подходов к экономичному получению специализированного корпоративного приложения – через поставщика услуг приложений . [128] Специализированные компании предоставляют оборудование, специальное программное обеспечение и поддержку конечных пользователей. Они могут ускорить разработку новых приложений, поскольку обладают квалифицированным персоналом по информационным системам. Самым большим преимуществом является то, что это освобождает внутренние ресурсы от укомплектования персоналом и управления сложными компьютерными проектами. [128] Многие поставщики услуг приложений нацелены на небольшие, быстрорастущие компании с ограниченными ресурсами информационных систем. [128] С другой стороны, более крупные компании с крупными системами, скорее всего, будут иметь свою техническую инфраструктуру. Одним из рисков является необходимость доверить конфиденциальную информацию внешней организации. Другой риск — необходимость доверять надежности инфраструктуры провайдера. [128]
Операционная система — это низкоуровневое программное обеспечение, которое поддерживает основные функции компьютера, такие как планирование процессов и управление периферийными устройствами . [121]
В 1950-е годы программист, который одновременно был и оператором, писал программу и запускал ее. После завершения выполнения программы выходные данные могли быть распечатаны или записаны на бумажную ленту или карты для последующей обработки. [28] Чаще всего программа не работала. Затем программист посмотрел на индикаторы консоли и повозился с переключателями консоли. Если повезло меньше, была сделана распечатка памяти для дальнейшего изучения. В 1960-е годы программисты сократили количество потраченного времени за счет автоматизации работы оператора. Программа, называемая операционной системой, всегда хранилась в компьютере. [129]
Термин «операционная система» может относиться к двум уровням программного обеспечения. [130] Операционная система может относиться к программе ядра , которая управляет процессами , памятью и устройствами . В более широком смысле, операционная система может относиться ко всему пакету центрального программного обеспечения. В пакет входит программа ядра, интерпретатор командной строки , графический интерфейс пользователя , служебные программы и редактор . [130]
Основная цель ядра — управлять ограниченными ресурсами компьютера:
Первоначально операционные системы программировались на ассемблере ; однако современные операционные системы обычно пишутся на языках более высокого уровня, таких как C , Objective-C и Swift . [г]
Утилита предназначена для помощи в администрировании системы и выполнении программного обеспечения . Операционные системы запускают служебные программы для оборудования, проверяющие состояние дисков, памяти, динамиков и принтеров. [139] Утилита может оптимизировать размещение файла на переполненном диске. Системные утилиты контролируют производительность оборудования и сети. Когда показатель выходит за пределы допустимого диапазона, генерируется триггерное оповещение. [140]
Вспомогательные программы включают программы сжатия, поэтому файлы данных хранятся на меньшем дисковом пространстве. [139] Сжатые программы также экономят время при передаче файлов данных по сети. [139] Вспомогательные программы могут сортировать и объединять наборы данных. [140] Служебные программы обнаруживают компьютерные вирусы . [140]
Программа микрокода — это интерпретатор нижнего уровня, который контролирует путь данных программно-управляемых компьютеров. [141] (Достижения в области аппаратного обеспечения перенесли эти операции в схемы аппаратного исполнения .) [141] Инструкции микрокода позволяют программисту легче реализовать цифровой логический уровень [142] — реальное аппаратное обеспечение компьютера. Уровень цифровой логики является границей между информатикой и компьютерной инженерией . [143]
Логический вентиль — это крошечный транзистор , который может возвращать один из двух сигналов: включенный или выключенный. [144]
Эти пять ворот образуют строительные блоки бинарной алгебры — цифровых логических функций компьютера.
Инструкции микрокода — это мнемоника , которую программисты могут использовать для выполнения цифровых логических функций вместо их формирования в двоичной алгебре. Они хранятся в хранилище управления центрального процессора (ЦП) . [145] Эти инструкции аппаратного уровня перемещают данные по всему пути передачи данных .
Цикл микрокоманд начинается, когда микросеквенсор использует свой счетчик микропрограмм для выборки следующей машинной инструкции из оперативной памяти . [146] Следующим шагом является декодирование машинной команды путем выбора соответствующей выходной линии аппаратного модуля. [147] Последним шагом является выполнение команды с использованием набора вентилей аппаратного модуля.
Инструкции по выполнению арифметических действий передаются через арифметико-логическое устройство (АЛУ). [148] АЛУ имеет схемы для выполнения элементарных операций сложения, сдвига и сравнения целых чисел. Комбинируя и пропуская элементарные операции через АЛУ, ЦП выполняет сложную арифметику.
Инструкции микрокода перемещают данные между ЦП и контроллером памяти . Инструкции микрокода контроллера памяти управляют двумя регистрами . Регистр адреса памяти используется для доступа к адресу каждой ячейки памяти. Регистр данных памяти используется для установки и чтения содержимого каждой ячейки. [149]
Инструкции микрокода перемещают данные между ЦП и множеством компьютерных шин . Шина контроллера диска осуществляет запись и чтение с жестких дисков . Данные также передаются между ЦП и другими функциональными блоками через экспресс-шину взаимодействия периферийных компонентов. [150]
x++
обычно компилируются в одну инструкцию.int increment_counter(){ static int counter; return ++counter;}
. 1) Статические переменные автоматически инициализируются нулем. 2) — оператор приращения++counter
префикса .[Программное обеспечение включает] все или часть программ, процедур, правил и связанной с ними документации системы обработки информации.
Альтернативой компиляции исходной программы является использование интерпретатора. Интерпретатор может напрямую выполнять исходную программу[.]
Их намерением было создать язык, который был бы очень простым для изучения студентами[.]
Идея заключалась в том, что студенты могут быть просто случайными пользователями или переходить от базового языка к более сложным и мощным языкам[.]
Машины Тьюринга могут моделировать все вычисления, которые могут быть выполнены на вычислительной машине.
[Все] распространенные математические функции, какими бы сложными они ни были, вычислимы по Тьюрингу.
В языках программирования третьего поколения и более высокого уровня каждое выражение языка преобразуется в несколько инструкций на машинном языке.
При вызове функции необходимо сохранить всю важную информацию, такую как значения регистров (соответствующие именам переменных) и адрес возврата (который можно получить из счетчика программы)[.] ... Когда функция захочет чтобы вернуться, он... восстанавливает все регистры. Затем он совершает обратный прыжок. Очевидно, что всю эту работу можно выполнить с помощью стека, и именно это происходит практически в каждом языке программирования, реализующем рекурсию.
Simula была основана на Algol 60 с одним очень важным дополнением — концепцией класса. ... Основная идея заключалась в том, что данные (или структура данных) и выполняемые над ними операции принадлежат друг другу[.]
Первоначально было разработано большое количество экспериментальных языков, многие из которых сочетали в себе объектно-ориентированное и функциональное программирование.
Хотя это правда, что ООД [(объектно-ориентированное проектирование)] как таковое не поддерживается большинством популярных языков, можно использовать большое подмножество ООД.
Основными компонентами императивного языка являются декларации, выражения и операторы.
Ключом к раскрытию потенциала любой компьютерной системы является прикладное программное обеспечение.
[] Сторонняя фирма-разработчик программного обеспечения, часто называемая поставщиком программного обеспечения с добавленной стоимостью, может разрабатывать или модифицировать программное обеспечение для удовлетворения потребностей конкретной отрасли или компании.
Рубрика: Собственное программное обеспечение; Подзаголовок: Преимущества; Цитата: Вы можете получить именно то, что вам нужно, с точки зрения функций, отчетов и так далее.
Рубрика: Собственное программное обеспечение; Подзаголовок: Преимущества; Цитата: Участие в разработке обеспечивает дополнительный уровень контроля над результатами.
Рубрика: Собственное программное обеспечение; Подзаголовок: Преимущества; Цитата: Появляется больше гибкости при внесении изменений, которые могут потребоваться для противодействия новой инициативе одного из ваших конкурентов или для удовлетворения новых требований поставщиков и/или клиентов.