Лекция
Это продолжение увлекательной статьи про компьютерная программа.
...
заключаются в круглые скобки определений функций. Они обеспечивают интерфейс для функции.
static
префикса, также хранятся в глобальной и статической области данных. В отличие от глобальных переменных, статические переменные видны только внутри функции или блока. Статические переменные всегда сохраняют свое значение. Примером использования может быть функция int increment_counter(){static int counter = 0; counter++; return counter;}
static
префикса, включая переменные формальных параметров, называются автоматическими переменными и сохраняются в стеке. Они видны внутри функции или блока и теряют свою область действия при выходе из функции или блока.malloc()
библиотечную функцию для выделения динамической памяти. Заполнение кучи данными является дополнительной функцией копирования. Переменные, хранящиеся в куче, экономично передаются функциям с помощью указателей. Без указателей весь блок данных пришлось бы передавать в функцию через стек.В 1970-х годах инженерам-программистам требовалась языковая поддержка, чтобы разбивать большие проекты на модули . Одной из очевидных особенностей было физическое разложение больших проектов на отдельные файлы . Менее очевидной особенностью было логическое разложение больших проектов на абстрактные типы данных . В то время языки поддерживали конкретные ( скалярные ) типы данных, такие как целые числа, числа с плавающей запятой и строки символов . Абстрактные типы данных — это структурыконкретных типов данных с присвоенным новым именем. Например, список целых чисел можно назвать integer_list
.
На объектно-ориентированном жаргоне абстрактные типы данных называются классами . Однако класс — это всего лишь определение; память не выделяется. Когда память выделяется классу и привязана к идентификатору , она называется объектом .
Объектно-ориентированные императивные языки , разработанные путем объединения потребности в классах и необходимости безопасного функционального программирования . В объектно-ориентированном языке функция присваивается классу. Назначенная функция тогда называется методом , функцией -членом или операцией . Объектно-ориентированное программирование — это выполнение операций над объектами .
Объектно-ориентированные языки поддерживают синтаксис для моделирования отношений подмножества/надмножества . В теории множеств элемент подмножества наследует все атрибуты, содержащиеся в надмножестве . Например, студент – это человек. Следовательно, множество студентов является подмножеством множества людей. В результате студенты наследуют все признаки, общие для всех людей. Кроме того, студенты обладают уникальными качествами, которых нет у других людей. Объектно-ориентированные языки моделируют отношения подмножества/надмножества с помощью наследования . Объектно-ориентированное программирование стало доминирующей языковой парадигмой к концу 1990-х годов.
C++ (1985) первоначально назывался «C с классами». Он был разработан для расширения возможностей C за счет добавления объектно-ориентированных средств языка Simula .
У императивных языков есть одна серьезная критика: присвоение выражения нелокальной переменной может привести к непредвиденному побочному эффекту . Декларативные языки обычно опускают оператор присваивания и поток управления. Они описывают , какие вычисления следует выполнить, а не как их вычислять. Двумя широкими категориями декларативных языков являются функциональные языки и логические языки .
Принцип функционального языка заключается в использовании лямбда-исчисления в качестве руководства для четко определенной семантики . В математике функция — это правило, которое сопоставляет элементы выражения с диапазоном значений . Рассмотрим функцию:
times_10(x) = 10 * x
Выражение сопоставляется функцией с диапазоном значений . Одно из значений равно 20. Это происходит, когда x равно 2. Таким образом, применение функции математически записывается как: 10 * x
times_10()
times_10(2) = 20
Компилятор функционального языка не сохранит это значение в переменной. Вместо этого оно помещает значение в стек компьютера , прежде чем вернуть программный счетчик вызывающей функции. Вызывающая функция затем извлекает значение из стека.
Императивные языки поддерживают функции. Следовательно, функциональное программирование может быть достигнуто на императивном языке, если программист соблюдает дисциплину. Однако функциональный язык навязывает эту дисциплину программисту посредством своего синтаксиса. Функциональные языки имеют синтаксис, специально предназначенный для подчеркивания того, что .
Функциональная программа разрабатывается с набором примитивных функций, за которыми следует одна функция драйвера. Рассмотрим фрагмент :
function max(a,b){/* code omitted */}
function min(a,b){/* code omitted */}
function difference_between_largest_and_smallest(a,b,c) {
return max(a,max(b,c)) - min(a, min(b,c));
}
Примитивы — это max()
и min()
. Функция драйвера difference_between_largest_and_smallest()
.
Выполнение:
put(difference_between_largest_and_smallest(10,4,7));
выведет 6.
Функциональные языки используются в исследованиях в области информатики для изучения новых возможностей языка. Более того, отсутствие побочных эффектов сделало их популярными в параллельном и параллельном программировании . Однако разработчики приложений предпочитают объектно-ориентированные возможности императивных языков .
Lisp (1958) означает «LISt Processor». Он предназначен для обработки списков . Полная структура данных формируется путем построения списков. В памяти строится древовидная структура данных . Внутри древовидная структура прекрасно подходит для рекурсивных функций. [80] Синтаксис построения дерева заключается в заключении элементов, разделенных пробелами, в круглые скобки. Ниже приводится список из трех элементов. Первые два элемента сами по себе являются списками из двух элементов:
((A B) (HELLO WORLD) 94)
В Lisp есть функции для извлечения и восстановления элементов. Функция head()
возвращает список, содержащий первый элемент списка. Функция tail()
возвращает список, содержащий все, кроме первого элемента. Функция cons()
возвращает список, который представляет собой объединение других списков. Следовательно, следующее выражение вернет список x
:
cons(head(x), tail(x))
Одним из недостатков Лиспа является то, что когда много функций вложены, круглые скобки могут сбивать с толку. Современные среды Lisp помогают обеспечить совпадение скобок. Кроме того, Лисп поддерживает императивные языковые операции оператора присваивания и циклов перехода. Кроме того, Лисп не заботится о типах данных элементов во время компиляции. Вместо этого он назначает (и может переназначать) типы данных во время выполнения . Назначение типа данных во время выполнения называется динамической привязкой . [84]Хотя динамическое связывание повышает гибкость языка, ошибки программирования могут сохраняться до самого конца процесса разработки программного обеспечения .
Написание больших, надежных и читаемых программ на Лиспе требует предусмотрительности. При правильном планировании программа может оказаться намного короче, чем эквивалентная программа императивного языка . Lisp широко используется в области искусственного интеллекта . Однако его использование было принято только потому, что оно содержит императивные языковые операции, что делает возможными непредвиденные побочные эффекты.
Пролог (1972) означает «Программирование в ЛОГИКЕ». Это язык логического программирования , основанный на формальной логике . Язык был разработан Аленом Кольмерауэром и Филиппом Русселем в Марселе, Франция. Это реализация метода выборочного линейного определенного предложения , впервые предложенного Робертом Ковальски и другими в Эдинбургском университете .
Строительными блоками программы на Прологе являются факты и правила . Вот простой пример:
Практическое применение Пролога — представление знаний и решение задач в области искусственного интеллекта .
Объектно-ориентированное программирование — это метод программирования для выполнения операций ( функций ) над объектами . Основная идея состоит в том, чтобы сгруппировать характеристики явления в контейнер объекта и дать контейнеру имя. Операции над явлением также группируются в контейнер. Объектно-ориентированное программирование, разработанное путем объединения потребности в контейнерах и необходимости безопасного функционального программирования . Этот метод программирования не обязательно ограничивается объектно-ориентированным языком . В объектно-ориентированном языке объектный контейнер называется классом . В необъектно-ориентированном языке структура данных (также известная как запись ) может стать контейнером объекта. Чтобы превратить структуру данных в контейнер объектов, необходимо написать операции специально для этой структуры. Полученная структура называется абстрактным типом данных . Однако наследование будет отсутствовать. Тем не менее, этот недостаток можно преодолеть.
Формальная стратегия создания объектно-ориентированных объектов заключается в следующем:
Например:
Синтаксис языка программирования представляет собой список правил производства , которые управляют его формой . Форма языка программирования — это правильное размещение его объявлений , выражений и операторов . Синтаксис языка дополняет его семантика . Семантика описывает значения, приписываемые различным синтаксическим конструкциям . Синтаксической конструкции может потребоваться семантическое описание, поскольку форма может иметь неверную интерпретацию. Кроме того, разные языки могут иметь одинаковый синтаксис; однако их поведение может быть разным.
Синтаксис языка формально описывается путем перечисления правил производства . Хотя синтаксис естественного языка чрезвычайно сложен, подмножество английского языка может иметь следующий список правил производства:
Слова, выделенные жирным шрифтом , известны как «нетерминалы». Слова в одинарных кавычках известны как «терминалы».
Из этого списка правил производства можно составить полные предложения с помощью серии замен. Процесс заключается в замене нетерминалов либо действительным нетерминалом , либо действительным терминалом . Процесс замены повторяется до тех пор, пока не останутся только клеммы . Одно допустимое предложение:
Однако другая комбинация приводит к недопустимому предложению:
Следовательно, для правильного описания значения пищевого действия необходима семантика .
Один из методов составления списка продукционных правил называется формой Бэкуса – Наура (BNF). BNF описывает синтаксис языка и сам имеет синтаксис . Это рекурсивное определение является примером метаязыка . Синтаксис BNF включает :
::=
что переводится как состоит из [n], когда нетерминал находится справа от него. Это переводится как « когда терминал находится справа».|
что переводится как или .<
и >
которые окружают нетерминалы .Используя BNF, подмножество английского языка может иметь следующий список правил производства :
< предложение > ::= < существительная-фраза >< глагол-фраза >
< существительная-фраза > ::= < статья >< прилагательное >< существительное >
< глагол-фраза > ::= < глагол >< существительная-фраза >
< статья > :: = < прилагательное
> ::= большой | маленький
< имя существительное > ::= кот | мышь
< глагол > ::= ест
Используя BNF, целое число со знаком имеет список правил продукции :
< целое число со знаком > ::= < знак >< целое число >
< знак > ::= + | -
< целое число > ::= < цифра > | < цифра >< целое число >
< цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Обратите внимание на правило рекурсивного производства:
< целое число > ::= < цифра > | < цифра >< целое число >
Это открывает бесконечное количество возможностей. Следовательно, необходима семантика для описания ограничения количества цифр.
Обратите внимание на возможность ведущего нуля в правилах производства:
< целое число > ::= < цифра > | < цифра >< целое число >
< цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Следовательно, необходима семантика , чтобы описать, что ведущие нули следует игнорировать.
Для описания семантики доступны два формальных метода . Это денотативная семантика и аксиоматическая семантика
До появления языков программирования Бетти Дженнингс и Фрэн Билас программировали ENIAC , перемещая кабели и устанавливая переключатели.
Программная инженерия — это различные методы создания качественного программного обеспечения. Компьютерное программирование — это процесс написания или редактирования исходного кода . В формальной среде системный аналитик будет собирать информацию от менеджеров обо всех процессах организации, которые необходимо автоматизировать. Затем этот специалист готовит подробный план новой или модифицированной системы. План аналогичен проекту архитектора
Целью системного аналитика является предоставление нужной информации нужному человеку в нужное время. Решающими факторами для достижения этой цели являются:
Достижение целевых показателей должно быть сбалансировано со всеми затратами, включая:
Применение процесса разработки систем смягчит аксиому: чем позже в процессе обнаруживается ошибка, тем дороже ее исправить.
Водопадная модель представляет собой реализацию процесса разработки систем . Как следует из обозначения каскада , основные фазы перекрывают друг друга:
Программист — это специалист, ответственный за написание или изменение исходного кода для реализации подробного плана. Вероятно, потребуется группа программистов, поскольку большинство систем слишком велики, чтобы их мог выполнить один программист. Однако добавление программистов в проект не может сократить время завершения. Вместо этого это может снизить качество системы. Чтобы быть эффективными, программные модули должны быть определены и распространены среди членов команды. Кроме того, члены команды должны взаимодействовать друг с другом осмысленно и эффективно.
Компьютерные программисты могут программировать в малом : программировать в рамках одного модуля. Скорее всего, модуль будет выполнять модули, расположенные в других файлах исходного кода. Следовательно, программисты могут программировать большие программные модули, чтобы они эффективно сочетались друг с другом. Программирование в целом включает в себя участие в разработке интерфейса прикладного программирования (API).
Модульное программирование — это метод усовершенствования программ на императивном языке . Усовершенствованные программы могут уменьшить размер программного обеспечения, разделить обязанности и тем самым смягчить старение программного обеспечения . Программный модуль — это последовательность операторов, ограниченных внутри блока и вместе идентифицируемых именем. Модули имеют функцию , контекст и логику :
Имя модуля должно определяться сначала по его функции , а затем по его контексту . Его логика не должна быть частью названия. Например, function compute_square_root( x )
или function compute_square_root_integer( i : integer )
— соответствующие имена модулей. Однако function compute_square_root_by_division( x )
это не так.
Степень взаимодействия внутри модуля — это уровень его сплоченности . Связность — это оценка связи между именем модуля и его функцией . Степень взаимодействия между модулями — это уровень связанности . Связывание — это оценка взаимосвязи между контекстом модуля и элементами, над которыми выполняется выполнение.
Уровни сплоченности от худшего к лучшему таковы:
function read_sales_record_print_next_line_convert_to_float()
. На практике случайная сплоченность возникает, если руководство навязывает глупые правила. Например: «Каждый модуль будет иметь от 35 до 50 исполняемых операторов». 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()
.Уровни связи от худшего к лучшему таковы:
perform_arithmetic( perform_addition, a, b )
. Вместо этого контроль должен осуществляться за составом возвращаемого объекта.
Пример диаграммы потока данных функционального уровня
Анализ потока данных — это метод проектирования, используемый для достижения модулей функциональной связности и связи данных . Входными данными для метода является диаграмма потока данных . Диаграмма потока данных представляет собой набор овалов, представляющих модули. Имя каждого модуля отображается внутри его овала. Модули могут находиться на уровне исполняемого файла или уровне функции.
На схеме также есть стрелки, соединяющие модули друг с другом. Стрелки, указывающие на модули, представляют собой набор входных данных. Каждый модуль должен иметь только одну стрелку, указывающую из него, чтобы представить его единственный выходной объект. (Необязательно, дополнительная стрелка исключения указывает.) Цепочка овалов будет отображать весь алгоритм . Модули ввода должны начинать диаграмму. Модули ввода должны подключаться к модулям преобразования. Модули преобразования должны подключаться к модулям вывода.
Диаграмма, показывающая, как пользователь взаимодействует с прикладным программным обеспечением . Прикладное программное обеспечение взаимодействует с операционной системой , которая взаимодействует с аппаратным обеспечением .
Компьютерные программы можно разделить по функциональным признакам. Основными функциональными категориями являются прикладное программное обеспечение и системное программное обеспечение . Системное программное обеспечение включает в себя операционную систему , которая объединяет аппаратное обеспечение компьютера с прикладным программным обеспечением. Целью операционной системы является создание среды, в которой прикладное программное обеспечение выполняется удобным и эффективным образом. Как прикладное, так и системное программное обеспечение выполняют служебные программы . На аппаратном уровне программа микрокода управляет схемами центрального процессора .
Прикладное программное обеспечение является ключом к раскрытию потенциала компьютерной системы. Программное обеспечение предприятия объединяет приложения бухгалтерского учета, персонала, клиентов и поставщиков. Примеры включают планирование ресурсов предприятия , управление взаимоотношениями с клиентами и программное обеспечение для управления цепочками поставок .
Корпоративные приложения могут разрабатываться собственными силами как единственное в своем роде проприетарное программное обеспечение . Альтернативно их можно приобрести как готовое программное обеспечение . Приобретенное программное обеспечение может быть модифицировано для предоставления специального программного обеспечения . Если приложение кастомизировано, то используются либо ресурсы компании, либо ресурсы передаются на аутсорсинг. Аутсорсинговая разработка программного обеспечения может осуществляться исходным поставщиком программного обеспечения или сторонним разработчиком.
Потенциальными преимуществами собственного программного обеспечения являются функциональные возможности и возможность разработки отчетов в точном соответствии со спецификациями. Руководство также может участвовать в процессе разработки и обеспечивать определенный уровень контроля. Руководство может принять решение противодействовать новой инициативе конкурента или реализовать требования клиента или поставщика. Слияние или поглощение может потребовать внесения изменений в корпоративное программное обеспечение. Потенциальными недостатками собственного программного обеспечения являются значительные затраты времени и ресурсов. Кроме того, могут возникнуть риски, связанные с характеристиками и производительностью.
Потенциальные преимущества готового программного обеспечения заключаются в том, что первоначальные затраты можно определить, основные потребности должны быть удовлетворены, а его производительность и надежность имеют послужной список. Потенциальные недостатки готового программного обеспечения заключаются в том, что оно может иметь ненужные функции, которые сбивают с толку конечных пользователей, в нем могут отсутствовать функции, необходимые предприятию, а поток данных может не соответствовать рабочим процессам предприятия.
Один из подходов к экономичному получению специализированного корпоративного приложения – через поставщика услуг приложений . Специализированные компании предоставляют оборудование, специальное программное обеспечение и поддержку конечных пользователей. Они могут ускорить разработку новых приложений, поскольку обладают квалифицированным персоналом по информационным системам. Самым большим преимуществом является то, что это освобождает внутренние ресурсы от укомплектования персоналом и управления сложными компьютерными проектами. Многие поставщики услуг приложений нацелены на небольшие, быстрорастущие компании с ограниченными ресурсами информационных систем. С другой стороны, более крупные компании с крупными системами, скорее всего, будут иметь свою техническую инфраструктуру. Одним из рисков является необходимость доверить конфиденциальную информацию внешней организации. Другой риск — необходимость доверять надежности инфраструктуры провайдера. [
Программа, процесс и планирование потоков , вытеснение , переключение контекста
Операционная система — это низкоуровневое программное обеспечение, которое поддерживает основные функции компьютера, такие как
продолжение следует...
Часть 1 Компьютерная программа, ее особенности и способы описания
Часть 2 Программная инженерия и компьютерное программирование - Компьютерная программа, ее особенности
Часть 3 Вау!! 😲 Ты еще не читал? Это зря! - Компьютерная программа, ее особенности и способы описания
Комментарии
Оставить комментарий
Разработка программного обеспечения и информационных систем
Термины: Разработка программного обеспечения и информационных систем