Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свой интерпретатор? Писать самому или взять готовый? 
:(
    Опции темы
Shaman2008
Дата 14.9.2013, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.6.2008

Репутация: нет
Всего: нет



Скопировал с форума cyberforum. Простите.

Привет всем!
Хочу попросить совет. Хочу написать программу, в которой можно было бы "чуток программировать". Предполагаю, что необходимо встроить в свою программу простенький интерпретатор. Но так ли это?
Задача такая:
Программа должна уметь читать написанный в ней код (скрипт) и выполнять определенные команды, описанные в этом коде (скрипте). На сколько сложно реализовать данную задачу?
Допустим, нужно, чтобы в программе был глобальный массив целочисленных переменных с индексами 0-999, для которых можно было бы задать имя и логику обработки.
Чтобы можно было выполнять над ними простые арифметические операции и использовать логические конструкции.
Например:

Per 0 Name Peremennaya_0; //Задаем нулевой глобальной переменной имя.
Per 1 Name Peremennaya_1; //Задаем первой глобальной переменной имя и описываем логику ее обработки.
{if Per1 > 0 [Per0 = 1], [Per0 = 0];}

{} - Обозначают начало и конец области описания логики обработки при изменении этой (Peremennaya_1) переменной.
Конструкция: if <выражение> [<выражение если true>], [<выражение если false>].
То есть, когда переменная "Peremennaya_1" примет какое-то значение (изменит его), должен будет выполниться код заключенный в {}. И, соответственно, если "Peremennaya_1" будет больше 0, то переменная "Peremennaya_0" примет значение 1. Если меньше, то "Peremennaya_0" примет значение 0.
С глобальным многомерным массивом (0-999) в принципе все понятно.
А вот как реализовать остальное? Подскажите пожалуйста. На сколько сложно будет написать свой интерпретатор с такими возможностями? Или проще взять готовый (какой) и его пристроить в свою программу? Сразу скажу, подобного опыта еще не было. Программу пишу для себя.

На cyber посоветовали посмотреть в сторону LUA. Но мне кажется он ОЧЕНЬ навороченный для моих задач. Подскажите, на сколько сложно написать свой интерпретатор? Пускай даже самый простенький? Объясните пожалуйста принцип в общих чертах, чтоб вообще иметь представление как работает интерпретатор...
Заранее спасибо!
PM MAIL   Вверх
Poseidon
Дата 14.9.2013, 09:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



В общем ты на правильном пути, либо писать свой, либо взять готовый. Минус первого варианта в том, что это очень трудозатратно. Даже если ты напишешь конкретно под свою задачу, через месяц может выясниться, что тебе нужно еще кое-чего добавить и придется все дорабатывать (если не писать заново). Минус второго варианта в том, что нужно изучать что-то новое. Когда я сталкнулся с таким вопросом, то выбрал второй путь. Есть несколько вариантов реализации, я и про LUI читал, и кто-то свою личную наработку выкладывал, но решил остановиться на RemObject Pascal Script. Можешь глянуть в его сторону, по-моему вполне достойный. Если все-таки решишь писать свое, то принцип тут элементарный: парсишь текст, определяешь команды, отправляешь на выполнение. Но сделать это, учесть нюансы, ой как не просто. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Shaman2008
Дата 14.9.2013, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.6.2008

Репутация: нет
Всего: нет



Цитата(Poseidon @ 14.9.2013,  09:54)
В общем ты на правильном пути, либо писать свой, либо взять готовый. Минус первого варианта в том, что это очень трудозатратно. Даже если ты напишешь конкретно под свою задачу, через месяц может выясниться, что тебе нужно еще кое-чего добавить и придется все дорабатывать (если не писать заново). Минус второго варианта в том, что нужно изучать что-то новое. Когда я сталкнулся с таким вопросом, то выбрал второй путь. Есть несколько вариантов реализации, я и про LUI читал, и кто-то свою личную наработку выкладывал, но решил остановиться на RemObject Pascal Script. Можешь глянуть в его сторону, по-моему вполне достойный. Если все-таки решишь писать свое, то принцип тут элементарный: парсишь текст, определяешь команды, отправляешь на выполнение. Но сделать это, учесть нюансы, ой как не просто.

Спасибо за ответ!
Вот именно его я и скачал первым, в поисках ответа на свой вопрос. А Вы с ним работали? Можете мне помочь со стартом? Я в общем то не глупый и понимаю, что придется для начала изучить данный скриптовый движок, но мне надо совсем чуть-чуть. Я посмотрел на ссылки (примеры) для Pascal Script. Мягко выражаясь - не понял, как его вмонтировать в свое приложение. Вы не пинайте сильно, в принципе с ООП знаком, даже свои события в своих компонентах создавал и описывал типы указывающие на функции (это не для хвастовства, а к тому, что чуток соображаю в Дельфи). Но вот со скриптовыми языками сталкиваться пока не приходилось...
Если не сложно, примитивный пример с использованием Pascal Script можно у Вас попросить?
Заранее спасибо!

Это сообщение отредактировал(а) Shaman2008 - 14.9.2013, 12:57
PM MAIL   Вверх
jsharp36
Дата 14.9.2013, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: нет
Всего: 1



Лучше однозначно пользоваться готовым. Интерпретатор свой написать и сложно и не сложно. Зависит от задачи, от количества операций в интерпретаторе и тому подобное. Я не советовал бы начинать писать, пока не изучите книгу:
http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%...%BD%D1%82%D1%8B
Считаю книгу полезным багажом знаний для любого серьезного программиста. Иногда приходится писать интерпретаторы/компиляторы, даже если не это специализация.

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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
jsharp36
Дата 14.9.2013, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: нет
Всего: 1



Я пробовал писать интерпретаторы, еще до того, когда изучил предлагаемую книгу. И получалось. И даже не сказать, что принципиально я что-то делал не так, как надо. Но у меня был ацкий говнокод, такая лапша, что развивать те интерпретаторы не было возможностей. Когда прочитал, всё уложилось в стройную модель. Так что советую прочитать.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Akella
Дата 14.9.2013, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



я бы взял готовый

Добавлено @ 16:26
http://forum.vingrad.ru/forum/topic-307217.html
Есть ещё FastScript, TMS Scripter, paxCompiler, LMD ScriptPack, RemObjects Pascal Script.
PM MAIL   Вверх
Shaman2008
Дата 14.9.2013, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.6.2008

Репутация: нет
Всего: нет



Цитата(jsharp36 @  14.9.2013,  15:58 Найти цитируемый пост)
Лучше однозначно пользоваться готовым. Интерпретатор свой написать и сложно и не сложно. Зависит от задачи, от количества операций в интерпретаторе и тому подобное. Я не советовал бы начинать писать, пока не изучите книгу:
http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%...%BD%D1%82%D1%8B
Считаю книгу полезным багажом знаний для любого серьезного программиста. Иногда приходится писать интерпретаторы/компиляторы, даже если не это специализация.

Ничего сложного в написании интерпретатора как бы нет (если не собираетесь писать супероптимальный компилятор), но трудозатраты обычно не маленькие. Даже не смотря на то, что есть генераторы парсеров, облегчающие написание.
...Я пробовал писать интерпретаторы, еще до того, когда изучил предлагаемую книгу. И получалось. И даже не сказать, что принципиально я что-то делал не так, как надо. Но у меня был ацкий ###код, такая лапша, что развивать те интерпретаторы не было возможностей. Когда прочитал, всё уложилось в стройную модель. Так что советую прочитать.

Спасибо за ответ! Вы не будите против, если я, после изучения данной книги обращусь к Вам за помощью, если что-то для меня станет не понятным? Если нет, без проблем, только скажите!
В любом случае спасибо!

Цитата(Akella @  14.9.2013,  16:21 Найти цитируемый пост)
я бы взял готовый
Добавлено @ 16:26
http://forum.vingrad.ru/forum/topic-307217.html
Есть ещё FastScript, TMS Scripter, paxCompiler, LMD ScriptPack, RemObjects Pascal Script. 

Спасибо за ответ!
В общем то, я так и думал! И скачал и поставил RemObjects Pascal Script. Но пришел к выводу, что нужно хотя бы представлять, как это работает. Потому как, если возникнут какие-либо ошибки, связанные с использованием готовых движков, то я думаю у меня руки будут сразу связаны. А так я хоть буду иметь представление почему и примерно где произошла ошибка. Возможно такого не будет. Но у меня, в общем то, совсем простые требования к интерпретатору, который мне нужен. И я думаю, что все таки необходимо хотя бы чуть-чуть приоткрыть для себя завесу в этой интересной теме.
Спасибо всем большое!
PM MAIL   Вверх
jsharp36
Дата 14.9.2013, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: нет
Всего: 1



Цитата

   Вы не будите против, если я, после изучения данной книги обращусь к Вам за помощью, если что-то для меня станет не понятным?
   


Нет, конечно. Правда, я давненько ее читал, не помню многое. Но в общем, книга классическая. Как писать компиляторы - учатся по ней. Не только компиляторы. Точнее - как писать трансляторы. В англоязычном варианте компилятор и транслятор - одно и то же.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
jsharp36
Дата 14.9.2013, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 8.10.2011

Репутация: нет
Всего: 1



В смысле: не буду против ))

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Shaman2008
Дата 14.9.2013, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.6.2008

Репутация: нет
Всего: нет



Спасибо за ответы и советы!
PM MAIL   Вверх
Poseidon
Дата 15.9.2013, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(Shaman2008 @  14.9.2013,  10:01 Найти цитируемый пост)
Мягко выражаясь - не понял, как его вмонтировать в свое приложение.
На самом деле все достаточно просто. Да, обсуждение работы RemObject достойно отдельной темы, но накидаю простенький пример тут:
  • Ложем на форму 3 компонента: стандартные Button, Memo и PSScript из набора RemObject.
  • Добавляем в private секцию формы процедуру TestProcedure 
    Код

    private
      { Private declarations }
      procedure TestProcedure(Value: Integer);

  • Реализуем эту процедуру (для примера она очень простенькая, конвертирует получаемое число в строку и отображает ее). На деле сюда можно впихнуть что угодно используя всю мощь Delphi 
    Код

    procedure TForm1.TestProcedure(Value: Integer);
    begin
      ShowMessage(IntToStr(Value))
    end;

  • Теперь нужно научить RemObject "понимать" нашу процедуру (ведь изначально он о ней не знает). Делается это в OnCompile у PSScript. 
    Код

    procedure TForm1.PSScript1Compile(Sender: TPSScript);
    begin
      Sender.AddMethod(Self, @TForm1.TestProcedure, 'procedure TestProcedure(Value: Integer);');
    end;

  • Ну и наконец нужно иметь возможность запустить наш скрипт. Будем это делать по нажатию на кнопку. 
    Код

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      PSScript1.Script.Text := Memo1.Text;  // передаем в PSScript код нашего скрипта.

      if PSScript1.Compile then  // Компилируем. Если все в порядке
        PSScript1.Execute;         // Запускаем
    end;

В окне нашей программы в Memo пишем скрипт, который запускает на выполнение нашу TestProcedure и передает ей 100 в качестве аргумента.
Код

begin
  TestProcedure(100);
end.
 

Пример простенький, но показывает как можно из скрипта вызвать код, который написан внутри программы. Если будут другие вопросы, то лучше создай отдельную тему.




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Shaman2008
Дата 15.9.2013, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 21.6.2008

Репутация: нет
Всего: нет



Poseidon, спасибо! В принципе, все понятно! Думаю, практика покажет остальное! smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0532 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.