- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
// Шифровка текста.
char* encryption(char *Text){
int i = 0;
while(Text[i]){
switch(Text[i]){
default:
Text[i] = '.';
break;
case 'a':
Text[i] = ',';
break;
// ...
}
i++;
}
return Text;
}
bormand 27.03.2014 13:01 # +2
Vasiliy 27.03.2014 13:30 # −1
roman-kashitsyn 27.03.2014 13:30 # −1
absolut 27.03.2014 14:26 # +7
Lokich 27.03.2014 16:23 # +2
Psionic 27.03.2014 17:07 # 0
guest 27.03.2014 17:22 # 0
Что?
roman-kashitsyn 27.03.2014 17:24 # +2
Psionic 27.03.2014 19:14 # 0
bormand 27.03.2014 19:32 # +1
Какие? В систему контроля версий добавляешь только питоний скрипт. В сгенеренный файл ничего руками не пишешь, под контроль его не добавляешь (его будет генерить сборочная система). Вот и все, и никаких проблем :)
P.S. Есть только мелкая проблемка - в IDE не сразу будут появляться подсказки по этому файлу. Но это решается банальной сборкой проекта.
roman-kashitsyn 27.03.2014 19:53 # 0
roman-kashitsyn 27.03.2014 21:33 # 0
Abbath 27.03.2014 19:50 # +5
guest 27.03.2014 20:13 # 0
Кого?
bormand 27.03.2014 20:14 # +4
Vindicar 27.03.2014 21:42 # +2
Кстати, кто-то разработал общий алгоритм синтеза квайна из N шагов. На хабре точно было.
3.14159265 27.03.2014 21:52 # 0
Совершенно верно.
Видел абсолютно безумные цепочки из 10-ти языков.
guest 27.03.2014 23:12 # +2
Abbath 27.03.2014 23:19 # +2
3.14159265 28.03.2014 12:37 # 0
http://habrahabr.ru/post/74827/
Lokich 27.03.2014 20:38 # 0
если уж на то пошло, то для этого даже питон не нужен, можно в экселе его нагенерить. мне когда лень грузить данные из экселя в базу через всякие загрузчики, то я там генерю insert скрипты
Psionic 28.03.2014 14:11 # 0
Vindicar 27.03.2014 17:34 # +1
Имхо оно заменит текст точками и всё.
inkanus-gray 27.03.2014 17:37 # +1
Soul_re@ver 27.03.2014 18:34 # +1
bormand 27.03.2014 19:35 # +1
Да. Порядок меток в свиче не имеет никакого значения. Это же всего лишь метки, по которым управление впрыгивает в большой блок...
Скорее всего первая версия switch'а транслировалась во что-то типа: И эта сишкоблядская деталь реализации до сих пор зияет из сишки, крестов и даже жабы...
bormand 27.03.2014 19:47 # +3
3.14159265 27.03.2014 21:58 # 0
Сохронил!
3.14159265 27.03.2014 22:05 # 0
bormand 28.03.2014 05:17 # 0
TarasB 28.03.2014 09:52 # 0
А если метки ведут на участки кода, равномерно отстоящие друг от друга, то можно ли вообще вычислить адрес, а не брать из таблицы?
Видимо
void* a = &&first + (&&second-&&first)*i;
goto *a;
first :
...
second :
bormand 28.03.2014 10:00 # 0
TarasB 28.03.2014 10:17 # 0
bormand 28.03.2014 10:36 # 0
TarasB 28.03.2014 11:43 # 0
bormand 28.03.2014 12:23 # 0
3.14159265 28.03.2014 12:32 # 0
Предсказателю переходов и блоку упреждающего исполнения это очень понравится.
bormand 28.03.2014 13:25 # 0
3.14159265 28.03.2014 13:28 # 0
Таблицы виртуальных функций и косвенные переходы цп таки как-никак научились ускорять. А "умное" вычисление адреса ставит крест на перфомансе, именно поэтому в интеле такие трудности со сменой eip.
> лишнего перехода перед goto *.
cmov
bormand 28.03.2014 13:36 # 0
Да никак ;) Вроде бы для косвенных переходов был тупой кеш на одно последнее значение (предполагаем, что прыгнут в то же самое место). Или там что-то поумнее нынче?
3.14159265 28.03.2014 13:45 # 0
> был тупой кеш на одно последнее значение
Там уже всё гораздо умнее.
Деталей не помню, но кажись еще в core 2 и последующих интелах какую-то оптимизацию придумали. Потом и амд запилила.
3.14159265 28.03.2014 13:51 # 0
3.14159265 28.03.2014 13:58 # +1
3.12 Indirect jumps on older processors Indirect jumps, indirect calls, and returns may go to a different address each time. The prediction method for an indirect jump or indirect call is, in processors older than PM and K10, simply to predict that it will go to the same target as last time it was executed.
Indirect jump prediction An indirect jump or call is a control transfer instruction that has more than two possible targets. A C++ program can generate an indirect jump or call with... a virtual function. An indirect jump or call is generated in assembly by specifying a register or a memory variable or an indexed array as the destination of a jump or call instruction. Many processors make only one BTB entry for an indirect jump or call. This means that it will always be predicted to go to the same target as it did last time. As object oriented programming with polymorphous classes has become more common, there is a growing need for predicting indirect calls with multiple targets. This can be done by assigning a new BTB entry for every new jump target that is encountered. The history buffer and pattern history table must have space for more than one bit of information for each jump incident in order to distinguish more than two possible targets. The PM is the first x86 processor to implement this method. The prediction rule on p. 12 still applies with the modification that the theoretical maximum period that can be predicted perfectly is mn, where m is the number of different targets per indirect jump, because there are mn different possible n-length subsequences. However, this theoretical maximum cannot be reached if it exceeds the size of the BTB or the pattern history table.
3.14159265 28.03.2014 14:11 # 0
Просто от произвольности этих значений зависит сложность формулы выбора.
В общем виде формула смотрится примерно так
f(x) = ((-(x = c)) & (a - c)) + ((-(x = a)) & (b - c)) + c
где a-c, b-c - константы
3.14159265 28.03.2014 12:41 # 0
по сути изменение eip/rip
> участки кода, равномерно отстоящие друг от друга
Только на risc-архитектурах где инструкции имеют фиксированную длину, на x86 с его разношерстными командами такое вряд ли сработает.
3.14159265 27.03.2014 21:56 # 0
>>Скорее всего первая версия switch'а транслировалась во что-то типа
Еще в фортране/бейсике был похожий оператор, только там явно были номера меток.
В лично том бейсике на котором кодил я такой фичи не было, но я слышал про диалекты с оной.
А вот в фортране называлоьс computed goto
http://h21007.www2.hp.com/portal/download/files/unprot/fortran/docs/lrm/lrm0124.htm
bormand 28.03.2014 05:18 # 0
TarasB 28.03.2014 09:53 # 0
bormand 28.03.2014 09:58 # 0
tirinox 28.03.2014 10:57 # +2
3.14159265 28.03.2014 12:38 # 0
bormand 28.03.2014 13:26 # 0
3.14159265 28.03.2014 14:05 # 0
3.14159265 28.03.2014 16:52 # 0
Если I не [1,2,3] оно вроде просто проваливалось вниз.
bormand 28.03.2014 17:37 # 0
3.14159265 28.03.2014 17:52 # 0
А GOTO X - гццизм.Я раньше всегда мечтал об такой фиче, но в реале никогда не видел
3.14159265 28.03.2014 12:30 # 0
В этом-то и вся фича.
TarasB 28.03.2014 13:37 # 0
3.14159265 28.03.2014 13:42 # 0
3.14159265 28.03.2014 14:17 # 0
Я сначала не въехал, но как мне объясняли сиё было полезно чтобы вставлять между ними код, а номера не менялись.
TarasB 28.03.2014 14:24 # 0
3.14159265 28.03.2014 14:26 # +1
Потому метки в олд-бейсик-проги и выглядят:
10
20
30
TarasB 28.03.2014 14:37 # 0
рефакторинг он такой
3.14159265 28.03.2014 14:48 # 0
TarasB 28.03.2014 14:57 # 0
guest 28.03.2014 15:15 # 0
guest 28.03.2014 15:38 # 0
bormand 28.03.2014 15:18 # 0
tirinox 27.03.2014 22:22 # 0
3.14159265 27.03.2014 23:09 # 0
absolut 28.03.2014 17:07 # 0
Это если бряки присутствуют.
bormand 28.03.2014 17:08 # 0
absolut 29.03.2014 03:51 # +1
Lokich 31.03.2014 22:52 # 0
bormand 01.04.2014 05:19 # 0
Lokich 01.04.2014 22:31 # +1