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


Примечание:

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




Другой подход (*в разработке встроенного ПО) заключается в создании
полной языковой среды на микроконтроллере. Обычно интерпретируемой,
хотя 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   \ статический массив из 256-и байт
    : 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, а также
портированный на 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, все это выглядит нерегулярно. Несмотря
на то, что важно, чтобы конкретный узел выполнял определенные задачи,
нам также нужны преимущества контроля исходного кода и возможность
управлять и реплицировать узлы в нескольких местах. Настройка на узел
не приведет нас туда.


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



Примечание:
В качестве реализации целевой Форт-системы встраиваемой в контроллер, могут быть использованы разные исполнительные схемы, кроме упомянутого автором в статье байт-кода и после инкрементального цикла разработки ПО контроллера, неизменная часть ПО может быть кросс-компилирована с «телом» базовой Форт системы (что и представленно, в частности, в VFX Forth)



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




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




К сожалению, не доступен сервер mySQL