OberonCore
https://forum.oberoncore.ru/

Проверка неопределенных значений переменных
https://forum.oberoncore.ru/viewtopic.php?f=29&t=6655
Страница 1 из 2

Автор:  adimetrius [ Суббота, 19 Сентябрь, 2020 21:53 ]
Заголовок сообщения:  Проверка неопределенных значений переменных

Коллеги,

под постом в сообществе Гершель https://vk.com/herschelcompiler?w=wall-196590190_62_r75
Илья Ермаков писал(а):
научить бы компилятор определять обращение до инициализации


Как я это понимаю: было бы полезно (в ряде случаев?) иметь гарантии того, что использование неопределенных значений переменных приводит к аварийному останову. Это можно было бы ввести в компилятор как опцию, наподобие проверки области допустимых значений (range checks, разд. 12 Platform-specific issues). Включаешь, обращаешься к переменной с неопределенным значением - и получаешь авост.

Напомню, что ныне Сообщение о языке гарантирует инициализацию только указательных и процедурных локальных переменных до выполнения тела процедуры. Это позволяет компилятору КП не инициализировать локальные переменные других типов, и СР2 так и делает.

В соседнем цехе Денис Будяк подверг такое положение вещей резкой критике, привел обоснования. Как я его понял, он считает, что язык должен гарантировать начальные значения всем типам. Но, как гласит предание ), в Оберонах это считается слишком накладным в отношении локальных переменных.

Что думаете по поводу целесообразности и технической возможности таких проверок?

Автор:  Илья Ермаков [ Суббота, 19 Сентябрь, 2020 23:29 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Нет, рантайм-проверка дорога, смысла не имеет.
Я имел в виду статическое выявление.

Автор:  adimetrius [ Воскресенье, 20 Сентябрь, 2020 01:09 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Статическое - это тогда не компиляторная, наэн, задача.

А инструмент Анализатор - он ведь показывает случаи use before set?

Автор:  Comdiv [ Воскресенье, 20 Сентябрь, 2020 16:31 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

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

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

Опыты через промежуточное представление на C показали, что при совмещении простого статического анализа, посильное и компилятору, с динамическим на проверку неинициализированности дополнительно уходит ~ 10 % при не оптимизирующей сборке и ~ 25% при сильно оптимизирующей. Оптимизированная версия с проверками в ~3 раза быстрей неоптимизированной без проверок.

Пример, как это может быть сделано для статической и динамической проверок

Автор:  adimetrius [ Воскресенье, 20 Сентябрь, 2020 23:35 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Comdiv писал(а):
Пример, как это может быть сделано для статической и динамической проверок


Интересная "песочница"!

А что же там "под капотом"? как посмотреть?

Автор:  Comdiv [ Понедельник, 21 Сентябрь, 2020 00:47 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Всё давно открыто

Автор:  Info21 [ Понедельник, 21 Сентябрь, 2020 09:14 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Вот надо бы по каждой фиче языка собрать подобную премудрость.

Может, просто завести раздел с названием "Почему в Обероне сделано так?" -- одна тема -- одна фича.
Фича -- объяснение эксперта -- утрясание деталей и непоняток.

Начать с неиниц. переменных и ответа Comdiv'а.

Какие-то ветки будут трактовать общие принципы, на которые опирается сразу несколько решений.

Был бы крайне полезный ресурс для начинающих (с коими я постоянно имею дело).

Автор:  Борис Рюмшин [ Вторник, 22 Сентябрь, 2020 15:21 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Info21 писал(а):
Может, просто завести раздел с названием "Почему в Обероне сделано так?" -- одна тема -- одна фича.
Фича -- объяснение эксперта -- утрясание деталей и непоняток.

Пожалуйста: viewforum.php?f=158

Автор:  Comdiv [ Вторник, 22 Сентябрь, 2020 22:37 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Info21 писал(а):
Может, просто завести раздел с названием "Почему в Обероне сделано так?" -- одна тема -- одна фича.
Если отвечать строго на поставленный вопрос, то во многих случаях правильным ответом будет потому, что так проще. То, что иногда это будет совпадать с решением для улучшения надёжности, это отчасти везение, основанное на общем свойстве простоты. Иногда для того, чтобы сделать лучше, нужно просто стоять на месте там, где все бегут не туда.

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

Автор:  kekc_leader [ Среда, 16 Декабрь, 2020 04:55 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Comdiv писал(а):
Но без усложнения языка оптимального определения не достичь.


...А усложнение языка опять приводит к понижению надёжности.

Автор:  Comdiv [ Среда, 16 Декабрь, 2020 14:37 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

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

Автор:  kekc_leader [ Среда, 16 Декабрь, 2020 15:21 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

А никто и не говорит, что оно примитивно зависит от простоты языка. Просто в каждом изменении есть обе тенденции. Любое изменение одновременно усложняет и упрощает, делает более надёжным и менее надёжным. Важно установить правильную меру, а для этого нельзя закрывать глаза ни на одну из тенденций.

Автор:  Comdiv [ Среда, 16 Декабрь, 2020 15:40 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

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

Автор:  Info21 [ Пятница, 12 Март, 2021 09:26 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Comdiv писал(а):
Можете тогда рассказать, как усложнение языка добавлением дополнительных требований проверок задания значений может понизить надёжность?
Разве компилятор не усложняется?
Тут возникают противонаправленные движения, баланс выяснить нелегко.

Автор:  Илья Ермаков [ Пятница, 12 Март, 2021 10:47 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Часть проверок, которые можно выполнять без изменений языка, ценна - и реализуема на каком-то отдельном уровне (как в попытке DevAnalyzer). Это хорошая мысль - реализовывать не в конкретном компиляторе, а отдельно.

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

Автор:  Comdiv [ Пятница, 12 Март, 2021 14:39 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Info21 писал(а):
Comdiv писал(а):
Можете тогда рассказать, как усложнение языка добавлением дополнительных требований проверок задания значений может понизить надёжность?
Разве компилятор не усложняется?
Тут возникают противонаправленные движения, баланс выяснить нелегко.
О том и речь, что язык и компилятор усложняются, а надёжность кода только растёт. Если задать этот же вопрос про средства работы с памятью и контроль её целостности, каков будет ответ?

Автор:  Comdiv [ Пятница, 12 Март, 2021 14:51 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Илья Ермаков писал(а):
Часть проверок, которые можно выполнять без изменений языка, ценна - и реализуема на каком-то отдельном уровне (как в попытке DevAnalyzer). Это хорошая мысль - реализовывать не в конкретном компиляторе, а отдельно.
Такие анализаторы должны быть частью компилятора, хотя и не обязательно буквально, а в том смысле, что компилятор имеет результат статических проверок. С точки зрения достижения надёжности это важно потому, что частая причина отказа от проверок на ошибки - это дороговизна проверок во время исполнения, поэтому критично важно не проверять во время работы программы то, что выполняется априори. Это позволяет сократить количество проверок времени исполнения, уменьшить накладные расходы, и отказаться от тупого выключения проверок.

Пример отрицательных плодов погони за скоростью:
adimetrius писал(а):
Использование SHORT для усекновения старших разрядов - мелкое хулиганство, я полагаю; но, увы, в ББ оно повсеместно ((( Я частенько спотыкался об него, поскольку компилирую всегда со всеми включенными проверками; стоит перекомпилировать разок штатный модуль - и он начинает сыпаться


Илья Ермаков писал(а):
Просто задача занудная, не сулящая прикладных прорывов - и никто особо не занимается.
Да и это одна из причин, почему надёжность "продавать" сложно, в том числе, и там, где достижение надёжности провозглашается как важнейшее свойство.

Автор:  Info21 [ Пятница, 12 Март, 2021 15:31 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Comdiv писал(а):
компилятор усложняются, а надёжность кода только растёт.
Сложность компилятора -- потенциальный источник ненадёжного кода, разве нет.

Автор:  Comdiv [ Пятница, 12 Март, 2021 16:02 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Для ответа на этот вопрос(?), можно ответить на другие вопросы:
1. Компилятор, который вставляет код проверок выхода за границы массива проще или сложней того, который не вставляет? Как это влияет на надёжность?
2. Компилятор, который не проверяет никакие возможные ошибки в исходном коде и работает только для корректного кода, проще или сложней того, который проверяет? Как это влияет на надёжность?
3. Компилятор Форта проще или сложней компилятора Оберона? Как это влияет на надёжность?
...

Автор:  Info21 [ Пятница, 12 Март, 2021 17:10 ]
Заголовок сообщения:  Re: Проверка неопределенных значений переменных

Каждый раз надо смотреть особо, об этом речь.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/