Не ждите, это язык времени выполнения

от автора


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

С высокоуровневым языком, работающим на микроконтроллере, все
продвигается на ступеньку (или две) с точки зрения выразительности и
языковой мощи. Нет необходимости придерживаться C или даже C++.

Это предпосылка для таких языков, как «Embedded Lua» (eLua) и
«Embedded JavaScript» (espruino). Сценарии на встроенном оборудовании,
кто бы этого не хотел?

Цена, которую нужно заплатить, заключается в том, что для этих языков
требуется довольно большой микроконтроллер, с 256 КБ или более
флэш-памяти и 64 КБ или более оперативной памяти. Одной из причин
может быть то, что эти языки в значительной степени зависят от строк и
байтовых массивов и, следовательно, от какого-то рода распределителя
памяти / сборщика мусора.

Даже с изрядной 512 КБ флэш-памяти и 128 КБ ОЗУ сложность
приложений, которые могут быть запущены в этих средах, может быть
довольно ограниченной (возможно, до тысячи строк кода).

Но «здоровенный» не является хорошим спутником «очень дешевых» и
«ультрамалых»…

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

Такая среда выполнения будет работать в гораздо меньших средах, таких
как Bitlash, ArduinoBASIC или даже интерпретируемый C — они подойдут
для Arduino: 32 КБ флэш-памяти, 1 КБ EEPROM и 2 КБ ОЗУ!

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

Бейсик

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

За прошедшие годы было написано множество интерпретаторов BASIC, и
некоторые из них были перенесены в современные микроконтроллеры,
которые, в конце концов, гораздо более эффективны, чем в 1970-х годах.
Хорошим примером является MaxiMite и связанный с ним MMBasic. Это не
так уж и мало: MMBasic требует ЦП с 32-битными целыми числами и
указателями, поддерживаемыми компилятором ANSI или C89.

В минимальной версии MMBasic обычно компилирует до 94 Кбайт
флэш-памяти и требует чуть более 5 Кбайт оперативной памяти
плюс минимум 4 Кбайт для стека (всего 9 Кбайт). Для хранения
программ, переменных и т. Д. Требуется больше памяти, поэтому
интерпретатору потребуется как минимум 16 КБ ОЗУ для запуска
небольшой базовой программы. Как правило, 32 КБ ОЗУ или более
предпочтительны, так как это позволит использовать более
крупные программы и массивы.

Форт (Forth)

И еще есть этот странно выглядящий язык из начала 1970-х, называемый
Forth :

    0 value ii        0 value jj     0 value KeyAddr   0 value KeyLen     create SArray   256 allot   \ state array of 256 bytes     : KeyArray      KeyLen mod   KeyAddr ;      : get_byte      + c@ ;     : set_byte      + c! ;     : as_byte       255 and ;     : reset_ij      0 TO ii   0 TO jj ;     : i_update      1 +   as_byte TO ii ;     : j_update      ii SArray get_byte +   as_byte TO jj ;     : swap_s_ij         jj SArray get_byte            ii SArray get_byte  jj SArray set_byte         ii SArray set_byte     ;      : rc4_init ( KeyAddr KeyLen -- )         256 min TO KeyLen   TO KeyAddr         256 0 DO   i i SArray set_byte   LOOP         reset_ij         BEGIN             ii KeyArray get_byte   jj +  j_update             swap_s_ij             ii 255 < WHILE             ii i_update         REPEAT         reset_ij     ;     : rc4_byte         ii i_update   jj j_update         swap_s_ij         ii SArray get_byte         jj SArray get_byte +             as_byte SArray get_byte  xor     ; 

(кстати, это полная реализация алгоритма шифрования RC4 )

Чтобы справиться с этим, нужно понять, что Форт использует обратную
польскую нотацию. Таким образом, « 1 2 + 3 * » означает « ((1 + 2) * 3) »,
фактически. RPN также известен как нотация Postfix — а «язык печати»
PostScript по сути является (сильно адаптированным) вариантом Forth.

Форт известен своей чрезвычайно компактной системой обозначений и
реализацией. Реализация языка чрезвычайно мала и эффективна, потому
что:

  1. его примитивы очень близки к машинному коду и
  2. он полностью построен на собственных механизмах.

Несколько килобайт флеш-памяти и несколько сотен байтов — это все,
что требуется для создания интерактивной среды разработки

(хотя никогда такой же, как в современных IDE!).
Редактирование исходного кода, сборка и разборка машинного кода,
многозадачность — все это было сделано много раз в Форте.

AmForth — один пример, написанный специально для AVR μC, а также
портированный на MSP430.

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

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

Чак Мур, оригинальный изобретатель Forth, создал то, что является,
вероятно, самой экстремальной (и минималистической версией), названной
colorForth. Упоминается здесь только для полноты.

Это странно увлекательный язык, который позже был классифицирован как
Конкатенативный язык, порождающий интересные языки, такие как Joy,
Factor и… PostScript..

Forth позволяет погружаться и выполнять различные части дизайна,
используя только последовательное соединение. Это очень важно во время
разработки, но может также пригодиться, когда вы пробуете что-то новое
или преследуете ошибку намного позже. Код остается на 100%
интроспективным.

Основным недостатком Forth является то, что он плохо сочетается с C/C++.
Нет простого способа интегрировать код из обоих миров.

Подходы слишком разные. В прошлом это приводило к тому, что в
(коммерческих) проектах была реализована полная реализация стеков TCP/IP и даже
Bluetooth (!).

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

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

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

Разнообразная информация и обсуждения Форт тематики на рускоязычном Форт-форуме. (активен с 2006г.)

\ перевод сделан с помощью гугл-транслятора


ссылка на оригинал статьи https://habr.com/ru/post/461391/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *