pavia писал(а):
Для практической реализации требуется ограничить функционал "переменных". Я имею в виду наложить ограничения типа только чтение или запись. Такое может быть полезным для создания интерфейса при работе с портами в/в.
Интересует как такие ограничения реализуются в ada и других языках?
Никак, если говорить о просто переменных. В Аде можно определить типы, работа с которыми будет возможна исключительно через связанные с ними методы, даже присваивание и сравнение не смогут быть выполнены "в лоб". Такой подход в значительной мере позволяет решить эту задачу, но он не всегда удобен: одно дело, когда создаётся некая сложная структура данных, и совсем другое, когда сами по себе данные имеют простой тип, и надо лишь ограничить к ним доступ.
Цитата:
К примеру в объявлениях функций используются In, Out, Const, var
Это в Аде, естественно, есть. Параметры подпрограмм (процедур и функций) могут быть доступны только для чтения, только для записи, для чтения и записи; кроме того, возможна передача параметра через т.н. "тип доступа" (access type -- можно считать, что это указатель, хотя в ряде случаев он может отличаться от традиционных указателей других языков). Для нормальной работы этого хватает; единственное, что меня напрягает, -- это невозможность определить доступные для записи (или чтения и записи) параметры в функциях: мол, функция может возвращать результат только именно как функция, но не через параметры (хотя с помощью access-параметра вернуть, естественно, можно, но этот путь обхода такого ограничения мне не нравится).
Так что, думаю, есть смысл распространить подобное и на переменные -- т.е. при описании переменной указать тип допустимого доступа к ней. В Аде, исходя из её логики, подобное было бы реализовано с помощью специальной прагмы -- именно они используются, например, чтобы описать точное представление типа данных, точное расположение в памяти и т.д., в самом же описании переменной или типа этой информации нет, чтобы не загромождать текст. Но, если включать подобный спецификатор в собственно определение переменной, то лучше делать что-то вроде:
MyVar : out MyType;
Помещать спецификатор перед именем переменной, а тип -- после имени будет неразумно: один из главных недостатков Си в плане читаемости заключается как раз в том, что там определяемое имя находится не на чётко определённом и легко доступном для глаза месте, а "плавает" по определению (простейший пример -- это объявление массива вроде int a[10], где имя переменной оказывается ровно посредине). Естественно, само объявление типа переменной тоже должно делаться в паскалевском стиле, а не сишном -- читаться строго слева направо, а не то в одну сторону, то в другую.
Цитата:
Но как к примеру сделать такое ограничение для указателя?
Для указателей придётся вводить дополнительный спецификатор или дополнительную прагму, ведь надо различать права доступа к самому указателю и к объекту, на который он указывает. Например, сам указатель может быть доступен и на чтение, и на запись, а объект -- только на чтение или только на запись; или же указатель быть доступным только на запись, а объект -- только на чтение и т.д. (Разыменование указателя хотя и подразумевает его чтение, не может быть ограничено подобным образом, поскольку тогда указатель теряет смысл, однако возможность явного его считывания для, например, присваивания другому указателю может быть ограничена).