Что должно быть протестировано в 64-разрядном Delphi

#delphi #testing #64-bit #delphi-xe2

#delphi #тестирование #64-разрядный #delphi-xe2

Вопрос:

Delphi с 64-разрядной компиляцией сейчас находится в стадии бета-тестирования, но только приглашенные бета-тестеры получат доступ к этой версии.

Что следует тестировать бета-тестерам?

Комментарии:

1. Отредактируйте свой пост 10 раз, попросите четырех других людей отредактировать его, получите 30 ответов или отметьте его для привлечения внимания модератора. meta.stackexchange.com/questions/11740 /…

2. Какова цель этого вопроса? У вас есть бета-версия, и вы хотите протестировать что-то для людей, у которых нет бета-версии? Кажется, это не очень связано с программированием.

3. Субъективно и не связано с программированием.

4. Я действительно не понимаю, почему этот вопрос отмечен как субъективный и не связанный с программированием. ИМХО, весьма объективно, что некоторым областям 64-разрядного компилятора требуется больше внимания, чем другим. Это также связано с программированием и на него можно ответить. Цель этого вопроса — выделить, о каких 64-разрядных проблемах программисту следует знать и каких подводных камней следует избегать. Выгода для сообщества — это место, где пропущенные 64-разрядные функции могут быть задокументированы и обсуждены и, надеюсь, тщательно протестированы до финального релиза.

5. @Warren: это имеет практическое отношение к искусству компьютерного программирования, даже если и не теоретическое. Этот компилятор важен для многих людей! И, несомненно, есть объективно полезные вещи, которые можно попробовать с ним.

Ответ №1:

Embarcadero, вероятно, предоставит руководство по тестированию для бета-тестеров. Но вот несколько идей:

  • 32-разрядная версия может использовать до 4 ГБ выделения памяти, выравнивания, кучи и стека. (ну, 3,5) адресного пространства в 64-разрядной версии Windows с /LARGEADDRESSAWARE переключателем: Delphi64 должен иметь возможность использовать гораздо больше. Попробуйте выделить 8, 16 и 32 ГБ. (Даже если у вас меньше оперативной памяти, распределение должно работать, поскольку это виртуальное адресное пространство.) Теперь прочитайте и запишите в него значения в определенных местах: проверьте ваше распределение, и все указатели работают. Посмотрите, что сообщает Process Explorer для приложения. Проверьте свой стек: он работает сверху вниз, в отличие от кучи — как он выглядит, какие адреса он использует? Как выглядит выравнивание на 16 байт? Сохраняется ли это выравнивание для всех внутренних функций Pascal или только для тех, которые вызывают внешний код? В 32-разрядном VCL были некоторые фрагменты кода, которые были небезопасны для адресов размером более 2 ГБ. Были ли они исправлены? Что-нибудь ломается, когда оно выделяется, скажем, в 53 ГБ адресного пространства вашей программы? (Попробуйте выделить огромный объем, а затем динамически создавать формы, элементы управления и т.д. — Они, вероятно, будут созданы с высокими адресами.) Фрагментируется ли диспетчер памяти? Насколько быстро выполняется перемещение и копирование памяти?

  • Предупреждения компилятора. (Это важно.) Обновите свои программы — скомпилируйте их без изменений и посмотрите, какие предупреждения / ошибки вы получаете; исправьте любые; а затем исправьте ошибки, которые возникают, даже если вас не предупреждали. С какими проблемами вы столкнулись? Должен ли компилятор был предупредить вас, но не сделал этого? Получаете ли вы предупреждения при усечении указателя при приведении к целому числу? Как насчет более сложных проблем: что происходит, если вы используете Single тип с плавающей запятой? Предупреждение, или оно безмолвно представлено в виде double ? Что, если вы передадите параметр методу другого размера — например, PostMessage и вы передадите handle параметру значение размером 32 бита — будет ли компилятор достаточно умен, чтобы догадаться, что если размер неверен, ваш код может быть неправильным, хотя часто допустимо передавать меньший тип параметру большего размера? При каких обстоятельствах это следует делать? (Еще один момент: что, если вы передаете 64-разрядный указатель на 32-разрядный тип в методе, ожидающем указатель на 64-разрядный тип — безопасность типа должна кричать громко, но так ли это? Примером использования для этого является чтение блоков из двоичного файла, что может легко вызвать проблемы с типами неправильного размера.) … и т.д.

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

  • Пользовательские элементы управления и WinAPI. Вероятно, у вас есть несколько пользовательских элементов управления или фрагментов кода, которые интенсивно используют Windows API вместо VCL. Существуют ли какие-либо проблемы, связанные с Windows API?

  • Совместимость с языком. Работает ли старый код ввода-вывода файла — AssignFile и т.д.? RTTI? Если у вас есть сигнатура события с Integer типом, а обработчик события создается IDE автоматически, генерируется ли он как целое число или целочисленный тип, зависящий от размера, в зависимости от текущей платформы? Что, если событие является NativeInt, что тогда? (Я уже видел ошибки в генерации сигнатуры метода обработчика событий, хотя только на стороне C .)

  • Различные типы приложений. Мы можем предположить, что программы с графическим интерфейсом были протестированы хорошо. Как насчет консольных и сервисных приложений?

  • Генерация файлов, совместимых с C Builder. C Builder не будет 64-разрядным в XE2, но, надеюсь, будет в XE3. Однако Delphi может создавать файлы ..hpp и .obj для кода Pascal. Что происходит в 64-разрядной платформе? Можете ли вы создать эти файлы, даже если они бесполезны? Генерирует ли компилятор предупреждения, специфичные для C , в 64-разрядном режиме или он сдается и не позволяет вам это сделать? В 32-разрядном режиме можно ли что-нибудь сделать для 64-разрядной совместимости, что сгенерирует предупреждение о создании заголовка C ?

  • Компоновщик. Можете ли вы дать ссылку .файлы lib и .obj, созданные с помощью других компиляторов? (Я бы ожидал.библиотека да, .obj нет.) Использует ли компоновщик COFF или OMF для 64-разрядной версии — изменились ли они? Этот поток подразумевает формат ELF. Изменилось ли это и для 32-разрядного? Влияет ли это на формат DCU, получим ли мы по-прежнему сверхбыструю компиляцию / компоновку?

  • COM и 64-разрядные плагины. Есть ли какие-либо проблемы с сортировкой? Можете ли вы сейчас создать 64-разрядный плагин для Explorer?

  • Соглашения о вызовах. Safecall предполагается, что это единственное «соглашение о вызовах» (если safecall имеет значение …), которое все еще отличается — оно все еще работает? Указатели на функции и процедуры и замыкания (указатели на объектный метод): работают ли они? Как они выглядят в инспекторе отладки? Учитывая, что все соглашения о вызовах теперь одинаковы, что произойдет, если вы смешаете соглашения о вызовах в объявлении вашего метода и вызывающем указателе? Есть ли какие-либо устаревшие материалы, которые могут сломаться, или они работают прозрачно? Выдает ли он теперь вам (ошибочное) предупреждение о том, что типы несовместимы?

  • Математика с плавающей запятой. В предварительном просмотре Delphi 64 указано, что значение с плавающей запятой будет только двойным. Может ли Delphi обрабатывать long double s? Существуют ли какие-либо процедуры совместимости для обработки старого Real (48 бит, я думаю??) тип? Генерирует ли компилятор код SSE или SSE2 или их сочетание, и насколько оно хорошо?

  • Производительность. Это их первый опыт работы с 64-разрядным компилятором; вероятно, он будет доработан в течение следующих нескольких выпусков. Но есть ли какие-либо очевидные проблемы с производительностью, с:

    • компиляция; компоновка; IDE insight?

    • Сгенерированный код: ваши программы быстрее или медленнее? FP math быстрее или медленнее? inline Работает, и генерирует ли это какие-либо ненужные биты верхнего / нижнего колонтитулов вокруг встроенных методов?

  • Отладка. Вероятно, это проще всего протестировать в ходе всего процесса тестирования всего остального, но насколько хорошо работает 64-разрядный отладчик? Обладает ли он всеми функциональными возможностями 32-разрядного Delphi? Плагины IDE debug visualizer все еще работают? Что, если вы отлаживаете 64-разрядную программу, отличную от Delphi, или подключаетесь к процессу вместо обычного запуска?

  • Разное Компилируется ли сам Delphi как 64-разрядная программа? Если нет, то почему бы и нет? (Они «едят свой собственный корм для собак»?) Код проверяет новый VCL (при условии, что предварительный просмотр поставляется с исходным кодом VCL). Что они сделали, чтобы сделать VCL 32/64 совместимым? Есть ли какие-либо ошибки, или если вы уже хорошо знаете 64-разрядный код из других IDE, есть ли более эффективные подходы, которые они могли бы использовать вместо этого?

…и т.д. Я мог бы продолжать печатать часами, но я думаю, что это хорошее начало, хотя 🙂

Ответ №2:

Я уверен, что Embarcadero предоставит некоторые рекомендации по тестированию. Как бы то ни было, это то, что я бы протестировал; В основном потому, что это то, что меня волнует:

  • Небольшое консольное приложение должно работать.
  • Позволяет мне выделить 4 Гб плоской памяти. На самом деле это не нужно, но это будет первое, что попробует мое консольное приложение, сразу после WriteLn('I''m using all 64 bits!!!!');
  • Можно создать 64-разрядную DLL, а DLL можно импортировать и использовать из другой среды.
  • Сделайте несколько простых вещей и посмотрите на сгенерированный ассемблер, просто для пущего эффекта.
  • Можно ли создать 64-разрядные файлы UDF, совместимые с Firebird
  • Я бы, вероятно, попробовал скомпилировать свои «служебные» модули, потому что они выполняют достаточное количество манипуляций с указателями, посмотрите, как они работают.
  • Если VCL работает, я бы провел его поэтапно: создал небольшую форму, поместил на нее кнопку, ShowMessage .

Вообще говоря, единственное, для чего мне действительно нужен 64-битный Delphi, — это 64-битный UDFs Firebird. Это незначительно и может быть «исправлено» с помощью FPC. Я предполагаю, что лучшее тестирование будет выполнено людьми, которым действительно нужен 64-разрядный delphi. И этим людям не нужны предложения по тестированию.

Ответ №3:

На первом месте должны быть базовые компоненты foundation, чтобы гарантировать, что Delphi 64 можно использовать для того, что не может быть использовано Delphi 32:

  • корректностькомпилятора: прежде всего, никаких внутренних ошибок, никакого неправильного кода-gen
  • возможность компиляции в 64-разрядные библиотеки DLL и стабильность этих
  • используйте диспетчер памяти: с большими объектами, фрагментированным распределением, многопоточными распределениями и т.д.
  • многопоточность: стабильна ли она? эффективно ли это? масштабируется ли оно? это для основных функций и модулей RTL, и не забывая о типах с подсчетом ссылок.
  • с плавающей запятой: обеспечивает ли компилятор надлежащий SSE? правильно ли реализованы математические функции? что произойдет, если вы подчеркнете набор регистров SSE сложными выражениями?

И в качестве бонуса, возможность принимать 64-разрядные объектные файлы из обычных компиляторов C .

Комментарии:

1. Как вы думаете, какие компиляторы C выдадут obj-файл, который может использовать Delphi? Я предполагаю, что функциональность не войдет в первый релиз.

2. Учитывая кроссплатформенные планы, GCC, вероятно, должен быть первым, но в Windows MSVC был бы хорош. Если бы они выбрали проприетарный формат объектного файла, это действительно могло бы не привести к выпуску, но если бы на этот раз они выбрали совместимость со стандартным набором инструментов, все могло бы быть возможно.

3. На данный момент это просто bcc32, не так ли? Одна из очевидных проблем, связанных с чем-либо еще, заключается в том, что делать с плавающей запятой.

4. Да, только bcc32, который не предлагает большой ценности (архаичный codegen, файлы и менее поддерживаются в проектах C и т.д.). Для операций с плавающей запятой они должны стандартизировать стандартное значение управляющего слова FPU, в любом случае оно уже используется MSVC DLL при первой возможности.

5. для меня было бы бесполезно использовать этот подход с управляющим словом. Для меня bcc32 подходит.

Ответ №4:

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

Я думаю, что предварительный просмотр сначала позволит вам настроить стратегию миграции, это было бы моим намерением. VCL … предназначен для работы на одной кодовой базе и, возможно, обратного переноса вашего кода в purepascal вместо ассемблера.

Майк