Jump to content

Очарование (язык программирования)

Очарование
Парадигма Структурированное программирование
Разработано П. Новосад
Впервые появился 1996
ТЫ РИСКИ
Веб-сайт очарование .ку-бит .co .uk
Под влиянием
РТЛ/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").

Ассемблер

[ редактировать ]

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

Листинг ассемблера @.arm.hello
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 ()

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

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

  1. ^ ISBN D-201-10073-8 Ахо, Принципы Ульмана разработки компилятора
  2. ^ ISBN D-201-10194-7 Ахо, Сетхи, Принципы, методы и инструменты компиляторов Ульмана
  3. ^ Уэйд, Стивен (июнь 1996 г.). «Оберег или безделушка?» . Пользователь Желудя . стр. 50–51 . Проверено 28 августа 2021 г.
  4. ^ Рэйт, Гэвин (январь 2012 г.). «Язык Charm: обзор» . Архив . Том. 23, нет. 4. с. 13 . Проверено 28 августа 2021 г.
  5. Июнь 2013 г. Электронная книга Kindle «Программирование Charm на Raspberry Pi».
  6. ^ ОС Charm RISC, языковая страница
  7. ^ ISBN   0-9512579-0-0 Питер Кокерелл Программирование на языке ассемблера ARM
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: fe0415e83718c4818267ea4ac0ce52d0__1666371600
URL1:https://arc.ask3.ru/arc/aa/fe/d0/fe0415e83718c4818267ea4ac0ce52d0.html
Заголовок, (Title) документа по адресу, URL1:
Charm (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)