-
Notifications
You must be signed in to change notification settings - Fork 1k
Russian translations #659
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Russian translations #659
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A very high quality translation, I would welcome more Russian translations of such quality.
I've suggested some minor changes below. All those are minor but make reading easier for me.
|
||
В попытке помочь в программировании многопоточности в стандартную библиотеку Scala были включены параллельные коллекции, которые скрыли от пользователей низкоуровневые подробности параллелизации, дав им привычную высокоуровневую абстракцию. Надежда была (и остается) на то, что скрытая под уровнем абстракции параллельность позволит на шаг приблизиться к ситуации, когда среднестатистический разработчик будет повседневно использовать в работе надежно исполняемый параллельный код. | ||
|
||
Идея проста: коллекции -- хорошо понятная и часто используемая программистами абстракция. И в силу своей структурности, они могут быть эффективно стать параллельными, оставив эту трансформацию прозрачной. Позволив пользователю "подменить" последовательные коллекции на те, что обрабатываются параллельно, решение Scala делает большой шаг вперед к охвату большего количества кода возможностями параллельной обработки. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
" они могут быть эффективно стать" -
быть
лишнее, да и в целом звучит странно
|
||
## Мотивация | ||
|
||
Пока производители процессоров в последние годы дружно переходили от одноядерных к многоядерным архитектурам, научное и производственное сообщества не менее дружно признали, что навыки параллельного программирования по-прежнему трудно привить широким массам. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"трудно привить широким массам" звучит несколько высокомерно, думаю более мягкая форма подойдет лучше.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Спасибо, за оценку и комментарии!
А если оставить ближе к тексту? "признали, что многопоточное программирование по-прежнему трудно сделать популярным"?
|
||
Пока производители процессоров в последние годы дружно переходили от одноядерных к многоядерным архитектурам, научное и производственное сообщества не менее дружно признали, что навыки параллельного программирования по-прежнему трудно привить широким массам. | ||
|
||
В попытке помочь в программировании многопоточности в стандартную библиотеку Scala были включены параллельные коллекции, которые скрыли от пользователей низкоуровневые подробности параллелизации, дав им привычную высокоуровневую абстракцию. Надежда была (и остается) на то, что скрытая под уровнем абстракции параллельность позволит на шаг приблизиться к ситуации, когда среднестатистический разработчик будет повседневно использовать в работе надежно исполняемый параллельный код. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В попытке помочь в программировании многопоточности
чтобы упростить написание многопоточных программ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да.
|
||
В попытке помочь в программировании многопоточности в стандартную библиотеку Scala были включены параллельные коллекции, которые скрыли от пользователей низкоуровневые подробности параллелизации, дав им привычную высокоуровневую абстракцию. Надежда была (и остается) на то, что скрытая под уровнем абстракции параллельность позволит на шаг приблизиться к ситуации, когда среднестатистический разработчик будет повседневно использовать в работе надежно исполняемый параллельный код. | ||
|
||
Идея проста: коллекции -- хорошо понятная и часто используемая программистами абстракция. И в силу своей структурности, они могут быть эффективно стать параллельными, оставив эту трансформацию прозрачной. Позволив пользователю "подменить" последовательные коллекции на те, что обрабатываются параллельно, решение Scala делает большой шаг вперед к охвату большего количества кода возможностями параллельной обработки. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
И в силу своей структурности, они могут быть эффективно стать параллельными, оставив эту трансформацию прозрачной.
я предложение в переведенной форме не понял, пока не посмотрел оригинал
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А я начала сомневаться, что поняла оригинал. Со второй попытки: "Упорядоченность коллекций позволяет эффективно и прозрачно (для пользователя) обрабатывать их параллельно."
|
||
list.par.map(_ + 42) | ||
|
||
Библиотека параллельных коллекций Scala тесно связана с "последовательной" библиотекой коллекций Scala (представлена в версии 2.8), во многом потому, что последняя служила вдохновением к ее дизайну. Он предоставляет параллельную "ответную часть" к ряду важных структур данных из библиотеки (последовательных) коллекций Scala, в том числе: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"ответную часть"
аналог? альтернативу?
* `ParRange` | ||
* `ParTrieMap` (`collection.concurrent.TrieMap` впервые в версии 2.10) | ||
|
||
В дополнение к общей архитектуре, библиотека параллельных коллекций Scala дополнительно делит со своей последовательной "половиной" _расширяемость_. Другими словами, как и в случае с обычными последовательными коллекциями, пользователи могут внедрять свои собственные типы коллекций, автоматически наследуя все предопределенные (параллельные) операции, доступные для других параллельных коллекций в стандартной библиотеке. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
библиотека параллельных коллекций Scala расширяема также как и последовательные коллекции, представленные в стандартной библиотеке.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Читается однозначно лучше, но уходит мысль про общую архитектуру... Но, пожалуй, тут я за читаемость.
|
||
Больше информации о конвертировании можно найти в разделах [преобразования]({{ site.baseurl }}/overviews/parallel-collections/conversions.html) и [конкретные классы параллельных коллекций]({{ site.baseurl }}/overviews/parallel-collections/concrete-parallel-collections.html) этого руководства. | ||
|
||
## Семантика |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Поведение?
Хотя я тут очень неуверен что будет лучше.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
По контексту я склонялась к варианту "Реализация". И тоже была не уверена.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Релизация в данном случае будет неправильный перевод - описывается то, как должна себя вести данная коллекция и какие гарантии предоставляются. Реализаций данного поведения и гарантий может быть множество, и они дальше не затрагиваются.
Думаю лучше оставить "семантика".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Согласна :)
1. **Операции, производящие побочные эффекты, могут нарушать детерминизм** | ||
2. **Неассоциативные операции могут нарушать детерминизм** | ||
|
||
### Операции, производящие побочные эффекты. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
производящие
имеющие?
Thanks for a high grade and helpful comments! I've made a fix according to suggestions. Now I wonder if I am allowed/supposed to publish other subparts of the parallel collections guide in the same pull request. Is it acceptable to commit them not in order of their original sequence? I suppose that merge will be useful only after completion of all eight of them, so there is no problem in being a bit out-of-order... |
Hi @returned-to-life! It's no problem at all for you to complete these translations in any order you like 🙂 And yes, you're right we should wait until all are ready to merge. Many thanks btw for doing this! We really appreciate it! |
@returned-to-life Are you planning to keep on translating this guide? 😄 I think it could be encouraging if we merge this as-is and then you submit another PR with more high-quality translations. It's up to you, though, so you decide! |
@jvican, It'd be best not to merge as-is because it would cause there to be lots of broken links for the other parts of this guide. Normally the policy is that we wait for the document to be completed before we merge a new translation. |
@jvican, I'm definitely about to proceed with translations :) Lately I was a bit offlined, so I couldn't commit results regularly, but I think I'll push a two more subparts till the weekend. To my opinion, it's better to publish whole guide when it complete; it is more comfortable to reader to know that all necessary is ready... @heathermiller, thanks for support! By the way, I have a few little questions about the meaning of some sentences, will it be ok to ask them there? |
Of course @returned-to-life! Happy to help however I can 😄 |
@heathermiller, please! In the second sentence of 'Parallel Array', here, we meet an 'underlying array':
What does 'underlying array' means here? Some structural element that hidden under abstraction level or something closer to 'hardware', like byte array where data stored? Does it correct to say that main idea was that much easier to make a new parallel array than to modify an old one?
... or 'underlying array' here is something different? |
yes. the parallel array is a wrapper around an underlying ordinary array.
hmm... not sure what you mean?
same |
Hello! If there is still some work for Russian translation, I would be more than happy to help. Thank you in advance. |
@SethTisue, thank you very much, you really saved me from a mistake!
It was said in suggestion that the answer on a previous question is "no". For now it seems much clearer to me, so I can't say myself what exactly I mean :) |
@shaitarov, hi! Thank you for an offer of help! It seems like there is a lot of work for Russian translations :) |
@returned-to-life, thank you very much for prompt response! If you need help with parallel collections part, I can help you to finish it. However, if you are fine with your part, I can start working on other parts. I just asked to make sure that our work will not overlap. P.S. Also can I contact you in any other ways like skype or slack? |
@shaitarov, I'm fine with my part, thanks! It seems I'm on a finish curve now :) You definitely can contact me via skype; but the truth is, I more frequently online in github.com than in skype. P.S. Just in case: as_markina. |
It seems like ready! Thanks to all for the support, it was really encouraging! |
@heathermiller, @jvican, for now I suppose that guide translation is ready to merge. What is next? Should I ask someone Russian for review? (By the way, I've noticed that my pull request was excluded from compilation, is it bad?) |
@returned-to-life Oh, it's actually pretty weird that CI is not running here. I'll look into it! Next step is to have someone else review the bits you added. Can you have another look @DarkDimius? Thank you for this work @returned-to-life! 😄 |
Oh, I've just realised why CI is not running. We changed CI to Drone and you haven't rebased over master, so Drone is not finding the configuration file in this branch. Can you do so? Drone will pick it up and run. |
@jvican, thanks! |
Interesting, it seems there's an encoding problem: https://platform-ci.scala-lang.org/scala/scala.github.com/144. |
Quite possible. I made sure that 1-6 were in UTF-8, but can't say that for sure for 7 and 8, that is, "performance". I'm fixing... |
Now this doesn't looks like a proper rebase anyway... Doesn't it better to close this one and create another pull request?... |
Sure, if you wish so! I think it will ease review. Though you don't need to close the PR, you can To fix this, you can undo the git merge by resetting hard before 61e4ed5 and then cherry-picking every of your commits over the latest master. Make sure you do a backup before that 😉. |
14f31ad
to
cf615ae
Compare
@jvican, thank you very much! (Yesterday I've stumbled over that --force, naturally) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I had a pass through the text. It looks good.
Most suggestions are changing literal translations to Russian algorithms terminology.
Aside from this I question if "overviews/parallel-collections/performance.md" should be translated:
- it relies on classes that has long since been deprecated in standard library;
- it is a very advanced topic and people who want to do it will have to read English sources anyway.
num: 5 | ||
--- | ||
|
||
Так же, как и обычная библиотека коллекций Scala, библиотека параллельных коллекций содержит большое количество операций, для которых, в свою очередь, существует множество различных реализаций. И так же, как последовательная, параллельная библиотека избегает повторений кода путем реализации большинства операций посредством собственных "шаблонов", которые достаточно объявить один раз, а потом гибко наследовать в различных реализациях параллельных коллекций. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
я убрал бы "Так же"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+ "а потом гибко наследовать" - меня тут коробит. Я бы убрал "гибко".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(here and further such a comment means: entirely agree, thank you, correction scheduled for following commit)
|
||
Так же, как и обычная библиотека коллекций Scala, библиотека параллельных коллекций содержит большое количество операций, для которых, в свою очередь, существует множество различных реализаций. И так же, как последовательная, параллельная библиотека избегает повторений кода путем реализации большинства операций посредством собственных "шаблонов", которые достаточно объявить один раз, а потом гибко наследовать в различных реализациях параллельных коллекций. | ||
|
||
Преимущества этого подхода сильно облегчают **поддержку** и **расширяемость**. Поддержка может стать простой и надежной, когда одна реализация операции над параллельной коллекцией наследуется всеми параллельными коллекциями; исправления ошибок в этом случае сами распространяются вниз по иерархии классов, а не требуют дублировать реализации. По тем же причинам всю библиотеку становится проще расширять-- новые классы коллекций могут просто унаследовать большинство имеющихся операций. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я бы изменил время в предложении чтобы убрать "неуверенность".
может стать -> станет
становится -> убрал
могут просто унаследовать -> унаследуют
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
||
## Ключевые абстракции | ||
|
||
Упомянутые выше "шаблонные" трейты реализуют большинство параллельных операций в терминах двух ключевых абстракций -- разделителей (`Splitter`) и компоновщиков (`Combiner`). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
компоновщиков -> я не знаю есть ли для этого существующий термин.
При отсуствии терминов я бы предпочел не переводить.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
На самом деле я насчет этого долго сомневалась. Пришла к тому, что раз combiner и splitter - термины из контекста Scala, то где, если не здесь, подбирать русские аналоги? Насчет полезности последних можно, конечно спорить, но мне субъективно приятнее, когда они есть. (Например, мне неудобно читать тексты на русском про future. Устоявшегося перевода я не нашла, хотя понятие уже есть, и не в одном языке программирования (мне нравится словечко "фьючерс", но от него ощутимо веет финансами)).
Поэтому для меня вопрос стоял в форме "как именно лучше перевести", а не "переводить или не переводить". Возможно, я не права.
|
||
### Разделители | ||
|
||
Задача разделителя `Splitter`, как и предполагает имя, заключается в том, чтобы неочевидным образом разбить параллельную коллекцию на разделы. А основная идея-- в том, чтобы разбивать коллекцию на более мелкие части, пока их размер не станет подходящим для последовательной обработки. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
неочевидным образом -> оригинал имел ввиду "нетривиальные" == "непустые"
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
упс... да, действительно. спасибо!
def split: Seq[Splitter[T]] | ||
} | ||
|
||
Что интересно, разделители `Splitter` реализованы через итераторы-- `Iterator`, а это подразумевает, что помимо разделения, они позволяют фреймворку перебирать элементы параллельной коллекции (то есть, наследуют стандартные методы трейта `Iterator`, такие, как `next` и `hasNext`.) Уникальность этого "разделяющего итератора" в том, что его метод `split` разбивает текущий объект `this` (мы помним, что `Splitter`, это подтип `Iterator`а) на другие разделители `Splitter`, каждый из которых перебирает свой, **отделенный** набор элементов когда-то целой параллельной коллекции. И так же, как любой нормальный `Iterator`, `Splitter` становится недействительным после того, как вызван его метод `split`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
фреймворку -> я бы убрал. позволяют всем, а не только фреймворку.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
||
def dup = new ParStringSplitter(s, i, ntl) | ||
|
||
И наконец, методы `split` и `psplit`, которые используются для создания разделителей, перебирающих подмножества элементов текущего разделителя. Для метода `split` действует соглашение, что он возвращает последовательность разделителей, перебирающих непересекающиеся подмножества элементов текущего разделителя, ни одно из которых не является пустым. Если текущий разделитель содержит один или менее элементов, `split` возвращает саму последовательность этого разделителя. Метод `psplit` должен возвращать последовательность разделителей, перебирающих точно такое количество элементов, которое задано значениями размеров, указанных параметром `sizes`. Если параметр `sizes` требует отделить меньше элементов, чем содержит текущий разделитель, то дополнительный разделитель со всеми остальными элементами размещается в конце последовательности. Если в параметре `sizes` указано больше элементов, чем содержится в текущем разделителе, для каждого размера, на который не хватило элементов, будет добавлен пустой разделитель. Наконец, вызов `split` или `psplit` делает текущий разделитель недействительным. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
я бы "содержит" заменил на "покрывает". Разделители на самом деле элементов не содержат, они ссылаются на части оригинальной колекции.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
} | ||
|
||
|
||
## Как мне реализовать собственный компоновщик? В общих чертах? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
мне -> я бы убрал.
В общих чертах? -> тоже
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
||
Тут нет стандартного рецепта, -- все зависит от имеющейся структуры данных, и обычно требует изобретательности со стороны того, кто пишет реализацию. Тем не менее, можно выделить несколько подходов, которые обычно применяются: | ||
|
||
1. Конкатенация и объединение. Некоторые структуры данных позволяют реализовать эти операции эффективно (обычно с логарифмической сложностью), и если требуемая коллекция представлена такой структурой данных, ее компоновщик может быть самой такой коллекцией. Особенно хорошо этот подход работает для пальчиковых деревьев (finger trees), веревочных деревьев (ropes) и различных видов куч. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
подвешенных деревьев (finger trees)
ropes -> я в литературе не встречал понятие "веревочные деревья". По моему опыту используется слово "веревка".
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
||
Кроме этого, результат может включать в себя потраченное на стороне JVM время на осуществление операций автоматического управления памятью. Время от времени выполнение программы прерывается и вызывается сборщик мусора. Если исследуемая программа размещает хоть какие-нибудь данные в куче (а большинство программ JVM размещают), значит сборщик мусора должен запуститься, возможно, исказив при этом результаты измерений. Можно нивелировать влияние сборщика мусора на результат, запустив измеряемую программу множество раз, и тем самым спровоцировав большое количество циклов сборки мусора. | ||
|
||
Одной из распространенных причин ухудшения производительности является оборачивание и разворачивание (boxing и unboxing), неявно происходящее в случаях, когда примитивный тип передается аргументом в обобщенный (generic) метод. Чтобы примитивные типы можно было передать в метод с параметром обобщенного типа, они во время выполнения преобразуются в представляющие их объекты. Этот процесс замедляет выполнение, а кроме того порождает необходимость в дополнительном выделении памяти и, соответственно, создает дополнительный мусор в куче. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
оборачивание и разворачивание -> упаковка и распаковка примитивов.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
||
Наконец, чтобы уменьшить вероятность того, что сборка мусора произойдет посреди микротеста, лучше всего добиться выполнения цикла сборки мусора перед началом теста, а следующий цикл отложить настолько, насколько это возможно. | ||
|
||
В стандартной библиотеке Scala предопределен трейт `scala.testing.Benchmark`, спроектированный с учетом приведенных выше соображений. Ниже приведен пример тестирования производительности операции `map` многопоточного префиксного дерева: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
scala.testing.Benchmark
is deprecated. Should this part be translated at all?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If it's already translated, we can leave it and think about removing this section in all the tutorial soon. /cc @SethTisue
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
logged as #752
@DarkDimius, thank you very much, comments were extremely helpful! I need to think about some of them, however... |
@DarkDimius, thank you once again! Now everything is fine, to my opinion. (Sorry for the bunch of letters (if they were sent) I've just understood, what that "show outdated" thing was). |
@DarkDimius feel free to hit "merge" on this if you think it's ready now. |
LGTM. Thanks for your contribution, @returned-to-life! |
seconded! I don't know Russian, but I can see what a substantial contribution this is. greatly appreciated. |
Hi everyone!
I have noticed that there is not Russian translations here, so I want to add some. To begin with I want to make a translation of Parallel Collections part. Here is the example of quality, if there is not any troubles with or the with the idea itself, I want to proceed with some more translations.
Thank you in advance!