@dlangru

Страница 280 из 719
Oleg
06.10.2017
17:29:47
может быть файберы в go просто юзают только 3 регистра?)))

Dmitry
06.10.2017
17:30:46
а данные где они тогда умудряются хранить во время рассчета? Или "го не для рассчетов"..?))

Го он и работает как Го...))

Прошу прощения, не полностью процитировал: "If you do asynchronous preemption you need save/restore ALL registers, that is, 16 general purpose registers, PC, SP, segment registers, 16 XMM registers, FP coprocessor state, X AVX registers, all MSRs and so on. If you cooperatively preempt at known points, then you need to safe/restore only what is known to be alive at these points. In Go that's just 3 registers — PC, SP and DX."

Google
Dmitry
06.10.2017
17:33:28
внимание вопрос — что есть ассинхронная, а что есть кооперативная многозадачность...

я просто думал это одно и тоже

Dmitry
06.10.2017
17:37:34
но чтобы операцию сделать какую-то нужно же данные в процессор загрузить. Разве он может напрямую данные прям в оперативке обрабатывать не загружая их в регистры?

Andrey
06.10.2017
17:46:10
внимание вопрос — что есть ассинхронная, а что есть кооперативная многозадачность...
асинхронная, видимо, нативные потоки. когда ядро приостанавливает поток, нужно сохранить весь контекст выпонения. кооперативная, соответсвенно, файберы, в одном потоке.

хотя это не точно)

Andrey
06.10.2017
17:47:28
Сделал в PE/COFF модуле импорт функций из DLLок. Сделал таблицу ссылок на символы внутри екзешки. Теперь могу писать любые данные в секцию данных. Импортировать функции из дллок. И ссылаться на любые символы из кода. Запилил выводы "Hello world!" в консоль через WriteConsoleA из kernel32

Oleg
06.10.2017
17:50:39
Andrey
06.10.2017
17:51:12
ну я что то тоже не уверен, что подразумевают под асинхронной

Andrey
06.10.2017
17:51:58
не, это для генерации exe файлов

для бекенда компилятора

Google
Oleg
06.10.2017
17:52:46
а где и для чего ты это делаешь?

Andrey
06.10.2017
17:53:15
https://github.com/MrSmith33/tiny_jit

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

Oleg
06.10.2017
17:55:01
?

Andrey
06.10.2017
17:55:07
только десяток основных инструкций x86_64

Andrey
06.10.2017
17:55:51
круто...

Oleg
06.10.2017
17:56:15
только десяток основных инструкций x86_64
а ты не разбирался в устройстве dmd?

Andrey
06.10.2017
17:56:25
не особо

Oleg
06.10.2017
17:56:32
или ldc

Andrey
06.10.2017
17:56:37
нет

Oleg
06.10.2017
17:56:49
жаль

Andrey
06.10.2017
18:02:56
еще там есть простой язык с целыми числами, вызовами функций. Цикл while, if else, операторы + - < =. Можно регать функции из D и вызывать изнутри. Можно для скриптов использовать

Dmitry
06.10.2017
18:08:25
К моему любимому вопросу про парсинг. А как быть если хочется програмно конфиг nginx менять?

Там же формат то не простой...

Pavel
06.10.2017
18:16:21
Можно попросить сишника покопаться в исходниках и сказать используется ли для парсинга какая-либо грамматика

На первый взгляд там все просто

section_name { statement1; statement2; }

Ievgenii
06.10.2017
21:56:54
Пока до if-ов не дойдешь)))

Andrey
06.10.2017
22:27:45
https://github.com/hmemcpy/milewski-ctfp-pdf

Dmitry
07.10.2017
08:00:43
а это точно? Просто я вот что прочитал (про Go) If you cooperatively preempt at known points, then you need to safe/restore only what is known to be alive at these points. In Go that's just 3 registers — PC, SP and DX.
В Go добровольное (кооперативное - от слова кооперация) переключение на другую горутину это операция, которую вставляет компилятор. Соответственно, он знает, какие регистры в этот момент что содержат. Все рассчетные операции с большим числом регистров к этому моменту закончены, остались лишь 3 значения, которые висят там постоянно. Т.е. до переключения код мог использовать кучу разных регистров, но вот он закончил и теперь может переключиться на другую горутину.

Google
Dmitry
07.10.2017
08:01:26
В случае же preemptive - это когда извне идет переключение, неожиданно для выполняющегося кода. Там все регистры могут быть нужны, все надо сохранять в стеке.

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

Dmitry
08.10.2017
05:46:01
@thedeemon а как компилятор узнает что рассчетные операции закончены? К примеру же рассчет может быть чуть дольше. Что тогда?

Просто как я понимаю у Go в случае блокировки горутины все остальные рутины рантайм перемещает в другой тред. "When a coroutine blocks, such as by calling a blocking system call, the run-time automatically moves other coroutines on the same operating system thread to a different, runnable thread so they won't be blocked"

Пhоверяю идею о том, что у Go все крутится в одном потоке на ядро, но в разных го-рутинах. http://paste.code123.org/925bc5f5-9533 Эксперимент это не подтверждает. Вот вывод: > go run app.go direct Done going without loop baz Done foo Done bar Done О;идалось что порядок будет: foo bar baz т.к. foo все заблокирует

Ievgenii
08.10.2017
11:12:50
А если сделать не 3, а скажем 30 вызовов таких ф-ций?

И использовать какой-то слип? Если он там есть...

Dmitry
08.10.2017
11:23:38
Слип будет скипаться рантаймом

Ievgenii
08.10.2017
12:16:01


Ну вот тебе и параллельность)))

Для горатин он создаёт отдельные треды

И ввиде маски их туда засылает

Ievgenii
08.10.2017
12:17:09
И если ты "израсходуешь" все треды - то привет

Dmitry
08.10.2017
12:22:51
как у тебя lock1 вnорым завершился?

по идее в начале должны были все test выполниться

Ievgenii
08.10.2017
12:28:08
Да, я тоже так ожидал

Но оно вот так...

Dmitry
08.10.2017
13:52:21
@thedeemon а как компилятор узнает что рассчетные операции закончены? К примеру же рассчет может быть чуть дольше. Что тогда?
Так он сам же их генерит. Вот есть у тебя несколько строк кода с расчетами. Грубо говоря, для выполнения одной строки компилятор может задействовать все регистры. Но когда результат одной строки записан в память, регистры свободны, пока еще не начали делать вычисления из следующей строки... Тут-то и можно вставить петеключение горутины.

Dmitry
08.10.2017
14:02:13
Погоди, а если я в рутине будут математику какую-т долго считать? Там разве будет момент когда "все регистры свободны"?

qwerty
08.10.2017
14:38:16
подскажите как удалить несколько элементов из массива

Google
qwerty
08.10.2017
14:38:36
пожалуйста

Oleg
08.10.2017
15:35:32
Можно фильтром и в новый массив

Dmitry
08.10.2017
16:51:17
А можно как-то так сделать? auto x = foreach(i;1..10) { yield(i); }

Dmitry
08.10.2017
16:53:05
Погоди, а если я в рутине будут математику какую-т долго считать? Там разве будет момент когда "все регистры свободны"?
До оптимизации - да, сколько угодно. Грубо говоря, каждая точка с запятой в С/С++ и что там у них вместо ; в Го - это место, где регистры свободны. Оптимизатор может это изменить, но это ж тоже часть компилятора, так что он сам с собой всегда договорится - где регистры иметь свлбодными, а где соптимизировать и передать что-то между разными строчками в них.

Dmitry
08.10.2017
16:54:50
короче в моем примере это просто оптимизатор так работал?

Admin
ERROR: S client not available

Dmitry
08.10.2017
16:58:30
подскажите как удалить несколько элементов из массива
std.algorithm.remove: "Multiple indices can be passed into remove. In that case, elements at the respective indices are all removed. The indices must be passed in increasing order, otherwise an exception occurs. int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; assert(remove(a, 1, 3, 5) ==[ 0, 2, 4, 6, 7, 8, 9, 10 ]); "

Dmitry
08.10.2017
17:01:01
Да, именно так я и сделал, но мне хочется понять можно ли без класса генератора обойтись

Dmitry
08.10.2017
17:02:32
Dmitry
08.10.2017
17:03:28
ну вот по твоей ссылке там класс генератора создается. только посредством него можно так делать?

Dmitry
08.10.2017
17:05:07
Еще больше запутал. :) То речь шла о регистрах и оптимизаторе, теперь вдруг об интерфейсе yield..

Dmitry
08.10.2017
17:07:12
Тот случай, когда кроме кода надо слова доки читать. Индексы. :)

Oleg
08.10.2017
17:08:53
Ну, индексами манипулировать

Dmitry
08.10.2017
17:10:02
Да, этот метод вообще редко полезен. Там еще хитрось в его использовании - что происходит с исходным массивом.

Dmitry
08.10.2017
17:18:11
Короче получается компилятор знает когда можно все тормознуть переключив текущий файбер на другой и делает это

Google
Dmitry
08.10.2017
17:19:16
а drop не подходит?

qwerty
08.10.2017
17:34:41
myArr = myArr.filter!fnc.array;
Мне нравится это. Но! Элементы которые не попадут в массив будут удалены?

Oleg
08.10.2017
17:35:42
Удаление это что?

qwerty
08.10.2017
17:36:26
В смысле gc их вычистит?

Oleg
08.10.2017
17:36:37
ну в какой-то момент да

qwerty
08.10.2017
17:36:42
Понял

Oleg
08.10.2017
17:36:53
если нужно вызывать деструкторы принудительно, то нужно отдельно это делать

qwerty
08.10.2017
17:37:03
Не думаю

Да я удаляю мертвые сокеты из массива

Oleg
08.10.2017
17:37:59
их не нужно никак финализировать?

просто gc может и до конца работы программы их не трогать

а может и в след момент удалить

на логику работы может влиять

qwerty
08.10.2017
17:39:24
Ясно! Destroy поможет для того чтоб финализировать?

Oleg
08.10.2017
17:40:09
по сути да, но на форуме советуют отдельный метод использовать для финализации

если это твой класс, конечно

qwerty
08.10.2017
17:40:29
Я понял

Спасибо

Страница 280 из 719