Встраиваемый интерпретатор языка Pascal и его возможное применение.

  В статье речь пойдет о простом встраиваемом интерпретаторе языка Паскаль для Delphi (и предположительно Lazarus) программ — «PASCALC interpreter v3.00 for Delphi (C)2000 Alex Boiko». Впервые я столкнулся с ним несколько лет назад при использовании программы-прошивальщика AsProgrammer, в которую он встроен изначально. Наличие встроенного скриптового языка позволяет конечному пользователю перестраивать поведение приложения в соответствии со своими потребностями без необходимости его перекомпиляции. Это делается командами скриптового языка через встроенные команды API, дающих доступ к внутренним обьектам программы.

  AsProgrammer в то время не поддерживал программирование SPD EEPROM памяти и я пытался добавить такую возможность через команды встроенного API (в настоящее время доступен форк программы AsProgrammer, начал его франкоязычный программист с ником TTAV134, его форк называется NeoProgrammer и он поддерживает программирование памяти SPD типа 34С04).
  На тот момент (как и сейчас, с новым форком) расширить набор команд встроенного API можно было только перекомпиляцией программы, и делать это должен автор. А вот тут уже все сложнее. Автору может быть недосуг заниматься вашими проблемами, они могут показаться ему мелкими или неактуальными, наконец просто не понравиться. Гораздо лучше, если была бы возможность расширить команды встроенного API самостоятельно, путем подключения внешних плагинов. Таким способом любой подготовленный пользователь сможет индивидуально подстроить программу именно под свою задачу.
  Поэтому мне стало интересно, смогу ли я добавить в интерпретатор от Бойко возможность подключать внешние плагины. Не сразу, но у меня получилось. В доработанном коде в папке программы содержащей интерпретатор PASCALC добавляется папка «Plugins» в которую можно добавлять файлы Dll, содержащие дополнительные команды скриптового языка. При загрузке программы эта папка сканируется на наличие плагинов Dll, найденные скрипты и константы подключаются к интерпретатору PASCALC и добавляются в список интерпретатора. Дополнительные команды API могут как расширять возможности встроенного языка Паскаль, так и содержать интерфейс к драйверам внешних устройств.
  Взаимодействие доработанного интерпретатора с внешним USB устройством (программатором, сниффером, логическим анализатором и т.д.) графически можно представить так (через плагин драйверов фирмы FTDI):

  

  1. С помощью HID устройств (клавиатура, мышка) пишется программа интерпретатора на языке Паскаль. Это можно делать как в окне интерпретатора, так и любом текстовом редакторе, умеющем создавать текст без излишнего форматирования (plain text).
  2. Загрузить исполняемую программу (скрипт) в интерпретатор и запустить на исполнение. Посмотреть на результат работы скрипта. Ошибки здесь могут быть самые разные, например скрипт должен работать с USB программатором, а программатор вы не вставили. Т.к. это интерпретатор, ошибки можно тут-же оперативно исправлять и снова запускать скрипт на исполнение.
  3. Именно наличие возможности подключить внешний плагин является отличительной особенностью этого варианта кода. Если программа предназначена для управления внешним USB устройством, необходимо предварительно написать внешний плагин для интерпретатора в виде Dll. Он должен обеспечить открытие, управление и закрытие USB устройства командами интерпретатора, и лежать в папке «Plugins» на момент его запуска.
  4. Плагин связывается с внешним USB устройством через инсталированные в систему драйвера этого устройства.
  5. Внешнее USB устройство выполняет действия под управлением программы интерпретатора.
  Получается очень интересно, если внешнее USB устройство, например программатор, может выполнять действия под управлением программы интерпретатора, значит грамотно написанный скрипт интерпретатора может заменить специализированную программу для програмирования.

  Исходный код Алекса Бойко изрядно переработан, добавлен и расширен, возможно к ошибкам допущенным им, я добавил и свои. Для удобства использования в интерпретатор добавлена модульная справка в CHM формате. Справка содержит:

Содержание:

  • Помощь по интерпретатору (мастер-файл модульной справки PasCFull.chm);
  • Файл помощи от Alex Boico (слейв-файл модульной справки PasCalc.chm);
  • Оболочка интерпретатора PasCFull.exe (слейв-файл модульной справки IdePasC.chm;
Плагины:
  • Устройство плагинов (слейв-файл модульной справки Plugins.chm);
  • Встроенные плагины, модуль BasePlug.pas (слейв-файл модульной справки BasePlug.chm;
  • Внешний плагин PasCMath.dll (Type I) (слейв-файл модульной справки PasCMath.chm);
  • Внешний плагин PasCStr.dll (Type I) (слейв-файл модульной справки PasCStr.chm);
  • Внешний плагин PasCTime.dll (Type I) (слейв-файл модульной справки PasCTime.chm);
  • Внешний плагин PasCTest.dll (слейв-файл модульной справки PasCTest.chm);
  • Внешний плагин PasCFTDI.dll (Type II) (слейв-файл модульной справки PasCFTDI.chm);
  • Внешний плагин PasC341A.dll (Type II) (слейв-файл модульной справки PasC341A.chm);
  • Внешний плагин PasEeSpd.dll (Type II) (слейв-файл модульной справки PasEeSpd.chm);

  Как видно справка получилась довольно обьемная, поэтому чтобы не повторяться несколько раз, все нюансы и тонкости я здесь опущу, лучше посмотреть ее. Надеюсь многие вопросы отпадут.

К статье приложены:
  • PasCFull.zip — архив оболочки интерпретатора.
  • PasCSrc.zip — архив исходных кодов, Delphi 7.
  • +1
  • 15 марта 2022, 18:10
  • anakost
  • 2
Файлы в топике: PasCFull.zip.zip, PasCSrc.zip.zip

Комментарии (3)

RSS свернуть / развернуть
Есть еще RemObjects Pascal Script, вроде более солидный проект. Импортировать функции из DLL умеет из коробки. Используется, например, в Inno Setup.
0
  • avatar
  • Vga
  • 15 марта 2022, 18:35
Скорее всего потому, что изначально я не собирался заниматься написанием своей программы, хотел доработать имеющуюся.
0
Да я знаю, прежде чем заниматься доработками, я поискал готовое. Все найденное мне не подощло, почему — уже не помню, полгода прошло…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.