LINUX.ORG.RU

What Hyperthreading Can (and Can't) Do for You

Определение NULL pointer

#define NULL (void*)0

>Если в какой-то архитектуре (кстати примерчик приведите пожалуйста) в указателе NULL не все биты нулевые

Серия Prime 50 использует сегмент 07777, смещение 0 для нулевого

указателя.

Некоторые центральные процессоры Honeywell-Bull используют код 06000

для внутреннего представления нулевых указателей.

Серия CDC Cyber 180 использует 48-битные указатели, состоящие из

кольца (ring), сегмента и смещения.

Большинство пользователей (в кольце 11) имеют в качестве нулевых

указателей код 0xB00000000000.

Это из FAQ по программированию на С.

Для доп. чтения рекомендуется

Стандарт ANSI C (X3.159-1989), сейчас ISO (8898) номер точно не помню

if (!p)

или

if (p == (void *) 0)

Разница понятна ?

Саныч

Sun-ch
()
Ответ на: What Hyperthreading Can (and Can't) Do for You от Sun-ch

За примерчики спасибо.

> f (!p)

> или

> if (p == (void *) 0)

> Разница понятна ?

К сожалению непонятна. Почему вы считаете, преобразование int -> void* компилятор может сделать правильно для данной платформы, а обратное преобразование void* -> int вызовет у него какие-то затруднения?

Еще раз - в условиях на С допустимы только целочисленные выражения (так как сравнение идет с целой константой 0). Если результат выражения не int осуществляется неявное преобразование в int (корректное для данной платформы). Если же исходить из вашей (буду считать ее _вашей_ пока не ткнете ссылкой на стандарт) логики, то и для выражений с плавающей точкой надо употреблять конструкции типа "if(a == 0.0)".

anonymous
()

What Hyperthreading Can (and Can't) Do for You

>Если же исходить из вашей (буду считать ее _вашей_ пока не ткнете ссылкой на стандарт) логики, то и для выражений с плавающей точкой надо употреблять конструкции типа "if(a == 0.0)".

man malloc не читали ?

В соответствии со стандартом ISO/IEC98999:1990

в случае ощибки он обязан возвращать NULL pointer, а не 0x0.

Речь идет исключительно об указателях.

Преобразование не

int -> void*

а

int* -> void*

На ряде архитектур int - 32 бита (сам CPU 32 битный), но шина адреса

может иметь 48 или 64 бита, отсюда int * - 48 или 64 бита.

и конструкция (void *)0 равна например 0xFFFFFFFE а не 0x0.

int *p = malloc(); malloc вернул NULL pointer- ошибка выделения памяти

выражение if (p) обрежет его до 32 бит и мы получим true, хотя была

ошибка.

Выражение if (p != (void*)0) вернет false

Поскольку компилер обязан сгенерить код в котором сравниваются не

32 битные регистры данных, а 48/64 битные регистры адреса.

Что то в этом роде.

В "Kernel Normal Form" на это обращается спец. внимание, поскольку

при портировании ядра на другую платформу может возникнуть ряд

неоднозначностей, связанных именно с представлением указателей.

Саныч

Sun-ch
()

What Hyperthreading Can (and Can't) Do for You

В догонку хочу заметить, что

if (!p) в большинстве случаев сработает правильно, но

лучше все-таки

if (p == NULL) это подчеркнет Ваш профессионализм (хотя бы то что читали

KNF).

Саныч

Sun-ch
()

What Hyperthreading Can (and Can't) Do for You

>то и для выражений с плавающей точкой надо употреблять конструкции типа "if(a == 0.0)".

double a = 0.001;

Перед вычислением if, a -> (int)a = 0

if (a) - false, однако if (a != 0.0) - true

Саныч

Sun-ch
()

> man malloc не читали ?

> В соответствии со стандартом ISO/IEC98999:1990

> в случае ощибки он обязан возвращать NULL pointer, а не 0x0.

> Речь идет исключительно об указателях.

Читал и с _этим_ я не спорю. Хотя мне трудновато вас понять: 0x0 - это что за указатель?

> Преобразование не

> int -> void*

> а

> int* -> void*

Извините, но (void*)0 - это именно преобразование int (0) -> void*.

> На ряде архитектур int - 32 бита (сам CPU 32 битный), но шина адреса

> может иметь 48 или 64 бита, отсюда int * - 48 или 64 бита.

> и конструкция (void *)0 равна например 0xFFFFFFFE а не 0x0.

Опять же. Мне все равно как выглядит в битовом виде (void*)0. Мне (и if, while и т. д.) интересно значение (int)NULL. По моему - это 0 (если преобразования симметричные).

> int *p = malloc(); malloc вернул NULL pointer- ошибка выделения памяти

> выражение if (p) обрежет его до 32 бит и мы получим true, хотя была ошибка.

Правильный компилятор ничего обрезать не станет, а сделает разумное преобразование NULL -> <void* to int> -> 0; Раз уж такая платформа.

> Выражение if (p != (void*)0) вернет false

> Поскольку компилер обязан сгенерить код в котором сравниваются не

> 32 битные регистры данных, а 48/64 битные регистры адреса.

> Что то в этом роде.

Очень сомнительно. Мне кажется, что условие будет срабатывать даже если p примет недопустимое значение. Ну как на этапе компиляции узнать в каком кольце будет работать программа, а значит как правильно преобразовать 0 ((void*)0) в инвалидный указатель? В итоге p _всегда_ будет не равен (void*)0.

> В "Kernel Normal Form" на это обращается спец. внимание, поскольку

> при портировании ядра на другую платформу может возникнуть ряд

> неоднозначностей, связанных именно с представлением указателей.

Скорее с кривизной нативных компиляторов.

anonymous
()

What Hyperthreading Can (and Can't) Do for You

>Скорее с кривизной нативных компиляторов.

KNF аппелирует исключительно к GNU C compiler.

Саныч

Sun-ch
()
Ответ на: What Hyperthreading Can (and Can't) Do for You от Sun-ch

> >Скорее с кривизной нативных компиляторов.

> KNF аппелирует исключительно к GNU C compiler.

Уговорили, с кривизной gcc на этих платформах.

anonymous
()
Ответ на: What Hyperthreading Can (and Can't) Do for You от Sun-ch

> double a = 0.001;

> Перед вычислением if, a -> (int)a = 0

> if (a) - false, однако if (a != 0.0) - true

Да, обломчик-с. Поправляюсь:

... преобразование в численный тип. Для которого имеет смысл сравнение с нулем.

anonymous
()

What Hyperthreading Can (and Can't) Do for You

Ну gcc не так уж и крив :)

Не понятно какой смысл в преобразовании

int *p = malloc();

if (p) <=> (int)p cmp 0

(int) p - это что адрес физической памяти ?

Что даст такое преобразование ?

(int) (void *) 0 это корректная операция с точки зрения С ?

Я понимаю когда сравнивают объекты одного типа числа с числами,

указатели с указателями и т.д.

Саныч

Sun-ch
()

Да ладно тут спорить. Будем писать if (foo != NULL) и все тут. А жаба программеры будут дикие трай/кэтч/файнали выстраивать. Флаг им...

IceD

anonymous
()

А что, if (foo != NULL) в java разве не работает :)))

anonymous
()

С базами работать на жабе не пробовали? Или еще с чем - 99% жаба библиотек вместо возвращения нула или кода ошибки или фолса кидают эксэпшны. И нету у тебя выбора - лови в все тут. Посмотрите для интереса на исходники любого жаба проекта - процентов 20 кода это трай/кэтч/файнали стэйтменты (причем пустые обычно).

IceD

anonymous
()

>С базами работать на жабе не пробовали? Или еще с чем - 99% жаба >библиотек вместо возвращения нула или кода ошибки или фолса кидают >эксэпшны. И нету у тебя выбора - лови в все тут. Посмотрите для >интереса на исходники любого жаба проекта - процентов 20 кода это >трай/кэтч/файнали стэйтменты (причем пустые обычно). В том то и прелесть, что вместо того, чтобы постоянно следить на null или кодами ошибок, можно просто определить действия на случай если при выполнении _блока_ действий произойдет ошибка, и обработать соответственно ошибке. ИМХО это более удобный способ и код становится более читаемым.

Korwin ★★★
()

2 IceD

>И нету у тебя выбора - лови в все тут

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

Alter ★★
()

А если я НЕ хочу ничего отделять и обрабатывать. В с++ сделано удобнее - хочешь проверяй на нул, хочешь трай/кэтч ставь. Свобода. А жаба ПРИНУЖДАЕТ... Я за свободу.

IceD

anonymous
()

2IceD. Это уже не свобода, а анархия. Не охота ничего отделять и обрабатывать - ставь глобально try { } catch (Exception ex) {} и твои волосы будут мягкими и шелковистыми. Вот только как можно будет тогда гарантировать, что программа работает правильно, без ошибок?

ИМХО Java НЕ ПРИНУЖДАЕТ, а ПРИУЧАЕТ писать корректный, нормальный код и это верно (особенно в свете так называемой свободы HTML кодинга).

Korwin ★★★
()

SuperCoolColredFloatingMenu superCoolColoredFloatingMenu = SuperCoolColredFloatingMenu.createSuperCoolColoredFloatingMenu(SuperCoolColoredF loatingMenu.MEGA_COOL_MENU_STYLE | SuperCoolColoredFloatingMenu.ALLOW_MENU_TO_LOOK_EVEN_BETTER)

Вот это практический стандартный жабокод (есессно немного гиперболированно) Комментарии?

IceD

anonymous
()

s/практический/практически/

anonymous
()

2 IceD

Почитайте Б.Эккеля "Философия Java". Многие вещи станут на свои места.

Alter ★★
()

Извините конечно, но засунте себе "Философию Явы" и все прочие "Thinking in Java" в жопу. Не имею охоты "думать" на яве и иметь проблемы со всеми остальными языками/платформами.

IceD

anonymous
()

2 IceD

Воля Ваша. Я от сишных привычек долго отвыкал.. хотел помочь. :((

Alter ★★
()

Microsoft приглядывается к Гуглю

2Alter

>Воля Ваша. Я от сишных привычек долго отвыкал.. хотел помочь. :((

Старенькую собачку нельзя научить новым трюкам.

Саныч

Sun-ch
()

Саныч!

Откуда такой пессимизм? Если язык позволяет четко структурировать рабочий код и обработку исключительных ситуаций, то это, IMHO, можно только приветствовать. В чем я не прав?

Alter ★★
()

> Если язык позволяет четко структурировать То то и оно, что жаба ЗАСТАВЛЯЕТ, а С++ тот-же ПОЗВОЛЯЕТ. Разницу чувствуем?

IceD

anonymous
()

Microsoft приглядывается к Гуглю

>Откуда такой пессимизм? Если язык позволяет четко структурировать рабочий код и обработку исключительных ситуаций, то это, IMHO, можно только приветствовать. В чем я не прав?

Интересно, а почему нет книжек типа "Учимся думать на С" ?

Наверное, люди которые пишут на С, думают в терминах предметной

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

Я понимаю, что есть предметно-ориентированные языки, со своей

философией. В рамках этих языков решаются задачи, которые

принципиально нельзя решить ни на С, ни на яве.

В отношении явы, я испытываю определенный скепсис, поскольку не вижу

задач которые можно решить на яве и нельзя решить на С, а вот обратное

к сожалению неверно.

Саныч

Sun-ch
()

Кстати, насчет 1С и Явы :) Может слышали про "Ил-2" от 1С:Maddox? Для тех, кто не в курсе - это игруха такая под винды. Так вот, этот самый "Ил-2" в основной своей части написан на Яве. На сях там только рендеринг и еще кой-какие низкоуровневые весчи. В WWII будет то же самое, поскольку движок - прямой наследник иловского. Вот так вот.

Анонимный Гейм-Девелопер

anonymous
()

Microsoft приглядывается к Гуглю

>На сях там только рендеринг

Наверное это как минимум 70% от всей нагрузки CPU/FPU :)

Саныч

Sun-ch
()

2 IceD

Пожалуйста, не объясняйте мне что может/не может C++. Я люблю оба эти языка и C++, и Java. Можно долго и горячо спорить о механизмах обратотки исключений, но стоит ли оно того? Боюсь, что мы не очень понимаем друг друга. :((

Alter ★★
()

>"Учимся думать на С"

Ну есть "Thinking In C++" :) Того же автора.

>Наверное, люди которые пишут на С, думают в терминах предметной

Угу. Может даже и согласен. Но при написании любого проекта и НАДО думать в терминах предметной области (например - пиша бух приложение - думаем в терминах проводок и прочей херотени, программируя кернел думаем в его предметной области). В случае явы нам еще необходимо наше мышление подстраивать под нее. Мешает сильно.

Да вот еще конкретный пример: Был у меня ява класс I18N со статическими методами setLocale(String locale) и i18n(String id). Т.е. использование такое:

I18N.setLocale("ru_RU"); // где-нибудь при ините

label.setText(I18N.i18n("hello_msg")); // в любом месте

Так вот. Наш мощный жабопрограммер увидев етот класс в проекте долго плевался, орал что так на яве не пишут и в итоге сделал класс Localization(!!) с НЕСТАТИЧЕСКИМИ методами setLocale(String locale) и getLocalizedString(String id) (!!!). Далее в головном классе проекта сделал СТАТИЧЕСКУЮ __ПРИВАТНУЮ__ переменную "Localization localization" и открытый статический метод getLocalization(). Что получилось:

label.setText(ProjectMainClass.getLocalization().getLocalizedString("hello_ msg"));

И в принципе он прав: стандартные пакеты именно в этом стиле и написаны. Но я так писать _НЕ_ХОЧУ_

ЗЫ. Ничего не имею против различных технологий (как-то EJB & Co) - хочешь используй, хочешь нет. Я сильно против самого УБОЖЕСКОГО языка который НАВЯЗЫВАЕТ стиль программирования и дает кривые реализации тех самых технологий.

ЗЗЫ. С# даже чуть получше (вернее менее хуже) будет с моей точки зрения.

IceD

anonymous
()

Да. Кто нибудть мне сделает метод "String md5(String)" который вернет 32символьную строку с md5. У меня 15 строк вышло с трай/кэтчем :(

IceD

anonymous
()

2IceD Объясни по русски что тебе надо от явы - ты уже просто запарил - то тебе не так и это тебе не так/ Если ТЫ НЕ УМЕЕШЬ програмировать на ней ЧТО ОБЛИВАТЬ.??? Много народа тихо и спокойно програмирует на нем и не пиндосит в чатах - ява суксь потому что я не могу тото и тото/ Имхо это от твоей кривизны рук - не более. Никто тебе не навязывает програмировать на ней - НЕ НРАВИТСЯ НЕ ЕШЬ! Сиди на сях = великолепный язык! ТОЛЬКО ВОТ СРАВНИВАТЬ НЕ НАДО!

2алл - Люди не слушайте провокаторов - имхо они только издеваются

Девел

anonymous
()

>Если ТЫ НЕ УМЕЕШЬ програмировать на ней ЧТО ОБЛИВАТЬ
Допустим умение вынимать пробку из бутылки поcредством ножа бывает полезным.
Но делать это (и пропогандировать этот способ) при наличии штопора по меньшей мере нецелесообразно:-)

>Имхо это от твоей кривизны рук
Относительно языка:-)

>ТОЛЬКО ВОТ СРАВНИВАТЬ НЕ НАДО
А почему, собственно?

>имхо они только издеваются
Вовсе нет. Пытаемся открыть вам(и себе заодно) глаза пошире:-) Правда, вы эту услугу не заказывали явно, но согласие неявно дается при попытке участия в обсуждении IMHO.

DonkeyHot ★★★★★
()

>Если ТЫ НЕ УМЕЕШЬ програмировать на ней ЧТО ОБЛИВАТЬ

Я то как раз умею и успешно пишу на том, что надо от текущего пректа. Меня просто выводят из себя крутые явапрограммеры которые ничего кроме явы не видели, не хотят видеть и орут что яву рулит __для__любых__проектов__ (есть естественно и исключения, но их слишком мало).

Да, еще возникают проблемы с выбором того, на чем писать - если проект довольно крупный и УДОБНЕЕ его писать на том же с++, чем на яве - приходится выбирать все же яву - так как у нас на конторе слишком мало народа, могущего писать на с++ (и явапрограммеры, как было сказано выше в сторону с++ смотреть не хотят даже. руки испачкать боятся)

Кто нибудь дайте комментарии на label.setText(ProjectMainClass.getLocalization().getLocalizedString("hello_ msg")) и label.setText(I18N.i18n("hello_msg")). И короткую и понятную функцию вывода MD5 в студию!

>имхо они только издеваются

Вернее бы сказал, что пар спускаю, который на работе накапливается.

>ТОЛЬКО ВОТ СРАВНИВАТЬ НЕ НАДО

Естественно. Все пишем на яве без права обсуждения и вперед к победе коммунизма. Слышали мы уже такие лозунги. Хватит.

IceD

anonymous
()
Ответ на: What Hyperthreading Can (and Can't) Do for You от Sun-ch

> Ну gcc не так уж и крив :)

Все может быть. :)

> Не понятно какой смысл в преобразовании

> int *p = malloc();

Прежде всего: int *p = (int*)malloc(...);

> if (p) <=> (int)p cmp 0

> (int) p - это что адрес физической памяти ?

Нет. if(p) - расшифровывается как "если p имеет допустимое значение".

> Что даст такое преобразование ?

Краткость. Сестру таланта.

> (int) (void *) 0 это корректная операция с точки зрения С ?

Ну тык. Причем ее результат есть целочисленный 0.

> Я понимаю когда сравнивают объекты одного типа числа с числами,

> указатели с указателями и т.д.

А я не понимаю. Зачем сравнивать с _чем-нибудь_, когда нужна лишь проверка допустимости?

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

> Да ладно тут спорить. Будем писать if (foo != NULL) и все тут. А жаба программеры будут дикие трай/кэтч/файнали выстраивать. Флаг им...

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

P.S. Я не фанат жабы. Скорее наоборот.

anonymous
()

s/смеятся/смеяться/

А напи(ш|щ)ите это на жабе :)

anonymous
()

2Alter

Кстати, "Философия Жабы",

а почему не

"Философия forth",

"Философия scheme",

"Философия Smalltalk" (чего не прощу Sun'у до конца чьей-нибудь жизни)

"Философия какого-нибудь другого прикольного языка (хотя бы и perl'а или ruby)" ?

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

> PS. Где короткий МД5 на яве???!

Где _anything_ *короткое* на Жабе?

anonymous
()

2 anonymous (*) (2003-04-08 18:32:18.694)

>Кстати, "Философия Жабы", а почему не ...

Хмм.. почему? Потому что в этой книге как мне думается дано относительно полное и последовательное описание дизайна языка. Опять же, IMHO. Еще мне казалось, что человек испытывает те же проблемы что и я в свое время. Поймите меня правильно, есть вещи которые приходят из детства и которые непросто менять, для меня скажем такие как язык C или морзянка. Мне понадобилось приличное время, чтобы программирование на Java приносило мне не только результат, но и удовольствие. Cтереотипы мышления сказали свое слово, но догматизм не есть хорошо :)), и рано или поздно любой цепкий ум поймет почему что-то сделано в Java так, а не иначе. С++, он острый как бритва, легко пораниться, но результат радует, Java - мягкая, аккуратная, IMHO, не менее мощная, но я не хотел бы спорить здесь об инструментах. :))

IMHO, любая беседа может состоятся только если собеседники прислушиваются, стараются понять друг друга, а не спускают пар. Ifconfig уже выше говорил об этом. Такие дела..

Да будет больше инструментов, хороших и разных. :))

Alter ★★
()

8) 2Alter - согласен на 100%

От себя хочу заметить - для IceD неплохо было бы познакомиться с языком D ( www.digitalmars.com ) - в нем есть многие вещи, о которых говорилось в треде - как вам, например, алиасы типов или сборка мусора вкупе с комплексными числами 8). Если уж IceD может позволить себе выбирать язык на основе критериев простоты кода - это будет далеко не худший выбор.

Жаль только он сейчас только для i386 8( Очень хотелось бы попробовать на SA11** - подскажите плз кто с этим поборолся -

Карлсон

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

Патамущта соответствующие книги еще не переведены. Если, конечно, я правильно понял, и речь идет о "Thinking Java". Я знаю из этой серии еще "Thinking C++" и "Thinking Postscript".

lukin
()

Новые модели low-end серверов от Sun

А если у меня проект сделан на С, Fortran и Perl ?

На чем мне бедному думать ?

Или вы думаете что у меня 3 головы ?

Sun-ch
()

>На чем мне бедному думать ?

Саныч. :)) Уж тебе-то думать точно есть чем и есть на чем. :)) И нечего тут прибедняться..

Ох уж эти физики-лирики.. (с)

Alter ★★
()

Ядро FreeBSD загрузилось на AMD ClawHammer

2Alter

Не понятно, в чем все же эта "философия Явы" ?

Я понимаю, что есть действительно культовые языки типа lisp.

За более чем 50 лет вокруг его сложилась культурная среда со

своей философией, наработками, причем уровень абстракции и сложности

проектов таков, что эти люди уже давно не программисты, а скорее

математики, спецы по AI, лингвисты и т.д.

А что такого в Яве "мягкого и аккуратного", что уже претендует

на целую философию.

Sun-ch
()

Не провокации ради а интереса для ;) Задачка для java-программеров. Требуется: выполнить команду вида xterm -e lftp -c "mget ftp://user:pass@host/filename(s)" на перле (и, наверное, С) это выглядит так: exec ("xterm -e lftp -c \"mget ftp\://user\:pass\@host/file*\""); А на жабе ? Могу сказать, что наши штатные жаба программеры такую задачу не смогли решить _вообще_, пришлось все делать за них.

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