Автор Тема: локальные переменные в отдельной декларативной части  (Прочитано 43277 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Кажется понял. Для тебя глобальный скоп и внешний одно и то же?

Прежде всего, речь, конечно, о глобальном скопе. Изменение некоего внешнего скопа вещь большее спорная. Но я также склоняюсь к запрету. Ради однообразия. И опять же по опыту использования питона (запрещено) и js (разрешено).

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
У динамических языков своя логика, с моей точки зрения не самая лучшая.

Динамичность здесь постольку поскольку. Никто не мешает сделать питоновский стиль объявление локальных переменных при полной статике (очень хочу пропробовать лично ;)

Я имел ввиду самое простое для реализации компилятора из достаточно хороших для пользователей языка.

То, что мы наблюдает в обероне-07 в плане простоты компилятора - это уже давно "проще, чем надо". Впрочем, если таки дойдет до "избавления от секции VAR" - обязательно поделюсь насколько это "сложно".

естественно, речь о применении Оберона по назначению

Хе-хе. Мне бы все-таки хотелось увидеть более ширпотребное применение оберона (пусть и в измененном виде) - за пределами FPGA (при всем восхищении от решения на FPGA).

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

Во-первых, имя процедуры ближе к семантическрому анализу, чем к классическому парсеру (у которого на выходе AST). Так что это еще надо постараться, чтобы заиспользовать имя процедуры для восстановления парсера.
Во-вторых, синтаксис с жестким форматированием (опять питон) в этом смысле все равно выглядит намного более удобным (тупо ищем следующую строку с заданным отступом).

В первую очередь с отдельной секцией очевидно, что если какая-то переменная в ней есть - она именно локальна, и не надо выискивать, есть ли где в мешанине коде объявление/перекрытие

Почему сразу "мешанина кода"? У нас же ш культурная процедура на < 10 строк. Естественно, что если выше по коду стоит "переменная = значение", то это переменная локальная. Ну или если совсем страшно, то пусть будет "var переменная = значение". Надобность в отдельной секции все равно не возникает. Особенно если постараться не оглядываться на привычки.

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
У динамических языков своя логика, с моей точки зрения не самая лучшая.
Динамичность здесь постольку поскольку. Никто не мешает сделать питоновский стиль объявление локальных переменных при полной статике (очень хочу пропробовать лично ;)
Это не совсем так. При неявной типизации изменение типа функции, которая инициализирует переменную можно получить неожиданный результат при сохранении компилируемости. К примеру, с INTEGER на REAL при проверке на равенство. Это вполне согласуется с динамическими языками, но статические теряют в контроле.
Цитата: vlad
Я имел ввиду самое простое для реализации компилятора из достаточно хороших для пользователей языка.
То, что мы наблюдает в обероне-07 в плане простоты компилятора - это уже давно "проще, чем надо". Впрочем, если таки дойдет до "избавления от секции VAR" - обязательно поделюсь насколько это "сложно".
Не валите все в одну кучу. Проще чем надо не имеет отношения к традиционной паскалевской секции VAR. Когда будете делиться о "сложности" избавления не забудьте, что я говорил о достаточно простом решении при достаточном удобстве для пользователя-программиста. Питоновский вариант достаточным не считаю.

Цитата: vlad
естественно, речь о применении Оберона по назначению
Хе-хе. Мне бы все-таки хотелось увидеть более ширпотребное применение оберона (пусть и в измененном виде) - за пределами FPGA (при всем восхищении от решения на FPGA).
Тут у меня возникла ассоциация с гламурной ведущей с канала "Дождь", задавшей вопрос Жоресу Алферову, зачем нужна российская электронная промышленность, если она не производит iPhone. Использование Оберона по назначению в том контексте - это компиляция в машинный код, не более.
Цитата: vlad
А вот простому парсеру языка восстановиться после ошибки в коде, особенно при наличии встроенных процедур в языке, помогает.
Во-первых, имя процедуры ближе к семантическрому анализу, чем к классическому парсеру (у которого на выходе AST). Так что это еще надо постараться, чтобы заиспользовать имя процедуры для восстановления парсера.
Во-вторых, синтаксис с жестким форматированием (опять питон) в этом смысле все равно выглядит намного более удобным (тупо ищем следующую строку с заданным отступом).
При построении самодостаточного парсера для Оберона нужно использовать семантический анализ не только касаемо имени в конце процедуры, неужели это сюрприз? А ведь это свойство языка послужило даже одним из эпизодов драмы, время от времени всплывающей на оберонкоре.

Цитата: vlad
Почему сразу "мешанина кода"? У нас же ш культурная процедура на < 10 строк. Естественно, что если выше по коду стоит "переменная = значение", то это переменная локальная. Ну или если совсем страшно, то пусть будет "var переменная = значение". Надобность в отдельной секции все равно не возникает. Особенно если постараться не оглядываться на привычки.
По сравнению с обероновским всё по полочкам, это будет мешанина даже в 10 строках. К тому же их никто не гарантирует, их еще добиваться надо, не забывайте про длительное сопровождение многими людьми. Вдобавок, иное искусственное разбиение на излишне малые процедуры бывает и хуже для понимания, чем уместный 40-строчник.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
При неявной типизации изменение типа функции, которая инициализирует переменную можно получить неожиданный результат при сохранении компилируемости. К примеру, с INTEGER на REAL при проверке на равенство. Это вполне согласуется с динамическими языками, но статические теряют в контроле.

Пример несколько надуман. Однако тип можно оставить, почему нет. Отдельная секция для этого все равно не нужна:
i: int = 123

Не валите все в одну кучу. Проще чем надо не имеет отношения к традиционной паскалевской секции VAR.

Да, не имеет. По моему мнению секция VAR больше из области "здесь так заведено". Когда-то на заре ЯП было принято расписывать в какую ячейку какая переменная пойдет... А КАПС хорошо смотрелся на монохромном (два цвета) мониторе...

Когда будете делиться о "сложности" избавления не забудьте, что я говорил о достаточно простом решении при достаточном удобстве для пользователя-программиста. Питоновский вариант достаточным не считаю.

Сформулируй точнее, что является достаточным.

Цитата: vlad
Хе-хе. Мне бы все-таки хотелось увидеть более ширпотребное применение оберона (пусть и в измененном виде) - за пределами FPGA (при всем восхищении от решения на FPGA).
Тут у меня возникла ассоциация с гламурной ведущей с канала "Дождь", задавшей вопрос Жоресу Алферову, зачем нужна российская электронная промышленность, если она не производит iPhone. Использование Оберона по назначению в том контексте - это компиляция в машинный код, не более.

Ну вот не надо передергивать. Речь не о чем-то попсовом, а о промышленном и полезном. Виртовские игры с FPGA имеют сугубо академический интерес (а самому Вирту оно вообще интересно, потому что интересно). Выхлоп в виде общечеловеческого блага (не айфона, а глобального) очень косвенный - кто-то под впечатлением от работы Вирта сделает таки что-то практически полезное - будь то новый процессор или компилятор.

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

Хорошо, у тебя есть сведения, что виртовский (или какой-то другой) компилятор использует эту особенность для восстановления после ошибок? Или это все-таки было придумано по ходу дела?

По сравнению с обероновским всё по полочкам, это будет мешанина даже в 10 строках.

Начнем с того, что строчек будет уже не 10, а 8 - за счет отсутствия VAR. Где там можно чего-то намешать - не представляю. Я ж говорю - привычка. Желание иметь отдельную одну полку. Хотя с тремя крючками удобнее.
« Последнее редактирование: Декабрь 15, 2013, 02:49:26 am от vlad »

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
...сведения, что виртовский (или какой-то другой) компилятор использует эту особенность для восстановления после ошибок? Или это все-таки было придумано по ходу дела?
Я точно помню, что читало про это где-то в 2006-2008 годах.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
...сведения, что виртовский (или какой-то другой) компилятор использует эту особенность для восстановления после ошибок? Или это все-таки было придумано по ходу дела?
Я точно помню, что читало про это где-то в 2006-2008 годах.
Исходники же есть. Посмотрите.
Y = λf.(λx.f (x x)) (λx.f (x x))

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
...сведения, что виртовский (или какой-то другой) компилятор использует эту особенность для восстановления после ошибок? Или это все-таки было придумано по ходу дела?
Я точно помню, что читало про это где-то в 2006-2008 годах.
Свою стратегию восстановления после ошибок Вирт неплохо описал в "Построении компиляторов" (см. п.7.9 Устранение синтаксических ошибок). Правда, среди точек синхронизации он не называет терминаторы процедур (это конечно не означает, что на практике он никогда их не использует для восстановления).

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Свою стратегию восстановления после ошибок Вирт неплохо описал в "Построении компиляторов" (см. п.7.9 Устранение синтаксических ошибок).

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
По сравнению с обероновским всё по полочкам, это будет мешанина даже в 10 строках.

Вот, кстати, хорошая иллюстрация (обсуждалась в курилке): http://www.inf.ethz.ch/personal/wirth/ProjectOberon/Sources/Checkers.Mod.txt
Обрати внимание на то где объявляется переменная цикла, а где сам цикл. Зачем???

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
vlad, это глобальная переменная. Очевидно, что она будет использоваться далеко от объявления. VAR тут совершенно не виноват.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
vlad, это глобальная переменная. Очевидно, что она будет использоваться далеко от объявления. VAR тут совершенно не виноват.
В данном случае её глобальность никак не проявляется.
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
vlad, это глобальная переменная. Очевидно, что она будет использоваться далеко от объявления. VAR тут совершенно не виноват.
В данном случае её глобальность никак не проявляется.
А причем тут глобальность - переменная используется в секции инициализации(телу) модуля, для которой данная переменная локальна. Единственное, что можно было бы сделать - как в старших Оберонах - произвольное расположение секций, тогда секцию VAR с этой переменной можно было бы прижать к телу модуля

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
2 valexey:
В смысле? Ты про то, что она используется в одном месте?
Ну мне тоже не нравится, что переменная цикла объявляется в VAR. Даже тему создавал по этому поводу.
Но разве это аргумент против VAR?

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
При неявной типизации изменение типа функции, которая инициализирует переменную можно получить неожиданный результат при сохранении компилируемости. К примеру, с INTEGER на REAL при проверке на равенство. Это вполне согласуется с динамическими языками, но статические теряют в контроле.
Пример несколько надуман. Однако тип можно оставить, почему нет. Отдельная секция для этого все равно не нужна:
i: int = 123
Для кого надуман, для кого - бытовуха. Любите валить всё в одну кучу, прям как переменные и код. Эта часть ответа был о реализации в питоне и связи с динамической логикой, а не о том, что для явного задания типа нужна отдельная секция.

Цитата: vlad
Да, не имеет. По моему мнению секция VAR больше из области "здесь так заведено". Когда-то на заре ЯП было принято расписывать в какую ячейку какая переменная пойдет... А КАПС хорошо смотрелся на монохромном (два цвета) мониторе...
Однажды проходя мимо коллеги, внезапно увидел знакомые "BEGIN - END". Когда я спросил его, что это, он ответил, что VHDL, а ключевые слова хоть и не регистрозависимые, но заглавными буквами ему удобней. Я посмеялся, вспомнив широко известную в узких кругах спецолимпиаду. Человеку 24 года, об Обероне не слышал, программирует на Си.

Цитата: vlad
Питоновский вариант достаточным не считаю.
Сформулируй, что является достаточным.
Единое поле видимости для всей функции, очевидность принадлежности, логичность представления. Увы, кроме 1-го, всё достаточно субъективно, особенно 3-й, так что попытки найти идеальный общий знаменатель будут бесплодны.
Цитата: vlad
Хорошо, у тебя есть сведения, что виртовский (или какой-то другой) компилятор использует эту особенность для восстановления после ошибок? Или это все-таки было придумано по ходу дела?
Как минимум тот, что пишу я(свет скорей всего не увидит), с остальными не разбирался. Боже упаси меня придумывать по ходу дела для вашего развлечения.

Цитата: vlad
Начнем с того, что строчек будет уже не 10, а 8 - за счет отсутствия VAR. Где там можно чего-то намешать - не представляю. Я ж говорю - привычка. Желание иметь отдельную одну полку. Хотя с тремя крючками удобнее.
10 строк кода - это 10 строк кода, переменные отдельно. Глянул сейчас на свой код - много функций побольше 10 строк, и самое сложное будет при их дроблении - это выдумывание адекватных названий для этих искусственных лепёшек, и сбор их в единый контекст.

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
По сравнению с обероновским всё по полочкам, это будет мешанина даже в 10 строках.
Вот, кстати, хорошая иллюстрация (обсуждалась в курилке): http://www.inf.ethz.ch/personal/wirth/ProjectOberon/Sources/Checkers.Mod.txt
Обрати внимание на то где объявляется переменная цикла, а где сам цикл. Зачем???
Откуда мне знать? Там, очевидно, напрашивается процедура с кодом инициализации, в которой эта переменная и должна быть объявлена. Видимо автор решил, что для такого модуля можно не заморачиваться.