LINUX.ORG.RU

Чувства неполноценности тред: знает ли кто-нибудь свой стандарт и сдк?

 , ,


2

3

Сабж

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

Теперь вопрос на засыпку. Воспользуюсь преимуществом большого и толстого мэйнстрима, вот вам два языка: Java и С++. Хотя борщевиков тоже интересно услышать, у них особая ситуация - неписаные стандарты.

Вопросы:

1) Кто из лоровцев читал и _знает_ свои стандарты? Соответственно, для Java это Java Language Specification и Java Virtual Machine Specificaiton for Java 8 SE Edition, и для С++ это ISO/IEC 14882:2011 C++ International Standard

2) Кто из лоровцев чистал свои сдк, и знает как они работают? Вот так по чесноку, положа ногу на сердце. Соответственно, JDK stable (сейчас JDK8), JDK current (сейчас JDK9) для Java, и STL/Boost/Qt для C++

Я сейчас пытаюсь хотя бы просто по одному разу прочитать JDK9, и это уже чувствуется как титанический труд. Там чуть больше 10 тысяч классов, я успеваю прочитать пару десятков в день, и в памяти остается только самое поверхностное понимание, скорее даже неуловимое послевкусие, как от если на улице случайно пройти мимо восхитительной девушке. Java Language Specification я прочитал раз десять, но все равно находятся места, которые видишь как в первый раз.

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

Но.......

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

Хотелось бы услышать тут отзывы этих героических людей. Истории успеха. Какие-то советы, как достичь подобных вершин. Спасибо.

★★★★☆
Ответ на: комментарий от ddos3

Не, я в церковь не хожу, спасибо. Если тебе мой опыт (я лично вытаскивал из реки человека, который в молодости и в детстве прекрасно плавал, а решил это сделать в возрасте 60 лет «показать, как надо плавать» и стал пузыри пускать) не доказательство, то набивай себе шишки сам и учись на них.

peregrine ★★★★★
()
Ответ на: комментарий от jtootf

это не вектор

А что же это? Связный список?

в нем нет значений типа bool

А какого же типа в нем значения? Целые числа? Вещественные? Может быть, строки?

ddos3
()
Ответ на: комментарий от ddos3

А что же это? Связный список?

это структура, не удовлетворяющая концепту вектора: адрес нулевого элемента нельзя трактовать как массив. это вообще плохая структура

А какого же типа в нем значения?

а какого типа значение одного бита в битовом поле?

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

это структура, не удовлетворяющая концепту вектора

Вектор - это одномерный массив, по определению. Оператор [] имеется? Значит удовлетворяет. То, что имплементация не дает каких-то дополнительных плюшек, не делает эту структуру не-вектором.

а какого типа значение одного бита в битовом поле?

Внезапно, один бит как раз и есть чистое булево значение.

ddos3
()
Ответ на: комментарий от ddos3

Вектор - это одномерный массив, по определению

вектор - это элемент векторного пространства. по определению

не делает

как раз и есть

да пожалуйста, хоть десять раз

jtootf ★★★★★
()
Ответ на: комментарий от ddos3

И что ты хочешь этим сказать?

А, блаародный дон, понимаю. Наверно нужно повторить.

Внезапно, один бит как раз и есть чистое булево значение.

anonymous
()
Ответ на: комментарий от jtootf

вектор - это элемент векторного пространства.

Это в математике. а в CS это все-таки одномерный массив. Ну и если уж на то пошло, «элемент векторного пространства» уж точно не должен хранить свои члены в единой последовательной области памяти и предоставлять пользователю указатель на нее.

ddos3
()
Ответ на: комментарий от anonymous

Я до сих пор не вижу, что ты хочешь этим сказать. Можешь прекратить мычать и кидаться цитатами, и внятно сформулировать свою мысль на русском языке?

ddos3
()
Ответ на: комментарий от anonymous

Сгинь из треда и не позорься. Бит - булево значение в теории, а на практике архитектура ПК не позволяет адресовать что-то меньше 8 бит. Потому во всех компиляторах размер переменной типа bool как раз 8 бит или 1 байт, но нет, какому-то грамотею пришло в голову вместо нормального, обычного вектора, в котором лежат те же самые переменные, что и везде, сделать эмуляцию 1 битных bool в этом векторе. Т.е. выделяется 8-битная область памяти, где каждому биту соответствует 1 булева переменная, если надо больше 8 таких переменных, то выделяется ещё одна такая область памяти. А считываются они оттуда скорее всего бинарным сдвигом, из-за таких особенностей этот вектор ведёт себя далеко не так, как ведут себя все остальные контейнеры типа вектор. Кстати, sizeof(char) тоже 1 вернёт, т.к. он возвращает размер в байтах.

peregrine ★★★★★
()
Ответ на: комментарий от anonymous

А, ну ок. Надо было сразу так и написать. Чего было так долго тужиться-то, прежде чем лужи газифицировать?

ddos3
()
Ответ на: комментарий от ddos3

Так я думал ты реально не понимаешь и хочешь разобраться. Ан нет, с последним совсем плохо, а с первым жуткий перебор.

anonymous
()
Ответ на: комментарий от ddos3

Это в математике

угу. а в C++ есть пункт стандарта class template vector overview, в котором сказано:

The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size()

иными словами, любой вектор в C++ должен хранить свои члены в единой последовательной области памяти. кроме vector<bool>

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

адрес нулевого элемента нельзя трактовать как массив

А почему должно бы можно?

The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

вектор - это элемент векторного пространства. по определению

Это Степанов придумал vector-ами называть, он же потом сказал, что это было неудачное название.

quasimoto ★★★★
()
Ответ на: комментарий от jtootf

Стандарт и я читал, если что. С++ определяет требования к своей реализации вектора, и явно гарантирует доступ по адресу только для не-булевых векторов. В чем проблема-то? Вот если бы стандарт не обговаривал отдельно vector<bool>, а фактическая его реализация отличалась бы, тогда я бы тебя понял.

ddos3
()
Ответ на: комментарий от ddos3

Стандарт и я читал

да мне всё равно, что ты читал. правда

В чем проблема-то?

в том, что vector<bool> это не вектор. и в нём нет значений типа bool

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

Он хранит упорядоченный набор значений и предоставляет доступ к произвольному члену за O(1). Значит вектор. Значения, которые он хранит - true и false. Значит булевые.

Реализация в стандартной библиотеке отличается от остальных векторов, в том числе не предоставляет доступ к данным в виде сырого указателя на bool. От этого контейнер не перестает быть вектором, а хранимые значения не перестают быть булевыми.

Что тебе здесь не понятно?

ddos3
()
Ответ на: комментарий от jtootf

Ну тут либо кто-то наступит на грабли и научится std::vector<bool> (а хотели как лучше), либо возьмёт std::vector<ImplicitWrapper<bool>> (правда зачем, если уже научился). С точки зрения стандарта они все vector-а (и сам тип даже не фиксирует «быть элементом вот _этого_ векторного пространства»).

quasimoto ★★★★
()
Ответ на: комментарий от ddos3

чувак, такое дело. на вопрос я ответил, а твоё мнение по поводу того, что такое вектор, мне не очень интересно. удачи в личной жизни и всё такое

jtootf ★★★★★
()
Ответ на: комментарий от quasimoto

наступит на грабли и научится

мы можем учиться ходить по граблям, а можем от граблей избавляться. стандартный dynamic_bitset избавил бы нас от частного случая в обобщённой структуре, реализация котрого накладывает ограничения на обобщённый интерфейс

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

dynamic_bitset

Ага, уговорил.

A container with a proxy reference type can not fulfill the container requirements as specified in the C++ standard (unless one resorts to strange iterator semantics). std::vector<bool> has a proxy reference type and does not fulfill the container requirements and as a result has caused many problems. One common problem is when people try to use iterators from std::vector<bool> with a Standard algorithm such as std::search. The std::search requirements say that the iterator must be a Forward Iterator, but the std::vector<bool>::iterator does not meet this requirement because of the proxy reference. Depending on the implementation, they may or not be a compile error or even a run-time error due to this misuse. For further discussion of the problem see Effective STL by Scott Meyers). So dynamic_bitset tries to avoid these problems by not pretending to be a container.

quasimoto ★★★★
()
Ответ на: комментарий от ddos3

Если что-то там написано в стандарте, это еще не значит, что оно хорошо. То что глупость соответствует сама себе, это еще не делает из нее жемчужину. «Консистентно глупое поведение». В данном конкретном вопросе поддерживаю jootf'а.

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Поддерживаешь его в чем? Что одного бита для хранения bool не достаточно? Он ведь ничего другого так и не сказал.

ddos3
()
Ответ на: комментарий от ddos3

Он про то что для bool вектор — не вектор, в смысле, не контейнер и вообще требует (обобщённый тип-то) особого к себе отношения. А может хотеться более регулярного поведения, так что array, vector, bitset, dynamic_bitset — в самый раз.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Не тупи.

И в чем проблема с vector<bool>?

в том, что это не вектор. и в нём нет значений типа bool

Вместо того, чтобы нормально обсудить (не)удачность идеи внести специализацию для булевых векторов в стандартную библиотеку, он продолжал нести ахинею про то что vector<bool> - не вектор, а bool в нем - не bool.

для bool вектор — не вектор, в смысле, не контейнер

А теперь ты начинаешь повторять ту же глупость. Пойди, почитай, что в стандарте написано про vector<bool>. Может быть поймешь, что это все-же контейнер, раз уж он хранит в себе набор булевых значений, и что практически единственное его отличие от других реализаций, это невозможность получить сырой указатель на данные. Но это плата за восьмикратный выигрыш в памяти и (в некоторых случаях) выигрыш в скорости работы.

ddos3
()
Ответ на: комментарий от ddos3
Ответ на: комментарий от quasimoto

Ты, похоже, и правда тупой, и делаешь все то же самое, что и твой друг. К чему ты сюда вывалил все эти левые ссылки? К чему тут буст и все эти бложики?
Ты, вообще, чего сказать-то хочешь? Что vector<bool> - не вектор? Тогда сразу иди далеко и не оборачиваясь, потому что это чушь. А если что-то другое, то потрудись написать это словами, чтобы мне не приходилось гадать.

ddos3
()
Ответ на: комментарий от ddos3

Любишь разбавлять информацию?

Ты, вообще, чего сказать-то хочешь? Что vector<bool> - не вектор?

Я уже сказал что хотел, ты даже процитировал:

для bool вектор — не вектор, в смысле, не контейнер

Ну вот не контейнер — читай ссылки (в т.ч. N1211, N2160, N2204).

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Специально для дегенератов цитирую единственный источник, который вообще имеет смысл цитировать: ISO/IEC 14882:2011 (а бложики всяких дебилов, вроде тебя, можешь себе засунуть сам знаешь куда).

23.3.7.2:
Unless described below, all operations have the same requirements and semantics as the primary vector template, except that operations dealing with the bool value type map to bit values in the container storage and allocator_traits::construct (20.6.8.2) is not used to construct these values.

23.3.7.5:
void flip() noexcept;
Effects: Replaces each element in the container with its complement.

Ты обратил внимание, что в стандарте пишут «контейнер»? Хочешь сказать, что авторы стандарта тупые и не понимают твою душевную боль?
В общем, ты такой же дебил, как и твой друг, и говорить тут больше не о чем.

ddos3
()
Ответ на: комментарий от ddos3

Ну офигеть, это всё «бложики» членов комитета стандартизации (у которых бложики и разные бусты в проектах, подумаешь). И не в них дело, давай ещё раз:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1999/n1185.pdf

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1847.pdf

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2050.pdf

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2130.html#96

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2160.html

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2204.html

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2353.html

Что есть концепт и иррегулярность (в т.ч. vector<bool>):

http://www.stroustrup.com/sle2011-concepts.pdf

Тот кусок стандарт я уже упоминал:

23.2 Container requirements (vs 23.3.7 Class vector<bool>)

В 14882:2011 к 14882 только «wording» и добавили, но в 23.3 сказано, что reference это lvalue of T, тогда как в 23.3.7 это reference в виде proxy type, обобщённый код из бложика http://isocpp.org/blog/2012/11/on-vectorbool и вообще (грабли же) как не работал, так и не работает (для bool, в остальном всегда работает).

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Ты реально упоротый.

То, что члены комитета пишут в своих бложиках, меня не волнует. Они в конце концов собрались однажды, и выразили общую точку зрения в виде одного стандартного документа. Все остальное, что они писали и пишут - это их личные ночные фантазии, которые ничего не значат.

Далее, в стандарте есть отдельная глава 23.7, в которой vector<bool> описан и назван контейнером не смотря на то, что не удовлетворяет некоторым дефинициям из 23.2.
Так что если хочешь опровергнуть, приведи мне тут цитату из стандарта, где написано, что vector<bool> не является контейнером. Ну или GTFO.

ddos3
()
Ответ на: комментарий от ddos3

open-std.org это уже не бложики, а процесс написания стандарта.

Что мы имеем — 98, 03 и 11 стандарты описывают требования на «container» и «forward iterator» одинаково (отличия не значительны в данном вопросе) и специализируют vector<bool> одинаково, дальше есть все эти предложения на open-std.org, явно говорящие, что vector<bool> и его итератор не удовлетворяет этим требованиям, в 11-ом это никак решено не было, вместо этого был добавлен текст:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2353.html

причём этот же человек отдаёт себе отчёт в том, что формально оно не удовлетворяет требованиям:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2204.html

The 2003 Standard requires a partial specialization of the standard library vector container for bool values. This specification has a number of problems (explained many times over the years) and it has been agreed in principle it should be deprecated (and not removed) in the next Standard, and a replacement provided. See LWG Issue 96 and Beman Dawes paper n2160 for further details if required.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2130.html#96

Vector<bool> is not a container

и т.д. в обратном хронологическом до Саттеровского предложения.

То что слово «container» два раза употребляется в том тексте что-то меняет? Нет — требования «container» и «forward iterator» не выполняются (оставляя в стороне прочую семантику других vector), можно писать стандартный обобщённый код работающий с контейнерами и такими итераторами и не работающий с vector<bool>.

В принципе, проблема не выглядит решённой, вот есть более новое обсуждение:

http://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/8kQzWI61ROU

То есть требования оставлять и устранять специализацию, либо обобщать требования, чтобы можно было писать proxy итераторы и т.п., в бусте есть концепты, опять же:

http://www.boost.org/doc/libs/1_55_0/libs/iterator/doc/index.html#new-style-i...

но всё равно специализация не Ъ — есть контейнеры array и vector для статических и динамических массивов, есть классы bitset и dynamic_bitset для статических и динамических битовых массивов.

quasimoto ★★★★
()
Последнее исправление: quasimoto (всего исправлений: 1)
Ответ на: комментарий от quasimoto

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2130.html#96

Vector<bool> is not a container

Что ты мне всякие нытик-треды цитируешь? Ты мне в стандарте это найди.

То что слово «container» два раза употребляется в том тексте что-то меняет?

Да, меняет. Авторы стандарта официально называют vector<bool> контейнером. И если кто-то из них потом пошел и выплакал свое несогласие с политикой партии в личном бложике, это уже ничего не значит.

ПыСы: Ты вообще понимаешь, что сражаясь за «vector<bool> - не вектор», ты фактически пытаешься мне втереть, что «то, что написано в стандарте, не соответствует стандарту»? Что абсурдно само по себе. Скорее всего, анальные боли у тебя вызывает не это, а сам факт наличия в стандарте главы 23.3.7, но ты слишком тупой, чтобы остановиться и задуматься, о чем ты, вообще, споришь.

ddos3
()
Ответ на: комментарий от ddos3

Это не болжик и не треды, это proposals!

«vector<bool> - не вектор»

«не вектор» это прикол (исключение среди векторов — это да), я сам сначала не понял, но речь про формальное соответствие концептам контейнера и форвард итератора.

Скорее всего, анальные боли у тебя вызывает не это

Что-то ты всё про боль, то про душевную, то про ональную.

Нет, мне всё равно, но vector<bool> всё ещё тупо не удовлетворяет концептам — вот так вот просто и по стандарту.

Вот ещё — http://www.gotw.ca/publications/mill09.htm, если что-то изменилось, то ты рассказывай.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Это не болжик и не треды, это proposals!

Ты правда такой тупой, что не понимаешь разницу между обсуждением и финальным стандартом?

если что-то изменилось, то ты рассказывай.

Да нет, ничего не изменилось. Ты все такой-же тупой. В стандарте прямым текстом сказано, что vector<bool> - контейнер, но ты продолжаешь спорить с этим спорить, ссылаясь на какие-то левые статьи. Боюсь, тебя уже ничего не изменит.

ddos3
()
Ответ на: комментарий от ddos3

Ты говорил уже

в стандарте есть отдельная глава 23.7, в которой vector<bool> описан и назван контейнером

не смотря на то, что не удовлетворяет некоторым дефинициям из 23.2.

То есть контейнером назван, но требованиям контейнера не удовлетворяет.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

требованиям контейнера не удовлетворяет

Термин «контейнер» определяется стандартом. Теперь следи за руками: в главе 23.2 написаны общие требования, в главе 23.3.7 описано исключение из общих правил. Фактически это значит, что контейнер в стандарте определен как «нечто, что соответствует описанию в главе 23.2 или vector<bool>». Когда ты тут ноешь, что «vector<bool> - не контейнер», ты используешь определение контейнера (данное в стандарте), чтобы оспорить это самое определение. До сих пор не видишь проблемы в своем бреде?

ddos3
()
Ответ на: комментарий от ddos3

Термин «контейнер» определяется стандартом.

Попробуй определить термин «контейнер» так же, как делают это создатели стандарта - с помощью собственного мозга.

Стандарт не первичен, это просто отражение наших мыслей. Какие мысли мы думаем, такой стандарт и выйдет.

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

Еще один воин бессмысленного фронта образовался.

Попробуй определить термин «контейнер» так же, как делают это создатели стандарта - с помощью собственного мозга.

Создатели стандарта сочли vector<bool> контейнером. Уверен, они при этом использовали свой мозг. И, представь себе, я тоже использовал свой мозг, и с его помощью полностью с ними согласился в этом вопросе.

Какие мысли мы думаем

Вы, похоже, вообще не думаете.

Ты чего вообще хочешь мне доказать? Что vector<bool> не контейнер? Ну тогда давай, повтори всю ту чушь, которую тут понаписали два твоих предшественника. Что-то другое? Тогда сначала вырази ясно свою позицию, прежде чем бросаться в бой.

ddos3
()
Ответ на: комментарий от ddos3

Ну и зачем так сделано? Почему нельзя иметь общие контейнеры array/vector без всяких исключений и bitset/dynamic_bitset в качестве структур специального назначения со своими оптимизированными алгоритмами вместо обобщённых <algorithm>?

quasimoto ★★★★
()

этому учат в институте

Охлол, ты серьезно?
Сам лично читал спецификацию c++11 для знакомства с основными возможностями и некоторые вырезки java code conventions, да бы знать как правильно оформлять код. Считаю что это знать надо, но позже, когда ты уже неспосредственно работаешь с языком в продакшене.

comp00 ★★★★
()

пытаюсь хотя бы просто по одному разу прочитать JDK9, и это уже чувствуется как титанический труд. Там чуть больше 10 тысяч классов

А зачем их читать? Их надо использовать. Запомнил полсотни-сотню основных, главных, тесезеть, для остальных по мере необходимости вытаскиваешь спецификацию из справочника. По мере роста объёмов написанного тобой говнокода, документация постепенно переселяется к тебе в голову.

Xellos ★★★★★
()
Ответ на: комментарий от quasimoto

Ну и зачем так сделано?

А это разве не очевидно? Исторически так сложилось. В те доисторические времена, когда всей памяти на десктопе было 640К, из которых 150К-200К съедали ОС и шелл, автор библиотеки не устоял перед соблазном сократить расход памяти в 8 или даже в 16 раз (некоторые древние компиляторы не отличали bool от int). Потом через много лет это вошло в первый стандарт. А теперь не меняют из-за обратной совместимости.

ddos3
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.