Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Критическая масса

Критическая масса — в диалектической логике минимальное количество мыслей, необходимых для начала самоизливающейся цепной реакции деления с общественностью.
Рейтинг: 5.00. Голосов: 2.

Условная компиляция: отрицательное условие

Запись от iNils размещена 07.02.2012 в 20:18
Обновил(-а) iNils 08.02.2012 в 21:18

Вопрос задали в рассылке ruFlash. Дублирую мой вариант решения.
Суть вопроса в том, чтобы компилировать, либо один вариант кода, либо другой.

Такой вариант работать не будет.
Код AS3:
TEST::on {
	trace ('on');
}
!TEST::on {
	trace ('off');
}
Поэтому заводят два параметра и меняют из значения на противоположные:
Код:
<define>
	<name>TEST::on</name>
	<value>true</value>
</define>
<define>
	<name>TEST::off</name>
	<value>false</value>
</define>
Код AS3:
TEST::on {
	trace ('on');
}
TEST::off {
	trace ('off');
}
Если TEST::on == true и TEST::off == false, то мы увидим "on"
Если TEST::on == false и TEST::off == true, то мы увидим "off"
Но вот если оба равны true, то будет и "on" и "off"
А если false, то ничего не будет.

Меняя оба параметра вручную, рано или поздно, можно допустить ошибку. Да это и не удобно.
Чтобы упростить задачу, то есть менять только один параметр, можно воспользоваться такой хитростью:
Код:
<define>
	<name>TEST::mode</name>
	<value>true</value>
</define>
<define>
	<name>TEST::on</name>
	<value>true==TEST::mode</value>
</define>
<define>
	<name>TEST::off</name>
	<value>false==TEST::mode</value>
</define>
Теперь, меняя значение у TEST::mode, мы динамически меняем его у TEST::on и TEST::off.
Всего комментариев 48

Комментарии

Старый 07.02.2012 20:55 КорДум вне форума
КорДум
 
Аватар для КорДум
Здорово!
Только я бы попросил подредактировать цвета (а конкретнее желтый). Поберегите глаза тех, кто сидит на дефолтном стиле движка форума.
Старый 07.02.2012 21:51 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
Поберегите глаза тех, кто сидит на дефолтном стиле движка форума.
http://www.flasher.ru/forum/showthread.php?t=175007
Старый 07.02.2012 22:46 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
mode true
Код AS3:
-define=TEST::on,true -define=TEST::off,!TEST::on
mode false
Код AS3:
-define=TEST::on,!true -define=TEST::off,!TEST::on
Старый 07.02.2012 22:57 iNils вне форума
iNils
 
Аватар для iNils
Речь о конфигах в flex-config.xml
Хотя наверно, там тоже можно такое провернуть. Завтра проверю.
Старый 08.02.2012 00:48 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Можно еще вот так:
Код AS3:
if (TEST::on)
{
	trace("on");
}
else {
	trace("off");
}
Старый 08.02.2012 00:51 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Или даже так:
Код AS3:
if (!TEST::on)
{
	trace("off");
}
Старый 08.02.2012 01:12 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Inet_PC, в результате компиляции в проекте останется конструкция вида:
Код AS3:
if (false) {
...
} else {
...
}
То есть смысл от конфига компиляции теряется - весь код попадает в проект. Это то же самое, что просто написать if-else с проверкой константы. Варианты, описанные выше просто включают определенный блок кода в проект при определенных условиях.
Старый 08.02.2012 09:53 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
gloomyBrain, от части Вы правы, но не все так плохо))
Код AS3:
//-define=TEST::on,true -define=TEST::off,!TEST::on
//При 
if (TEST::on)
{
	trace("on");
}
//Получаем:
trace("on");
//Тот же самый пример при on == false во флешку вообще ничего не запишется.
Код AS3:
//При -define=TEST::on,true -define=TEST::off,!TEST::on и 
if (TEST::on)
{
	trace("on");
}
	else {
	trace("off");
}
//Получаем:
trace("on");
//И соответственно при on == false:
trace("off");
//Все происходит именно так как мы и хотим.
Код AS3:
//И только когда начинаем использовать ! начинается хрунь((
//-define=TEST::on,true -define=TEST::off,!TEST::on и 
if (!TEST::on)
{
	trace("off");
}
//Получаем:
if (!true)//Это все происходит из-за практически некакущей оптимизации, 
{//вот это можно было и вырезать
	trace("off");
}
//Кошмарно согласен((
 
//При on == false:
if (!false)
{
	trace("off");
}
Код AS3:
//Ну и соответственно :
if (!TEST::on)
{
	trace("off");
}
else {
	trace("on");
}
 
//Превращается в 
if (!true)
{
	trace("off");
}
else
{
	trace("on");
}
Ну и при on == false ненужный код так же попадает в swf((. Таким образом, если не использовать "!" то можно обойтись и без второй константы компиляции.
Обновил(-а) iNils 08.02.2012 в 12:08
Старый 08.02.2012 16:21 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
Цитата:
gloomyBrain, от части Вы правы, но не все так плохо))
Все именно так плохо. за исключением того, что конструкция вида
Код AS3:
if (true)
попадает в байткод всегда без условия. Это одна из немногих оптимизаций, которые делает FlexSDK. Например
Код AS3:
if (!true)
Уже попадет в байткод вместе с условием.

ЗЫ
Вообще FlexSDK - это беда а не компилятор.
Старый 08.02.2012 20:10 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Цитата:
Все именно так плохо. за исключением того, что конструкция вида
Код AS3:
if (true)
попадает в байткод всегда без условия. Это одна из немногих оптимизаций, которые делает FlexSDK.
А разве этого нам мало, чтобы не использовать вторую константу компиляции?
Старый 08.02.2012 20:13 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Цитата:
ЗЫ
Вообще FlexSDK - это беда а не компилятор.
Абсолютно с Вами согласен.
Старый 09.02.2012 13:35 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Абсолютно с Вами согласен.
И чем же интересно знать он вам не угодил? Приведите примеры и отличия
Старый 09.02.2012 14:54 ~~~ вне форума
~~~
 
Аватар для ~~~
Ну ОК. Но я бы сделал так:
Код AS3:
      <define>
         <name>CONFIG::debug</name>
         <value>true</value>
      </define>
 
      <define>
         <name>CONFIG::release</name>
         <value>false==CONFIG::debug</value>
      </define>
Старый 09.02.2012 17:22 FlashRus вне форума
FlashRus
 
Аватар для FlashRus
Супер! Не знал о таких возможностях!
Старый 09.02.2012 20:02 gloomyBrain вне форума
gloomyBrain
 
Аватар для gloomyBrain
@in4core Посмотри на генерируемый байт-код. Он по крайней мере не оптимален.
Старый 09.02.2012 20:27 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Цитата:
И чем же интересно знать он вам не угодил? Приведите примеры и отличия
Самый простой пример:
Код AS3:
public static const FOO: int = 15 + 30;
Так и останется в коде. Я уж и не говорю о:
Код AS3:
public static const FOO: int = getFoo() * 15;
public static function getFoo():int {return 17;}
И
Код AS3:
if (false)
{
//тонны строчек кода
}
Аналогично останется во флешке.
Mxmlc, пожалуй, единственный компилятор(из тех что я знаю), который не делает, практически никаких, оптимизаций . Я уже не говорю о чем то более сложном (например: Развёртка, свёртка, объединение и разделение циклов;Вычисление инвариантов циклов, вынесение общих подвыражений и кода в ветвлениях, вынесение ветвлений из циклов и др).
Обновил(-а) Inet_PC 09.02.2012 в 20:33
Старый 09.02.2012 22:25 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Inet_PC, всё просто: лучше нету.
Старый 09.02.2012 23:11 elder_Nosferatu вне форума
elder_Nosferatu
 
Аватар для elder_Nosferatu
2Psycho Tiger
Горько, но правда...
Старый 09.02.2012 23:34 in4core вне форума
in4core
 
Аватар для in4core
Inet_PC это я все прекрасно понимаю, я немного неверно задал вопрос. Чем это грозит ? Проще говоря, останется в коде и останется, дальше что? Кому это помешает? Или от этого итоговая скорость работы подает?
Старый 09.02.2012 23:44 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
in4core, курочка по зернышку клюет, а весь двор обсирает. Так и тут: там на обработку лишнего условия тратиться процессорное время, там алгоритм не оптимизирован, в результате падает производительность, может для юзера и не критично, но падает. Это огорчает.
Старый 10.02.2012 01:13 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Цитата:
Inet_PC, всё просто: лучше нету.
И походу лучше уже и не будет((
Цитата:
Или от этого итоговая скорость работы подает?
Естественно падает, а как же иначе? Вы не замечали, что флешка без кода (или почти без кода) работает гораздо быстрей той, что с кодом? Дольше грузится, дольше запускается, гораздо больше жрет памяти, зависает, мерцает и все что угодно. И для всех стандарт, что баннер на флеше загружает 4-х ядерник под 100%. Про мобильники я вообще молчу.
Цитата:
Кому это помешает?
Мне мешает, другим разработчикам мешает, пользователям, процессору, ОЗУ, HDD, скорости интернет соединения, можно еще долго продолжать. Хорошо только противникам Flash-а, которые на всех углах кричат, что Flash мертв (хорошо если в 20 по популярности входит).
Цитата:
Проще говоря, останется в коде и останется, дальше что?
Ну забыл хирург тампон в пациенте, дальше то что... Ну скорее всего никто не сидит и специально не пишет мертвый код, значит скорее всего он там оказался из-за какойто ошибки. А что ошибки это плохо, думаю и так понятно. Почему строители не строят сотни этажей вручную по старинке? Всем краны, бетономесилки и многочего еще подавай. Так почему я, как разработчик, должен делать механическую работу для которой компьютер собственно и был создан? Почему mxmlc не друг мне? Почему он не помогает мне делать мою работу быстрее, качественней, лучше и тд и тп? Считается (вроде как) что программист тратит около 90% времени на поиск и исправление ошибок, так какого лешего mxmlc усугубляет эту ситуацию и делает разработку на Flash гораздо менее привлекательно и приятной? Ну скажите мне кто в здравом уме и памяти будет писать на почти "мертвом" языке, компилятор которого делает все, что в его силах, чтобы этому человеку не понравилось?
Я и так пишу абсолютно неидеальный код, так еще "этот друг" очень хорошо мне помогает. В общем, я считаю, что во флешке, скомпиленной для ВК, НЕ ДОЛЖНО БЫТЬ НИ СТРОЧКИ ЛИШНЕГО КОДА для версии mail.ru или одноклассников например. Я флеш люблю, его бы отдать в хорошие руки и цены бы ему не было.
Старый 10.02.2012 14:17 FlashRus вне форума
FlashRus
 
Аватар для FlashRus
Цитата:
отдать в хорошие руки и цены бы ему не было.
много барохла разгребать придётся. Да и вообще, думаю мало кому по карману будет, разве что Microsoft)))
Старый 10.02.2012 14:38 in4core вне форума
in4core
 
Аватар для in4core
Мне так не кажется, дело не в деньгах скорее а в лени, что у адоба денег чтоли нету? Да и причем тут деньги, 2-3 толковых программиста соберут новый компилятор за пол года, - даже у нас в универе помню были у сапра задачи собирать свой компилятор для С++
Старый 10.02.2012 14:45 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Цитата:
разве что Microsoft)))
Тыдыщь, только не им... Тем более у них SilverLight врядли они купят флеш.
Старый 10.02.2012 14:46 fish_r вне форума
fish_r
 
Аватар для fish_r
Inet_PC++ )
Старый 10.02.2012 15:07 TanaTiX вне форума
TanaTiX
 
Аватар для TanaTiX
Цитата:
Тем более у них SilverLight врядли они купят флеш.
Тем более они забили на SilverLight.
Старый 10.02.2012 15:13 in4core вне форума
in4core
 
Аватар для in4core
Кстати странно, что забили, вроде как интересная платформа была, и уже были компании которые брали разработчиков сл на работу, даже у нас в городе
Старый 10.02.2012 15:47 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
Мне так не кажется, дело не в деньгах скорее а в лени, что у адоба денег чтоли нету?
А что, у компании при деньгах есть "лень"? Как ты себе это представляешь?
"Нет, мы не будем развивать нашу платформу, хотя это требуется и нужно. Почему? Ну, мне например лень подписать об этом приказ."?

Это просто смешно )
Старый 10.02.2012 16:03 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Ну вот что-то в слове "лень" есть если воспринимать ее в неком "корпоративном" смысле. Многие компании обладают такой ленью.
Старый 10.02.2012 16:30 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
А что, у компании при деньгах есть "лень"?
Легко. Понабрали например новыйх разработчиков - и чтобы перелопатить весь компилятор им надо вникать сначала в старый и т.п. - в итоге сроки могут быть огромными, - бросают затею. Даже если разработчики те же, перелопачивать тонну кода - никому не хочется, опять же сроки бешенные. Не совсем и лень, скорее нет нужды, когда и так все работают и будут работать даже с таким
Старый 10.02.2012 16:45 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
Вообще мне кажется, все это достаточно "интимные" моменты, философия у каждой компании своя. Если Адоби не "пилит" компилятор, значит есть более приоритетные цели для них, чем доделывать то, чем все и так будут пользоваться.
Вспоминается фраза про мышей и кактус.
Старый 10.02.2012 21:35 FlashRus вне форума
FlashRus
 
Аватар для FlashRus
Microsoft Flash))))
а вообще, думаю, если бы они взялись, то делали бы по полной. И напихали бы туда .NET
Старый 10.02.2012 22:44 Tails вне форума
Tails
 
Аватар для Tails
Такие мелкие косяки компилятора ... Всё-равно основная нагрузка на 4 ядерник идет от отрисвоки на экране.
Старый 11.02.2012 01:47 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Цитата:
Понабрали например новыйх разработчиков - и чтобы перелопатить весь компилятор им надо вникать сначала в старый и т.п. - в итоге сроки могут быть огромными, - бросают затею.
Цитата:
2-3 толковых программиста соберут новый компилятор за пол года
Взаимоисключающие параграфы?
Цитата:
скорее нет нужды, когда и так все работают и будут работать даже с таким
А это уже правильный ход мыслей.
Старый 11.02.2012 02:54 iNils вне форума
iNils
 
Аватар для iNils
Если одни и те же люди работают над одним и тем же проектом, а новых задач особо нет, то как истинный программисты, они просто "обязаны" заняться оптимизацией
Старый 11.02.2012 12:09 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Сколько иронии, ё-мое.)
Старый 11.02.2012 15:30 Tails вне форума
Tails
 
Аватар для Tails
И нашелся на руси богатырь, расправившийся со всеми змеями адобовского компилятора ...
Старый 25.02.2012 00:00 dsQuadro вне форума
dsQuadro
 
Аватар для dsQuadro
люди просвещенные, подскажите пожалуйста, эта возможность только во флексе есть, или в FD тоже можно этим пользоваться? если можно то как?
Старый 25.02.2012 00:17 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
Не нашел я как прикрепить скрин к ответу, но
Project -> Properties... -> Compiler Options -> Compiler Constants
Старый 25.02.2012 00:33 ChuwY вне форума
ChuwY
 
Аватар для ChuwY
.....
Цитата:
-load-config=project-config.xml переопределяет глобальные параметры.

-load-config+=project-config.xml добавляет значения к тем глобальным параметрам, у которых их более одного, таким как -library-path. Глобальные параметры, принимающие только одно значение, переопределяются.
Старый 25.02.2012 01:39 dsQuadro вне форума
dsQuadro
 
Аватар для dsQuadro
спасибо! но что-то все равно не получается =( где бы почитать про project-config.xml, и как его формировать?
Старый 25.02.2012 02:21 ChuwY вне форума
ChuwY
 
Аватар для ChuwY
Почитайте вот здесь
Старый 25.02.2012 17:32 dsQuadro вне форума
dsQuadro
 
Аватар для dsQuadro
Спасибо! попробую разобраться.
Старый 11.03.2012 16:00 alatar вне форума
alatar
 
Аватар для alatar
Цитата:
Я флеш люблю, его бы отдать в хорошие руки и цены бы ему не было.
Если вы про компилятор, то уже отдали (почти, осталось в репу залить). И следующий (aka Falcon) отдадут, когда допишут.
Старый 11.03.2012 16:04 Silicium вне форума
Silicium
 
Аватар для Silicium
Цитата:
Если вы про компилятор, то уже отдали (почти, осталось в репу залить).
можно чутка подробнее? О чем речь?
Старый 11.03.2012 16:22 alatar вне форума
alatar
 
Аватар для alatar
Flex SDK, включая компилятор передали в Apache. Процесс еще не завершен, пока полностью передали только код фреймворка, включая svn историю. В последующем также будут переданы ныне разрабатываемые компиляторы Falcon и FalconJS.
Старый 11.03.2012 17:24 Silicium вне форума
Silicium
 
Аватар для Silicium
Спасибо, буду знать.
Старый 11.03.2012 20:21 Aquahawk вне форума
Aquahawk
 
Аватар для Aquahawk
Про модификации компилятора можно на хабре лянуть
 

 


Часовой пояс GMT +4, время: 02:27.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.