ivanvlaskin1976

Category:

=== 80 == инфология ==

информация - это форма материи

инфология - это наука о формах материи


важнейшим в инфологии является

1.системотехника - наука о Системах

2.лингвистика - наука о интерфейсах Систем, уже описывалась в главе 53 - лингвистика человеческой речи

3.программирование - наука о формализации Систем

4.математика - наука о законах Систем


инфология сочетает объективность и субъективность


можно признать что целые числа и дробные числа обладают разным функционалом, однако традиции совмещают значения констант относящимся к разным Множествам функционалов


например скорость света в идеале равна 3*10^8 метра в секунду

а число пи в идеале равно арифметическая последовательность((-1)^n)/(1+2*n)),n=0..безконечность

отклонения от этих величин усложняют расчеты и делают их менее эффективными, однако из-за традиций

- скорость света принимется равной 299 792 45(8) метра в секунду

- число пи принимается равным 4*арифметическая последовательность((-1)^n)/(1+2*n)),n=0..безконечность = 3.1415926

- число экспоненты принимается равным 2+арифметическая последовательность(1/n!),n=2..безконечность = 2.71828

- exp(x)=1+x+арифметическая последовательность((x^n)/n!),n=2..безконечность


==

1.системотехника

Система может состоять из частей, имеющих следующие категории:

1.дерево - каталог объектов и других каталогов

2.ветвь - объект, базовый каталог характеристик

3.лист - характеристика объекта, базовая еденичная структура информации


все они адресуется своим личным идентификацационным именем

Система может иметь интерфейс связи с внешним миром, могущий быть представленным в самой Системе ветвями и листями


взаимодействуя друг с другом Системы могут образовывать МультиСистемы


автономная Система может иметь:

1.ядро - базовую её часть реализующую:

1.1 базовые функции

1.2 анализ информации

1.3 синтез информации

1.4 мировозрение анализа информации

1.5 мировозрение синтеза информации

2.инструментарий - набор функций

3.учебники - Базы Знаний методов применения функций

4.энциклопедии - Базы Знаний областей наук

5.область деятельности - область применения методов

6.область интерфейса ввода информации

7.область интерфейса вывода информации

8.область задач - поставленные Системе задачи

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


==

3.программирование


предупреждение: в написании этого труда похоже участвовало несколько авторов, когда писал я, Власкин Иван Иванович, дата рождения 1976-03-18, то я в начале абзацов писал текст без заглавных букв и в конце абзацев не ставил точки


Понятие алгоритма. Одним из фундаментальных понятий в информатике является понятие алгоритма. Происхождение самого термина «алгоритм» связано с математикой. Это слово происходит от Algorithm -  латинского написания имени Мухаммеда аль-Хорезми (787-850), выдающегося математика средневекового Востока.В XII в. был выполнен латинский перевод его математического трактата, из которго европейцы узнали о десятичной позиционной системе счисления и правилах арифметики многозначных чисел. Именно эти правила в то время называли алгоритмами. Сложение, вычитание, умножение столбиком, деление уголком многозначных чисел – вот первые алгоритмы в математике.


=====

программирование включает разные категории программирования:

1.по типу логики решения задания (редукция, индукция, дедукция)

2.по направлению синтеза решения (программирование "сверху", программирование "снизу")

3.по структуре реализации алгоритма (структурное или блочное)

4.по использованию функций (с функциями или без функций)


====

по типу логики решения задания существуют:

1.редукция - когда известны исходные данные и как их надо преобразовать - известно также как нисходящая декомпозиция или пошаговое усовершенствование

2.индукция - когда известен формат результата, формат исходных данных и надо создать алгоритм

3.дедукция - когда есть программа и надо понять смысл её работы - для этого надо абстрагировать алгоритм программы в автомат

в ходе программирования эти типы могут комбинироваться


для каждого типа программирования существует свой тип проверки правильности алгоритма программы

1.для редукции:

- берутся значения для которых известны правильные результаты и сравниваются с результатами программы

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

2.для индукции: берутся крайние значения и точки экстремума функций формата исходных данных и сравнивается результат работы программы с требуемым форматом исходных данных

3.для дедукции: представляется алгоритм программы как автомат, и определяется изза чего и в каких областях значений срабатывают переходы этого автомата


====

по направлению синтеза решения существуют:

1.программирование "сверху" или конструирование функции

=

достоинства:

1.Хорошо решает проблемы имеющие иерархический характер

2.Большая группа схожих проблем может быть идентифицирована и замещена одной функцией.

3.Каждая из этих проблем относительно мала и может характеризоваться малым числом параметров.

4.Каждая из проблем отличается от других (иначе говоря, унификация требует многократного использования проекта и его кода в каждой проблеме).

5.Нет включения сложных структур данных (иначе концептуальная автономия каждого прикладного модуля была бы потеряна).


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

=

недостатки:

1.Функциональную точку зрения трудно развивать.

 Каждая реальная система изменяется и эволюционирует. Нисходящий подход создает хорошую программную модель для исходных требований к системе. Но система изменяется, что ведет к появлению новых требований. Поэтому функциональная архитектура постепенно становится неуправляемой. Поскольку программное обеспечение разработано вокруг относительно фиксированной древовидной структуры, изменения обычно требуют длительного сокращения и прививания. Чистый и хорошо разработанный проект быстро становится "ужастиком", повествующим о новых и повисших связях. Сопровождение становится все более трудным, поскольку первоначальная архитектура медленно умирает с каждой новацией или изменением требований.

2.Реальные системы трудно охарактеризовать функционально.

 Многие из больших систем не имеют верхнего уровня. Например, система управления базой данных включает инструментальные средства для запроса данных, изменение данных, хранение непротиворечивых данных, и т.д. Нет какой-либо функции, являющейся самым важным звеном в этой системе. Определение этой системы в терминах одной функции верхнего уровня искусственно и приводит к чрезмерно сложным и неадаптивным архитектурам.

 "Одним из наиболее важных решений, принимаемым при разработке системы, является предположение о том, как сделать декомпозицию верхнего уровня. При нисходящем подходе это решение необходимо принять в начале процесса проектирования, то есть тогда, когда имеется минимум информации... Возможно, наиболее серьезная слабость в том, что нисходящее функциональное проектирование требует, чтобы система характеризовалась одной функцией наверху. Это сомнительное требование для многих современных систем, управляемых событиями".

3.Фокусирование на функциональности теряет из виду данные.

 Нисходящий проект не фиксирует информацию о данных, используемых в программе. Функции же всегда что-то делают с данными. Обычно, одни и те же данные разделены между функциями (например, модификации, удаления, вставки и запроса, работающих с таблицей базы данных). Так как декомпозиция только высвечивает функциональные аспекты проблемы, влияние структур данных на проблему оказывается потерянным.

4.Функциональная ориентация производит код, менее пригодный для многократного использования.

 При нисходящем проектировании осуществляется непрерывное дробление проблемы на все более простые части. Каждый кусок анализируется и специфицируется отдельно без сильной связи между ним и остальной частью системы. Это является одной из причин, по которой проектирование "сверху вниз" так эффективно на этапе анализа проблемы. Данный метод работает хорошо при начальном проектировании системы, и помогает получить спецификации для выявления и решения проблемы. Однако каждый элемент программы разработан только с ограниченными требованиями к памяти. Так как маловероятно, что точно такие же требования встретятся при решении следующей проблемы, проект программы и код не могут быть обобщены для многократного использования.

=

проблемы:

1.Когда необходимо иметь дело с более сложными проблемами приходится иметь индивидуальные подпрограммы со многими параметрами

 Большое число параметров будет делать подпрограмму трудно используемой и трудно сопровождаемой. Код, скорее всего, будет включать многочисленные вложения операторов if или case. Это кошмар при таких модификациях, как новые добавления к пространству состояний.

2.Когда необходимо иметь дело с более сложными проблемами приходится иметь много малых подпрограмм с небольшим числом параметров.

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

3.Синтез не препятствует созданию общих подпрограмм, которые разделяются между многими программами; но оно не поощряет этот процесс.


===

2.программирование "снизу":

=

достоинства:

1.Хорошо объединеняет повторно используемые программы и подпрограммы в систему

=

недостатки:

1.сложность программы, с увеличением числа переменных, функций и их комбинаций, возрастает в геометрической прогрессии, изза чего:

- сложно запомнить предназначение переменных, функций и адресных меток блоков

- с увеличением количества строк уходит много времени на поиск требуемого текста программы и перемотку к нему


====

по структуре реализации алгоритма существуют:

1.структурное программирование - представление программы в виде одной структуры с ветвением на подструктуры с помощью оператров if, for, case, switch, while, do

2.блочное программирование - представление программы в виде адресованных метками(label) блоков с переходами к ним по оператору goto


==

1.структурное программирование

=

позволяет:

1.возможность легкого заимстования кода в другие программы

2.возможность легкого мелкого улучшения программ

=

создает проблемы:

1.при большой вложенности циклов теряется читабельность программы

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

3.для проверки приходится в мозгу переводить все структуры в автомат


==

2.блочное программирование

=

позволяет:

1.возможность блочного программирования и как подраздел его - программирование автоматов (можно вместо goto использовать switch do и break, но это усложняет программу, теряет её наглядность и увеличивает количество её строк)

2.быструю скорость программирования

3.легкость понимания алгоритма кода

4.легкость проверки кода на корректность работы алгоритмов

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

=

создает проблемы:

1.можно потерять данные

2.можно потерять указатели

3.можно перепутать переменную изза использования одной и той же переменной для разных задач

4.если ваш работадатель узнает что вы в своем коде ставите goto вас могут уволить за якобы непрофессионализм, или если при приёме на работу в вашем тестовом задании увидят goto вам могут отказать в приёме на работу

5.вас могут презирать ваши коллеги программисты за использование goto как непрофессионала

6.ваш заказчик, если кто-нибудь ему сообщит что вы используете goto в программе, может отказать вам в заказе

7.ваша репутация может быть испорчена


====

по использованию функций существуют:

1.программирование с функциями

2.программирование без функций

=

достоинства функций:

1.более понятный текст программы, особенно если название функции описывает её действие

2.более короткий исходный код

3.экономия памяти ОЗУ

=

недостатки функций:

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

2.функция - это потеря времени на переходы и работу со стеком, потеря времени на резервное хранение параметров функции, потеря памяти на работу стека функции и её переменных


=====

Основное различие между традиционными структурными методологиями проектирования и более новыми объектно-ориентированными методологиями находится в их первичном фокусировании: 

Структурные методы проектирования фокусируются на функциях системы: "Что она делает". 

Объектно-ориентированные методы фокусируются на данных (объектах) системы: "Что делается с...".


Разработка программного обеспечения - это, прежде всего, нахождение способов получения качественного программного продукта

Качество программного обеспечения -

1.внешние характеристики (например, легкое в использовании, выполняется быстро)

2.внутренние характеристики (например, модульная конструкция, читабельный код).

 Внешние метрики - единственные, которые, в конце концов, действительно имеют значение. Никто, на самом деле, не заботится, насколько хорошую модульную конструкцию вы использовали при создании программы. Всех только заботит, чтобы она хорошо выполнялась. Однако, внутренняя (скрытая) метрика является ключом к созданию внешних, и при этом необходимо учитывать правила конструирования программ и технику программирования.


=====

параметры программы:

1.Корректность (правильность) -  Обеспечивает правильную обработку на правильных данных

2.Устойчивость - "Элегантно" завершает обработку ошибок

3.Расширяемость(масштабируемость) - Может легко адаптироваться к изменяющимся требованиям

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

5.Совместимость - Может легко использоваться с другим программным обеспечением

6.Эффективность - Эффективное использование времени, компьютерной памяти, дискового пространства и т.д.

7.Переносимость(кроссплатформенность) - Можно легко перенести на другие аппаратные и программные средства

8.Верификация - Простота проверки, легкость разработки тестов при обнаружении ошибок, легкость обнаружения мест, где программа потерпела неудачу, и т.д.

9.Поддержка целостности - Защищает себя от неправильного обращения и неправильного употребления

10.Легкость использования(интуитивно-понятный интерфейс) - Для пользователя и для будущих программистов

11.Читабельный код - Для легкости использования программистом алгоритма кода с целью его изменения или заимствования


====

1.Корректность

2.Устойчивость

Легко спутать термины "Корректная программа" и "Устойчивая программа". Корректная программа работает, когда поданы на вход правильные данные. Она отвечает всем требованиям к спецификации данных и не терпит неудачу внутри заданного диапазона. Устойчивость подразумевает не только правильность. Устойчивая программа способна обработать ситуации, не запланированные проектом. Эти ситуации включают некорректный ввод пользователя, аппаратный отказ и ошибки во время выполнения программы. Устойчивые системы терпят неудачу элегантно, без потери критических данных. Легко увидеть, что обе характеристики необходимы для любой системы, которая будет оценена как высококачественное программное обеспечение. Если система некорректна, то она бесполезна. Если система неустойчива, то она окажется неспособной справиться с задачей в реальной ситуации.


====

3.Расширяемость

Требований меняются. Это - один из бесспорных фактов процесса разработки программ. Высококачественная программа способна иметь дело с этими изменениями относительно безболезненно. Этот сорт адаптируемости - не является существенным для малых проектов, но становится определяющим, когда происходит "программирование в большом".

Два основных принципа создания расширяемого программного обеспечения:

=

3.1.сложность проекта.

Более простые проект и архитектура позволяют произвести изменения намного быстрее и легче, чем при сложном проекте.

термины сложность(вкл. аспекты - требования к эффективности алгоритмов,

емкость проектной задачи, наукоёмкость), ёмкость(объём работ и кол-во задач), наукоёмкость(исп. технологии).

Сложность бывает аналитическая, архитектурная и практическая.

Аналитическая - на стадии анализа задач и подбора алгоритмов. Самые сложные - недетерминированные и наукоёмкие алгоритмы.

Архитектурная - на стадии разработки\выбора архитектуры проекта.

Практическая - на стадии реализации(кодирования).

=

3.2.Декомпозиция.

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

=

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


====

4.Многократность (повторность) использования и совместимость

Многократное использование может просматриваться на различных уровнях: при анализе, проектировании, и реализации. 

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

=

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

=

Время и энергия, сохраненные через многократное использование, могут применяться для улучшения других характеристик качества программы (например, корректности или устойчивости).


====

5.Совместимость программного обеспечения

Мера того, насколько просто объединить различные программные изделия вместе для нового применения. Основы совместимости вытекают из общих проектных решений. Например, файловая система UNIX разработана таким образом, чтобы позволить малым инструментальным средствам хорошо работать вместе при решении сложных проблем. 

Противоположным примером является типичный беспорядок при совместной подготовке текстов и графических изображений. В этом случае, большие усилия должны быть затрачены на создание транслятора, которые позволяет одной программе работать с другой.


Совместимость и многократное(повторное) использование идут "взявшись за руки", потому что повторно используемое программное обеспечение (например, plug&play компоненты) должно быть совместимо с его новым окружением. Совместимое программное обеспечение поддерживает качество посредством использования прошлых усилий и подпорок при формировании новых систем. Программное обеспечение с низким коэффициентом совместимости требует огромных усилий, чтобы настроить систему на необходимое использование(кастомизация). Это усилие могло быть потрачено на проектирование лучшей системы или на улучшение эффективности кода.


====

Другие характеристики

Эти первые пять атрибутов качественного программного обеспечения (корректность, устойчивость, расширяемость, возможность многократного использования и совместимость) больше всего извлекают пользу при переходе от структурного к объектно-ориентированному подходу. Это не означает, что эффективность, переносимость, верификация, целостность и легкость использования имеют меньшее значение. Все перечисленные атрибуты важны при создании программного обеспечения истинно высокого качества.


=====

В работе "Научные основы доказательного программирования" А.П.Ершов выделял три вида программирования:

1.Синтезирующее (автоматическое, автоматизированное или ручное манипулирование знанием о задаче с синтезом соответствующей программы)

2.Сборочное (построение программы из уже существующих и корректных фрагментов)

3.Конкретизирующее (построение специализированных программ из универсальных заготовок). Их отображение на распространенные ныне парадигмы и языки программирования имеет следующий вид.

=

1.Синтезирующее программирование:

императивное (Паскаль, Си);

логическое (Пролог);

функциональное (Лисп);

параллельное (параллельный Паскаль, Оккам).

=

2.Сборочное программирование:

модульное (Модула-2, Ада);

компонентное (Эйфель, Component Pascal).

=

3.Конкретизирующее программирование:

объектно-ориентированное (Smalltalk, Си++, Оберон, Java);

шаблонно-ориентированное (Си++, Clarion).


=====

Литература:

1.Гари Уорен Кинг (Gary Warren King) - статья "Объектно-ориентированный подход действительно лучше структурного"

2.А.П.Ершов "Научные основы доказательного программирования" 

3.Руслан Богатырев "Об автоматном и асинхронном программировании" 

4.Зюбин В.Е. статья "Графические и текстовые формы спецификации сложных управляющих алгоритмов: непримиримая оппозиция или кооперация?"


==========

изучить:

Одной из таких удобных абстракций могут служить конечные автоматы, среди разновидностей которых стоит выделить трансдюсеры (transducer), автоматы Мили и Мура.

..

Однако при этом надо четко себе представлять, в чем их недостатки, а для этого придется обратиться к истокам программирования, к идеям "механического" вычисления. Как известно, они воплотились в таких формальных моделях, как машины Тьюринга (1936), комбинаторные процессы Поста (1936), нормальные алгоритмы Маркова (1951).

..

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


Сети Петри лучше всего подходят для описания любых асинхронных систем (асинхронное программирование), тогда как конечные автоматы - лишь для сугубо последовательных систем (автоматное программирование). (Система взаимосвязанных автоматов реализует параллельные системы - замечание Шалыто А.А.). Наглядность динамики и композиционные возможности сетей Петри выше (при различии понятий "позиция" и "состояние", что требует построения графа достижимых маркировок для определения функциональных возможностей сети Петри - замечание Шалыто А.А.), чем у конечных автоматов, но при этом компактность представления предпочтительнее у последних. Что касается отношения к машине Тьюринга, то достаточно расширить сеть Петри сдерживающими дугами (позволяющими определять отсутствие фишек в данной позиции), как она же становится эквивалентной машине Тьюринга. Очевидно, что чем "мощнее" абстракция, чем больше она позволяет синтезировать возможностей, тем хуже у нее дело обстоит с анализом. Иными словами, конечные автоматы анализировать гораздо проще, чем классические сети Петри и уж тем более чем машины Тьюринга.

==========

сырой материал


что узнать -

редукция

индукция

дедукция


трансдюсеры (transducer)

автоматы Мили и Мура

машины Тьюринга

комбинаторные процессы Поста

нормальные алгоритмы Маркова

сети Петри

==========



==

4.математика

предположительно важнейшее в математике это

1.теория Множеств

2.Логика

3.теория неравенств

4.теория совершенных и несовершенных пределов


4.1 теория Множеств

Множество — это большое количество, которое позволяет воспринимать себя как одно



Error

Anonymous comments are disabled in this journal

default userpic