OberonCore https://forum.oberoncore.ru/ |
|
BlackBox 64 https://forum.oberoncore.ru/viewtopic.php?f=2&t=2439 |
Страница 4 из 4 |
Автор: | nail_kh [ Понедельник, 01 Июль, 2013 11:31 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Alexey Veselovsky писал(а): nail_kh писал(а): Ну так давайте оставим универсальные типы INTEGER и REAL для расчетов, а для работы с битами, масками, сдвигами и т.д. - будем использовать типы с названиями, явно отражающими их разрядность. Если более высокоразрядная платформа поддерживает эти явные типы (а это почти всегда так), то никаких проблем с компиляцией быть не должно. Разумеется, это не относится к случаю, когда программист использует INTEGER (или что вообще немыслимо - REAL) для битовых операций, а BYTE и CHAR - для расчетов. Тут, как говорится, против лома нет приема. Как я описал выше, для расчетов "универсальные" (то есть без каких-либо гарантий) типы INTEGER и REAL также не годятся. В этом плане лучше всего конечно сделано в Аде. Гарантии отсутствуют только при переходе с более высокоразрядной платформы на более низкоразрядную. Но при таком переходе проблемы как раз ожидаются и программист знает, что надо принять меры. При переходе на более высокоразрядную вообще то говоря было бы логичным ожидать что проблем с переполнением не возникнет. Разумеется, это не относится к ситуации использования INTEGER для битовых операций или в качестве адрес памяти и т.д. Именно это порождает проблемы при переходе. |
Автор: | Alexey Veselovsky [ Понедельник, 01 Июль, 2013 11:49 ] |
Заголовок сообщения: | Re: BlackBox 64 |
nail_kh писал(а): Alexey Veselovsky писал(а): nail_kh писал(а): Ну так давайте оставим универсальные типы INTEGER и REAL для расчетов, а для работы с битами, масками, сдвигами и т.д. - будем использовать типы с названиями, явно отражающими их разрядность. Если более высокоразрядная платформа поддерживает эти явные типы (а это почти всегда так), то никаких проблем с компиляцией быть не должно. Разумеется, это не относится к случаю, когда программист использует INTEGER (или что вообще немыслимо - REAL) для битовых операций, а BYTE и CHAR - для расчетов. Тут, как говорится, против лома нет приема. Как я описал выше, для расчетов "универсальные" (то есть без каких-либо гарантий) типы INTEGER и REAL также не годятся. В этом плане лучше всего конечно сделано в Аде. Гарантии отсутствуют только при переходе с более высокоразрядной платформы на более низкоразрядную. Но при таком переходе проблемы как раз ожидаются и программист знает, что надо принять меры. При переходе на более высокоразрядную вообще то говоря было бы логичным ожидать что проблем с переполнением не возникнет. Разумеется, это не относится к ситуации использования INTEGER для битовых операций или в качестве адрес памяти и т.д. Именно это порождает проблемы при переходе. Приложение (и тем более алгоритм) обычно должно работать на нескольких платформах с разной разрядностью. Поэтому очень неплохо бы именно в реализации алгоритма указать какая же ёмкость (минимальная разрядность) целого ему нужна для корректной работы. Это позволит во-первых проще сопровождать код (код самодокументирован будет), во-вторых в случае чего (нет такого типа для данной платформы) получить ошибку компиляции, а не ошибку исполнения. |
Автор: | igor [ Понедельник, 01 Июль, 2013 13:24 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Alexey Veselovsky писал(а): Приложение (и тем более алгоритм) обычно должно работать на нескольких платформах с разной разрядностью. Поэтому очень неплохо бы именно в реализации алгоритма указать какая же ёмкость (минимальная разрядность) целого ему нужна для корректной работы. Это позволит во-первых проще сопровождать код (код самодокументирован будет), во-вторых в случае чего (нет такого типа для данной платформы) получить ошибку компиляции, а не ошибку исполнения. На самом деле для одних целочисленных данных крайне желательно указать разрядность, а для других лучше использовать универсальный тип INTEGER (как предлагает nail_kh). ИМХО.
|
Автор: | Alexey Veselovsky [ Понедельник, 01 Июль, 2013 13:51 ] |
Заголовок сообщения: | Re: BlackBox 64 |
igor писал(а): Alexey Veselovsky писал(а): Приложение (и тем более алгоритм) обычно должно работать на нескольких платформах с разной разрядностью. Поэтому очень неплохо бы именно в реализации алгоритма указать какая же ёмкость (минимальная разрядность) целого ему нужна для корректной работы. Это позволит во-первых проще сопровождать код (код самодокументирован будет), во-вторых в случае чего (нет такого типа для данной платформы) получить ошибку компиляции, а не ошибку исполнения. На самом деле для одних целочисленных данных крайне желательно указать разрядность, а для других лучше использовать универсальный тип INTEGER (как предлагает nail_kh). ИМХО.Какие-то минимальные гарантии даже для универсального типа нужны. А ну как он окажется двубитным? То есть что-то вроде int_least32_t (как минимум, 32 бита) из stdint.h. |
Автор: | nail_kh [ Понедельник, 01 Июль, 2013 17:11 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Alexey Veselovsky писал(а): Какие-то минимальные гарантии даже для универсального типа нужны. А ну как он окажется двубитным? То есть что-то вроде int_least32_t (как минимум, 32 бита) из stdint.h. В рантайме такая гарантия уже есть. Это авост при переполнении. Что касается этапа компиляции - то не хотелось бы перегружать базовые типы еще какими то новыми типами. Проще это указать в опциях компилятора. |
Автор: | igor [ Понедельник, 01 Июль, 2013 17:29 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Alexey Veselovsky писал(а): Какие-то минимальные гарантии даже для универсального типа нужны. Согласен.Alexey Veselovsky писал(а): А ну как он окажется двубитным? Да ладно
|
Автор: | Alexey Veselovsky [ Понедельник, 01 Июль, 2013 19:08 ] |
Заголовок сообщения: | Re: BlackBox 64 |
nail_kh писал(а): Alexey Veselovsky писал(а): Какие-то минимальные гарантии даже для универсального типа нужны. А ну как он окажется двубитным? То есть что-то вроде int_least32_t (как минимум, 32 бита) из stdint.h. В рантайме такая гарантия уже есть. Это авост при переполнении. Что касается этапа компиляции - то не хотелось бы перегружать базовые типы еще какими то новыми типами. Проще это указать в опциях компилятора. Я предпочитаю, по возможности, обходиться без авостов. Потому что авост может привести к реальной аварии. |
Автор: | Comdiv [ Понедельник, 01 Июль, 2013 19:32 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Alexey Veselovsky писал(а): А вообще, проблема в том, что ни INTEGER в Обероне (не путать с КП!) ни int в с++ не дает каких-либо гарантий по минимальной разрядности. Полагаю их алгоритм не стал бы работать если б int/INTEGER внезапно оказался бы 8ми битным. Поэтому, если мы говорим о Обероне, то в стандартной (то есть за которую отвечает создатель конкретного компилятора) библиотеке должен быть модуль аналогичный сишному stdint.h. Если в стандарте с++ нет гарантий минимальной разрядности(что сомнительно), то это шаг назад по сравнение даже со стандартом Си 89-года. В ANSI-C во-первых сказано, что INT_MAX>=32767, во-вторых можно написать так Код: #if INT_MAX < 1000000 "мало!!!" #endif Получается почти как в Аде, когда компилятор честно сообщает, что собрать корректную версию для этой платформы не может. Определение же языка Оберон не является законченным с точки зрения стандарта, но может лишь послужить основой для него. |
Автор: | Alexey Veselovsky [ Понедельник, 01 Июль, 2013 20:02 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Comdiv писал(а): Alexey Veselovsky писал(а): А вообще, проблема в том, что ни INTEGER в Обероне (не путать с КП!) ни int в с++ не дает каких-либо гарантий по минимальной разрядности. Полагаю их алгоритм не стал бы работать если б int/INTEGER внезапно оказался бы 8ми битным. Поэтому, если мы говорим о Обероне, то в стандартной (то есть за которую отвечает создатель конкретного компилятора) библиотеке должен быть модуль аналогичный сишному stdint.h. Если в стандарте с++ нет гарантий минимальной разрядности(что сомнительно), то это шаг назад по сравнение даже со стандартом Си 89-года. В ANSI-C во-первых сказано, что INT_MAX>=32767, Посмотрел внимательней на стандарт. Там забавно. Стандарт С++ определяет INT_MAX в файле climits, который, как далее указывается, имеет то же содержимое что и limits.h, а limits.h берется из Сишного стандарта, на который имеется там ссылка. Следовательно всё что справедливо для C89/90 (касаемо INT_MAX), то справедливо и для С++98. Так что гарантия таки есть. int минимум 16ти битный. Comdiv писал(а): во-вторых можно написать так Код: #if INT_MAX < 1000000 "мало!!!" #endif Получается почти как в Аде, когда компилятор честно сообщает, что собрать корректную версию для этой платформы не может. Идея хороша. Хотя конечно лучше так: Код: #if INT_MAX < 1000000 #error int too small #endif Ну, или static assert'ом можно. |
Автор: | Trurl [ Вторник, 02 Июль, 2013 07:16 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Comdiv писал(а): Получается почти как в Аде, когда компилятор честно сообщает, что собрать корректную версию для этой платформы не может. В Обероне можно сделать так же. Код: ASSERT(MAX(INTEGER) >= 1000000)
|
Автор: | Alexey Veselovsky [ Вторник, 02 Июль, 2013 07:25 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Trurl писал(а): Comdiv писал(а): Получается почти как в Аде, когда компилятор честно сообщает, что собрать корректную версию для этой платформы не может. В Обероне можно сделать так же. Код: ASSERT(MAX(INTEGER) >= 1000000) Это не будет ведь ошибкой компиляции в случае если INTEGER слишком мелок. А проверка в рантайме нас не устраивает. Зато можно, сделать так (на КП, проверил на ББ - работает): Код: MODULE Test; TYPE Check = ARRAY SIZE(INTEGER)-3 OF CHAR; END Test. Тут если INTEGER будет меньше 4 байт, то будет ошибка компиляции, соответственно можно проверить не только на 4 байта, но и на любое иное число. Аналогично делается с MAX/MIN (только нужно постараться, чтобы слишком больших значений не выходило). Вот такой вот, static assert. |
Автор: | Kemet [ Вторник, 02 Июль, 2013 08:13 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Alexey Veselovsky писал(а): Trurl писал(а): В Обероне можно сделать так же. Код: ASSERT(MAX(INTEGER) >= 1000000) Это не будет ведь ошибкой компиляции в случае если INTEGER слишком мелок. А проверка в рантайме нас не устраивает. Компилятор Активного Оберона выдаст ошибку времени компиляции |
Автор: | Alexey Veselovsky [ Вторник, 02 Июль, 2013 08:20 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Kemet писал(а): Alexey Veselovsky писал(а): Trurl писал(а): В Обероне можно сделать так же. Код: ASSERT(MAX(INTEGER) >= 1000000) Это не будет ведь ошибкой компиляции в случае если INTEGER слишком мелок. А проверка в рантайме нас не устраивает. Компилятор Активного Оберона выдаст ошибку времени компиляции ББ, кстати, тоже. Очень жаль, что этого в описании языка нет. То есть что там не уточнен этот момент. |
Автор: | Comdiv [ Вторник, 02 Июль, 2013 11:29 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Alexey Veselovsky писал(а): ББ, кстати, тоже. Очень жаль, что этого в описании языка нет. То есть что там не уточнен этот момент. Этому способствует встроенность всех частей оператора в язык и возможность вычисления на этапе компиляции, но, пожалуй, явное указание не помешало бы. Но даже если бы он выдавал ошибку исключительно во время исполнения, компиляцию модуля и вызов процедуры с проверкой можно было бы просто включить как этап сборки. |
Автор: | Илья Ермаков [ Вторник, 02 Июль, 2013 11:59 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Банально в секцию инициализации модуля воткнуть... |
Автор: | Trurl [ Вторник, 02 Июль, 2013 12:47 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Alexey Veselovsky писал(а): ББ, кстати, тоже. Очень жаль, что этого в описании языка нет. То есть что там не уточнен этот момент. Да, я случайно наткнулся. Проверял, что размер записи совпадает с заданным, а он не совпал и компилятор ругнулсяю |
Автор: | Alexey Veselovsky [ Вторник, 02 Июль, 2013 13:55 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Илья Ермаков писал(а): Банально в секцию инициализации модуля воткнуть... Загрузка модуля может быть динамической. |
Автор: | Илья Ермаков [ Вторник, 02 Июль, 2013 19:24 ] |
Заголовок сообщения: | Re: BlackBox 64 |
Ну да, но тем не менее это произойдёт до реального выполнения прикладного кода. А в момент запуска или последующего подключения компонента. Ну, это не говоря про то, что мы всё-таки имеем статический контроль... |
Страница 4 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |