OberonCore
https://forum.oberoncore.ru/

Несерьёзный bag в компиляторе BB
https://forum.oberoncore.ru/viewtopic.php?f=1&t=1195
Страница 1 из 1

Автор:  igor [ Воскресенье, 12 Октябрь, 2008 12:28 ]
Заголовок сообщения:  Несерьёзный bag в компиляторе BB

Привет всем! Давно с интересом слежу за обсуждениями в данном сообществе. Приверженцем швейцарской школы программирования я стал задолго до того, как познакомился с ней :) . Это мой первый пост на данном форуме.
Код:
CONST
  s1 = 'q';         (* LEN(s1) приводит к ошибке! *)
  s2 = 'q' + 0X; (* LEN(s2) не приводит к ошибке *)

С точки зрения языка обявления констант s1 и s2 равнозначны. Но компилятор в BB, к сожалению, считает иначе :( . В обоих случаях цепочка длины 1 размещается в статической памяти (для глобальных констант). Но в первом случае выделяется один байт для хранения цепочки, а во втором случае - два байта, так как операция конкатенации неявно добавляет нуль-литеру.
В случае объявления литерной цепочки длины 0, 2 или более, указанная "особенность" не проявляется.

Автор:  PGR [ Воскресенье, 12 Октябрь, 2008 12:53 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

В BlackBox 1.6 это уже исправлено.

Автор:  AVC [ Воскресенье, 12 Октябрь, 2008 16:03 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

Игорь Лоскутов писал(а):
Это мой первый пост на данном форуме.
Добро пожаловать! :D

Автор:  igor [ Воскресенье, 12 Октябрь, 2008 16:18 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

AVC писал(а):
Игорь Лоскутов писал(а):
Это мой первый пост на данном форуме.
Добро пожаловать! :D

Спасибо! Всегда приятно поговорить с умными людьми :)

Автор:  А.П. [ Понедельник, 13 Октябрь, 2008 05:31 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

Здравствуйте, Игорь!

Предлагаю познакомиться при личной встрече. Например, на ф-те информатики ТГУ в четверг или в субботу (у меня 3-я пара "Практикум на ЭВМ" 12:25-14:00, ауд.103-б). Я думаю, общие интересы в области прог-я на КП/ББ у нас есть.

Автор:  Александр Ильин [ Понедельник, 13 Октябрь, 2008 06:28 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

Игорь Лоскутов писал(а):
Привет всем! Давно с интересом слежу за обсуждениями в данном сообществе. Приверженцем швейцарской школы программирования я стал задолго до того, как познакомился с ней :) . Это мой первый пост на данном форуме.
Привет! Рад видеть ещё одного томича : ) Поддерживаю предложение А.П. о встрече, чаю попить никогда не помешает.
Игорь Лоскутов писал(а):
Код:
CONST
  s1 = 'q';         (* LEN(s1) приводит к ошибке! *)
  s2 = 'q' + 0X; (* LEN(s2) не приводит к ошибке *)

С точки зрения языка обявления констант s1 и s2 равнозначны. Но компилятор в BB, к сожалению, считает иначе :(
Я так понимаю, что в первом случае константа имеет тип CHAR, а во втором случае ARRAY OF CHAR. Значение LEN(CHAR) не определено в описании языка, так что по-хорошему компилятор должен выдавать ошибку.

Автор:  igor [ Понедельник, 13 Октябрь, 2008 10:11 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

А.П. писал(а):
Предлагаю познакомиться при личной встрече

Александр Ильин писал(а):
Поддерживаю предложение А.П. о встрече

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

Александр Ильин писал(а):
Я так понимаю, что в первом случае константа имеет тип CHAR, а во втором случае ARRAY OF CHAR. Значение LEN(CHAR) не определено в описании языка, так что по-хорошему компилятор должен выдавать ошибку.

Вы правы, Александр, в первом случае константа имеет тип CHAR. Но от себя добавлю, что должна была бы иметь тип ARRAY OF CHAR, точнее тип цепочек литер. Строки в КП - хороший пример того, как тип переменной может не совпадть с типом значения, хранящегося в этой переменной. И насчёт переменных, здесь я не оговорился, потому что строковые константы в КП всегда реализованы как "переменные только для чтения" и никогда не размещаются компилятором непосредственно в коде (immediate data), в отличие от констант других типов.
В пользу того, что это всё-таки ошибка говорит тот факт, что в v1.6 она исправлена, как справедливо заметил PGR.
Я кажется понял механизм того, как возникла эта ошибка. Разработчики, помятуя о том, что
Цитата:
Цепочка длины 1 может использоваться всюду, где разрешена литерная константа, и наоборот.

привели цепочки длины один в соответствие с литерной константой. А нужно было наоборот: привести литерные константы в соответствие с литерными цепочками длины 1. А это, как мы видим, не одно и то же.

Автор:  igor [ Вторник, 29 Сентябрь, 2009 18:28 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

Продолжаем искать баги в компиляторе :)

Аттрибуты ABSTRACT, LIMITED, EMPTY и EXTENSIBLE помечены в сообщении как ключевые слова, но реализованы в Блэкбокс как предопределённые идентификаторы (см. DevCPT, секция инициализации).

Автор:  Борис Рюмшин [ Вторник, 29 Сентябрь, 2009 19:41 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

Это фича. :)
Так просто быстрее компилятор расширить видимо было.

Автор:  Info21 [ Вторник, 29 Сентябрь, 2009 19:53 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

igor писал(а):
Аттрибуты ABSTRACT, LIMITED, EMPTY и EXTENSIBLE помечены в сообщении как ключевые слова, но реализованы в Блэкбокс как предопределённые идентификаторы (см. DevCPT, секция инициализации).
Кстати, где это проявляется? в сообщениях компилятора? и как Вы обнаружили -- простым рассматриванием?

Автор:  igor [ Вторник, 29 Сентябрь, 2009 19:56 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

Но знать об этой фичи никому не помешает :). Собственно, поэтому и написал.

Автор:  igor [ Вторник, 29 Сентябрь, 2009 20:02 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

Info21 писал(а):
Кстати, где это проявляется? в сообщениях компилятора? и как Вы обнаружили -- простым рассматриванием?
Обнаружил случайно, просматривая исходники компилятора.
Проявляется, например, так. Следующий код компилятор проглатывает не поморщившись:
Код:
 TYPE EMPTY = INTEGER;
А должен выдавать ошибку!

Автор:  Info21 [ Вторник, 29 Сентябрь, 2009 20:16 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

igor писал(а):
Info21 писал(а):
... простым рассматриванием?
Обнаружил случайно, просматривая исходники компилятора.
Ага!

Я спросил для статистики: все настоящие открытия деляются случайно в процессе пристального рассматривания.

igor писал(а):
А должен выдавать ошибку!
Помнится, студент зачем-то использовал какие-то из all-cap слов в качестве идентификаторов, и там лезли странные ошибки. Но пристально рассмотреть никто не догадался.

Эффект Вавилова-Черенкова тоже видели две (кажется) группы в мире до Черенкова, но отмахнулись типа мало ли, мусор.
И только Черенков оказался занудой и стал проверять.
И получил Нобеля :)

Автор:  igor [ Вторник, 29 Сентябрь, 2009 20:25 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

Ну, на Нобеля я не претендую :D
Кстати, помнится я читал статью Никлауса Вирта, в которой он сетовал, что поздно понял, что FALSE и TRUE следовало бы сделать ключевыми словами. Даже пример приводил, приводящий к абсурду. Вот ссылочку сейчас дать затрудняюсь, но думаю, что все её читали.

Автор:  Info21 [ Вторник, 29 Сентябрь, 2009 21:41 ]
Заголовок сообщения:  Re: Несерьёзный bag в компиляторе BB

igor писал(а):
Ну, на Нобеля я не претендую :D
Тут дело не в претензии, а в хороших привычках. А дальше уж как повезет :)

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