Практичность систем программирования — КиберПедия 

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

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Практичность систем программирования

2021-01-31 121
Практичность систем программирования 0.00 из 5.00 0 оценок
Заказать работу

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

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

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


 

 

решение задач разработки надежных и удобных средств работы с большеобъ- емными данными.

 
Объем описаний новых языков программирования (ЯП) нередко превы- шает пятьсот страниц (Java, Haskell, C#, Scala, F#), а разрабатываемые опре- деления новых стандартов на традиционные ЯП приближается к полутора тысячам страниц (C++) с пропорциональным возрастанием количества тесто- вого материала при отладке систем программирования (СП) для таким обра- зом определенного ЯП. Кроме того ряд проблем реализации СП связан со слабой структурированностью таких описаний и определений, не вполне со- ответствующей логике разработки и конструирования программных систем. Практика минимизации трудозатрат на создание инструментальной под- держки полного жизненного цикла задач автоматизации программирования препятствует успеху компонентного подхода к разработке СП, требующего более практичных критериев декомпозиции программ. Еще Фр. Брукс в своей знаменитой книге отмечал, что трудоемкость решения задачи в виде компо- нента программы примерно в три раза выше трудоемкости разработки авто- номной программы, а трудоемкость создания компонента для многопро- граммного комплекса еще выше31.

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

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

 

31 Брукс Ф. Мифический человеко-месяц, или Как создаются программные системы = The mythical Man-Month: Essays on Software Engineering. М.: Символ-Плюс, 2010. 304 с.


 

 

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

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

 
Вскоре после появления раздельной компиляции, воплощенной при раз- работке языка Fortran, была представлена четкая концепция решения про- блем разработки систем программирования по Венской методике определе- ния языков программирования на базе абстрактного синтаксиса (АС) и аб- страктной машины (АМ)33. Убедительный эксперимент по воплощению этого метода фактически произошел при реализации СП для языка Lisp, ис- пользующей взаимодействие интерпретатора и компилятора при организа- ции памяти со «сборкой мусора» с выделением базовой семантики в виде подъязыка Pure Lisp [22]. Роль абстрактного синтаксиса выполнил язык S-выражений, реализованный в виде списков и позднее послуживший осно- вой для парадигмы функционального программирования. В дальнейшем ра- боты по языкам Алмо, Альфа, Сигма и внутреннему языку системы БЕТА показали перспективность многопроходной компиляции и оптимизации про- грамм при ограниченных ресурсах. Появление синтаксических конструкто- ров YACC и LEX над языком Си определило доминирование решения про- блем машинно-зависимого переноса через сведение реализационной прагма- тики разных языков к ядру языка Си. Объектно-ориентированное

 

32 Фуксман А. П. Технические аспекты создания программных систем. М.: Статистика, 1979. 180 с.

33 Lucas P., Lauer P., Stigleitner H. Method and Notation for the Formal Definition of Pro- gramming Languаges. IBM Laboratory. Venna, TR 25.087, 1968.


 

 

 
программирование на базе классов объектов в С++ дало технику уточнения программных компонентов по мере эволюции постановки задачи. Целена- правленная попытка компонентного подхода к проблеме разработки СП на базе специально созданного внутреннего языка предпринята в проекте.Net и в других подобных проектах. По всем этим линиям был достигнут опреде- ленный успех, но не образовал достаточную базу программотехники для ав- торов новых ЯП.

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

 
Экстенсивное порождение предметно-ориентированных языков в XXI веке знаменует переход к методике конструирования компьютерных языков в качестве средства, позволяющего пользователю, умеющему рабо- тать с текстами, таблицами и визуальными оболочками на уровне Word-Excel и Visual-Studio, формировать грамматики, накрывающие пространство по- нятных решений текущих задач34. Происходящее в этом процессе уточнение такого пространства приводит к проблеме минимизации объема изменений, возникающих в ранее сложившихся парадигмах программирования, нацелен- ных на борьбу за эффективность однопроцессорных программ над оператив- ной памятью, рассчитанных на надежность хранения данных на носителях, допускающих защиту и контроль.

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

 

 

34 Статья Руслана Хайрова про особенности LLVM [Электронный ресурс]. Режим доступа: https://habrahabr.ru/post/47878.


 

 

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

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

 

Семантическая декомпозиция

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

Основой факторизации СП служит семантическая декомпозиция опреде- ления ЯП в предложенных С. С. Лавровым терминах, расширяющих понятие

 
«алгебраическая система» заданием явного правила вычислений.

Семантическая система: <V, F, R> - множество, функции, правило

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


 

 

Обычно для любого множества значений V реализационно различимы ме- тоды вычислений (V* → V), средства доступа к памяти (T: N → V), особен- ности управления вычислениями ({0|1}: K) и обратимой комплексации дан- ных (E ↔ S). На уровне базовой семантики существенные отличия можно представить следующим образом:

Таблица 37

Семантическая декомпозиция минимального ядра определения ЯП

Цель Класс V V* → V T: N → V {0|1}: K E ↔ S
Ядро Значение Вычисления Память Управление Структуры

 
Ядро – семантический базис, позволяющий остальное определение ЯП получать как консервативное расширение ядра.

Значение – минимальное представление объектов из области приложе- ния языка.

Вычисления – минимальный комплект операций для обработки значе- ний.

Память – из V выделяются идентификаторы для лаконичного представ- ления значений (адреса, переменные, метки).

Управление – разметка выполнимости последовательности элементов программы из (действий = операций) специально выбранными значениями, например, {0|1}.

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

Повышение уровня ЯП обеспечивается средствами укрупнения данных, что приводит к понятию «иерархия» и оперирование блоками программы.

Таблица 38

Семантическая декомпозиция макрорасширения ядра определения ЯП

Цель Класс V V* → V T: N → V {0|1}: K E ↔ S
Ядро Значение Вычисления Память Управление Структуры
Макро Данное Функции Задание Блоки Иерархия

Макро – укрупнение конструкций для лаконизма, наследования отлажен- ности и исключения дублей.

Данное – хранимое значение, допускающее уникальность экземпляра.


 

 

Функции – укрупнение операций с возможной параметризацией операн- дов.

Задание – хранимое выражение с возможность многократного выполне- ния.

 
Блоки – ветвления, циклы, вызовы функций с локализацией переменных.

Иерархия – схема организации программ и данных в ЯВУ, возможно с защитой независимых ветвей.

Возрастание объемов программ достигается отчасти автоматизацией кон- троля некоторых условий корректности применения операций и функций к их операндам. Становится важным понятие «предикат» и «тип переменных», удобно проверяемых при компиляции.

 

Таблица 39

Семантическая декомпозиция дигностического расширения ядра определения ЯП

Цель Класс V V* → V T: N → V {0|1}: K E ↔ S
Ядро Значение Вычисления Память Управле- ние Структуры
Макро Данное Функции Задание Блоки Иерархия
Контроль Диагно- стика Предикаты Типы пере- менных Проверка границ Ч. у. м.

Контроль – проверка вычислимости выражений и выполнимости про- грамм.

Диагностика – выбор истиностных значений {T|F} для разметки нужных действий или значения «Error» для диагностических сообщений.

Предикаты – позволяют определять типы значений независимо от места расположения в памяти.

Типы переменных – связывание типа значения с переменной, хранящей его в памяти.

Проверка границ – соответствие ТД операциям доступа к памяти.

Ч. у. м. – перебор равноправных как механизм удостоверения выполни- мости, если удалось (частично упорядоченное множество).

 

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


 

 

Таблица 40 Семантическая декомпозиция дополнения для обеспечения производительности

 
ядра определения ЯП

 

Цель Класс V V* → V T: N → V {0|1}: K E ↔ S
Ядро Значение Вычисления Память Управление Структуры
Макро Данное Функции Задание Блоки Иерархия
Контроль Диагно- стика Предикаты + Error Типы пере- менных Проверка Ч. у. м.
Надеж- ность Исключе- ния   Отношения Просачива- ние операций Простран- ства итери- рования   Комплексы

 

Надежность – дополнение ЯП средствами обеспечения качества про- грамм при отладке.

Исключения – _|_ Error, Future – специальные значения и ловушки. Отношения – декларативное объявление контролируемых зависимостей. Просачивание операций – неявное расширение области действия опера-

ций.

Пространства итерирования – запараллеливание тела цикла – многопо- точность.

Комплексы – средство повышения эксплуатационных характеристик программы тиражированием готового или подобного.

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

 

Трансформационная семантика

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

 

35 Сайт энтузиастов разработки новых языков программирования. URL: http://compiler.su.


 

 

операционную семантику, а также выбрать реализационное ядро системы программирования при его экспериментальной раскрутке. Задача трансфор- мационной семантики – сведение программы к нормализованной форме, удобной для интерпретации программ или генерации масштабируемого ис- полнимого кода. В случае многопоточных программ преобразование сети по- токов может быть нацелено на сведение к однородной системе потоков, од- нозначно отображаемых на заданный комплекс процессоров – размещение потоков по процессам или назначение процессоров для выполнения потоков. В такой «причесанной» форме все потоки могут начинаться с барьеров, и общая шкала событий упорядочена так, что последовательность событий по- тока ей не противоречит. Можно считать, что процессоры включаются сами. Шкала событий содержит списки ожидающих потоков. Действия, выполняе-

мые процессорами, соотнесены с их исходными потоками.

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

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

границ их применимости.

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

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


 

 

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

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

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

 


Поделиться с друзьями:

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.061 с.