Автор Тема: Раскручиваем компилятор O7  (Прочитано 39946 раз)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #75 : Ноябрь 08, 2013, 07:44:45 am »
А вот вариант, основанный на идее, подсмотренной в исходниках BB:
PROCEDURE IsReservedOberonWord(s: ARRAY OF CHAR): BOOLEAN;
VAR res: BOOLEAN
BEGIN
  CASE s[0] OF
  | 'A': res := s = "ARRAY";
  | 'B': res := (s = "BEGIN") OR (s = "BY");
  | 'C': res := (s = "CASE") OR (s = "CONST");
  | 'D': res := (s = "DIV") OR (s = "DO");
  | 'E': res := (s = "END") OR (s = "ELSE") OR (s = "ELSIF");
  | 'F': res := (s = "FALSE") OR (s = "FOR");
  | 'I': res := (s = "IMPORT") OR (s = "IN") OR (s = "IS") OR (s = "IF");
  | 'M': res := (s = "MOD") OR (s = "MODULE");
  | 'N': res := s = "NIL";
  | 'O': res := (s = "OF") OR (s = "OR");
  | 'P': res := (s = "POINTER") OR (s = "PROCEDURE");
  | 'R': res := (s = "RECORD") OR (s = "REPEAT") OR (s = "RETURN");
  | 'T': res := (s = "TO") OR (s = "THEN") OR (s = "TRUE") OR (s = "TYPE");
  | 'U': res := s = "UNTIL";
  | 'V': res := s = "VAR";
  | 'W': res := s = "WHILE";
  ELSE res := FALSE
  END;
  RETURN res
END IsReservedOberonWord;

Ну вот, простейшая хеш-таблица вышла )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #76 : Ноябрь 08, 2013, 08:03:09 am »
Ну вот, простейшая хеш-таблица вышла )))
Так и есть :-)

---------
К слову сказать, этот пример иллюстрирует, что оператор CASE это всё-таки нечто большее, чем просто синтаксический сахар. В случае использования равноценного многоветочного IF компилятору пришлось бы проанализировать условия во всех ветках для того чтобы понять сможет ли он сгенерировать эффективную таблицу переходов, или придётся генерировать код как для обычного IF'а.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #77 : Ноябрь 08, 2013, 08:44:48 am »
К слову сказать, этот пример иллюстрирует, что оператор CASE это всё-таки нечто большее, чем просто синтаксический сахар. В случае использования равноценного многоветочного IF компилятору пришлось бы проанализировать условия во всех ветках для того чтобы понять сможет ли он сгенерировать эффективную таблицу переходов, или придётся генерировать код как для обычного IF'а.

Так и с CASE'ом тоже самое -- придётся анализировать, в каких диапазонах находятся эти метки и диапазоны меток, сортировать их, решать, можно ли сделать всё одной таблицей переходов или же придётся делать несколько таблиц переходов, или вообще проще IF-ами всё сравнивать...
Особой разницы для автора компилятора нет...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #78 : Ноябрь 08, 2013, 09:28:51 am »
Так и с CASE'ом тоже самое -- придётся анализировать, в каких диапазонах находятся эти метки и диапазоны меток, сортировать их, решать, можно ли сделать всё одной таблицей переходов или же придётся делать несколько таблиц переходов, или вообще проще IF-ами всё сравнивать...
Особой разницы для автора компилятора нет...
Да, пожалуй. Значения меток выбора в общем случае могут быть сильно разряжены и располагаться неравномерно. С построением таблицы переходов могут возникнуть сложности:
VAR a: LONGINT;
CASE a OF
| -100500: ... ;
| 0, 1: ... ;
| 100500: ... ;
END

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #79 : Ноябрь 08, 2013, 09:33:50 am »
Так и с CASE'ом тоже самое -- придётся анализировать, в каких диапазонах находятся эти метки и диапазоны меток, сортировать их, решать, можно ли сделать всё одной таблицей переходов или же придётся делать несколько таблиц переходов, или вообще проще IF-ами всё сравнивать...
Особой разницы для автора компилятора нет...
Да, пожалуй. Значения меток выбора в общем случае могут быть сильно разряжены и располагаться неравномерно. С построением таблицы переходов могут возникнуть сложности:
VAR a: LONGINT;
CASE a OF
| -100500: ... ;
| 0, 1: ... ;
| 100500: ... ;
END
Не сложности, а даже невозможности :-) Идеальную хэш-функцию не построить в общем случае.

И как тут, в сосденей ветке, надавно заметили, репорт Оберона не запрещает меткам пересекаться. Что добавляет веселья компиляторщику :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #80 : Ноябрь 08, 2013, 09:56:38 am »
Не сложности, а даже невозможности :-) Идеальную хэш-функцию не построить в общем случае.
К счастью, в нашем случае с ключевыми словами таких проблем не возникает. Хотя, надо сказать, что нет гарантии того, что какой-либо автор компилятора у себя в коде всё сделал правильно. :-)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #81 : Ноябрь 08, 2013, 10:09:17 am »
Да, пожалуй. Значения меток выбора в общем случае могут быть сильно разряжены и располагаться неравномерно. С построением таблицы переходов могут возникнуть сложности:
VAR a: LONGINT;
CASE a OF
| -100500: ... ;
| 0, 1: ... ;
| 100500: ... ;
END
Не сложности, а даже невозможности :-) Идеальную хэш-функцию не построить в общем случае.

И как тут, в сосденей ветке, надавно заметили, репорт Оберона не запрещает меткам пересекаться. Что добавляет веселья компиляторщику :-)[/quote]

А учитывая, что в качестве меток могут быть не только константы, но и переменные, а также строковые литералы, совсем весело становится с таблицей переходов )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #82 : Ноябрь 08, 2013, 10:19:16 am »
А учитывая, что в качестве меток могут быть не только константы, но и переменные, а также строковые литералы, совсем весело становится с таблицей переходов )))

Ну, это не совсем таки так:
Цитировать
The case expression must be of type INTEGER or CHAR, and all labels must be integers or single-character strings, respectively.

А вот про константность того что в label'e действительно не сказано, хотя явно же ident там оставлен для именованных констант а не для переменных.
Y = λf.(λx.f (x x)) (λx.f (x x))

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #83 : Ноябрь 09, 2013, 02:13:20 pm »
Наверняка такая мысль высказывалась уже. Но думаю цикл дейкстры в первую очередь удобен там, где после обычного цикла надо обработать еще что-то (прямо связанное с данным циклом). Правда в этом случае удобнее было бы сделать не ELSIF DO а просто ELSE и дальше уже условия цикла не проверять.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #84 : Ноябрь 10, 2013, 01:01:36 pm »
Не для этого нужен ЦД. Это цикл, содержащий внутри себя последовательность циклов.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #85 : Ноябрь 10, 2013, 06:13:24 pm »
- Почему в популярны языках нет Цикла Дейкстры?
- Потому что он там нинужен

:)
Если бы Влад изначально не заморочил мозги циклом Дейкстры, то выяснилось бы, что он и в этом примере нахрен не нужен.
    static bool isReservedWorld2(string s, string words) {
      int i = 0, w = 0;
      bool prevEq = true;
      while ((w < words.Length) && (i < s.Length)) {
        if (prevEq && (words[w] == s[i])) {
          i++;
        } else if (words[w] == ' ') {
          if (prevEq) {
            i = 0;
          } else {
            prevEq = true;
          }
        } else if (prevEq) {
          prevEq = false;
          i = 0;
        }
        w++;
      }
      return i == s.Length && (w == words.Length || words[w] == ' ');
    }

kkkk

  • Full Member
  • ***
  • Сообщений: 135
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #86 : Ноябрь 10, 2013, 08:21:29 pm »
С учетом всех тем, где упоминался цикл Дейкстры, что я наблюдал, можно прийти к выводу, что в мире современных программистов ЦД - могучий артефакт, притягивающий к себе внимание вне зависимости от его целесообразности в конкретном случае. Знай бы об этом Никлаус Вирт, вероятно, захотел бы и его исключить из языка. Но с точки зрения маркетинга такая скандалообразующая штука безусловно полезна.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #87 : Ноябрь 10, 2013, 08:42:25 pm »
С учетом всех тем, где упоминался цикл Дейкстры, что я наблюдал, можно прийти к выводу, что в мире современных программистов ЦД - могучий артефакт, притягивающий к себе внимание вне зависимости от его целесообразности в конкретном случае. Знай бы об этом Никлаус Вирт, вероятно, захотел бы и его исключить из языка. Но с точки зрения маркетинга такая скандалообразующая штука безусловно полезна.

Самое смешное -- это то, что в Обероне нет цикла Дейкстры. Есть цикл, синтаксически напоминающий цикл Дейкстры, но семантически всё-таки отличающийся от него...
Впрочем, настоящего ветвления Дейкстры в Оберонах/Модулах-2 тоже нет, есть ветвление, лишь синтаксически напоминающее его.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #88 : Ноябрь 10, 2013, 08:53:43 pm »
С учетом всех тем, где упоминался цикл Дейкстры, что я наблюдал, можно прийти к выводу, что в мире современных программистов ЦД - могучий артефакт, притягивающий к себе внимание вне зависимости от его целесообразности в конкретном случае. Знай бы об этом Никлаус Вирт, вероятно, захотел бы и его исключить из языка. Но с точки зрения маркетинга такая скандалообразующая штука безусловно полезна.

Самое смешное -- это то, что в Обероне нет цикла Дейкстры. Есть цикл, синтаксически напоминающий цикл Дейкстры, но семантически всё-таки отличающийся от него...
Впрочем, настоящего ветвления Дейкстры в Оберонах/Модулах-2 тоже нет, есть ветвление, лишь синтаксически напоминающее его.
Предлагаю раскрыть мысль, дабы народ сейчас не нафантазировал чего-то странного.
Y = λf.(λx.f (x x)) (λx.f (x x))

adva

  • Sr. Member
  • ****
  • Сообщений: 385
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #89 : Ноябрь 10, 2013, 09:54:18 pm »
Не для этого нужен ЦД. Это цикл, содержащий внутри себя последовательность циклов.
Да, но мозги при этом сломаешь больше, чем с обычными циклами. Да и условий дополнительных писать