#1 05-12-2010 23:12

BritishColonist
Registered: 30-09-2009
Posts: 72

О создании скриптовых языков

Доброго времени суток, ребята. А особо в этой теме приветствуются люди знающие и/или участвовавшие в разработке скриптовых движков, в частности CLEO/SunnyBuilder.
/* немного автобиографии
Давно пишу скрипты для SA, и последние мои разработки сводились к сплошной работе с адресами памяти напрямую.
И я подумал, раз так, то почему бы не использовать вообще отдельную программу? Тогда юзеру даже не придётся ставить клео, качать скрипт. Тем более, включение и выключение будет максимально удобным (крестик в окошечке рулит, как никак). Так я подумал, когда хотел сделать себе сохранялку координат на клео. Расставлял тачки в сампе, а когда заглянул в окно СанниБилдера, понял, что получать координаты из сампа он категорически отказывается. А с файлами через скрипты я как работать не умел, так и не умею (кстати, тема для мануала). В то время я считал, что команда сохранения координат пашет только в режиме дебага самп-сервера (а оказалось, что работает она везде, просто не отображает какой-либо результат). Так что выход был один - использовать отдельную программку. И мне пришлось много париться, т.к. знал намного меньше, нежели сейчас. Изобретал велосипед, но учился...
В данный момент я как-то редко захожу в SA и ещё реже в Билдер, т.к. игра наскучила. Разве что, когда просят, делаю людишкам скрипты. Вообще, всё, что можно, придумано и реализовано (хотя не совсем, я лично создал пару новинок). И вот пал мой взгляд на другие игры, где можно было бы весело издеваться над игровой механикой. А для этого я решил сперва поискать инфу (ничего не нашёл), а потом и взять дело "в свои руки". Я вовсе не стремлюсь к славе и распространению своих наработок, мне лишь нужен удобный инструмент, который будет самостоятельно раскапывать бездонные структуры, добираясь до того, с чем удобно будет работать непосредственно скриптеру. Весьма вероятно, что Seemann когда-то думал точно так же.

*/

Это было, так сказать, предисловие. Собственно, основное:
Возможно эти слова будут слишком громкими, но всё же.
Планирую создать нечто вроде клео, но не для гта. Значит конкурентом данному проекту я не буду никоим образом.
Но для начала мне нужна отправная точка. Имеются некоторые вопросы относительно создания скриптового движка:
* На чём удобнее создавать? С++ или Delphi? // Изначально я учил паскаль/дельфи, так что лично мне удобнее работать с ним, но слышал, что Си наиболее гибок, среди языков высокого уровня. Стоит ли полностью переходить на Си?
* Каким образом можно внедрить код отдельных скриптов в процесс игры? //Неужто через построчное считывание скрипта, проверку в каждой строчке на имя команды (в СанниБилдере - опкод) и дальнейшую работу с переданными параметрами (в соответствии с командой)?
* Чем копать EXE? // Я, например, юзал как иду, так и олли дебаг. Ещё круто ворочает ассемблерный код программка TSearch. Я даже много чего находил и записывал всё в блокнотик. Проблема в том, что этой информации много, хранится она в неудобном виде и достаётся оттуда с трудом.
* Неужели вся работа клео-опкодов постороена на прямой работе с памятью? // В смысле, как происходит работа скрипта? Внутри игры или посредством "топорных" чтения и записи в адреса памяти?

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

Опыт показывает, что пока за дело не возьмёшься лично ты, оно не тронется ничуть, несмотря на то, касается ли оно других. И сейчас я думаю о том, насколько хорошо то, что когда-то Seemann взялся за создание CLEO. Вот я, например, многое узнал благодаря работе в Билдере. Я благодарен автору. Я, будучи начинающим программером, нашёл применение навыков в деле, полезном не одному мне. Я создал десятки скриптов, за которые мне были благодарны люди. Но самое главное: ко мне обращались за помощью. У меня спрашивали, что и как. И, чёрт возьми, я учил их и показывал. Разве это не прекрасно? Благое дело, как никак. Вот ещё одна причина, по которой я уж очень хочу создать скриптовый язык, движок.

И, что бы вы тут не написали, спасибо за внимание.

Last edited by dragonforce (05-12-2010 23:21)

Offline

#2 06-12-2010 07:10

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: О создании скриптовых языков

По твоим комментариям не скажешь, что ты учил Паскаль smile
Мне больше нравится Си, хотя сильных отличий я не вижу. Не очень хорошо знаю, как работает КЛЕО, но думаю, что так, как ты описал.

Offline

#3 06-12-2010 12:31

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: О создании скриптовых языков

мне лишь нужен удобный инструмент, который будет самостоятельно раскапывать бездонные структуры

это называется мозг.

На чём удобнее создавать? С++ или Delphi?

какой язык знаешь, на таком и пиши. мне лично знание только дельфи никак не мешало писать программы и хаки.

Каким образом можно внедрить код отдельных скриптов в процесс игры?

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

Чем копать EXE?

IDA. Очень удобная и мощная программа (+ встроенный отладчик).

Неужели вся работа клео-опкодов постороена на прямой работе с памятью?

Смотри исходники CLEO 1. Принципиально ничего не поменялось.

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

Как вариант, можно покопаться на sf.net и поискать готовые интерпретаторы для скриптовых языков
http://sourceforge.net/softwaremap/?&fq[]=trove%3A49

Offline

#4 06-12-2010 13:33

~AquaZ~
Registered: 01-03-2010
Posts: 726

Re: О создании скриптовых языков

Offline

#5 06-12-2010 13:34

Sw[ee]t
From: Нижний Новгород
Registered: 16-02-2009
Posts: 686
Website

Re: О создании скриптовых языков

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

Ну а он хочет с нуля всё переписать. Флаг в руки, мышку в зубы и вперде!

Честно говоря не думал что для этой игры можно ещё что-то придумать, так как всё что было возможно придумать, уже придумано. Вот возьмитесь лучше Source Engine ломать, благо есть исходники grin

Offline

#6 06-12-2010 15:48

Alien
Registered: 12-10-2008
Posts: 564

Re: О создании скриптовых языков

Кажется тут поднимаются вопросы, с которыми я недавно имел тесное взаимодействие.=) Первым делом несколько ссылок.
1) Драконова книга Ахо, Лам, Сети, Ульмана. Это классический учебник по проектированию компиляторов и интерпретаторов.
2) cleo script compiler. Мой простенький вариант компилятора скриптов для CLEO. В открытом доступе отсутствует, но из обсуждения может кое-что проясниться в плане разработки компилятора для своих нужд.
3) C4. (Де)компилятор скриптов для GTA 4. Судя по разговорам, которые ходят по тому форуму, разрабатывается что-то, по своей сложности сравнимое с разработкой самой GTA.:D


Теперь по проектированию "языка", хотя на самом деле тут все ступорится не в "язык", а в программу, обрабатывающую этот язык - компилятор или интерпретатор. Возможны 2 варианта - компилируемый язык или интерпретируемый язык. Отсюда 2 различных варианта реализации.
[large]1 Компилируемый язык.[/large]
Используется, когда скриптовый движок основан на последовательном выполнении команд, записанных в бинарном формате - байт-коде. В частности скриптовый движок игр GTA действует именно по такому принципу. В этом случае задача программы-компилятора сводится к переводу исходного текста программы (понятного программисту) в машинный байт-код (понятный обработчику скрипта, т.е. скриптовому движку). Возможный вариант реализации такого компилятора:
1) Препроцессор. Его задача - обработка спец-инструкций программы, называемых директивами препроцессора. Сюда относятся директивы подключения внешних модулей (#include), условной компиляции (#define, #ifdef, #ifndef, #endif) и проч. Также препроцессор может выполнять удаление комментариев из текста программы.
2) Сканер. Выполняет сканирование исходного текста программы и разбивает его на последовательность отдельных значащих лексем (ключевые слова, имена переменных, константы, операторы математических выражений, знаки препинания).
3) Парсер. Самая сложная часть компилятора. Теоретически тут очень много разных вариантов - выделяют нисходящие, восходящие парсеры разных уровней - в зависимости от синтаксиса языка. Я предлагаю не заморачиваться и взять C-подобный синтаксис, потому что он спроектирован таким образом, что возможен разбор программы без предпросмотра на n-ное количество лексем вперед (я гарантирую, это возможно). То есть возможен вариант нисходящего парсера нулевого уровня.
Довольно-таки большая и неочевидная в реализации часть парсера - это разборщик математических выражений. Тут следует пользоваться проверенным алгоритмом обратной польской нотации (в википедии приведено несколько вариантов этого алгоритма).
4) Машинонезависимый оптимизатор высокоровневого представления. В общем виде тут все понятно. Этот этап может отсутствовать или неявно входить в состав парсера.
5) Кодогенератор. Формирует из высокоуровневого представления машинозависимое низкоуровневое представление.
6) Машинозависимый оптимизатор низкоуровневого представления. Аналогично этот этап может отсутствовать или неявно входить в состав кодогенератора.
7) Сборщик-компановщик. Преобразует низкоуровневое представление в последовательность байтов (байт-код) и записывает все это в исполняемый файл. Это финальный этап и после него программа готова к исполнению скриптовым движком.:cool:
[large]2 Интерпретируемый язык.[/large]
Используется, когда отсутствует как таковой скриптовый движок. В этом случае проектируется интерпретатор, который бы одновременно разбирал исходный код программы (скрипта) и исполнял его. То есть в данном случае не требуется переводить программу из высокоуровневого представления в низкоуровневое и сохранять ее в исполняемый файл, зато требуется написать функциональный аналог скриптового движка.
Этапы разработки интерпретатора:
1-4) То же самое, что и в случае с компилятором.
5) Здесь подразумевается дальнейшее исполнение того внутреннего представления программы, которое ты получил в предыдущих этапах.

Last edited by Alien (06-12-2010 15:52)

Offline

#7 06-12-2010 16:26

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: О создании скриптовых языков

Довольно-таки большая и неочевидная в реализации часть парсера - это разборщик математических выражений. Тут следует пользоваться проверенным алгоритмом обратной польской нотации (в википедии приведено несколько вариантов этого алгоритма).

когда я писал компилятор для SB 3 (который так и не дошел до релиза), это было самой мощной и интересной его частью. Компилятор мог "разгребать" выражения любого уровня сложности (всякие приоритеты, скобки, минусы как подвид умножения на -1 (например 1@ = -(5@*2@+1) и т.д.) Польская запись тут идеальный вариант.

Offline

#8 08-12-2010 04:06

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: О создании скриптовых языков

dragonforce

Написали всего много все по делу. Добавлю пару вещей от себя.
Исходники скриптового движка SA я выкладывал. Они полностью работающие. (Но, там подход такой, что лучше так не делать). В VCS подход более красивый, в IV почти хорошо и в RDR стало совсем хорошо.
(Но скриптовая часть IV и RDR у меня еще не в том состоянии, чтобы можно было выкладывать).

Примеров, действительно, много. Есть подробные и красивые, например: http://habrahabr.ru/blogs/programming/99162/ (там уже до 10й части дописано).

Беда в том, что общепринятая теория компиляции фундаментально не верна.
Там делается большой упор на автогенерируемый лексер и парсер, что позволяет легко и просто писать небольшие трансляторы, но не дает написать что-то сложное (т.е. транслятор K&R C сделать - элементарно, а вот C99, не говоря уже о C++ - умаешься).

Читать для начала, если уровень английского позволяет, лучше не Dragon Book, а RCT. Там краткое изложение теории компиляции дается страниц на 30. (Да, оно капитально устарело. Да, там полно концептуальных ошибок - но это единственная нормальная работа на эту тему).

Готовых инструментов для раскапывания структур - просто нет. IDA - это единственное, что есть, и то, она помогает не очень сильно (она ничего не знает ни про объекты, ни о наследовании, ни, тем более, о шаблонах). Hex-Rays скорее мешает, чем помогает. Максимум, в нем можно посмотреть, что делает какая-нибудь особо хитрая идиома. Так что, процентов 80 делается в уме.

Alien

3) C4. (Де)компилятор скриптов для GTA 4. Судя по разговорам, которые ходят по тому форуму, разрабатывается что-то, по своей сложности сравнимое с разработкой самой GTA.

Дело не сколько в сложности, сколько в отсутствии свободного времени. При рабочей неделе в ~80 часов, особо не попрограммишь. Максимум, удается выкроить часик, чтобы покопаться в коде.

Компилятор-то там работает. Проблема в том, что без полностью работающего декомпилятора, написать ничего сложнее "Нello world" не получится. Нужно полностью восстанавливать сегмент .globals (а он большой) и, желательно, библиотеки, которые инлайнятся в каждый скрипт.

Offline

#9 22-08-2011 04:30

BritishColonist
Registered: 30-09-2009
Posts: 72

Re: О создании скриптовых языков

должно быть, я немного зазнался, поставив перед собой настолько сложную цель.
давно же я не посещал этот форум.. впрочем, благодарю всех за ответы.
а всем безумцам, решившим создать свой скриптовый язык (или прочие подобные вещи) я хочу сказать, что ВСЁ реализуется в C++, причём довольно просто.
пожалуй, я познал это для себя, открыв возможности си ;D

прикрепляю к посту свою последнюю на сегодняшний день разработку - проигрыватель онлайн-радиостанций для gta sa. может похвастаться некоторыми полезными настройками.
выполнен в виде .asi-плагина. написал на C++ за одну ночь)
всегда мечтал о подобном плагине и скорее всего я такой не один.
подробнейший ридми аж на двух языках прилагается к архиву, настоятельно рекомендуется прочесть его перед использованием.

p.s. Админы, если можно, переименуйте меня в мой нынешний ник: BritishColonist.

p.p.s. К сожалению ничего не прикрепилось. как заливать-то?

Last edited by dragonforce (22-08-2011 06:01)

Offline

#10 22-08-2011 06:40

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: О создании скриптовых языков

Размер аттача ограничен 300кб, и некоторые расширения файлов отклоняются (например, exe).

Offline

#11 22-08-2011 08:08

BritishColonist
Registered: 30-09-2009
Posts: 72

Re: О создании скриптовых языков

куда позволительно залить архив с плагином, дабы скинуть сюда линк?

Offline

#12 22-08-2011 10:17

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: О создании скриптовых языков

народ.ру, айфолдер, мегааплоад... все, кроме летитбит.

Offline

#13 22-08-2011 14:48

444andrei444
Registered: 29-03-2011
Posts: 317
Website

Re: О создании скриптовых языков

Seemann wrote:

народ.ру, айфолдер, мегааплоад... все, кроме летитбит.

Можно один вопросик ,а почему нельзя на летибит, чисто из любопытства. А по поводу онлайн радио это действительно круто!

Offline

#14 22-08-2011 19:19

BritishColonist
Registered: 30-09-2009
Posts: 72

Re: О создании скриптовых языков

пожалуйста:
http://www.megaupload.com/?d=ULESG7UJ
обязательно расскажите друзьям, если понравится.

и куда его тут можно положить, чтобы его заметили или нашли из поиска?)

Last edited by dragonforce (22-08-2011 19:53)

Offline

#15 27-08-2011 17:11

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: О создании скриптовых языков

BritishColonist wrote:

проигрыватель онлайн-радиостанций для gta sa

А можешь к нему BASSWMA прикрутить?


programmer.png
modder.jpg

Offline

#16 28-08-2011 16:42

BritishColonist
Registered: 30-09-2009
Posts: 72

Re: О создании скриптовых языков

не думаю, что это особо сложно, только вот зачем? он и так работает через обычный bass.dll (в этом-то и всё удобство).

Offline

#17 29-08-2011 09:00

RDH
From: Энгельс
Registered: 09-01-2010
Posts: 65

Re: О создании скриптовых языков

BritishColonist wrote:

не думаю, что это особо сложно, только вот зачем? он и так работает через обычный bass.dll (в этом-то и всё удобство).

Так bass.dll без плагина WMA-поток не воспроизводит!


programmer.png
modder.jpg

Offline

#18 25-03-2014 06:31

Snylss
Registered: 25-03-2014
Posts: 1

Re: О создании скриптовых языков

Вот такой вопрос: Как на PhP написать интерпритаор? Хочу попробовать создать скриптовый язык!
Пишу на PhP 2 года!

Offline

Board footer

Powered by FluxBB