
- •Содержание (Технология программирования)
- •2. Определение алгоритма. Пример алгоритма. Пять основных свойств алгоритма. Сущность алгоритмизации.
- •3. Понятие алгоритмического языка. Основные достоинства и недостатки программирования на алгоритмическом языке
- •4. Языки программирования высокого уровня. Поколения и топология языков программирования высокого уровня с примерами (по г. Бучу).
- •5. Интерпретаторы и компиляторы. «За» и «против». Структура. Понятие Байт-кода (p-Code) в языке Java. Языки 4gl.
- •6. Транслятор. Редактор связей. Загрузчик. Назначение и принципы функционирования.
- •7. Понятие исходного, объектного, загрузочного модулей. Назначение.
- •8. Понятие программы, подпрограммы, функции. Способы передачи и возврата параметров в подпрограммы и функции.
- •9. Основные принципы структурного программирования.
- •10. Модели управления в программных системах: централизованное управление, управление, основанное на событиях.
- •11. Структура событийно-управляемой программы для платформы Win32
- •25. Понятие интерфейса. Язык описания интерфейсов idl (midl).
- •26. Стандартная библиотека шаблонов stl. Основные концепции: контейнер, алгоритм, итератор, поток.
- •27. Представление в машине символьной информации. Кодировки ascii, mbcs, ansi, Unicode. Строки ascii-z, Pascal, bstr.
- •28. Признаки сложных систем согласно общей теории систем. Примеры систем (выделить в них признаки).
- •29. Сложность, присущая программному обеспечению. Составляющие сложности программного обеспечения по ф. Бруксу.
- •3 0. Эволюция системного программного продукта. Понятие и составляющие программы, программного комплекса, программного продукта, системного программного продукта (по ф. Бруксу)
- •31. Борьба со сложностью в программном обеспечении. Эволюция методов анализа и разработки (sa/sd, ooa/ood).
- •32. Жизненный цикл программного обеспечения. Фазы жц, их характеристики артефакты.
- •33. Модели жизненного цикла разработки программного обеспечения. Сравнение моделей.
- •35. Производительность труда программиста. Различия в прогах опытного программиста и новичка по ф. Бруксу.
- •36. Распределение стоимости разработки программного обеспечения по технологическим стадиям создания.
- •37. Язык uml. История создания. Область применения. Виды диаграмм uml для описания системы.
- •38. Программирование на основе шаблонов (паттернов). Роль шаблонов проектирования в борьбе со сложностью программного обеспечения. Будущее шаблонов.
- •39. Понятия связанности (Coupling) и зацепления (Cohesion) в сложных программных системах. Связанность и зацепление классов, модулей, компонентов.
- •40. Ошибки программирования: переполнение буфера. Понятие безопасного программного кода.
- •41. Оптимизация программного кода. Основные возможности оптимизации кода программистом и компилятором.
- •42. Оформление программ: основные пункты.
- •43. Процесс отладки программного обеспечения. Сложность отладки по. Методы поиска и устранения ошибок. Связь отладки с тестированием.
- •44. Понятие качества программного обеспечения. Составляющие и критерии качества. Обеспечение качества как процесс, а не этап. Международный стандарт iso 9000/9001.
- •46. Основы тестирования программного обеспечения методом «чёрный ящик» (функциональное тестирование). Роль прецедентов в функциональном тестировании.
- •47. Основы тестирования программного обеспечения методом «белый ящик» (структурное тестирование).
- •48. Понятие надежного по. Различие между надежностью аппаратуры и по.
- •49. Модели надёжности по. Сравнение моделей оценки надежности по. Перспективы построения «хороших» моделей оценки надежности по.
- •50. Динамические модели надежности программного обеспечения (Шумана).
- •51. Статические модели надежности программного обеспечения (Миллса).
- •52. Case - технологии (инструменты, системы, средства). Эволюция case - средств, их классификация, характеристики современных case - инструментов. Перспективы развития. (По Вендрову, Калянову).
- •53. Классификация средств разработки (case - инструментов).
- •54. Технологический скачок (тс) в программировании. Признаки технологического скачка. Исторические факты технологических скачков.
7. Понятие исходного, объектного, загрузочного модулей. Назначение.
Исходный модуль – исходный текст программы, написанный на каком-либо алгоритмическом языке. При программировании в коде исходный текст и исполняемый код идентичны.
Объект, получаемый транслятором в результате трансляции исходного модуля, называется объектный модуль. В этом модуле кроме машинных команд сохраняется информация об именах переменных, адресах команд, требующих модификации при объединении модулей в единую программу и отладочная информация. Далее эта информация используется программой редактором связей для получения загрузочного модуля.
Загрузочный модуль – программный модуль, представленный в форме, пригодной для загрузки в ОП для выполнения. Загрузочный модуль является конечным результатом действий программиста. Это исполняемый код, который может выполнятся на компьютере.
8. Понятие программы, подпрограммы, функции. Способы передачи и возврата параметров в подпрограммы и функции.
Программа – основная часть программы, которая получает управление от ОС в момент ее запуска, и которая в последующем определяет ход ее выполнения, в соответствии с заданным алгоритмом. Программа отвечает и за ее нормальное завершение – освобождение занимаемых ранее ресурсов. На языке C главная программа main – функция или WinMain для Windows.
Подпрограмма – программа, вызываемая другой программой или подпрограммой. Основное отличие от главной программы, то что она не настраивает окружающую среду. Предполагается, что это сделала главная программа. Подпрограмма же использует уже установленную среду. Подпрограмма выполняет действия по распределению памяти для собственных переменных и самой себя. Если все внутренние переменные подпрограммы живут только пока есть сама подпрограмма (языки C и Algol), то, разумеется, где-то должны выполняться действия по запросу и распределению памяти для переменных, а по завершению работы необходимо удалить из памяти ранее распределённые переменные. Кроме того, на входе подпрограммы выполняется «распаковка» входных параметров, а на выходе «упаковка» возвращаемого значения, если оно есть. Отсюда видно, что подпрограмма не может быть запущена самостоятельно. Она должна быть вызвана другой подпрограммой или главной программой. При этом вызывающая программа обязана обеспечить среду функционирования подпрограммы.
Использование подпрограмм экономит память, программа в целом становится короче, но работает такая программа чуть-чуть медленнее, так как тратится время на вызов подпрограммы. С другой стороны, при разбиении программы на подпрограммы лучше просматривается структура больших и сложных программ. Подпрограммы обеспечивают логическую сегментацию программы, облегчают отладку, снижают общее время отладки. Но самая главная ценность грамотно написанных подпрограмм в том, что их могут использовать другие программисты в других программах.
Подпрограммы делятся на два класса – процедуры и функции. Основное отличие процедур от функций заключается в том, что процедура может и не возвращать в главную программу результатов своих действий, а функция обязательно возвращает какой-либо результат. Список параметров, передаваемых в процедуры и функции, состоит из имен параметров и указания их типа. Примеры №1, объявления подпрограмм:
на языке Pascal: Procedure Pr(x1, x2: real; A: Integer);
на языке С: double Pr(double x1; double x2; int A);
Такая передача параметров называется передачей по значению. В момент вызова процедуры в памяти создаются временные переменные с именами x1, x2, A и в них копируются значения аргументов, передаваемых при вызове. На этом связь между аргументами и переменными разрывается. Можно изменять внутри процедуры значения x1, x2 и A, но это никак не отразится на значениях аргументов.
Существует ещё один способ передачи параметров в подпрограммы. Это так называемая передача параметров по ссылке. Пример №2,
на языке Pascal: Procedure Pr(var x1; x2: real; var A: Integer);
на языке С:
1) double Pr( int &x) // передается адрес переменной
{ x=x+1; return 0}
Pr(y); // вызов подпрограммы
2) double Pr(int *x); // передается указатель (косвенная адресация)
{ *x = *x+1; return 0}
Pr(&y); // вызов подпрограммы
В этом случае не происходит копирования значения аргумента в локальную, временную переменную в подпрограмме. Подпрограмма реально работает не с параметром, а со ссылкой – указателем на место хранения аргумента в памяти. Соответственно, любые изменения параметра x1, произведённые в подпрограмме, в действительности относятся не к этому параметру, а к тому аргументу, который передан при ее вызове.