Быстрая разработка

Содержание

Преимущества концепции графического программирования NI LabVIEW
Краткая история развития высокоуровневого программирования
Преимущества программирования на языке G Интеграция языка G с другими языками
Оптимальный способ решения ваших задач


Преимущества концепции графического программирования NI LabVIEW

Более 20 лет инженеры и ученые используют NI LabVIEW для разработки измерительных систем, испытательных стендов и систем управления. В основе LabVIEW лежит графический язык программирования G. Помимо самой возможности программирования среда LabVIEW предоставляет в распоряжение пользователя широкий спектр инструментов и библиотек: от интерактивных мастеров настройки и пользовательских интерфейсов до встроенных компилятора, компоновщика и средств отладки.


Краткая история развития высокоуровневого программирования

Чтобы лучше понять основные преимущества концепции графического программирования, стоит обратиться к истории появления первого высокоуровневого языка. В середине 50-х годов XX века, на заре развития компьютерной техники, небольшое подразделение в IBM разработало альтернативный способ программирования суперкомпьютеров IBM 704 – язык FORTRAN. В отличие от существовавшего в то время низкоуровневого языка, предложенный специалистами язык был ближе к прикладной области, проще воспринимался человеком и позволял ускорить процесс разработки.

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

Несмотря на то, что высокоуровневые языки все время совершенствуются, вопрос повышения удобства и скорости работы остается актуальным и на сегодняшний день. Это объясняет популярность и широкое распространение языка G, с тех пор как он появился в 1986 году. Этот язык предоставляет максимально возможный уровень абстракции, что позволяет пользователям работать более эффективно, практически не проигрывая в производительности кода таким языка как FORTRAN, C и C++.

LabVIEW: графическое потоковое программирование

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

image002.jpg
Рис.1. Условный цикл (цикл While) представлен в языке G в виде интуитивно понятной структуры, которая циклически выполняется до тех пор, пока не будет достигнуто условие выхода из цикла 

Вторая отличительная особенность LabVIEW - это поддержка выполнения кода, написанного на языке G, в режиме потока данных (потоковое программирование), в то время как традиционные текстовые языки (например, C и C++) обеспечивают выполнение кода в виде последовательности команд. В основе языков потокового программирования (таких как G, Agilent VEE, Microsoft Visual Programming Language и Apple Quartz Composer) лежит концепция потока данных, который и определяет последовательность выполнения функциональных узлов программы.

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


Преимущества программирования на языке G

Интуитивное использование средств графического языка

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

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

image003.jpg
Рис.2. Данные появляются в результате работы функции сбора данных, а затем передаются узлу анализа и, следом за ним, узлу сохранения результатов в файл

Интерактивные средства отладки


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

image004.jpg
Рис.3. Анимация выполнения наглядно демонстрирует последовательность выполнения кода G

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

image005.jpg
Рис. 4. На инструментальной панели блок-диаграммы расположены пиктограммы стандартных отладочных средств (например, пошаговое выполнение кода)

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

image006.jpg
Рис.5. Пробники – это эффективный способ увидеть, какие именно данные распространяются по проводникам, в том числе и по параллельным ветвям
image007.jpg
Рис.6. Значения всех пробников в приложении, включая подпрограммы, представлены в окне Probe Watch

Одна из отличительных особенностей процесса отладки в LabVIEW – это скрытое компилирование кода. Пока вы работаете с кодом, компилятор постоянно проводит семантический и синтаксический анализ кода. В случае обнаружения ошибок, блокируется возможность выполнения программы, а на инструментальной панели отображается пиктограмма со сломанной стрелкой.
image008.jpg
Рис. 7. Сломанная стрелка запуска (Run arrow) говорит об ошибках в коде G

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

image009.jpg
Рис.8. В окне с перечнем ошибок дано подробное описание каждой ошибки

Автоматическое распараллеливание

Языки потокового программирования, такие как LabVIEW, позволяют автоматически распараллеливать выполнение кода. В отличие от языков с последовательным выполнением команд, таких как C и C++, графические языки изначально содержат в себе информацию о том, какие участи кода следует выполнять параллельно. Рассмотрим, к примеру, шаблон проектирования «Производитель/Потребитель», в котором два цикла While выполняются независимо: первый цикл генерирует или получает данные, а второй – обрабатывает их. Несмотря на то, что циклы выполняются параллельно, данные между ними успешно передаются с помощью механизма очередей, которые поддерживаются и в стандартных языках.

image010.jpg
Рис. 9. Шаблон проектирования LabVIEW «Производитель/Потребитель» часто используется для увеличения производительности приложений с несколькими параллельно решаемыми задачами

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

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

Явное преимущество языка G по сравнению с обычными текстовыми языками программирования заключается в том, что реализация многопоточных приложений является весьма простой задачей. Встроенный компилятор самостоятельно определяет участки кода, имеющие параллельно расположенные узлы, и организует раздельные потоки для их параллельного исполнения. В компьютерной терминологии такой механизм называется «неявный параллелизм», т.е. реализация параллелизма осуществляется автоматически средствами разработки, а не специально написанным кодом.

Помимо поддержки многопоточности на многоядерных системах, язык G позволяет создавать приложения для параллельных вычислений на ПЛИС – интегральных микросхемах с программируемой логикой, в которых выполнение независимых участков кода организуется абсолютно независимыми участками микросхемы, которые не влияют на производительность друг друга.

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

image011.jpg
Рис.10. Параллельные ветви кода в LabVIEW FPGA выполняются независимыми участками микросхемы ПЛИС параллельно


Уровень абстракции низкоуровневых операций

В примере с языком FORTRAN было показано, что уровни абстракции, обеспечиваемые языками высокого уровня – их главное преимущество, которое проявляется в более наглядном виде кода по сравнению с низкоуровневыми языками. Язык G автоматически обеспечивает выполнение ряда задач (например, управление памятью), которое в текстовых языках обычно ложится на плечи разработчика. В подобных случаях вы самостоятельно должны обеспечить выделение памяти перед ее использованием и освобождение – после, а также следить за тем, чтобы не выйти за границы выделенной области. Наиболее серьезные ошибки в текстовых языках вызваны именно отсутствием или недостаточным выделением памяти. Кроме того, недостаточное выделение памяти еще и трудно диагностировать в ходе отладки.

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

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

image012.jpg
Рис.11. Управление памятью в LabVIEW реализуется автоматически, однако специалисты при необходимости могут использовать информацию по работе с памятью для оптимизации кода

Если программа, написанная на языке G, демонстрирует неожиданные результаты, вы можете воспользоваться как упомянутыми выше средствами отладки, так и инструментарием для продвинутых пользователей, а именно – тулкитом Desktop Execution Trace Toolkit, который позволяет провести динамический анализ кода на наличие:

  • •    Утечек памяти и ошибки ссылок/указателей
  • •    Участков кода, вызывающих не желаемое поведение программы
  • •    Участков программы, на которых может быть увеличена производительность
  • •    Определение вызова предшествующего ошибке
  • •    Сравнение работы кода на разных платформах

image013.jpg
Рис.12. Если вам необходима низкоуровневая отладка приложения, вы можете воспользоваться тулкитом LabVIEW Desktop Execution Trace, чтобы заглянуть внутрь процесса выполнения приложения


Интеграция языка G с другими языками

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

Например, в LabVIEW есть узел, называющийся Formula Node, который позволяет рассчитывать значения по текстовым формулам и выполнять текстовые программы с C-подобным синтаксисом.
image014.jpg
Рис.13. Узел Formula Node позволяет внедрить в программу компактный текстовый код, используя C-подобный синтаксис для математических операций

Аналогично, узел MathScript Node позволяет встраивать в программу на LabVIEW код .m файлов
image015.jpg
Рис.14. С помощью узла MathScript (MathScript Node) вы можете создавать и использовать .m файлы для обработки сигналов и анализа данных


Оптимальный способ решения ваших задач

Графический язык и концепция потокового программирования LabVIEW позволяет вам решать задачи более удобными и эффективными методами, чем традиционные текстовые языки. Ключевые особенности программирования на языке G, а именно интуитивно понятный и наглядный графический код, а также управляемое потоком данных выполнение программы, позволяют сделать процесс программирования более близким к процессам мышления, чем другие языки. Несмотря на высокий уровень абстракции кода, производительность программ, написанных в среде LabVIEW, остается сопоставимой с языками типа C, благодаря встроенному компилятору кода.
 


 

© 2016 National Instruments Russia. All rights reserved.
Яндекс.Метрика