Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7] 8 9 10 11 .. 69   вперед  Ctrl
 Re: какие новости в мери Delphi  [new]
GunSmoker
Member

Откуда:
Сообщений: 2935
Для всех, кому лень открыть отладчик.

Код:
Y := X;
Y := Y + 5;


В 16-битном Pascal-е это выглядело так:

Y := X; 
// 89C1           mov cx,ax
Y := Y + 5;
// 83C105         add cx,$05


Здесь идёт работа с двухбайтовыми числами (16 бит).

Когда произошёл переход 16 -> 32, этот же ассемблерный код стал:

Y := X; 
// 89C1           mov ecx,eax
Y := Y + 5;
// 83C105         add ecx,$05


Здесь уже идёт работа с четырёхбайтовыми числами (32 бита). Т.е. один и тот же машинный код стал оперировать с целочисленными типами другого размера. Иными словами, родной для процессора целочисленный тип стал другого размера.

Однако, когда произошёл переход 32 -> 64, родной для процессора целочисленный тип не изменился:

Y := X; 
// 89C1           mov ecx,eax
Y := Y + 5;
// 83C105         add ecx,$05


Внезапно, ровно этот же машинный код на x64 работает с 32-битными, а вовсе не с 64-битными числами. Чтобы явно указать, что мы работаем с 64-битным расширением, нужно к каждой команде добавлять специальный префикс REX:

Y := X; 
// 4889C1           mov rcx,rax
Y := Y + 5;
// 4883C105         add rcx,$05


Иными словами, родной для процессора целочисленный тип не изменил своей разрядности в x64, оставшись 32-битным.
24 ноя 16, 00:21    [19927882]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
GunSmoker
Member

Откуда:
Сообщений: 2935
Kazantsev Alexey
GunSmoker
Внезапно - нет.

Внезапно, дельфийская дока:
The platform-dependent integer types are NativeInt, and NativeUInt; use these types whenever possible, since they result in the best performance for the underlying CPU and operating system



Явная ошибка же.
24 ноя 16, 00:22    [19927886]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
rgreat
Member

Откуда:
Сообщений: 3746
Kazantsev Alexey
Чой та? Сериализация у нас существует исключительно для статически размещённых данных?
Integer самый используемый в коде тип.

Нет никакого неудобства.
И, особенно удобно было бы везде приводить integer-ы, например, к DWORD. И думать: а влезет ли туда значение integer.

Ну попробуй к поинтеру прибавить чего-нибудь, без приведения типа. Это сейчас можно c PByte кувыркаться как хочешь, а раньше нельзя было.
Ты сам захотел поиграть в low-level + unsafe игры.
Это как возмущатся что x32 ассемблер под x64 не работает.
24 ноя 16, 00:25    [19927896]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Товарищ младший сержант
Member [заблокирован]

Откуда:
Сообщений: 5126
GunSmoker
Для всех, кому лень открыть отладчик.

Код:
Y := X;
Y := Y + 5;


В 16-битном Pascal-е это выглядело так:

Y := X; 
// 89C1           mov cx,ax
Y := Y + 5;
// 83C105         add cx,$05


Здесь идёт работа с двухбайтовыми числами (16 бит).

Когда произошёл переход 16 -> 32, этот же ассемблерный код стал:

Y := X; 
// 89C1           mov ecx,eax
Y := Y + 5;
// 83C105         add ecx,$05


Здесь уже идёт работа с четырёхбайтовыми числами (32 бита). Т.е. один и тот же машинный код стал оперировать с целочисленными типами другого размера. Иными словами, родной для процессора целочисленный тип стал другого размера.

Однако, когда произошёл переход 32 -> 64, родной для процессора целочисленный тип не изменился:

Y := X; 
// 89C1           mov ecx,eax
Y := Y + 5;
// 83C105         add ecx,$05


Внезапно, ровно этот же машинный код на x64 работает с 32-битными, а вовсе не с 64-битными числами. Чтобы явно указать, что мы работаем с 64-битным расширением, нужно к каждой команде добавлять специальный префикс REX:

Y := X; 
// 4889C1           mov rcx,rax
Y := Y + 5;
// 4883C105         add rcx,$05


Иными словами, родной для процессора целочисленный тип не изменил своей разрядности в x64, оставшись 32-битным.

Офигенная причина, нечего сказать. Архитектура Дельфи оказалась заложником древнего кодогенератора.
24 ноя 16, 00:32    [19927919]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 2676
GunSmoker
Явная ошибка же.

Ну и как после этого верить в любовь?
24 ноя 16, 00:36    [19927925]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
rgreat
Member

Откуда:
Сообщений: 3746
Kazantsev Alexey
Ну и как после этого верить в любовь?
Раз за разом! ;)
24 ноя 16, 00:37    [19927929]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
GunSmoker
Member

Откуда:
Сообщений: 2935
Товарищ младший сержант
Офигенная причина, нечего сказать. Архитектура Дельфи оказалась заложником древнего кодогенератора.


Какого ещё кодогенератора? Это процессор, аппаратная часть.

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

У Крей-1, к примеру, регистры общего назначения были 64-битными (грубо говоря, SizeOf(Integer) = 64), но адресовал память он только на 24 бита (SizeOf(Pointer) = 24).
24 ноя 16, 00:40    [19927936]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Товарищ младший сержант
Member [заблокирован]

Откуда:
Сообщений: 5126
Имхо, дельфикодерам сильно пофиг на архитектуру процессора. На архитектуру Крея - пофиг два раза. Дельфи для того и создавался, чтобы быстро былокодить. Появилась возможность писать код для 64 разрядных ОС - хорошо. Вот тебе поинтер нового размера, и всё, больше ничего нового. А то, что ты его раньше по какой-то причине поинтер в интежер прятал - ну, кто тебе виноват, больше так не делай.
24 ноя 16, 00:54    [19927972]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 2676
rgreat
Integer самый используемый в коде тип.

Это не более чем привычка. Мог бы LongInt быть самым используемым.

rgreat
Ты сам захотел поиграть в low-level + unsafe игры.

Иногда это вынужденная мера.

rgreat
Это как возмущатся что x32 ассемблер под x64 не работает.

Что такое "x32 ассемблер"?
24 ноя 16, 00:56    [19927981]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2468
rgreat
Integer самый используемый в коде тип.

Именно поэтому я и хотел бы, чтобы везде в моем коде он автоматом стал 64-битным.

rgreat
И, особенно удобно было бы везде приводить integer-ы, например, к DWORD. И думать: а влезет ли туда значение integer.

Не пойму, зачем?

rgreat
Ты сам захотел поиграть в low-level + unsafe игры.
Не ко мне, но меня тоже касается и я отвечу.
Вопросом.
Как мне в D7, планируя будущее, надо было писать код вроде того, как писал я:
Pointer( Cardinal( p ) + sizeof( TMyRecord) + sizeof( Pointer ) )^

?
24 ноя 16, 01:03    [19927985]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
GunSmoker
Member

Откуда:
Сообщений: 2935
Товарищ младший сержант
дельфикодерам сильно пофиг на архитектуру процессора


Это как бы не скриптовый язык, не виртуальная машина, не .NET. Это native-компилятор, поэтому он отражает и процессор и ОС.
24 ноя 16, 01:03    [19927986]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 2676
GunSmoker
целочисленные регистры общего назначения являются одновременно и адресными (это далеко не так у многих процессоров)

Потому во Free Pascal есть PtrInt, который совсем не то же самое что дельфийский NativeInt.
24 ноя 16, 01:04    [19927988]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
GunSmoker
Member

Откуда:
Сообщений: 2935
Kazantsev Alexey
Потому во Free Pascal есть PtrInt, который совсем не то же самое что дельфийский NativeInt.


Чем-то это? Именем, что-ли?
24 ноя 16, 01:21    [19928005]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 2676
GunSmoker
Чем-то это? Именем, что-ли?

Именно. Имя NativeInt говорит, что это родное для платформы целое ("целочисленные регистры общего назначения"), а на деле это целое совпадающее с размером указателя ("это далеко не так у многих процессоров"). Придираюсь в общем.
24 ноя 16, 01:34    [19928022]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
DetSimen
Member

Откуда: Новосибирск
Сообщений: 252
а я, с некоторых пор, приучил себя описывать тип явно, и для меня и для компилятора разночтений чтоб не было. Появились же псевдонимы типов Int32, UInt8, Int16 и т.д, как в шарпе. По крайней мере, из описания я сразу знаю максимум, который в такой переменной может храница.
24 ноя 16, 04:41    [19928088]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
rgreat
Member

Откуда:
Сообщений: 3746
Kazantsev Alexey
Это не более чем привычка. Мог бы LongInt быть самым используемым.

Расскажи это RTL и VCL.

Иногда это вынужденная мера.
Бывает. Но тогда и доработки и оптимизации под другую платформу это нечто само собой разумеющееся.

Что такое "x32 ассемблер"?
Давай в терминах не будем копатся. Думаю ты меня понял.
24 ноя 16, 12:56    [19929473]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 2676
rgreat
Расскажи это RTL и VCL.

Так это не удивительно, т.к. они сами говорили, что эти типы нужно использовать всегда. Правда предупреждали, что их размер может меняться (привет твоей сериализации, кстати).

rgreat
Бывает. Но тогда и доработки и оптимизации под другую платформу это нечто само собой разумеющееся.

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

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

В том то и дело, что я не понял о чём ты. В x64 дельфях нельзя использовать только инлайн-ассемблер, а полностью ассемблерные функции можно.
24 ноя 16, 14:30    [19930016]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2468
Kazantsev Alexey
Выбор немного очевиден, не так ли?

Если бы только очевиден. Он был безальтернативен.

А потом тем, кто читал документацию и код, написанный в rtl/vcl, положили на голову. И, как всегда, большинство считает, что правильно сделали.
24 ноя 16, 14:50    [19930127]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Arioch
Member

Откуда:
Сообщений: 9144
YuRock
всегда и везде писал sizeof( Integer ) или sizeof( Cardinal ), будучи уверен, что это был и будет платформозависимым кодом.


....и закрыв себе дорогу при будущем рефакторинге поменять тип переменной.

вариация вечной темы "волшебные константы"

переносимый код - это весьма нудно писать и читать. и часто он нафиг не нужен.

но например это так:

var 
   p: ^xxxxx;
   a: array of xxxxx;

....SizeOf(p^)....   ....SizeOf(a[1]).....
24 ноя 16, 14:58    [19930169]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Arioch
Member

Откуда:
Сообщений: 9144
GunSmoker
Однако, когда произошёл переход 32 -> 64, родной для процессора целочисленный тип не изменился:


изменился

просто размер по умолчанию типов integer и pointer теперь задается для каждого потока отдельно в его Code Selector дескрипторе

Соответсвенно префиксы типа REX означают не "сделай 64", а "сделай не так как обычно"

А "как у нас обычно" выбирает операционка, Windows видимо режила делать 32 бита
24 ноя 16, 15:02    [19930196]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Arioch
Member

Откуда:
Сообщений: 9144
Товарищ младший сержант
Архитектура Дельфи оказалась заложником древнего кодогенератора.


точно? а вот слухи ходили, что DCC64 - точнее в него входящий кодогенератор Win64 - был скопипащен из MS VC++ и вовсе не является развитием/портированием DCC32.
24 ноя 16, 15:03    [19930211]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Arioch
Member

Откуда:
Сообщений: 9144
Товарищ младший сержант
Появилась возможность писать код для 64 разрядных ОС - хорошо. Вот тебе поинтер нового размера, и всё, больше ничего нового. А то, что ты его раньше по какой-то причине поинтер в интежер прятал - ну, кто тебе виноват, больше так не делай.


вот уж нет, я хочу БЫСТРО быдлокодить, и как раньше прятал Integer <=> Pointer <=> TObject так идалше прятать.

и не надо на меня пальцем показывaть, TComponent.Tag и TStrings.Objects придумывал не я, меня приучили и подсадили.

так что с точки зрения "быстро быдлокодить" размеры указателя и обычного-целочисленного должны совпадать
24 ноя 16, 15:06    [19930225]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Arioch
Member

Откуда:
Сообщений: 9144
YuRock
rgreat
Ты сам захотел поиграть в low-level + unsafe игры.
Не ко мне, но меня тоже касается и я отвечу.
Вопросом.
Как мне в D7, планируя будущее, надо было писать код вроде того, как писал я:
Pointer( Cardinal( p ) + sizeof( TMyRecord) + sizeof( Pointer ) )^
?


Pointer( Cardinal( p ) + sizeof( var1 ) + sizeof( var2 ) )^
24 ноя 16, 15:07    [19930233]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
Товарищ младший сержант
Member [заблокирован]

Откуда:
Сообщений: 5126
Arioch
Товарищ младший сержант
Появилась возможность писать код для 64 разрядных ОС - хорошо. Вот тебе поинтер нового размера, и всё, больше ничего нового. А то, что ты его раньше по какой-то причине поинтер в интежер прятал - ну, кто тебе виноват, больше так не делай.


вот уж нет, я хочу БЫСТРО быдлокодить, и как раньше прятал Integer <=> Pointer <=> TObject так идалше прятать.

и не надо на меня пальцем показывaть, TComponent.Tag и TStrings.Objects придумывал не я, меня приучили и подсадили.

так что с точки зрения "быстро быдлокодить" размеры указателя и обычного-целочисленного должны совпадать


А кто-то поинтер в Currency прятал. Мало ли кто как с ума сходит.
24 ноя 16, 15:10    [19930256]     Ответить | Цитировать Сообщить модератору
 Re: какие новости в мери Delphi  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2468
Arioch
YuRock
Как мне в D7, планируя будущее, надо было писать код вроде того, как писал я:
Pointer( Cardinal( p ) + sizeof( TMyRecord) + sizeof( Pointer ) )^

?


Pointer( Cardinal( p ) + sizeof( var1 ) + sizeof( var2 ) )^

И что это?
Для x86 твой код сработает так же, как и мой.
А для x64 он будет так же НЕ работоспособен, как и мой.
24 ноя 16, 15:15    [19930283]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7] 8 9 10 11 .. 69   вперед  Ctrl
Все форумы / Delphi Ответить