Очарование (язык программирования)
Парадигма | Структурированное программирование |
---|---|
Разработано | П. Новосад |
Впервые появился | 1996 |
ТЫ | РИСКИ |
Веб-сайт | очарование |
Под влиянием | |
РТЛ/2 , С , Паскаль |
Charm — это язык программирования, разработанный в начале 1990-х годов и имеющий сходство с языками RTL/2 , Pascal и C , а также содержащий некоторые собственные уникальные особенности. Язык Charm определяется контекстно-свободной грамматикой, которую можно обрабатывать анализатором рекурсивного спуска, как описано в основополагающих книгах по проектированию компиляторов . [1] [2]
Набор инструментов Charm, включая компилятор, ассемблер и компоновщик, был доступен для платформы RISC OS Acorn . [3] Переработанный Charm для платформ ОС RISC впоследствии был рецензирован в журнале Archive. [4]
Подробнее Charm описан в электронной книге «Программирование в Charm на Raspberry Pi» . [5]
Грамматика
[ редактировать ]Определение грамматики Charm в форме Бэкуса-Наура вместе с описательными примерами конструкций Charm дано на странице языка Charm . [6]
Язык имеет блочную структуру, при этом каждый блок вводится ключевым словом языка, описывающим операцию, выполняемую в блоке, например для , пока , повтор ( итерация ), случай , если ( выбор ). Каждый блок окружен {
и }
разделители. Кроме того, языковые строки внутри блока обычно имеют отступ для ясности, хотя это не требуется, поскольку пробелы игнорируются.
Каждый грамматически соответствующий текст представляет собой набор исполняемого кода и связанных с ним данных, которые могут использоваться набором инструментов Charm в качестве компонента при сборке программы, которую можно запускать под операционной системой, используя предоставляемые ею службы для выполнения полезной работы, такой как обработка данных. или взаимодействие с пользователями через графический интерфейс пользователя (GUI).
Типы данных
[ редактировать ]Charm — это строго типизированный язык, но он допускает некоторые неявные преобразования между числовыми типами и типами с плавающей запятой. Поддерживаются следующие основные типы переменных:
- int – целые числа
- чар – символы
- boolean – логические значения ( правда или ЛОЖЬ )
- действительный – числа с плавающей запятой
Агрегаты данных одного и того же типа могут быть объявлены и статически инициализированы с помощью метода ключевое слово массива , и они могут быть многомерными. Агрегаты разных типов могут быть объявлены с использованием ключевое слово записи , и такое объявление может определять объединение полей записи, которые накладываются друг на друга с точки зрения распределения памяти. Модули также могут агрегировать смесь статических и динамических элементов данных. Экземпляры как записей, так и модулей (только динамический контент) могут быть созданы в стеке или в куче с помощью метода новый оператор. Модули также могут определять конструктор ~новая процедура инициализации динамических данных и соответствующих ~delete процедура деконструктора для освобождения ресурсов аналогично языку C++.
Ссылки
[ редактировать ]Данные или процедуры в рамках модуля можно сделать глобальными для конечного приложения с помощью ключевое слово экспорта . Если модуль желает ссылаться на процедуру или данные из другого модуля Charm, он делает это с помощью ключевое слово импорта . Модули могут содержать переменные-члены на основе экземпляров, которые доступны через процедуры, объявленные с помощью динамическое ключевое слово через неявный первый параметр этот указатель.
Ссылки на конструкции и процедуры данных могут быть сделаны с использованием ключевое слово ссылки . Их можно разыменовать с помощью ключевое слово вал . При использовании ссылочных переменных доступны операторы сравнения, позволяющие проверить, относятся ли две ссылочные переменные к одному и тому же элементу данных ( :=:
) или совпадают ли данные, на которые они указывают ( =
).
Пример
[ редактировать ]Оригинальная классическая программа Hello world, написанная на Charm:
ext proc write_string (ref array char);
module hello;
ent proc start ();
write_string ("Hello world");
end_proc;
end_module;
и эквивалентная последняя версия после эволюционных синтаксических изменений языка:
import lib.Out;
module Hello
{
export proc ~start ()
{
Out.vdu.str ("Hello world"). nl();
}
}
Набор инструментов
[ редактировать ]Ожидается, что реализации набора инструментов будут предоставлять компилятор и ассемблер для создания объектных файлов из исходного кода Charm и исходного кода ассемблера, которые затем можно будет скомпоновать вместе с библиотеками и файлами поддержки времени выполнения для создания исполняемой программы.
На момент написания статьи доступна для загрузки только одна установка набора инструментов Charm (бесплатно). Сами инструменты написаны на языке Charm, а исходный код доступен на условиях GNU General Public License . Они работают на ПК и платформах с ОС RISC с процессорами ARM (например, Raspberry Pi ), а также на эмуляторах ОС RISC, размещенных на платформах Windows или Linux (например, RPCEmu ). Генерация кода для аппаратных операций двойной точности с плавающей запятой поддерживается для платформ на базе чипов ARM, которые поддерживают архитектуру сопроцессора VFP версии 2.
Компилятор
[ редактировать ]Компилятор Charm — это однопроходный компилятор с рекурсивным спуском, который анализирует исходный код Charm для создания четверок формы result := lhs op rhs на промежуточном языке, который поддерживает арифметические, логические операции и операции управления потоком. Данные хранятся во временных объектах, которые назначаются регистрам и ячейкам памяти в серверной части компилятора. В настоящее время существуют две серверные части: одна генерирует язык ассемблера Motorola 68000 , а другая — архитектуру ARM . [7]
Четырехкратный вывод примера hello world:
param l1$ call write_string[proc (ref array char) void]
и вывод ассемблера:
string "hello"
xdef _start
align
_start
xref _write_string
stmfd sp!,{rp}
adr r0,_l1$
bl _write_string
ldmfd sp!,{pc}
address
align
_l1$
string "Hello world"
direct
end
В более поздних выпусках Charm I/O Процедуры разделены на отдельные модули In и Out . Другие стандартные библиотечные процедуры организованы в набор записей со ссылками на процедуры в качестве полей. В рамках этой реорганизации write_string
метод теперь вызывается через модуль библиотеки времени выполнения Out
через статическую ссылку на член .vdu
как процедура str
то есть в примере hello world выше write_string ("Hello world")
становится Out.vdu.str ("Hello world")
.
Ассемблер
[ редактировать ]Ассемблер принимает мнемонику команд, объявления данных и директивы и создает объектный файл, содержащий информацию, легко понимаемую ЦП целевого процессора, в частности инструкции кода, закодированные в двоичном формате.
0000:6D795F6D
0000:E92D4000
0004:
000C:EBFFFFFE
0010:E8BD8000
0000:48656C6C
|
string "hello"
xdef _start
align
_start
xref _write_string
stmfd sp!,{rp}
adr r0,_l1$
bl _write_string
ldmfd sp!,{pc}
address
align
_l1$
string "Hello world"
direct
end
|
Линкер
[ редактировать ]Один и только один из модулей Charm, связанных для формирования исполняемой программы, должен содержать процедуру, соответствующую одной из сигнатур:
export proc ~start () export proc ~start (int argc, ref array ref array char argv)
Это аналог функции main в языках C и Java . Здесь argc
содержит количество параметров, переданных в командной строке, и argv
содержит ссылку на массив argc + 1
строки (одна строка на каждый позиционный параметр по порядку и завершающий символ nil
).
Кроме того, модули могут дополнительно содержать статические процедуры запуска и завершения работы, вызываемые во время запуска и завершения программы, соответствующие сигнатурам:
export proc ~startup () export proc ~shutdown ()
Компоновщик добавляет любую необходимую информацию заголовка, необходимую операционной системе для выполнения программы, и обеспечивает запуск кода поддержки ассемблера библиотеки времени выполнения, который настраивает среду выполнения (данные и указатели стека) и передает управление процедуре запуска. приложения.
Дополнительно создается файл карты, показывающий имена всех модулей, связанных с программой, а также глобальные данные и ссылки на код, который может использоваться отладчиками и профилировщиками.
Ссылки
[ редактировать ]- ^ ISBN D-201-10073-8 Ахо, Принципы Ульмана разработки компилятора
- ^ ISBN D-201-10194-7 Ахо, Сетхи, Принципы, методы и инструменты компиляторов Ульмана
- ^ Уэйд, Стивен (июнь 1996 г.). «Оберег или безделушка?» . Пользователь Желудя . стр. 50–51 . Проверено 28 августа 2021 г.
- ^ Рэйт, Гэвин (январь 2012 г.). «Язык Charm: обзор» . Архив . Том. 23, нет. 4. с. 13 . Проверено 28 августа 2021 г.
- ↑ Июнь 2013 г. Электронная книга Kindle «Программирование Charm на Raspberry Pi».
- ^ ОС Charm RISC, языковая страница
- ^ ISBN 0-9512579-0-0 Питер Кокерелл Программирование на языке ассемблера ARM