Компьютерная программа — это последовательность или набор [a] инструкций на языке программирования для выполнения компьютером . Это один из компонентов программного обеспечения , который также включает документацию и другие нематериальные компоненты. [1 ]
Компьютерная программа в ее читаемой человеком форме называется исходным кодом . Исходному коду нужна другая компьютерная программа для выполнения , поскольку компьютеры могут выполнять только свои собственные машинные инструкции . Поэтому исходный код может быть переведен в машинные инструкции с помощью компилятора , написанного для этого языка. ( Программы на языке ассемблера транслируются с помощью ассемблера . ) Полученный файл называется исполняемым . В качестве альтернативы исходный код может выполняться в интерпретаторе, написанном для этого языка. [2]
Если исполняемый файл запрошен для выполнения, то операционная система загружает его в память и запускает процесс . [3] Центральный процессор вскоре переключится на этот процесс, чтобы иметь возможность извлекать, декодировать, а затем выполнять каждую машинную инструкцию. [4]
Если исходный код запрашивается для выполнения, то операционная система загружает соответствующий интерпретатор в память и запускает процесс. Затем интерпретатор загружает исходный код в память для перевода и выполнения каждого оператора . Запуск исходного кода медленнее, чем запуск исполняемого файла . [5] [b] Более того, интерпретатор должен быть установлен на компьютере.
Программа «Hello, World!» используется для иллюстрации базового синтаксиса языка . Синтаксис языка BASIC (1964) был намеренно ограничен, чтобы сделать язык простым для изучения. [6] Например, переменные не объявляются перед использованием. [7] Кроме того, переменные автоматически инициализируются нулем. [7] Вот пример компьютерной программы на языке Basic для усреднения списка чисел: [8]
10 ВВОД "Сколько чисел нужно усреднить?" , A 20 ДЛЯ I = 1 ДЛЯ A 30 ВВОД "Введите число:" , B 40 ПУСТЬ C = C + B 50 ДАЛЕЕ I 60 ПУСТЬ D = C / A 70 ПЕЧАТЬ "Среднее равно" , D 80 КОНЕЦ
После изучения механизмов базового компьютерного программирования становятся доступными более сложные и мощные языки для создания больших компьютерных систем. [9]
Улучшения в разработке программного обеспечения являются результатом усовершенствований компьютерного оборудования . На каждом этапе истории оборудования задача компьютерного программирования кардинально менялась.
В 1837 году ткацкий станок Жаккарда вдохновил Чарльза Бэббиджа на попытку построить аналитическую машину . [10] Названия компонентов вычислительного устройства были заимствованы из текстильной промышленности. В текстильной промышленности пряжа приносилась из магазина для измельчения. Устройство имело магазин , который состоял из памяти для хранения 1000 чисел по 50 десятичных знаков каждое. [11] Числа из магазина переносились на мельницу для обработки. Он был запрограммирован с помощью двух наборов перфорированных карт. Один набор управлял работой, а другой вводил переменные. [10] [12] Однако тысячи зубчатых колес и шестеренок никогда полностью не работали вместе. [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 . Целью было разработать язык, который был бы всеобъемлющим, простым в использовании, расширяемым и заменил бы Cobol и Fortran. [26] Результатом стал большой и сложный язык, компиляция которого заняла много времени . [27]
Компьютеры, выпускавшиеся до 1970-х годов, имели переключатели на передней панели для ручного программирования. [28] Компьютерная программа была написана на бумаге для справки. Инструкция была представлена конфигурацией настроек включения/выключения. После установки конфигурации нажималась кнопка выполнения. Затем этот процесс повторялся. Компьютерные программы также автоматически вводились с помощью бумажной ленты , перфокарт или магнитной ленты . После загрузки носителя начальный адрес устанавливался с помощью переключателей, и нажималась кнопка выполнения. [28]
Важной вехой в разработке программного обеспечения стало изобретение схемы сверхбольшой интеграции (VLSI) (1964). [29] После Второй мировой войны ламповая технология была заменена транзисторами с точечным контактом ( 1947) и биполярными транзисторами (конец 1950-х), установленными на печатной плате . [29] В 1960-х годах аэрокосмическая промышленность заменила печатную плату интегральной микросхемой . [29]
Роберт Нойс , соучредитель Fairchild Semiconductor (1957) и Intel (1968), добился технологического усовершенствования для усовершенствования производства полевых транзисторов (1963). [30] Цель состоит в том, чтобы изменить электрическое сопротивление и проводимость полупроводникового перехода . Сначала природные силикатные минералы преобразуются в стержни поликремния с использованием процесса Сименса . [31] Затем процесс Чохральского преобразует стержни в монокристаллический кремний, кристалл були. [32] Затем кристалл тонко нарезается для формирования подложки пластины . Затем планарный процесс фотолитографии интегрирует униполярные транзисторы , конденсаторы , диоды и резисторы на пластине для создания матрицы транзисторов металл-оксид-полупроводник (МОП). [33] [34] МОП-транзистор является основным компонентом в чипах интегральных схем . [30]
Первоначально интегральные микросхемы имели свои функции, установленные во время производства. В 1960-х годах управление электрическим потоком перешло к программированию матрицы постоянной памяти (ПЗУ). Матрица напоминала двумерный массив предохранителей. [29] Процесс внедрения инструкций в матрицу заключался в сжигании ненужных соединений. [29] Было так много соединений, что программисты прошивки написали компьютерную программу на другом чипе, чтобы контролировать сжигание. [29] Технология стала известна как программируемое ПЗУ . В 1971 году Intel установила компьютерную программу на чип и назвала его микропроцессором Intel 4004. [35]
Термины микропроцессор и центральный процессор (ЦП) теперь используются как взаимозаменяемые. Однако ЦП появились раньше микропроцессоров. Например, IBM System/360 (1964) имела ЦП, сделанный из печатных плат, содержащих дискретные компоненты на керамических подложках . [36]
Intel 4004 (1971) был 4- битным микропроцессором, разработанным для работы калькулятора Busicom . Через пять месяцев после его выпуска Intel выпустила Intel 8008 , 8-битный микропроцессор. Билл Пентц возглавил команду в Университете Сакраменто , чтобы построить первый микрокомпьютер , использующий Intel 8008: Sac State 8008 (1972). [37] Его целью было хранение медицинских карт пациентов. Компьютер поддерживал дисковую операционную систему для запуска жесткого диска Memorex объемом 3 мегабайта . [29] Он имел цветной дисплей и клавиатуру, которые были упакованы в одну консоль. Дисковая операционная система была запрограммирована с использованием языка Basic Assembly Language (BAL) компании IBM . Приложение для работы с медицинскими картами было запрограммировано с использованием интерпретатора BASIC . [29] Однако компьютер был эволюционным тупиком, поскольку был чрезвычайно дорогим. Кроме того, он был построен в лаборатории государственного университета для определенной цели. [37] Тем не менее, проект внес вклад в разработку набора инструкций Intel 8080 (1974) . [29]
В 1978 году современная среда разработки программного обеспечения началась, когда Intel обновила Intel 8080 до Intel 8086. Intel упростила Intel 8086, чтобы производить более дешевый Intel 8088. [ 38] IBM приняла Intel 8088, когда они вышли на рынок персональных компьютеров (1981). По мере того, как потребительский спрос на персональные компьютеры рос, росла и разработка микропроцессоров Intel. Последовательность разработки известна как серия x86 . Язык ассемблера x86 представляет собой семейство обратно совместимых машинных инструкций . Машинные инструкции, созданные в более ранних микропроцессорах, сохранялись во время модернизации микропроцессоров. Это позволило потребителям приобретать новые компьютеры без необходимости приобретать новое прикладное программное обеспечение . Основные категории инструкций: [c]
Схемы VLSI позволили среде программирования перейти от компьютерного терминала (до 1990-х годов) к компьютеру с графическим пользовательским интерфейсом (GUI). Компьютерные терминалы ограничивали программистов одной оболочкой , работающей в среде командной строки . В 1970-х годах стало возможным полноэкранное редактирование исходного кода с помощью текстового пользовательского интерфейса . Независимо от доступной технологии, цель состоит в том, чтобы программировать на языке программирования .
Возможности языка программирования существуют для того, чтобы предоставлять строительные блоки, которые можно объединять для выражения идеалов программирования. [39] В идеале язык программирования должен: [39]
Стиль программирования языка программирования, обеспечивающий эти строительные блоки, можно разделить на парадигмы программирования . [40] Например, различные парадигмы могут различаться: [40]
Каждый из этих стилей программирования внес свой вклад в синтез различных языков программирования . [40]
Язык программирования — это набор ключевых слов , символов , идентификаторов и правил, с помощью которых программисты могут передавать инструкции компьютеру. [41] Они следуют набору правил, называемых синтаксисом . [41]
Языки программирования берут свою основу из формальных языков . [42] Целью определения решения в терминах его формального языка является создание алгоритма для решения основной проблемы. [42] Алгоритм — это последовательность простых инструкций, которые решают проблему. [43]
Эволюция языков программирования началась, когда EDSAC (1949) использовал первую сохраненную компьютерную программу в своей архитектуре фон Неймана . [44] Программирование EDSAC было в первом поколении языков программирования .
Императивные языки определяют последовательный алгоритм с помощью деклараций , выражений и операторов : [52]
var x: integer;
2 + 2
возвращает 4x := 2 + 2; if x = 4 then do_something();
FORTRAN (1958) был представлен как "Система IBM Mathematical FORmula TRANslating". Он был разработан для научных расчетов, без возможности обработки строк . Наряду с объявлениями , выражениями и операторами он поддерживал:
Это удалось, потому что:
Однако поставщики, не являющиеся IBM, также писали компиляторы Fortran, но с синтаксисом, который, скорее всего, не справился бы с компилятором IBM. [54] Американский национальный институт стандартов (ANSI) разработал первый стандарт Fortran в 1966 году. В 1978 году стандартом стал Fortran 77, действовавший до 1991 года. Fortran 90 поддерживает:
COBOL (1959) означает «COmmon Business Oriented Language» (общий бизнес-ориентированный язык). Fortran манипулировал символами. Вскоре стало ясно, что символы не обязательно должны быть числами, поэтому были введены строки . [55] Министерство обороны США оказало влияние на разработку COBOL, и Грейс Хоппер внесла основной вклад. Выражения были похожи на англоязычные и многословны. Целью было разработать язык, на котором менеджеры могли бы читать программы. Однако отсутствие структурированных утверждений помешало достижению этой цели. [56]
Разработка COBOL была под строгим контролем, поэтому не возникло диалектов, требующих стандартов ANSI. Как следствие, он не менялся в течение 15 лет до 1974 года. Версия 1990-х годов действительно внесла существенные изменения, такие как объектно-ориентированное программирование . [56]
ALGOL (1960) означает «ALGOrithmic Language». Он оказал глубокое влияние на разработку языков программирования. [57] Возникнув из комитета европейских и американских экспертов по языкам программирования, он использовал стандартную математическую нотацию и имел читабельный, структурированный дизайн. Algol был первым, кто определил свой синтаксис с помощью формы Бэкуса–Наура . [57] Это привело к появлению синтаксически-управляемых компиляторов. Он добавил такие функции, как:
Прямые потомки Algol включают Pascal , Modula-2 , Ada , Delphi и Oberon на одной ветви. На другой ветви потомки включают C , C++ и Java . [57]
BASIC (1964) означает «Универсальный символьный код инструкций для начинающих». Он был разработан в Дартмутском колледже для всех студентов. [8] Если студент не переходил на более мощный язык, он все равно помнил Basic. [8] Интерпретатор Basic был установлен в микрокомпьютерах, произведенных в конце 1970-х годов. По мере роста индустрии микрокомпьютеров рос и язык. [8]
Basic был пионером интерактивного сеанса . [8] Он предлагал команды операционной системы в своей среде:
Однако синтаксис Basic был слишком прост для больших программ. [8] Недавние диалекты добавили структуру и объектно-ориентированные расширения. Visual Basic от Microsoft по-прежнему широко используется и создает графический пользовательский интерфейс . [7]
Язык программирования C (1973) получил свое название, потому что язык BCPL был заменен на B , а AT&T Bell Labs назвала следующую версию «C». Его целью было написание операционной системы UNIX . [50] C — относительно небольшой язык, что позволяет легко писать компиляторы. Его рост отражал рост аппаратного обеспечения в 1980-х годах. [50] Его рост также был обусловлен тем, что он имел возможности языка ассемблера , но использовал высокоуровневый синтаксис . Он добавил расширенные возможности, такие как:
C позволяет программисту контролировать, в какой области памяти данные должны храниться. Глобальные переменные и статические переменные требуют наименьшего количества тактов для хранения. Стек автоматически используется для стандартных объявлений переменных . Память кучи возвращается в переменную-указатель из malloc()
функции.
main()
. [59] Глобальные переменные видны main()
любой другой функции в исходном коде.main()
, других функций или внутри {
}
разделителей блоков являются локальными переменными . Локальные переменные также включают формальные переменные параметров . Переменные параметров заключаются в скобки определения функции. [60] Параметры предоставляют интерфейс к функции.static
префикса, также хранятся в глобальной и статической области данных. [58] В отличие от глобальных переменных, статические переменные видны только внутри функции или блока. Статические переменные всегда сохраняют свое значение. Примером использования может служить функция int increment_counter(){static int counter = 0; counter++; return counter;}
[g]static
префикса, включая формальные переменные параметров, [62] называются автоматическими переменными [59] и хранятся в стеке. [58] Они видны внутри функции или блока и теряют свою область действия при выходе из функции или блока.malloc()
библиотечную функцию для выделения памяти кучи. [i] [64] Заполнение кучи данными — это дополнительная функция копирования. [j] Переменные, хранящиеся в куче, экономично передаются функциям с помощью указателей. Без указателей весь блок данных пришлось бы передавать функции через стек.В 1970-х годах инженерам-программистам требовалась языковая поддержка для разбиения крупных проектов на модули . [65] Одной из очевидных функций было физическое разложение крупных проектов на отдельные файлы . Менее очевидной функцией было логическое разложение крупных проектов на абстрактные типы данных . [65] В то время языки поддерживали конкретные (скалярные) типы данных, такие как целые числа, числа с плавающей точкой и строки символов . Абстрактные типы данных — это структуры конкретных типов данных с назначенным новым именем. Например, список целых чисел можно было назвать .integer_list
В объектно-ориентированном жаргоне абстрактные типы данных называются классами . Однако класс — это только определение; память не выделяется. Когда память выделяется классу и привязывается к идентификатору , он называется объектом . [66]
Объектно-ориентированные императивные языки, разработанные путем объединения потребности в классах и потребности в безопасном функциональном программировании . [67] Функция в объектно-ориентированном языке назначается классу. Назначенная функция затем называется методом , функцией -членом или операцией . Объектно-ориентированное программирование выполняет операции над объектами . [68]
Объектно-ориентированные языки поддерживают синтаксис для моделирования отношений подмножества/надмножества . В теории множеств элемент подмножества наследует все атрибуты, содержащиеся в надмножестве. Например, студент — это человек. Следовательно, множество студентов — это подмножество множества людей. В результате студенты наследуют все атрибуты , общие для всех людей. Кроме того, студенты имеют уникальные атрибуты, которых нет у других людей. Объектно-ориентированные языки моделируют отношения подмножества/надмножества с помощью наследования . [69] Объектно-ориентированное программирование стало доминирующей языковой парадигмой к концу 1990-х годов. [65]
C++ (1985) изначально назывался «C with Classes». [70] Он был разработан для расширения возможностей C путем добавления объектно-ориентированных возможностей языка Simula . [71]
Объектно-ориентированный модуль состоит из двух файлов. Файл определений называется заголовочным файлом . Вот заголовочный файл C++ для класса GRADE в простом школьном приложении:
// сорт.h // -------// Используется для того, чтобы разрешить нескольким исходным файлам включать // этот заголовочный файл без ошибок дублирования. // ---------------------------------------------- #ifndef GRADE_H #define GRADE_Hclass GRADE { public : // Это операция конструктора. // ---------------------------------- GRADE ( const char letter ); // Это переменная класса. // ------------------------- символ буква ; // Это операция-член. // --------------------------- int grade_numeric ( const char letter ); // Это переменная класса. // ------------------------- int numeric ; }; #endif
Операция конструктора — это функция с тем же именем, что и имя класса. [72] Она выполняется, когда вызывающая операция выполняет new
оператор.
Другой файл модуля — это исходный файл . Вот исходный файл C++ для класса GRADE в простом школьном приложении:
// grade.cpp // --------- #include "grade.h" GRADE :: GRADE ( const char letter ) { // Ссылаемся на объект, используя ключевое слово 'this'. // ---------------------------------------------- this -> letter = letter ; // Это временная связность // -------------------------- это -> числовое = grade_numeric ( letter ); } int GRADE :: grade_numeric ( const char letter ) { if ( ( letter == 'A' || letter == 'a' ) ) return 4 ; else if ( ( letter == 'B' || letter == 'b' ) ) return 3 ; else if ( ( letter == 'C' || letter == 'c' ) ) return 2 ; else if ( ( letter == 'D' || letter == 'd' ) ) return 1 ; else if ( ( letter == 'F' || letter == 'f' ) ) return 0 ; else return -1 ; }
Вот заголовочный файл C++ для класса PERSON в простом школьном приложении:
// person.h // -------- #ifndef PERSON_H #define PERSON_Hкласс ПЕРСОНА { public : ПЕРСОНА ( const char * name ); const char * name ; }; #endif
Вот исходный файл C++ для класса PERSON в простом школьном приложении:
// person.cpp // ---------- #include "person.h" ЧЕЛОВЕК :: ЧЕЛОВЕК ( const char * name ) { this -> name = name ; }
Вот заголовочный файл C++ для класса STUDENT в простом школьном приложении:
// student.h // --------- #ifndef STUDENT_H #define STUDENT_H#include "person.h" #include "grade.h" // STUDENT является подмножеством PERSON. // -------------------------------- class STUDENT : public PERSON { public : STUDENT ( const char * name ); GRADE * grade ; }; #endif
Вот исходный файл C++ для класса STUDENT в простом школьном приложении:
// student.cpp // ----------- #include "student.h" #include "person.h" STUDENT :: STUDENT ( const char * name ) : // Выполнить конструктор суперкласса PERSON. // ------------------------------------------------- PERSON ( name ) { // Больше ничего не нужно делать. // ------------------- }
Вот программа-драйвер для демонстрации:
// student_dvr.cpp // --------------- #include <iostream> #include "student.h" int main ( void ) { СТУДЕНТ * студент = new СТУДЕНТ ( "Студент" ); студент -> оценка = new GRADE ( 'a' ); std :: cout // Обратите внимание, что student наследует имя PERSON << student -> name << ": Числовая оценка = " << student -> grade -> numeric << " \n " ; return 0 ; }
Вот makefile для компиляции всего:
# makefile # -------- все : student_dvr очистить : rm student_dvr *.ostudent_dvr : student_dvr . cpp оценка . o student . o персона . o c++ student_dvr. cpp оценка.o student.o персона.o -o student_dvr класс.o : класс . cpp класс . h c++ -c класс.cpp студент.o : студент .cpp студент .h c ++ -c студент.cpp person.o : person . cpp person . h c++ -c person.cpp
Императивные языки имеют одно важное замечание: присваивание выражения нелокальной переменной может привести к непреднамеренному побочному эффекту . [73] Декларативные языки обычно опускают оператор присваивания и поток управления. Они описывают, какое вычисление должно быть выполнено, а не как его вычислить. Две широкие категории декларативных языков — это функциональные языки и логические языки .
Принцип функционального языка заключается в использовании лямбда-исчисления в качестве руководства для четко определенной семантики . [74] В математике функция — это правило, которое отображает элементы из выражения в диапазон значений . Рассмотрим функцию:
times_10(x) = 10 * x
Выражение отображается функцией в диапазон значений . Одно значение равно 20. Это происходит , когда x равен 2. Таким образом, применение функции математически записывается как:10 * 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))
Одним из недостатков Lisp является то, что когда много функций вложены, скобки могут выглядеть запутанными. [76] Современные среды Lisp помогают гарантировать соответствие скобок. Кстати, Lisp поддерживает императивные языковые операции оператора присваивания и циклов goto. [82] Кроме того, Lisp не заботится о типе данных элементов во время компиляции. [83] Вместо этого он назначает (и может переназначать) типы данных во время выполнения . Назначение типа данных во время выполнения называется динамическим связыванием . [84] В то время как динамическое связывание увеличивает гибкость языка, ошибки программирования могут задерживаться до поздних стадий процесса разработки программного обеспечения . [84]
Написание больших, надежных и читаемых программ на Lisp требует предусмотрительности. При правильном планировании программа может быть намного короче эквивалентной программы на императивном языке . [76] Lisp широко используется в искусственном интеллекте . Однако его использование было принято только потому, что в нем есть императивные языковые операции, что делает возможными непреднамеренные побочные эффекты. [78]
ML (1973) [85] означает «Meta Language». ML проверяет, сравниваются ли друг с другом только данные одного типа. [86] Например, эта функция имеет один входной параметр (целое число) и возвращает целое число:
развлечение_10 ( n : int ) : int = 10 * n ;
ML не является эксцентричным по скобкам, как Lisp . Ниже приведен пример применения times_10()
:
раз_10 2
Возвращает «20 : int». (Возвращаются как результаты, так и тип данных.)
Как и Lisp , ML предназначен для обработки списков. В отличие от Lisp , каждый элемент имеет один и тот же тип данных. [87] Более того, ML назначает тип данных элемента во время компиляции . Назначение типа данных во время компиляции называется статическим связыванием . Статическое связывание повышает надежность, поскольку компилятор проверяет контекст переменных перед их использованием. [88]
Prolog (1972) означает "PROgramming in LOGic". Это язык логического программирования , основанный на формальной логике . Язык был разработан Аленом Кольмерауэром и Филиппом Русселем в Марселе, Франция. Это реализация селективного линейного разрешения определенных предложений , впервые предложенная Робертом Ковальски и другими в Эдинбургском университете . [89]
Строительными блоками программы Prolog являются факты и правила . Вот простой пример:
кот ( том ). % том — кот, мышь ( джерри ) . % джерри — мышьживотное ( X ) :- кошка ( X ). % каждая кошка является животным животное ( X ) :- мышь ( X ). % каждая мышь является животнымбольшой ( X ) :- кот ( X ). % каждый кот большой маленький ( X ) :- мышь ( X ). % каждая мышь маленькаяешьте ( X , Y ) :- мышь ( X ), сыр ( Y ). % каждая мышь ест каждый сыр ешьте ( X , Y ) :- большой ( X ), маленький ( Y ). % каждое большое животное ест каждое маленькое животное
После того, как все факты и правила введены, можно задать вопрос:
?- есть ( том , джерри ). правда
В следующем примере показано, как Prolog преобразует буквенную оценку в ее числовое значение:
numeric_grade ( 'A' , 4 ). numeric_grade ( 'B' , 3 ). numeric_grade ( 'C' , 2 ). numeric_grade ( 'D' , 1 ). numeric_grade ( 'F' , 0 ). numeric_grade ( X , -1 ) :- не X = 'A' , не X = 'B' , не X = 'C' , не X = ' D ' , не X = ' F' . grade ( 'Студент' , 'A' ).
?- оценка ( 'Студент' , X ), числовая_оценка ( X , Y ). X = 'A' , Y = 4
Вот исчерпывающий пример: [90]
1) Все драконы извергают огонь, или, что то же самое, вещь извергает огонь, если эта вещь является драконом:
огонь_волн ( X ) :- это_дракон ( X ).
2) Существо извергает огонь, если один из его родителей извергает огонь:
огонь_взрывов ( X ) :- является_существом ( X ), является_родителем_ ( Y , X ), огонь_взрывов ( Y ).
3) Вещь X является родителем вещи Y, если X является матерью Y или X является отцом Y:
является_родителем_для ( X , Y ):- является_матерью_для ( X , Y ). является_родителем_для ( X , Y ):- является_отцом_для ( X , Y ).
4) Вещь является существом, если она является драконом:
это_существо ( X ) :- это_дракон ( X ).
5) Норберта — дракон, а Пафф — существо. Норберта — мать Паффа.
это_дракон ( норберта ). это_существо ( пуф ). это_мать_чего-либо ( норберта , пуф ).
Правило (2) — это рекурсивное (индуктивное) определение. Его можно понять декларативно, без необходимости понимать, как оно выполняется.
Правило (3) показывает, как функции представляются с помощью отношений. Здесь функции матери и отца гарантируют, что у каждого индивида есть только одна мать и только один отец.
Пролог — нетипизированный язык. Тем не менее, наследование может быть представлено с помощью предикатов. Правило (4) утверждает, что существо является суперклассом дракона.
На вопросы отвечают с помощью обратного рассуждения . Учитывая вопрос:
?- огонь_волн ( X ).
Пролог генерирует два ответа:
X = норберта X = пухляш
Практическими приложениями Prolog являются представление знаний и решение задач в области искусственного интеллекта .
Объектно-ориентированное программирование — это метод программирования для выполнения операций ( функций ) над объектами . [91] Основная идея заключается в группировке характеристик явления в контейнер объектов и присвоении контейнеру имени. Операции над явлением также группируются в контейнер. [91] Объектно-ориентированное программирование, разработанное путем объединения потребности в контейнерах и потребности в безопасном функциональном программировании . [92] Этот метод программирования не обязательно должен ограничиваться объектно-ориентированным языком . [93] В объектно-ориентированном языке контейнер объектов называется классом . В необъектно-ориентированном языке структура данных (которая также известна как запись ) может стать контейнером объектов. Чтобы превратить структуру данных в контейнер объектов, операции должны быть написаны специально для структуры. Полученная структура называется абстрактным типом данных . [94] Однако наследование будет отсутствовать. Тем не менее, этот недостаток можно преодолеть.
Вот заголовочный файл языка программирования C для абстрактного типа данных GRADE в простом школьном приложении:
/* сорт.h */ /* ------- *//* Используется для включения нескольких исходных файлов */ /* этот заголовочный файл без ошибок дублирования. */ /* ---------------------------------------------- */ #ifndef GRADE_H #define GRADE_Htypedef struct { char letter ; } GRADE ; /* Конструктор */ /* ----------- */ GRADE * grade_new ( char letter ); int grade_numeric ( символьная буква ); #endif
Функция grade_new()
выполняет тот же алгоритм, что и операция конструктора C++ .
Вот исходный файл программирования на языке C для абстрактного типа данных GRADE в простом школьном приложении:
/* оценка.c */ /* ------- */ #include "оценка.h" GRADE * grade_new ( буква символа ) { GRADE * grade ; /* Выделение памяти кучи */ /* -------------------- */ if ( ! ( grade = calloc ( 1 , sizeof ( GRADE ) ) ) ) { fprintf ( stderr , "ОШИБКА в %s/%s/%d: calloc() вернул пустой. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); exit ( 1 ); } оценка -> буква = буква ; вернуть оценку ; } int grade_numeric ( char letter ) { if ( ( letter == 'A' || letter == 'a' ) ) return 4 ; else if ( ( letter == 'B' || letter == 'b' ) ) return 3 ; else if ( ( letter == 'C' || letter == 'c' ) ) return 2 ; else if ( ( letter == 'D' || letter == 'd' ) ) return 1 ; else if ( ( letter == 'F' || letter == 'f' ) ) return 0 ; else return -1 ; }
В конструкторе calloc()
вместо используется функция malloc()
, поскольку каждая ячейка памяти будет установлена в ноль.
Вот заголовочный файл языка программирования C для абстрактного типа данных PERSON в простом школьном приложении:
/* person.h */ /* -------- */ #ifndef PERSON_H #define PERSON_Htypedef struct { char * name ; } ПЕРСОНА ; /* Конструктор */ /* ----------- */ PERSON * person_new ( char * name ); #endif
Вот исходный файл программирования на языке C для абстрактного типа данных PERSON в простом школьном приложении:
/* person.c */ /* -------- */ #include "person.h" ПЕРСОНА * персона_новый ( символ * имя ) { ПЕРСОНА * персона ; если ( ! ( person = calloc ( 1 , sizeof ( PERSON ) ) ) ) { fprintf ( stderr , "ОШИБКА в %s/%s/%d: calloc() вернул пустой. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); выход ( 1 ); } персона -> имя = имя ; вернуть персону ; }
Вот заголовочный файл языка программирования C для абстрактного типа данных STUDENT в простом школьном приложении:
/* student.h */ /* --------- */ #ifndef STUDENT_H #define STUDENT_H#include "person.h" #include "grade.h" typedef struct { /* УЧАЩИЙСЯ является подмножеством ЧЕЛОВЕКА. */ /* -------------------------------- */ ЧЕЛОВЕК * person ; ОЦЕНКА * оценка ; } СТУДЕНТ ; /* Конструктор */ /* ----------- */ СТУДЕНТ * student_new ( char * name ); #endif
Вот исходный файл программирования на языке C для абстрактного типа данных STUDENT в простом школьном приложении:
/* student.c */ /* --------- */ #include "student.h" #include "person.h" СТУДЕНТ * студент_новый ( символ * имя ) { СТУДЕНТ * студент ; если ( ! ( student = calloc ( 1 , sizeof ( STUDENT ) ) ) ) { fprintf ( stderr , "ОШИБКА в %s/%s/%d: calloc() вернул пустой. \n " , __FILE__ , __FUNCTION__ , __LINE__ ); выход ( 1 ); } /* Выполнить конструктор суперкласса PERSON. */ /* ------------------------------------------------- */ student -> person = person_new ( name ); return student ; }
Вот программа-драйвер для демонстрации:
/* student_dvr.c */ /* ------------- */ #include <stdio.h> #include "student.h" int main ( void ) { STUDENT * student = student_new ( "Студент" ); student -> grade = grade_new ( 'a' ); printf ( "%s: Числовая оценка = %d \n " , /* В то время как подмножество существует, наследование не существует. */ student -> person -> name , /* Функциональное программирование — это выполнение функций точно в срок (JIT) */ grade_numeric ( student -> grade -> letter ) ); вернуть 0 ; }
Вот makefile для компиляции всего:
# makefile # -------- все : student_dvr очистить : rm student_dvr *.ostudent_dvr : student_dvr .c оценка .o студент .o персона .o gcc student_dvr.c оценка.o студент.o персона.o -o student_dvr сорт.o : сорт . c сорт . h gcc -c сорт.c студент.o : студент .c студент .h gcc -c студент.c персона.о : персона .c персона .h gcc -c персона.c
Формальная стратегия создания объектно-ориентированных объектов заключается в следующем: [95]
Например:
Синтаксис компьютерной программы представляет собой список правил производства , которые формируют ее грамматику . [96] Грамматика языка программирования правильно размещает свои объявления , выражения и операторы . [97] Дополнением к синтаксису языка является его семантика . Семантика описывает значения, придаваемые различным синтаксическим конструкциям. [ 98] Синтаксическая конструкция может нуждаться в семантическом описании, поскольку правило производства может иметь недопустимую интерпретацию. [99] Кроме того, разные языки могут иметь одинаковый синтаксис; однако их поведение может быть разным.
Синтаксис языка формально описывается перечислением правил производства. В то время как синтаксис естественного языка чрезвычайно сложен, подмножество английского языка может иметь этот список правил производства: [100]
Слова, выделенные жирным шрифтом, называются нетерминалами . Слова в «одинарных кавычках» называются терминалами . [101]
Из этого списка правил производства можно сформировать полные предложения, используя ряд замен. [102] Процесс заключается в замене нетерминалов либо допустимым нетерминалом , либо допустимым терминалом . Процесс замены повторяется до тех пор, пока не останутся только терминалы . Одно допустимое предложение:
Однако другая комбинация приводит к недействительному предложению:
Поэтому для правильного описания смысла деятельности, связанной с приемом пищи , необходима семантика .
Один из методов листинга правил производства называется формой Бэкуса–Наура (БНФ). [103] БНФ описывает синтаксис языка и сама имеет синтаксис . Это рекурсивное определение является примером метаязыка . [ 98] Синтаксис БНФ включает:
::=
что переводится как состоит из a[n] , когда нетерминал находится справа от него. Это переводится как is, когда терминал находится справа от него.|
что переводится как или .<
и >
которые окружают нетерминалы .Используя BNF, подмножество английского языка может иметь следующий список правил продукции :
< предложение > ::= < существительное-фраза >< глагол-фраза > < существительное-фраза > ::= < статья >< прилагательное >< существительное > < глагол -фраза > ::= < глагол >< существительное-фраза > < статья > ::= < прилагательное > ::= большой | маленький < существительное > ::= кошка | мышь < глагол > ::= ест
Используя BNF, знаковое целое число имеет следующий листинг правил производства : [104]
< знаковое целое > ::= < знак >< целое > < знак > ::= + | - < целое > ::= < цифра > | < цифра >< целое > < цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Обратите внимание на правило рекурсивного производства:
< целое число > ::= < цифра > | < цифра >< целое число >
Это допускает бесконечное количество возможностей. Поэтому семантика необходима для описания ограничения количества цифр.
Обратите внимание на возможность наличия начального нуля в правилах производства:
< целое число > ::= < цифра > | < цифра >< целое число > < цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Поэтому необходима семантика, описывающая, что начальные нули следует игнорировать.
Для описания семантики доступны два формальных метода : денотационная семантика и аксиоматическая семантика . [105]
Программная инженерия — это множество методов создания качественных компьютерных программ . [106] Компьютерное программирование — это процесс написания или редактирования исходного кода . В формальной среде системный аналитик собирает информацию от менеджеров обо всех процессах организации, которые необходимо автоматизировать. Затем этот специалист готовит подробный план для новой или модифицированной системы. [107] План аналогичен чертежу архитектора. [107]
Системный аналитик ставит перед собой цель доставить нужную информацию нужному человеку в нужное время. [108] Критические факторы для достижения этой цели: [108]
Достижение целевых показателей эффективности должно быть сбалансировано со всеми затратами, включая: [109]
Применение процесса разработки систем смягчит аксиому: чем позже в процессе обнаруживается ошибка, тем дороже ее исправление. [110]
Модель водопада представляет собой реализацию процесса разработки систем . [111] Как следует из названия водопада , основные фазы перекрывают друг друга: [112]
Программист — это специалист , ответственный за написание или изменение исходного кода для реализации подробного плана. [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]
perform_arithmetic( perform_addition, a, b )
. Вместо этого управление должно быть на уровне возвращаемого объекта.Анализ потока данных — это метод проектирования, используемый для достижения модулей функциональной связности и связи данных . [120] Входными данными для метода является диаграмма потока данных . Диаграмма потока данных — это набор овалов, представляющих модули. Имя каждого модуля отображается внутри его овала. Модули могут находиться на уровне исполняемых файлов или на уровне функций.
На схеме также есть стрелки, соединяющие модули друг с другом. Стрелки, указывающие на модули, представляют собой набор входов. Каждый модуль должен иметь только одну стрелку, выходящую из него, чтобы представлять его единственный выходной объект. (По желанию, дополнительная стрелка исключения указывает.) Гирляндная цепь овалов будет передавать весь алгоритм . Входные модули должны начинать схему. Входные модули должны подключаться к модулям преобразования. Модули преобразования должны подключаться к выходным модулям. [121]
Компьютерные программы можно классифицировать по функциональным признакам. Основными функциональными категориями являются прикладное программное обеспечение и системное программное обеспечение . Системное программное обеспечение включает операционную систему , которая связывает компьютерное оборудование с прикладным программным обеспечением. [122] Цель операционной системы — обеспечить среду, в которой прикладное программное обеспечение выполняется удобным и эффективным образом. [122] Как прикладное программное обеспечение, так и системное программное обеспечение выполняют служебные программы . На аппаратном уровне программа микрокода управляет цепями по всему центральному процессору .
Прикладное программное обеспечение является ключом к раскрытию потенциала компьютерной системы. [123] Корпоративное прикладное программное обеспечение объединяет приложения для бухгалтерского учета, персонала, клиентов и поставщиков. Примерами могут служить планирование ресурсов предприятия , управление взаимоотношениями с клиентами и программное обеспечение для управления цепочками поставок .
Корпоративные приложения могут быть разработаны внутри компании как уникальное в своем роде фирменное программное обеспечение . [124] В качестве альтернативы они могут быть приобретены как готовое программное обеспечение . Приобретенное программное обеспечение может быть изменено для предоставления индивидуального программного обеспечения . Если приложение настраивается, то либо используются ресурсы компании, либо ресурсы передаются на аутсорсинг. Разработка программного обеспечения на аутсорсинге может осуществляться как исходным поставщиком программного обеспечения, так и сторонним разработчиком. [125]
Потенциальные преимущества внутреннего программного обеспечения заключаются в том, что функции и отчеты могут быть разработаны точно в соответствии со спецификацией. [126] Руководство также может быть вовлечено в процесс разработки и предлагать определенный уровень контроля. [127] Руководство может принять решение противодействовать новой инициативе конкурента или реализовать требования клиента или поставщика. [128] Слияние или поглощение может потребовать изменений корпоративного программного обеспечения. Потенциальные недостатки внутреннего программного обеспечения заключаются в том, что затраты времени и ресурсов могут быть значительными. [124] Кроме того, могут нависнуть риски, касающиеся функций и производительности.
Потенциальные преимущества готового программного обеспечения заключаются в том, что первоначальные затраты можно определить, основные потребности должны быть удовлетворены, а его производительность и надежность имеют послужной список. [124] Потенциальные недостатки готового программного обеспечения заключаются в том, что оно может иметь ненужные функции, которые сбивают с толку конечных пользователей, в нем может отсутствовать функции, необходимые предприятию, а поток данных может не соответствовать рабочим процессам предприятия. [124]
Один из подходов к экономически выгодному получению настраиваемого корпоративного приложения — через поставщика услуг приложений . [129] Специализированные компании предоставляют оборудование, настраиваемое программное обеспечение и поддержку конечных пользователей. Они могут ускорить разработку новых приложений, поскольку у них есть квалифицированный персонал по информационным системам. Самое большое преимущество заключается в том, что это освобождает внутренние ресурсы от кадрового обеспечения и управления сложными компьютерными проектами. [129] Многие поставщики услуг приложений нацелены на небольшие, быстрорастущие компании с ограниченными ресурсами информационных систем. [129] С другой стороны, более крупные компании с крупными системами, скорее всего, будут иметь свою техническую инфраструктуру. Один из рисков — необходимость доверять внешней организации конфиденциальную информацию. Другой риск — необходимость доверять надежности инфраструктуры поставщика. [129]
Операционная система — это низкоуровневое программное обеспечение, которое поддерживает основные функции компьютера, такие как планирование процессов и управление периферийными устройствами . [122]
В 1950-х годах программист, который также был оператором, писал программу и запускал ее. После того, как программа завершала выполнение, вывод мог быть распечатан или мог быть пробит на бумажной ленте или картах для последующей обработки. [28] Чаще всего программа не работала. Затем программист смотрел на индикаторы консоли и возился с переключателями консоли. Если повезло меньше, делалась распечатка памяти для дальнейшего изучения. В 1960-х годах программисты сократили количество потерянного времени, автоматизировав работу оператора. Программа, называемая операционной системой, все время хранилась в компьютере. [130]
Термин операционная система может относиться к двум уровням программного обеспечения. [131] Операционная система может относиться к программе ядра , которая управляет процессами , памятью и устройствами . В более широком смысле, операционная система может относиться ко всему пакету центрального программного обеспечения. Пакет включает в себя программу ядра, интерпретатор командной строки , графический пользовательский интерфейс , служебные программы и редактор . [131]
Основное назначение ядра — управление ограниченными ресурсами компьютера:
Первоначально операционные системы программировались на ассемблере ; однако современные операционные системы обычно пишутся на языках более высокого уровня, таких как C , Objective-C и Swift . [k]
Утилиты предназначены для помощи в системном администрировании и выполнении программного обеспечения. Операционные системы выполняют аппаратные утилиты для проверки состояния дисководов, памяти, динамиков и принтеров. [140] Утилиты могут оптимизировать размещение файла на переполненном диске. Системные утилиты контролируют производительность оборудования и сети. Когда показатель выходит за пределы допустимого диапазона, генерируется триггерное оповещение. [141]
Вспомогательные программы включают в себя программы сжатия, поэтому файлы данных хранятся на меньшем дисковом пространстве. [140] Сжатые программы также экономят время при передаче файлов данных по сети. [140] Вспомогательные программы могут сортировать и объединять наборы данных. [141] Вспомогательные программы обнаруживают компьютерные вирусы . [141]
Программа микрокода — это интерпретатор нижнего уровня, который управляет путем передачи данных программно-управляемых компьютеров. [142] (Достижения в области аппаратного обеспечения перенесли эти операции в аппаратные схемы выполнения .) [142] Инструкции микрокода позволяют программисту легче реализовать цифровой логический уровень [143] — реальное аппаратное обеспечение компьютера. Цифровой логический уровень — это граница между компьютерной наукой и компьютерной инженерией . [144]
Логический вентиль — это крошечный транзистор , который может возвращать один из двух сигналов: включено или выключено. [145]
Эти пять вентилей образуют строительные блоки двоичной алгебры — цифровых логических функций компьютера.
Инструкции микрокода — это мнемоники, которые программисты могут использовать для выполнения цифровых логических функций вместо их формирования в двоичной алгебре. Они хранятся в управляющем хранилище центрального процессора (ЦП) . [146] Эти инструкции аппаратного уровня перемещают данные по всему пути данных .
Цикл микрокоманд начинается, когда микросеквенсор использует свой микропрограммный счетчик для извлечения следующей машинной инструкции из оперативной памяти . [147] Следующий шаг — декодирование машинной инструкции путем выбора правильной выходной линии для аппаратного модуля. [148] Последний шаг — выполнение инструкции с использованием набора вентилей аппаратного модуля.
Инструкции для выполнения арифметических действий передаются через арифметико-логическое устройство (АЛУ). [149] АЛУ имеет схемы для выполнения элементарных операций по сложению, сдвигу и сравнению целых чисел. Объединяя и циклически выполняя элементарные операции через АЛУ, ЦП выполняет свою сложную арифметику.
Инструкции микрокода перемещают данные между ЦП и контроллером памяти . Инструкции микрокода контроллера памяти манипулируют двумя регистрами . Регистр адреса памяти используется для доступа к адресу каждой ячейки памяти. Регистр данных памяти используется для установки и чтения содержимого каждой ячейки. [150]
Инструкции микрокода перемещают данные между ЦП и множеством компьютерных шин . Шина контроллера диска записывает и считывает данные с жестких дисков . Данные также перемещаются между ЦП и другими функциональными блоками через экспресс-шину периферийных компонентов. [151]
x++
обычно компилируются в одну инструкцию.int increment_counter(){ static int counter; return ++counter;}
. 1) Статические переменные автоматически инициализируются нулем. 2) ++counter
— префиксный оператор инкремента .calloc()
функцию выделения памяти кучи. Она предоставляет две дополнительные услуги: 1) Позволяет программисту создавать массив произвольного размера. 2) Устанавливает каждую ячейку памяти в ноль.strdup()
функцию. Она выполняет как функцию выделения, так и функцию копирования.[Программное обеспечение включает] все или часть программ, процедур, правил и связанной с ними документации системы обработки информации.
Альтернативой компиляции исходной программы является использование интерпретатора. Интерпретатор может напрямую выполнить исходную программу[.]
Их намерением было создать язык, который был бы очень прост для изучения студентами[.]
Идея заключалась в том, что студенты могли быть просто обычными пользователями или переходить от базового уровня к более сложным и мощным языкам[.]
могут моделировать все вычисления, которые могут быть выполнены на вычислительной машине.
[В]се общие математические функции, независимо от их сложности, вычислимы по Тьюрингу.
В языках программирования третьего поколения и более высокого уровня каждое выражение в языке транслируется в несколько инструкций на машинном языке.
При вызове функции необходимо сохранить всю важную информацию, например, значения регистров (соответствующие именам переменных) и адрес возврата (который можно получить из счетчика программы)[.] ... Когда функция хочет вернуться, она ... восстанавливает все регистры. Затем она выполняет возврат. Очевидно, что всю эту работу можно выполнить с помощью стека, и именно это происходит практически в каждом языке программирования, реализующем рекурсию.
Simula была основана на Algol 60 с одним очень важным дополнением — концепцией класса. ... Основная идея заключалась в том, что данные (или структура данных) и операции, выполняемые над ними, связаны друг с другом[.]
было разработано большое количество экспериментальных языков, многие из которых сочетали объектно-ориентированное и функциональное программирование.
Хотя верно, что OOD [(объектно-ориентированное проектирование)] как таковое не поддерживается большинством популярных языков, можно использовать большое подмножество OOD.
Синтаксис (или грамматика) языка программирования описывает правильную форму, в которой могут быть написаны программы[.]
Основными компонентами императивного языка являются декларации, выражения и утверждения.
Ключом к раскрытию потенциала любой компьютерной системы является прикладное программное обеспечение.
[Сторонняя фирма-разработчик программного обеспечения, часто называемая поставщиком программного обеспечения с добавленной стоимостью, может разрабатывать или модифицировать программное обеспечение для удовлетворения потребностей конкретной отрасли или компании.
Заголовок: Проприетарное программное обеспечение; Подзаголовок: Преимущества; Цитата: Вы можете получить именно то, что вам нужно с точки зрения функций, отчетов и т. д.
Заголовок: Проприетарное программное обеспечение; Подзаголовок: Преимущества; Цитата: Участие в разработке обеспечивает дополнительный уровень контроля над результатами.
Заголовок: Проприетарное программное обеспечение; Подзаголовок: Преимущества; Цитата: Существует большая гибкость при внесении изменений, которые могут потребоваться для противодействия новой инициативе одного из ваших конкурентов или для удовлетворения новых требований поставщиков и/или клиентов.