Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
Описание языка программирования ARM-ГлаголОктябрь 2008 г.
Что на уме, то и на языке. Введение1. Условные обозначения2. Слова языка3. Объявления и области действия понятий4. Объявление постоянной5. Объявление вида5.1. Простые виды5.2. Вид РЯД5.3. Вид НАБОР5.4. Вид ДОСТУП5.5. Вид БЕГУНОК5.6. Вид ЗАДАЧА6. Объявление переменных7. Выражения7.1. Данные7.2. ДействияДействия над множествамиОтношения8. Указания8.1. ПрисваиваниеГлагол для АРМ Ноябрь 2006г. Описание среды разработки приложений реального времени для АРМ-процессоров на языке Глагол. Что на уме, то и на языке. СОДЕРЖАНИЕ
ВведениеУспех работы приложения настоящего времени зависит не только от быстродействия оборудования, но и, в большей степени, от чётко выстроенного кода. Для достижения последнего разработчику необходимо досконально разбираться в получаемом коде. Конечно, он не будет изучать каждую команду, выдаваемую преобразователем, но он должен хорошо представлять суть его работы. Правила преобразования должны быть довольно прозрачными. Этого можно достичь разумно простым языком с ясно определёнными выражениями, которые легко преобразуются в достаточно производительный для данного процессора код. Исходя из этого, была предпринята попытка определить подмножество языка Глагол для АРМ-процессора. На полном Глаголе был написан Малый Преобразователь Глагола (МПГ), который производит АРМ-код, работающий под управлением PocketPC. 1 Малый Преобразователь ГлаголаВсе исходные тексты МПГ поставляются в составе разработок на Глаголе. Для получения готового к работе файла \Глагол\Службы\МПГ.EXE необходимо запустить командный файл \Глагол\Приложения\МПГ\Построить.bat. При разработке МПГ верхний уровень преобразования был частично заимствован из полного Преобразователя Глагола (ПГ), а задачи, вырабатывающие код для целевого процессора, были переписаны заново. Для упрощения переноса преобразователя на другие ОС и другие процессоры было решено, чтобы МПГ производил не двоичный код, а текст на языке ассемблера целевого процессора. Предполагается, что далее этот текст будет переводиться в исполняемые приложения при помощи сторонних средств. 2 Изменения в языке2.1 ОграниченияПоскольку среда выполнения приложений настоящего времени не должна сильно нагружать процессор, то её было решено значительно упростить. В среде не осталось ни уборки памяти, ни проверок времени выполнения, ни охраны вида, ни ловушек исключений. Эти упрощения не должны сильно повлиять на надёжность работы приложения, т.к. предполагается, что приложения предварительно отлаживаются в среде полного Глагола, а уже потом переносятся в среду настоящего времени. Учитывая возможности новой среды выполнения, из языка были изъяты указания ДЛЯ ВИДА, ВЫБРАТЬ ИЗ, ЯВЛЯЕТСЯ и встроенные задачи СТОП, ПРОВЕРИТЬ. Необходимо заметить, что при внесении всех изменений в язык учитывались следующие обстоятельства (по порядку их предпочтения): 1. простота и надёжность алгоритмов преобразования; 2. скорость выполнения целевого кода; 3. совместимость с полным Глаголом. Т.к. не во всех процессорах встроена вещественная арифметика, то виды ВЕЩ и ШИРВЕЩ были исключены. В будущем намечено осуществить программную замену этих видов средствами целой арифметики. Также был изъят редко используемый вид ШИРЦЕЛ. Указание ВЫБРАТЬ ИЗ было убрано из-за громоздкости его представления в преобразователе и отсутствии в среде ловушек исключений. К тому же это указание всегда можно заменить равнозначными указаниями (А)ЕСЛИ ТО. Для дальнейшего упрощения преобразователя на язык были наложены следующие ограничения: – в текущей задаче можно обращаться только к тем переменным, которые объявлены в ней самой или в области отдела, но не в окружающих задачах; – нет открытых рядов, кроме приёмников переменных вида ЦЕПЬ; – встроенные задачи, которые работали и с ЦЕПЬ, и с РЯД ИЗ ЗНАК, теперь работают только с ЦЕПЬ. Также необходимо учитывать, что при входе в задачу среда выполнения приложений не записывает начальное значение ПУСТО в переменные бегунков и доступов этой задачи. 2.2 Дополнительные возможностиЕсли при объявлении задачи после её заголовка следует служебное слово КОД, то весь текст от этого слова до служебного слова КОН попадёт напрямую в выходной ассемблерный текст. Пример:
ЗАДАЧА Задача; (* прямой КОД *)
КОД
STMDB SP!,{FP,LR}
MOV FP,SP
SUB SP,SP,#4
MOV R11,#1
STR R11,[FP,#-4]
MOV SP,FP
LDMIA SP!,{FP,PC}
КОН Задача;
3 Дальнейшие намерения по изменению МПГ3.1 Регистровые приёмникиСейчас приёмники задачи передаются через стек, далее будет проведена оценка целесообразности передачи приёмников через регистры. Эта возможность даёт в некоторых случаях выигрыш в производительности кода и позволяет осуществить изменения, перечисленные в следующих подразделах. 3.2 Оконечные задачиЗнак * после слова ЗАДАЧА сообщает преобразователю, что это оконечная задача. Оконечная задача – это задача, из которой не производятся вызовы задач. В таких задачах можно оставлять приёмники в изначальных регистрах, а не переписывать их на стек при входе в задачу. Однако регистры, постоянно занятые под приёмники, уменьшат число свободных регистров, доступных для вычисления выражений. Но обычно вычисления выражений занимают немного регистров, и это ограничение будет редко проявляться. 3.3 Регистровые переменныеЗнак * после объявления переменных служит указанием преобразователю, что эти переменные необходимо разместить в регистрах, а не в памяти. Возможность задания таких переменных присутствует только в оконечных задачах. Пример:
ЗАДАЧА* Задача(а,б:ЦЕЛ); (* а - R0, б - R1 *)
ПЕР в,г:ЦЕЛ*; (* в - R2, г - R3 *)
УКАЗ
КОН Задача;
3.4 БегункиПеременные вида БЕГУНОК могут быть определены только в оконечных задачах. Каждая такая переменная занимает один регистр. Рассмотрим на двух примерах преимущества бегунков по сравнению с обычным обращением к переменным ряда. 1. Вычисление скалярного произведения векторов. В обычной задаче приходится полностью вычислять адрес переменных ряда 2 раза при обсчёте каждой координаты: ЗАДАЧА* ВекторНаВектор(р1-,р2-:Вектор):ЦЕЛ; ПЕР с,н:ЦЕЛ; УКАЗ с:=0; ОТ н:=0 ДО РАЗМЕР(р1)-1 ВЫП с:=с+р1[н]*р2[н] КОН; ВОЗВРАТ с КОН ВекторНаВектор; Та же задача с использованием бегунков полностью вычисляет адрес переменных ряда только 3 раза в самом начале расчёта: ЗАДАЧА* ВекторНаВектор(р1-,р2-:Вектор):ЦЕЛ; ПЕР с:ЦЕЛ; б1,б2,г1:БЕГУНОК ПО ЦЕЛ; УКАЗ с:=0; ПОСТАВИТЬ(б1,р1,0); ПОСТАВИТЬ(б2,р2,0); ПОСТАВИТЬ(г1,р1,РАЗМЕР(р1)); ПОКА б1 < г1 ВЫП с:=с+б1^*б2^ КОН; ВОЗВРАТ с КОН ВекторНаВектор; 2. Вычисление произведения 3х3 матриц. Обычная задача вычисляет полностью адрес переменных ряда 8 раз для каждого элемента выходной матрицы: ЗАДАЧА* МатрицаНаМатрицу(м1-,м2-,м3+:Матрица); ПЕР i,j:ЦЕЛ; УКАЗ ОТ i:=0 ДО 2 ВЫП ОТ j:=0 ДО 2 ВЫП м3[i,j]:=м1[i,0]*м2[0,j]+м1[i,1]*м2[1,j]+м1[i,2]*м2[2,j] КОН КОН КОН МатрицаНаМатрицу; Та же задача с использованием бегунков использует только 2 полных вычисления адреса переменных ряда на каждый элемент: ЗАДАЧА* МатрицаНаМатрицу(м1-,м2-,м3+:Матрица); ПЕР i,j:ЦЕЛ; б1,б3:БЕГУНОК ПО ЦЕЛ; б2:БЕГУНОК 3 ПО ЦЕЛ; УКАЗ ПОСТАВИТЬ(б3,м3,0); ОТ i:=0 ДО 2 ВЫП ОТ j:=0 ДО 2 ВЫП ПОСТАВИТЬ(б1,м1[i],0); ПОСТАВИТЬ(б2,м2,j); б3^:=б1^*б2^+б1^*б2^+б1^*б2^; КОН КОН КОН МатрицаНаМатрицу; 4 Перевод выходных текстов МПГ в готовые приложенияДля перевода выходных ассемблерных текстов МПГ в готовые EXE-приложения применяются две служебные программы стороннего разработчика – ассемблер ARMASM (файл armasm.exe) и редактор связей LINK (файлы link.exe и mspdb60.dll). Эти файлы поставляются с eMbedded Visual Tools 3.0, eMbedded Visual C++ 4.0, eMbedded Visual C++ 4.0 SP4 и Visual Studio 2005. Первые три набора инструментов можно безплатно переписать у их разработчика. Обычно для преобразования и сборки приложений Глагола применяется командный файл \Глагол\Службы\ПостроитьМ. bat, который последовательно запускает МПГ, ARMASM и LINK. Далее описываются используемые возможности ARMASM и LINK. 4.1 АRMASMARMASM – это двухпроходный макроассемблер, который переводит текст с языка ассемблера АРМ-процессора в двоичные файлы формата COFF. В командной строке указываются следующие настройки:
В командном файле \Глагол\Службы\ПК. bat содержатся все вышеперечисленные настройки. Служебные указания ассемблера, которые вырабатывает МПГ:
4.2 LINKРедактор связей LINK позволяет из файлов формата COFF собрать EXE-приложение. Наиболее приемлемым для сборки Глагол-приложений является редактор связей из eMbedded Visual C++ 4.0 SP4. В командной строке указываются следующие настройки:
В файле \Глагол\Службы\MSLinkARM.sbo содержатся все вышеперечисленные настройки. 5 Примеры приложенийПриложения полного Глагола, которые не используют вещественную арифметику, также работают и на PocketPC. Командные файлы ПостроитьМ. bat из соответствующих папок служат для построения EXE-примеров при помощи МПГ, а файлы Построить. bat служат, как и раньше, для построения примеров с использованием ПГ. Необходимо учитывать, что приложения на Глаголе работают в консольном режиме, а в PocketPC изначально не встроен такой режим. Поэтому для правильной работы приложений Глагола на PocketPC требуется предварительная установка какой-либо консольной оболочки стороннего производителя. На данный момент используется безплатно распространяемая оболочка PocketConsole 1.3. 6 Ссылки
|
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com
|