OberonCore https://forum.oberoncore.ru/ |
|
Совместимость типов https://forum.oberoncore.ru/viewtopic.php?f=29&t=2071 |
Страница 1 из 3 |
Автор: | Rifat [ Среда, 18 Ноябрь, 2009 21:14 ] |
Заголовок сообщения: | Совместимость типов |
Перечитывал статью "Современное ИТ: индустрия и образование. Обзор языка Ada" С. И. Рыбин. Там есть такой абзац: "Что такое тип данных? Вы же знаете, что это такое, попробуйте сказать это одним предложением. (молчание) - "Область занимаемой памяти?" Отлично, варианты ещё есть? (молчание) Вот смотрите - вы знаете, что такое тип данных. Единственная версия - область занимаемой памяти. Я вам дам вторую версию: множество значений при совокупности операций. Оно вам нравится как - больше, меньше? - "Ну, наверное, надо еще знать, как оно представляется в памяти..." А вот теперь я вам скажу такую вещь, что тип данных на самом деле есть описание содержательной роли объектов данных, которую они играют в программе. Как вы на это смотрите? Концепция строгой типизации, она вообще зачем нужна? Например, вы пишите некую программу - автопилот чего-то, что летает. У этого автопилота есть понятие высоты и понятие скорости. Они есть, если говорить про область памяти, если говорить про множество значений при совокупности операций - то это число с плавающей точкой. Правильно? А если говорить про содержательную роль, то это высота и скорость. Если вы описываете разные типы данных для высоты и скорости, зачем вы это делаете? А чтобы, упаси Бог, в первом часу ночи, когда вы в бреду горячечном, не успеваете - если вы случайно высоте скорость присвоите, что будет? Если у вас это область памяти - всем на это наплевать. Если у вас множество значений при совокупности операций - всем наплевать. Если у вас разные содержательные роли, то вас должен поймать компилятор. Именно для этого нужна концепция строгой типизации. Чтобы этой вашей ошибке не дать дойти до работающей программы, чтобы вас отругали раньше. И чем раньше вас обругают - тем легче вам будет жить...". После чего я попробовал написать следующий код: Код: MODULE TestTypes; TYPE Height = REAL; Speed = REAL; PROCEDURE Do*; VAR h: Height; s: Speed; BEGIN s := 1000; h := s; END Do; END TestTypes. Все нормально откомпилировалось. Компилятор меня не "поймал". Может быть есть какая-нибудь обция компилятора, которая отлавливает присваивание одного типа другому? (BlackBox 1.6 rc6) |
Автор: | Александр Ильин [ Среда, 18 Ноябрь, 2009 21:20 ] |
Заголовок сообщения: | Re: Совместимость типов |
Rifat писал(а): Обзор языка Ada Однако, язык не тот.
... (BlackBox 1.6 rc6) |
Автор: | Иван Кузьмицкий [ Среда, 18 Ноябрь, 2009 21:23 ] |
Заголовок сообщения: | Re: Совместимость типов |
Типы Height и Speed являются эквивалентными: Цитата: Одинаковые типы [Same types]
Две переменные a и b с типами Ta и Tb имеют одинаковый тип, если 1. Ta и Tb оба обозначены одним и тем же идентификатором типа, или 2. Ta описан в описании типа вида Ta = Tb, или 3. a и b появляются в одном списке идентификаторов в описании переменных, полей записи или формальных параметров. Эквивалентные типы [Equal types] Два типа Ta и Tb эквивалентны, если 1. Ta и Tb имеют одинаковый тип, или 2. Ta и Tb суть типы открытых массивов с эквивалентными типами элементов, или 3. Ta и Tb суть процедурные типы, чьи списки формальных параметров соответствуют. 4. Ta и Tb суть указательные типы с эквивалентными базовыми типами. |
Автор: | Валерий Лаптев [ Среда, 18 Ноябрь, 2009 22:08 ] |
Заголовок сообщения: | Re: Совместимость типов |
Надо не просто переименовать, а обернуть в record. |
Автор: | Виктор О [ Четверг, 19 Ноябрь, 2009 14:49 ] |
Заголовок сообщения: | Re: Совместимость типов |
И добавить алгебру типов для данной предметной области: тип "Сила" = тип "Масса" * тип "Ускорение" тогда var F : Sila; M: Massa; a: Uskorenie; begin M:=2; a:=3; F := M*a; end. будет работать. По правилам Ньютона Ну и само собой, тип "Ускорение" = тип "Длина" / тип "Время"_квадрат |
Автор: | Александр Ильин [ Четверг, 19 Ноябрь, 2009 16:23 ] |
Заголовок сообщения: | Re: Совместимость типов |
Валерий Лаптев писал(а): Надо не просто переименовать, а обернуть в record. Правильно! И полный контроль типов будет обеспечен.
|
Автор: | Илья Ермаков [ Четверг, 19 Ноябрь, 2009 16:59 ] |
Заголовок сообщения: | Re: Совместимость типов |
Не добавите Вы всерьёз такую "алгебру типов". Помнится, кто-то пробовал на Хаскелле определять такие правила для более-менее содержательной физической предметки, не получилось. |
Автор: | Ihor [ Четверг, 19 Ноябрь, 2009 17:22 ] |
Заголовок сообщения: | Re: Совместимость типов |
Илья Ермаков писал(а): Не добавите Вы всерьёз такую "алгебру типов". Помнится, кто-то пробовал на Хаскелле определять такие правила для более-менее содержательной физической предметки, не получилось. Почему, у вас єсть доказательство? То что кому то не удалось ещё не повод говорить о том что это невозможно. Это говорит о трудности, но никак не о возможности. Сам этим вопросом не занимался. Но вопрос считаю интересным. |
Автор: | Виктор О [ Четверг, 19 Ноябрь, 2009 17:25 ] |
Заголовок сообщения: | Re: Совместимость типов |
Илья Ермаков писал(а): Помнится, кто-то пробовал на Хаскелле определять такие правила для более-менее содержательной физической предметки, не получилось. В свое время такие работы вел, если мне не изменяет память, Тыугу с идеей синтеза программ. Но в его книге были многовыходовые процедуры типа proc Om (u,i,r); if u = null then u:=i*r elseif i = null then i:=u/r elseif r = null then r:=u/i end; и я размышлял, как сделать универсальный алгоритм, который бы по выражению выдавал бы нужный результат, те. из выражения A/B + C*E/D = 0 мог бы вычислить любую переменную при известных остальных, но с налету не удалось, и я забросил. Хорошая задачка для студентов ![]() Еще, помню, Григорий Цейтин делал в Мартышкине доклад про свою систему, в которой можно было решать задачи с несколькими параллельно-последовательными резисторами. |
Автор: | Илья Ермаков [ Четверг, 19 Ноябрь, 2009 17:35 ] |
Заголовок сообщения: | Re: Совместимость типов |
Ну, лично я скептически отношусь к "умному" инструментарию ![]() Наличие хорошего набора "тупых" кирпичиков в итоге оказывается лучше, чем один "умный волшебный ящик". Сложный механизм требует конфигурирования. В конечном счёте, самый мощный способ конфигурирования - возможность указания алгоритмов (скриптование). Поверх "ящика" опять наворачиваются средства общего программирования. За шо ж боролись? Обычная подоборка компонент + качественный 3GL-язык, по совокупности качеств, рулят ![]() |
Автор: | Виктор О [ Четверг, 19 Ноябрь, 2009 17:58 ] |
Заголовок сообщения: | Re: Совместимость типов |
Илья Ермаков писал(а): Ну, лично я скептически отношусь к "умному" инструментарию ![]() Наличие хорошего набора "тупых" кирпичиков в итоге оказывается лучше, чем один "умный волшебный ящик". Я представляю себе это не как "волшебный ящик", а как штатную возможность в языке программирования type A = real; type B = real; type C = A*B; var k1,k2,k3 : real; var a1,a2,a3 : A; var b1,b2,b3 : B; var c1,c2,c3 : C; и транслятор должен транслировать a2:=k1*a1; b2:=k2*b1; c2:=k3*c1; a2:=a1/k1; c2:=k3*a2*b1+a1*b2+c1; b3:=c3/a3+b1; и выдавать ошибку на c2:=k2*a2; a2:=a1/b2; b2:=b1+k2; |
Автор: | Илья Ермаков [ Четверг, 19 Ноябрь, 2009 18:07 ] |
Заголовок сообщения: | Re: Совместимость типов |
А нафига он нужен, умный такой, язык-то? ![]() Есть большие сомнения даже в том, что ада-вская типизация как-то повышает надёжность, по сравнению с Обероновской. Достаточно убрать смешение разных слоёв из фокуса внимания (т.е. позволить программисту забыть о машинном представлении, неявных приведениях типов и т.п.; а дать ему просто надёжное типизированное число; точно так же дать простой неломаемый указатель...) - и не будет этот программист делать глупых ошибок в выражениях и т.п. Потому что эти выражения - основная его работа, смысл программы. Раньше он отвлекался на всякую дрянь инструмента, не отвлекается - и отлично. А дальше усиливать контроль - особо сильного эффекта для качества ожидать не стоит. А вот как это повлияет на компилятор и рантайм - неясно. Поробуйте для разминки хотя бы ответить на вопрос, как эти механизмы будут себя вести при разнесении связанных соотношениями типов по разным модулям, в условиях раздельной компиляции, а тем более динамической загрузки? Языков с усиленным статическим контролем много, только, как правило, такой контроль требует глобального анализа. И ставит крест на раздельной компиляции (тот же контрактно-ориентированный Эйффель вот, насколько я помню, её не поддерживает). Баланс - штука тонкая. |
Автор: | Ihor [ Четверг, 19 Ноябрь, 2009 18:26 ] |
Заголовок сообщения: | Re: Совместимость типов |
Вот и хороший пример недоразумения, фразу "Не добавите Вы всерьёз такую "алгебру типов"." Ильи Ермакова я расценил как невозможность это сделать, а имелось ввиду сомнение в нужности/практичности... |
Автор: | Виктор О [ Четверг, 19 Ноябрь, 2009 18:59 ] |
Заголовок сообщения: | Re: Совместимость типов |
Илья Ермаков писал(а): Языков с усиленным статическим контролем много, только, как правило, такой контроль требует глобального анализа. И ставит крест на раздельной компиляции (тот же контрактно-ориентированный Эйффель вот, насколько я помню, её не поддерживает). Я не считаю себя достаточно компетентным спорить с Вами, но обращаю внимание на следующие аспекты: 1. Динамика, как ее используют системные программисты (биты, пойнтеры неизвестно на что и т.д.), убивает контроль на корню, но это специфика системного программирования. 2. Когда программист использует сложный тип, транслятор знает все о составляющих этот тип: тип А = композиция (Б,В,Г); Дробавление операции (*) не добавляет необходимости никакой новой информации. 3. В константах операции такого типа разрешены, а связанные с этим трудности сопоставимы. Илья Ермаков писал(а): Есть большие сомнения даже в том, что ада-вская типизация как-то повышает надёжность, по сравнению с Обероновской. Не знаю никаких исследований надежности и юзабилити со времен Шнейдермана. Кто-нибудь этим занимался? Как насчет того, чтобы поручить какому-нибудь аспиранту поставить соответствующие опыты ![]() Илья Ермаков писал(а): Раньше он отвлекался на всякую дрянь инструмента, не отвлекается - и отлично. Кстати, для меня вот все эти встроенные в интерфейс паттерны - есть целая наука, наподобие кинематики или динамики - и сравнимая трудоемкость освоения - полагаю семестра хватит. Такой вот, "простой" язык оберон в стиле КП. Илья Ермаков писал(а): Поробуйте для разминки хотя бы ответить на вопрос, как эти механизмы будут себя вести при разнесении связанных соотношениями типов по разным модулям, в условиях раздельной компиляции, а тем более динамической загрузки? Не компетентен. |
Автор: | Валерий Лаптев [ Четверг, 19 Ноябрь, 2009 21:58 ] |
Заголовок сообщения: | Re: Совместимость типов |
Илья Ермаков писал(а): Языков с усиленным статическим контролем много, только, как правило, такой контроль требует глобального анализа. И ставит крест на раздельной компиляции (тот же контрактно-ориентированный Эйффель вот, насколько я помню, её не поддерживает). Баланс - штука тонкая. Нифига не ставит крест. Все дело - в организации среды. При написании модулей среда должна собирать и хранить информацию о всех объявленных типах и их свойствах. Тогда и стыковаться можно будет... ![]() |
Автор: | Илья Ермаков [ Четверг, 19 Ноябрь, 2009 22:08 ] |
Заголовок сообщения: | Re: Совместимость типов |
Таки глобальный анализ. "Обо всех.. Собирать..." Раздельная компиляция - это если я могу скомпилировать модуль А без наличия исходных текстов других модулей, а только их интерфейсов. Впрочем, да, в обсуждаемом примере непосредственных проблем с этим не будет (но остаётся вопрос, как проверять совместимость модулей - т.е. если вдруг я что-то меняю в декларации типа, и т.п. Тонкостей может быть много). А вот автовывод типов - уже всё, подавайте исходные тексты всех модулей. Нужна полная инофрмация обо всех использованиях типа. |
Автор: | Валерий Лаптев [ Четверг, 19 Ноябрь, 2009 22:27 ] |
Заголовок сообщения: | Re: Совместимость типов |
Неееееее.... Раздельная компиляция в том виде, как вы говорите - это простые текстовые файлы... И не только раздельная компиляция, но и потом еще отдельный шаг сборки линкером... А давайте доведем среду ББ до логического конца... Модули - это не обычные текстовые файлы, а несколько более сложные структуры, в которых содержится полная информация о типах... См диссер Франца... И СРЕДА естественно, эту информацию по каждому проекту может собирать в некий отдельный контейнер... Каждый модуль физически отдельно, но семантически - они в одном проекте... Дело в среде - раз уж пошли по пути усложнения от простого текста к текстовому документу... Давайте доведем до логического конца: программа - не текст, а граф с гиперссылками. Который среда бдит, обрабатывает, хранит, изменяет и прочая... |
Автор: | QWERTYProgrammer [ Четверг, 19 Ноябрь, 2009 22:48 ] |
Заголовок сообщения: | Re: Совместимость типов |
Виктор О писал(а): будет работать. По правилам Ньютона А кто мешает, заводим тип для физ. величин в СГС Код: TYPE PhysVariable = RECORD v: REAL; c, g, s: INTEGER; END; PROCEDURE MulPhysVariable (IN x, y: PhysVariable; OUT z: PhysVariable); BEGIN ASSERT(z.c = x.c + y.c); ASSERT(z.g = x.g + y.g); ASSERT(z.s = x.s + y.s); z.v := x.v * y.v; END MulPhysVariable; ... и вперед! Громоздко, правда, но если хочется непременно по-ньютону ![]() |
Автор: | Valery Solovey [ Четверг, 19 Ноябрь, 2009 22:59 ] |
Заголовок сообщения: | Re: Совместимость типов |
Илья Ермаков писал(а): А вот автовывод типов - уже всё, подавайте исходные тексты всех модулей. Нужна полная инофрмация обо всех использованиях типа. Не совсем понятно, что подразумевалось под использованием типа.А для автовывода нужна полная информация только о самом типе. Т.е., достаточно правил его генерации. Таким образом, нужно, чтобы в самом типе было где-то зашиты операции между переменными этого типа и правила формирования этого типа из группы переменных другого типа. Для простых примеров, которые приходят в голову, реализация не очень-то сложная, а для общего случая лень копаться: работы много, а необходимости для себя я пока не вижу. |
Автор: | Илья Ермаков [ Четверг, 19 Ноябрь, 2009 23:07 ] |
Заголовок сообщения: | Re: Совместимость типов |
Про необходимость глобального анализа для Хинди-Милнера читал у Шиперского в дисере. Сам в детали автовывода не вникал; но примерно представляю. Так вот: тип объекта явно не описан. Он конструируется исходя из способа использования объекта. А если объект используется за пределами модуля А, то мне, чтобы скомпилировать А (сопоставить тип объекту), нужно знать все случаи использования А. И перекомпилировать, если возникает новый случай. |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |