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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Раскручиваем компилятор O7
« : Октябрь 27, 2013, 06:36:14 am »
Итак, свершилось: кусочек компилятора был переписан на обероне и скомпилирован самим компилятором. Надо сказать, что в этом что-то есть :) Типа непосредственного прикосновения к вечной проблеме курицы и яйца.

Код приведен в самом конце. Текущие впечатления от кодирования:
- В отсутствие методов запись "Stream.pos(stream)" конечно многословнее и воспринимается хуже, чем "stream.pos()".
- Дублирование в конце имени процедуры - жестокое и беспощадное. Программер должен страдать. Особенно если захочет переименовать. Смысла - 0. Если уж боремся за читабельность, то лучше запретить процедуры длиннее 10 строк...
- Точка с запятой после RETURN. Точнее требование ее отсутствия. Вот уж действительно мелочь, но вот чисто с эргономической точки зрения напрягает страшно. Удобство принесенное в жертву формализму.
- Тяжелый синтаксис. Даже если постараться не смотреть на КАПС. Т.е. я конечно в курсе незабвенного "синтаксического оверхеда", но вот в случае тривиальных процедур - обероновский код выглядит если не многословным, то многобуквенным. И даже "int" vs "INTEGER" начинает напрягать. Т.е. пока пишешь "int" в каком-нибудь С++ это кажется и не таким важным. Но вот пописав "INTGER" начинаешь ценить более короткий вариант.
MODULE Stream;
IMPORT JsString;

TYPE
    Type = POINTER TO RECORD
        s: JsString.Type;
        pos: INTEGER
    END;

    ReaderProc = PROCEDURE(c: CHAR): BOOLEAN;

PROCEDURE make*(text: JsString.Type): Type;
VAR result: Type;
BEGIN
    NEW(result);
    result.s := text;
    RETURN result
END make;

PROCEDURE eof*(self: Type): BOOLEAN;
    RETURN self.pos = JsString.len(self.s)
END eof;

PROCEDURE pos*(self: Type): INTEGER;
    RETURN self.pos
END pos;

PROCEDURE setPos*(self: Type; pos: INTEGER);
BEGIN
    ASSERT(pos <= JsString.len(self.s));
    self.pos := pos
END setPos;

PROCEDURE next*(self: Type; n: INTEGER);
BEGIN
    ASSERT(self.pos + n <= JsString.len(self.s));
    self.pos := self.pos + n;
END next;

PROCEDURE peekChar*(self: Type): CHAR;
BEGIN
    ASSERT(~eof(self));
    RETURN JsString.at(self.s, self.pos)
END peekChar;

PROCEDURE getChar*(self: Type): CHAR;
VAR result: CHAR;
BEGIN
    ASSERT(~eof(self));
    result := JsString.at(self.s, self.pos);
    INC(self.pos);
    RETURN result
END getChar;

PROCEDURE peekStr*(self: Type; len: INTEGER): JsString.Type;
VAR max: INTEGER;
BEGIN
    max := JsString.len(self.s) - self.pos;
    IF len > max THEN
        len := max;
    END
    RETURN JsString.substr(self.s, self.pos, len)
END peekStr;

PROCEDURE read*(self: Type; f: ReaderProc): BOOLEAN;
BEGIN
    WHILE ~eof(self) & f(peekChar(self)) DO
        next(self, 1);
    END
    RETURN ~eof(self)
END read;

PROCEDURE lineNumber*(self: Type): INTEGER;
VAR
    line: INTEGER;
    lastPos: INTEGER;
BEGIN
    lastPos := JsString.indexOf(self.s, 0DX);
    WHILE (lastPos # -1) & (lastPos < self.pos) DO
        INC(line);
        lastPos := JsString.indexOfFrom(self.s, 0DX, lastPos + 1);
    END;
    RETURN line + 1
END lineNumber;

END Stream.

kkk

  • Гость
Re: Раскручиваем компилятор O7
« Ответ #1 : Октябрь 27, 2013, 09:16:23 am »
За много лет творческого пиздежа против оберона первые строчки на обероне, хо-хо-хо.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #2 : Октябрь 27, 2013, 09:18:55 am »
За много лет творческого пиздежа против оберона первые строчки на обероне, хо-хо-хо.

Ну а ты обероном до сих пор не пользуешься, ва-ха-ха.
to iterate is human, to recurse, divine

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

kkk

  • Гость
Re: Раскручиваем компилятор O7
« Ответ #3 : Октябрь 27, 2013, 09:23:19 am »
Да и тут Ъ"обероном" не пахнет, всего лишь "-07".
С твоей дебильной точки зрения, С++11-лохи не могут в С++'99.

kkk

  • Гость
Re: Раскручиваем компилятор O7
« Ответ #4 : Октябрь 27, 2013, 09:28:18 am »
Component Pascal is Oberon microsystems' refinement of the Oberon-2 language. Oberon microsystems thanks H. Mössenböck and N. Wirth for the friendly permission to use their Oberon‘2 report as basis for this document.
Component Pascal is Oberon microsystems' refinement of the Oberon-2 language. Oberon microsystems thanks H. Mössenböck and N. Wirth for the friendly permission to use their Oberon‘2 report as basis for this document.
Component Pascal is Oberon microsystems' refinement of the Oberon-2 language. Oberon microsystems thanks H. Mössenböck and N. Wirth for the friendly permission to use their Oberon‘2 report as basis for this document.
Component Pascal is Oberon microsystems' refinement of the Oberon-2 language. Oberon microsystems thanks H. Mössenböck and N. Wirth for the friendly permission to use their Oberon‘2 report as basis for this document.
Component Pascal is Oberon microsystems' refinement of the Oberon-2 language. Oberon microsystems thanks H. Mössenböck and N. Wirth for the friendly permission to use their Oberon‘2 report as basis for this document.
Component Pascal is Oberon microsystems' refinement of the Oberon-2 language. Oberon microsystems thanks H. Mössenböck and N. Wirth for the friendly permission to use their Oberon‘2 report as basis for this document.
Component Pascal is Oberon microsystems' refinement of the Oberon-2 language. Oberon microsystems thanks H. Mössenböck and N. Wirth for the friendly permission to use their Oberon‘2 report as basis for this document.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #5 : Октябрь 27, 2013, 09:30:11 am »
Да и тут Ъ"обероном" не пахнет, всего лишь "-07".
С твоей дебильной точки зрения, С++11-лохи не могут в С++'99.

С++11 отличается от С++99 куда меньше, чем КП от Оберона.
Если уж сравнивать, то КП -- это аналог С++83, а Оберон -- это аналог С70...

Учи матчасть.
to iterate is human, to recurse, divine

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

kkk

  • Гость
Re: Раскручиваем компилятор O7
« Ответ #6 : Октябрь 27, 2013, 09:31:10 am »
Учи матчасть.
Иди нахуй, чучело.
В твоём первом высере ничего не было про степени отличия. На хабре такую хуйню втирай.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #7 : Октябрь 27, 2013, 09:32:05 am »
Component Pascal is Oberon microsystems' refinement of the Oberon-2 language. Oberon microsystems thanks H. Mössenböck and N. Wirth for the friendly permission to use their Oberon‘2 report as basis for this document.
Вот именно что КП -- это версия Oberon-2 language, а вовсе не виртовского Оберона! Говорю же -- учи матчасть!
to iterate is human, to recurse, divine

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

kkk

  • Гость
Re: Раскручиваем компилятор O7
« Ответ #8 : Октябрь 27, 2013, 09:34:42 am »
Текущие впечатления от кодирования:
- конечно многословнее и воспринимается хуже
- жестокое и беспощадное. страдать. Если уж, то лучше...
- мелочь, но вот чисто с эргономической точки зрения напрягает страшно. Удобство принесенное в жертву формализму.
- Тяжелый синтаксис. обероновский код выглядит если не многословным, то многобуквенным. начинает напрягать. пописав "INTGER" начинаешь ценить более короткий вариант.
Эмоциональные эксперты на страже всего мейнстримного. Одни несчётные параметры. Ну этому аналезу от прафессеаналав можна вереть, дыа.

kkk

  • Гость
Re: Раскручиваем компилятор O7
« Ответ #9 : Октябрь 27, 2013, 09:36:44 am »
Цитировать
Оберон-2 был разработан в 1991 году в Швейцарской высшей технической школе (Цюрих) Никлаусом Виртом и Ханспетером Мёссенбёком
http://www.uni-vologda.ac.ru/oberon/o2rus.htm

Всё в порядке, гони хуйню дальше, женя. Ты же вон какой профессионал ;)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #10 : Октябрь 27, 2013, 09:37:10 am »
А как вообще этот код может компилироваться?
MODULE Stream;
IMPORT JsString;

TYPE
    Type = POINTER TO RECORD
        s: JsString.Type;
        pos: INTEGER
    END;
...

PROCEDURE make*(text: JsString.Type): Type;
...
Как можно экспортировать процедуру make, например, если тип Type, входящий в сигнатуру этой процедуры, неэкспортирован? о_О


- В отсутствие методов запись "Stream.pos(stream)" конечно многословнее и воспринимается хуже, чем "stream.pos()".

Это же не oberon-way. По-обероновски было бы сделать фабрику, которая кроме выделения необходимой для объекта памяти ещё и проинициализирует его методы-процедурные переменные. И тогда будет вполне привычная запись "stream.pos()"...
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #11 : Октябрь 27, 2013, 09:40:25 am »
Цитировать
Оберон-2 был разработан в 1991 году в Швейцарской высшей технической школе (Цюрих) Никлаусом Виртом и Ханспетером Мёссенбёком
http://www.uni-vologda.ac.ru/oberon/o2rus.htm

Мало ли что Свердлов понаписал на своём сайте. Он и про арифметику синтаксиса пургу гнал.


Всё в порядке, гони хуйню дальше, женя. Ты же вон какой профессионал ;)
петрушка, слушай лучше Стравинского, больше пользы принесёшь...
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #12 : Октябрь 27, 2013, 09:44:25 am »
- В отсутствие методов запись "Stream.pos(stream)" конечно многословнее и воспринимается хуже, чем "stream.pos()".

Это же не oberon-way. По-обероновски было бы сделать фабрику, которая кроме выделения необходимой для объекта памяти ещё и проинициализирует его методы-процедурные переменные. И тогда будет вполне привычная запись "stream.pos()"...

Хотя нет, выйдет примерно так: "stream.pos(stream)". Да уж, хрен редьки не слаще...
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #13 : Октябрь 27, 2013, 09:51:01 am »
Да и тут Ъ"обероном" не пахнет, всего лишь "-07".

Кчтати, Влад, если доведёшь компилятор до соответствия этому рапорту, можно его смело переименовывать из Oberon-07/11 в Oberon-13, или же просто в Oberon. Так будет правильнее...
to iterate is human, to recurse, divine

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

kkk

  • Гость
Re: Раскручиваем компилятор O7
« Ответ #14 : Октябрь 27, 2013, 09:53:52 am »
Цитировать
Оберон-2 был разработан в 1991 году в Швейцарской высшей технической школе (Цюрих) Никлаусом Виртом и Ханспетером Мёссенбёком
http://www.uni-vologda.ac.ru/oberon/o2rus.htm

Мало ли что Свердлов понаписал на своём сайте. Он и про арифметику синтаксиса пургу гнал.


Всё в порядке, гони хуйню дальше, женя. Ты же вон какой профессионал ;)
петрушка, слушай лучше Стравинского, больше пользы принесёшь...
Заявка на победу. То есть ты сомневаешься, что О2 был написан виртом, как развитие Оберона? Ну ты и ебанько.