ADOLF

cJass - дополнение к языку JASS

» опубликован

Что это?

cJass - это еще одно расширение языка JASS, которое полностью совместимо с популярным vJass. Цель его создания - дать программистам еще больше возможностей по созданию простого и качественного кода. Основными направлениями являются:
  1. Макросредства и стандартная библиотека - избавляют от рутины, позволяя сконцентрироваться на основном коде.
  2. Упрощение синтаксиса - мы не хотим снова начинать спор, какой синтаксис лучше (блоки через begin & end или {}), и более того, мы не навязываем свою точку зрения - все конструкции cJass имеют JASS-style аналоги, тем не менее мы предоставляем выбор.
  3. Оптимизация карты - основная концепция cJass - это то, что все языковые конструкции не должны сказываться на качестве генерируемого кода. Также мы работаем над встроенным оптимизатором.

Как это использовать?

Просто скачайте дистрибутив (пароль для архива: cjass), распакуйте и запустите инсталлятор. У вас уже должен быть установлен Jass New Gen Pack.
Ознакомиться с возможностями можно, прочитав руководство пользователя cJass (off-line версия этого файла также имеется в директории программы).

Что-то не работает!

В настоящий момент мы активно дополняем язык всевозможными конструкциями, поэтому полноценная проверка синтаксиса пока отсутствует. Но мы всегда внимательно изучаем
bug-репорты, которые можно оставить в этой теме.

У меня есть идея: а не плохо бы...

Мы всегда рады выслушать Ваши идеи и предложения по внесению каких либо новых возможностей в язык, расширению стандартной библиотеки и т.д. Иногда мы даже действительно делаем то, что Вы нам предлагаете ;) Наша секция обратной связи ждет Вас!
» И напоследок немного истории.
А история программы начинается на ресурсе wc3c.net, когда Vexorian, выслушав предложение от ADOLF'a сделать инструкции инкремента и декремента создает ветку с обсуждением синтаксиса... и благополучно забывает об этом. Тогда ADOLF подумал: "А неплохо было бы сделать свой парсер и включить в него всяких вкусностей". Изначально программа весила меньше заветных 9000 байт, распространялась по сети ICQ/Jabber и ее использовали несколько человек.
Однажды один из ее пользователей - Van Damm (впоследствии стал соавтором) сказал "это очень удобно!" (это было сказано про то, что можно вызывать функции без ключевого слова call) - и тогда мы решили, что если это удобно, почему бы не выложить программу на публичное обозрение. Благодаря zibade у нас появился сайт, где сразу стал отписываться Dark Dragon, который помог выявить львиную долю багов и внес множество интересных предложений.
С тех пор прошло много времени, мы сделали много новых версий, вес программы вырос в 3 раза (сейчас 26 Кбайт). На данный момент у нас есть планы, касающиеся многих конструкций, оптимизатора, и всего прочего.


Просмотров: 79 719



MF #101 - 11 лет назад 1   
Van_Damm, даешь новый тип counter с методами getCurent, getNext и так далее )))
Van Damm #102 - 11 лет назад 0
MF, ты почти угадал О_О
Elf_Stratigo #103 - 11 лет назад 0
[code]library ZloVnytri initializer init
define private e_Accelerator = 3
define
{
private void=nothing
private int=integer
private bool=boolean
}
private group dgroup
private bool Zlo
{
return GetWidgetLife(GetFilterUnit())>.405 and (not IsUnitAlly(GetFilterUnit(), dplayer))
}
private void OnTimer
{
dplayer=Player(1)
}
private void init()
{
count=0
dgroup=CreateGroup()
TimerStart(CreateTimer(),0.01*e_Accelerator,true,function OnTimer)
Zlo
}
endlibrary[/code]
Очень забавно - AdicHelper вешается в шаге Killing Vexorian
как бы если внутри очень много чего написано сомнительного, то тривиальность ошибки не сразу видна...
Sebra #104 - 11 лет назад 0
Библиотеку не открыл фигурной скобкой - раз
Начались дефайны - ждём закрытие endlibrary
определение переменной
private bool Zlo
и открываем блок...
{
return GetWidgetLife(GetFilterUnit())>.405 and (not IsUnitAlly(GetFilterUnit(), dplayer))
}
Вот на ничейном блоке влутри либы без { и затыкаемся
NCrashed #105 - 11 лет назад 0
Предложение сделать энум:
ForGroup name{

}
Sebra #106 - 11 лет назад 0
А нативку зачем приплёл?
Энум уже есть и собирается быть лучше. Давно.
Van Damm #107 - 11 лет назад 0
library/endlibrary тоже работает. Другое дело, что после имени функции должны стоять скобки! Это ведь чёрным по белому написано в руководстве! Его кто-то читает вообще?
adic3x #108 - 11 лет назад 0
[quote]ForGroup name{
}[/quote]
это векс делает, я пока над анонимными функциями не думал
Sebra #109 - 11 лет назад 0
Van_Damm, "Затыкаемся" - значит АдикХелпер зависает!
И с чего это твой апдейтер стал распознаваться трояном?
Кстати, в момент зависания (на функции Zlo) опять вылез антивирус.
ADOLF, Я понимаю, что вперёд Векса анонимные функции делать чревато, но может быть всё просто:
sometype somefunction(int arg){
...
      TimerStart(t, 65.0, false,  function(){ BJDebugMsg("65 seconds later") }  )
...
}
Выносим анонимную функцию перед текущей, даём ей уникальное имя, подставляем это имя в выражение. - Всё. Этого достаточно.
Векс, правда, хочет , чтобы внутрь передавались локалки, чтобы использовались интерфейсы, ещё что-то. Но уже этого будет достаточно для начала.
adic3x #110 - 11 лет назад 0
bb:ну мне сейчас надо баги отфиксить))) т.е. там их много... очень
насчет апдейтера - хз, ну вообще он даунлоадит... вд, а ты не думал мд делать сам .ехе апдейтера статичным, а даунлоадитть .длл, а потом ее через лоад либрари?
YellowStar #111 - 11 лет назад 0
function = nothing
дефаин с таким типом записи, умирает на убиистве векса.
Van Damm #112 - 11 лет назад 0
bb:Эм, странный дефайн вообще-то. Но вам ведь сказали, что вылеты ещё есть (
Sebra #113 - 11 лет назад 0
narayan, Это типа "функция - ничто, юнит - всё" ?
Ну да. Делает из кода такую кашу, что cJass вешается. Хотя надо, конечно выдавать ошибку.
Нож - инструмент опасный. Можно и порезаться.
После такого, даже если в пользовательском коде всё хорошо (да хоть пусто), близовские функции рушатся.
Elf_Stratigo #114 - 11 лет назад 0
bb:у меня вопрос по оптимизатору - а является ли эта штука супер чудоштукой?))))
поясню немного:
допустим есть в карте несколько триггерных спелов, разумеется они регистрируются эквивалентными событиями с разными условиями
дак супероптимизатор объединяет их события в один триггер - где будет одна функция GetSpellAbilityId() и кучка ифоф?))
ну и соответственно с другими событиями...
если нет, то можно считать это предложением)
Van Damm #115 - 11 лет назад 0
Elf_Stratigo, нет офк
Van Damm добавил:
Пока оптимизатор только режет неиспользуемые функции, и всё.
YellowStar #116 - 11 лет назад 0
Мне это нужно было, чтобы восстановить возможности zInc частично, так скажем. Все равно неприятный. Надо исправлять (догадываюсь что лаг изза main и конфиг)
Sebra #117 - 11 лет назад 0
Elf_Stratigo:
у меня вопрос по оптимизатору - а является ли эта штука супер чудоштукой?))))
поясню немного:
допустим есть в карте несколько триггерных спелов, разумеется они регистрируются эквивалентными событиями с разными условиями
дак супероптимизатор объединяет их события в один триггер - где будет одна функция GetSpellAbilityId() и кучка ифоф?))
ну и соответственно с другими событиями...
если нет, то можно считать это предложением)
Такого делать нельзя!
Автор карты может явно использовать подобные системы (они есть), но оптимизатор не может.
Разные триггеры могут использовать по нескольку разных событий, разные функции - фильтры, на их хэндлы могут быть привязаны разные данные. Всего этого просто так не учесть.
narayan:
Мне это нужно было, чтобы восстановить возможности zInc частично, так скажем. Все равно неприятный. Надо исправлять (догадываюсь что лаг изза main и конфиг)
Э-это как???
Elf_Stratigo #118 - 11 лет назад 0
[quote=Sebra]Такого делать нельзя!
Автор карты может явно использовать подобные системы (они есть), но оптимизатор не может.
Разные триггеры могут использовать по нескольку разных событий, разные функции - фильтры, на их хэндлы могут быть привязаны разные данные. Всего этого просто так не учесть.[/quote]
я и не спрашивал про всё, а токо эквивалентные!!!
пример реализации:
А:
  1. Ищем блоки, содержащие CreateTrigger( ) и считаем вхождение функций регистрации событий, допустим TriggerRegisterAnyUnitEventBJ, без ограничения общности, EVENT_PLAYER_UNIT_SPELL_EFFECT
  2. Отсеиваем функции, единственные в своём классе, и содержащие сложные условия
  3. Для каждого оставшегося класса оставляем один триггер - диспетчер
  4. Для каждого диспетчера - действие - выбор по соответствующему условию
Пример:
[code]
до оптимизации
function Trig001_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A001'
endfunction
function Trig001_Actions takes nothing returns nothing
endfunction
function InitTrig001 takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function Trig001_Conditions ) )
call TriggerAddAction( t, function Trig001_Actions )
set t=null
endfunction
function Trig002_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A002'
endfunction
function Trig002_Actions takes nothing returns nothing
endfunction
function InitTrig002 takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function Trig002_Conditions ) )
call TriggerAddAction( t, function Trig002_Actions )
set t=null
endfunction
результат оптимизации
function TrigSuper_Actions takes nothing returns nothing
local integer Super = GetSpellAbilityId()
if Super=='A001' then
call Trig001_Actions(Super)
elseif Super=='A002'
call Trig002_Actions(Super)
endif
endfunction
function InitTrigSuper takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( t, function TrigSuper_Actions )
set t=null
endfunction[/code]
  1. 2 функции эквивалентной структуры InitTrig001 и InitTrig002
  2. нечего отсеивать...
  3. результат InitTrigSuper
  4. результат TrigSuper_Actions
И главное - критерии сравнения можно также передать в функцию, заменив соответственно вызовы "условной" функции переменной
Б:
Можно также сделать "явный" приказ оптимизатору - типо эта функция - должна относится к блоку "заклинания"; нечто вроде:
void OnSpell() #spell(<код заклинания>)
{
}
тогда эта функция при оптимизации будет зарегистрирована в соответствующем диспетчере
<код заклинания>==цифирка или глобалка типа инт
Каждая карта имеет в себе обычно несколько триггерных заклинаний, которые могут входить в разные системы(library) - поэтому чтобы джассеру самому оптимизировать вызовы функции, необходимо вручную избавляться от ООП, или работать с результатом трансляции vJASS компилятора...
Я бы сам сделал вариант Б, но я ассемблер немного плоховато знаю, чтобы подписать ...
ScorpioT1000 #119 - 11 лет назад 0
это "непросто"
Sebra #120 - 11 лет назад 0
Весьма мягко ещё сказано.
Для подобной оптимизации существуют наработки. Их автор должен применять сознательно.
Попытки оптимизатора сделать это автоматически будут натыкаться на 1000 мелочей типа сохранения или определения хэндла триггера, пересекающихся условий, неоднократно применяемых функций и т.д.
Хочешь сделать сам - пытайся.
Elf_Stratigo #121 - 11 лет назад 0
bb:я могу попробовать сделать это в паскале, если это переведут в ассемблер, то сё ок
разумеется буду делать вариант Б :Р
adic3x #122 - 11 лет назад 0
[quote]я могу попробовать сделать это в паскале[/quote]
сказанного достаточно
подобная оптимизация делаться небудет ввиду потенциально опасности возниконовения ошибок
Nekit1234007 #123 - 11 лет назад 0
bb:Обновил до .15, смотрю About...
adic3x #124 - 11 лет назад 0
адик забыл надпись поправить)))
сделаем сейчас
DragonSpirit #125 - 11 лет назад 0
ADOLF, и сделай (с) через © ))
Van Damm #126 - 11 лет назад 0
Обновил до .15, смотрю About...
fixed
ZeToX2007 #127 - 11 лет назад 0
Сделать бы перехват не только обычных функций но и vJass (структур в основном)
Van Damm #128 - 11 лет назад 0
Сделать бы перехват не только обычных функций но и vJass (структур в основном)
и в чём проблема это сделать сейчас?
Nekit1234007 #129 - 11 лет назад 0
жасс (0.A.2.5) и адик (1.4.1.1[h]6[/h]) хелперы опять не стакаются :]
При тупо (без изменений) пересохранении карты Fiziks0.6.w3x вылетает:
2 комментария удалено
Van Damm #132 - 11 лет назад 0
Nekit1234007, сейчас посмотрю
Diaboliko #133 - 11 лет назад 0
Мне не особо это нужно, но кто создал цджасс???(Русския или не русские?)
BK.Jugg #134 - 11 лет назад 0
[b]Diaboliko[/b], украинцы)
adic3x #135 - 11 лет назад 0
Nekit1234007, ты скинул карту ван дамму? если нет - то мне для отладки нужен материал, а именно исходный код
Diaboliko, в первом посте написана история создания программы
NCrashed #136 - 11 лет назад 0
Обновите сайт, а то там еще висит версия 15, а уже 16 вышла.
Van Damm #137 - 11 лет назад 0
ADOLF, вопрос с некитом уже решен. Парсер снова тупит на
function ...
   globals
      ...
   endglobals
   ...
endfunction
NCrashed #138 - 11 лет назад 0
В шестой версии физики такого не должно быть, помню, что фиксил. Вообще нужно добавить варны при компиляции на такую конструкцию.
NCrashed добавил:
Почему при такой конструкции парсер все равно выпиливает часть кода:
define Module = true

...
#if Module then


#endif 
...
NCrashed добавил:
Версия парсера 16. Выпиливается даже при такой конструкции
define Module = true

...
#if Module then

#else
	DoNothing()
#endif 
...
Chester #139 - 11 лет назад 0
SOS!
if a == "\"{}
"\" пытается склеивать след строку! Что делать?
adic3x #140 - 11 лет назад 0
NCrashed, зен ненужен
Van_Damm, скажите прямо - что фиксить?
ADOLF добавил:
if a == "\"{}
"\" пытается склеивать след строку! Что делать?
пытаться как то понять, что \" - а кавычка внутри строки?
Chester #141 - 11 лет назад 0
пытаться как то понять, что \" - а кавычка внутри строки?
ADOLF, не понял вопроса. Объясни как мне сровнять строки с символом \ ?
Нужно для функции экранирования путей иконок
adic3x #142 - 11 лет назад 0
Нужно для функции экранирования путей иконок
символ \ должен указіваться как \\ смотри любой рабочий код и как в нем указанны пути к ресурсам
Chester #143 - 11 лет назад 0
а что, не будет работать если я в указании пути напишу ekran("ReplaceableTextures\CommandButtons\BTNHolyBolt.blp") а она мне уже возвратит "ReplaceableTextures\\CommandButtons\\BTNHolyBolt.blp" ? Для меня удобней так, чем вручную добавлять по \ к каждой.
Так всеже, как можно сравнить этот символ?
Chester добавил:
думаю решение в
//! nocjass
adic3x #144 - 11 лет назад 0
а что, не будет работать если я в указании пути напишу ekran("ReplaceableTextures\CommandButtons\BTNHolyBolt.blp")
небудет
думаю решение в
! nocjass
думаю решение в
! подключить мозг
ADOLF добавил:
сЖасс к этому отношения не имеет
NCrashed #145 - 11 лет назад 0
Ну тогда, ошибку пусть выдает, а не просто втихую вырезает код =)
NCrashed добавил:
Мда и не мешает сделать систему варнов, чтобы быдлокод не плодился.
Sebra #146 - 11 лет назад 0
Chester:
ekran("ReplaceableTextures\CommandButtons\BTNHolyBolt.blp")
Попробуй вывести эту строку, набранную в джассе...
А потом попробуй её же, но с удвоенными '\'.
Просто этот символ в строке - спецсимвол. Читай правила работы со строками.
Elf_Stratigo #147 - 11 лет назад 0
[quote]\adichelper\AHupdate.exe
Win32:Malware-gen
Вирус/Червь[/quote]
D:
NETRAT #148 - 11 лет назад 0
у меня
обнаружено: троянская программа Trojan-Downloader.Win32.Genome.tkp URL: cjass.xgm.ru/files/cJassSetup.exe//stream//data0008//PE_Patch.UP...
обнаружено: троянская программа Trojan-Downloader.Win32.Genome.tkp Файл: cJassSetup\$INSTDIR\AdicHelper\AHupdate.exe//PE_Patch.UPX//UPX
адик зачем ты вишмастера постишь? =)
Van Damm #149 - 11 лет назад 0
бред и паранойя
adic3x #150 - 11 лет назад 0
это маразм конченых антивирусов - считать любое .ехе, которое загружает через инет другое .ехе - вирусом
ADOLF добавил:
хотя что бы хомячки не визжали надо это как то порезать
ADOLF добавил:
анивей там чистый си, если бы я писал виря то там бы был асм и что то нетривиальное