OSDev

для всех
Текущее время: 29 мар 2024, 07:35

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 19 апр 2015, 17:38 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Обсуждение выделено из темы "Формальные грамматики". Freeman.

pavia писал(а):
Паскаль считается LR(1) языком. Это наиболее простая форма которая требует минимума анализа.
1 - определяет насколько надо заглядывать вперёд.


Не в курсе, случаем, как с этим делом у Це++? (т.е. насколько далеко вперёд надо смотреть)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык программирования Кантор
СообщениеДобавлено: 19 апр 2015, 18:46 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
SII писал(а):
Не в курсе, случаем, как с этим делом у Це++? (т.е. насколько далеко вперёд надо смотреть)

Я бы сказал - на сколько далеко назад. В С++ используется начальное декларирование всех переменных, и ничего не используется "снизу" по тексту. Только не знаю, как на этот показатель влияет оператор goto.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык программирования Кантор
СообщениеДобавлено: 23 апр 2015, 16:51 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
Himik писал(а):
В С++ используется начальное декларирование всех переменных, и ничего не используется "снизу" по тексту.

Во, мне тоже так кажется. Противоположный случай -- FASM, не требующий предварительного описания меток и потому вынужденный делать несколько проходов. У ассемблеров это вообще общая практика, не?

В языках типа C++ или Кантора необходимость нескольких проходов будет определяться предварительным объявлением процедур/функций/методов, а не переменных. В C++ это решено заголовочными файлами, в Паскале -- интерфейсными секциями и ключевым словом forward, а в Канторе еще не решил как. Смотрю на Java, в которой ни заголовочных файлов, ни предварительных объявлений нет. Кто может сказать, сколько проходов делает компилятор Java?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык программирования Кантор
СообщениеДобавлено: 24 апр 2015, 00:50 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Freeman писал(а):
В языках типа C++ или Кантора необходимость нескольких проходов будет определяться предварительным объявлением процедур/функций/методов, а не переменных. В C++ это решено заголовочными файлами, в Паскале -- интерфейсными секциями и ключевым словом forward, а в Канторе еще не решил как. Смотрю на Java, в которой ни заголовочных файлов, ни предварительных объявлений нет. Кто может сказать, сколько проходов делает компилятор Java?


Добавлю ещё от себя. В Аде почти каждый модуль делится физически на два файла: один содержит спецификацию модуля (объявления публичных типов, переменных, процедур и т.п.), второй -- тело этого модуля. В общем и целом это ближе всего к Турбо Паскалю/Дельфям с той разницей, что части интерфейса и реализации физически разнесены в отдельные файлы. Вроде бы теоретически в определённых ситуациях такое разделение является полезным и даёт несколько большие возможности, чем разделение одного файла на части интерфейса и реализации, но я с таким не сталкивался.

В плане синтаксиса самих объявлений мне Ада в целом больше нравится, чем Паскаль, так как в ней объявление типа записи (структуры) в общем случае делится на две части -- публичную и приватную. Физически обе размещаются в спецификации модуля (ведь, не имея полного описания, компилятор не может определить размер типа, а значит, не может выделять память под соответствующие переменные, даже если собственно работа с ними будет идти исключительно через подпрограммы модуля, где определён тип), однако находятся в разных его частях (публичной и приватной). Благодаря этому описание публичной части получается коротким, содержащим лишь объявления собственно публичной части, а все "глубоко интимные" моменты типа описаны отдельно. В Паскале, как и в Це++, публичная и приватная части объявляются вместе, просто разделяются ключевыми словами public и private, из-за чего объявление типа может быть очень громоздким, а сие затрудняет его "внешнее" использование (когда приватная часть объявления не нужна и лишь мешает программисту, отвлекая на себя внимание). Естественно, возможность внесения исполнимого кода (тел функций) в объявление типа, что допускает Це++, ещё более ухудшает и без того невысокую читаемость его текстов. Так что здесь я безусловный сторонник адского подхода -- наиболее полного отделения "мух от котлет".

Что же до числа проходов, то при наличии предварительных объявлений (что является обязательным требованием в Паскале и Аде, да вроде и в Це++; в просто Це функции могут не объявляться заранее, но тогда типы их параметров компилятор определяет сам, глядя на вызов функции), то компиляция гарантированно может быть выполнена за один проход. Правда, это исключает сколько-нибудь глубокую оптимизацию (максимум, что может сделать однопроходный компилятор, -- это выполнить локальную оптимизацию выражений вроде свёртки констант или выноса общих подвыражений), но зато позволяет очень быстро получить готовый к выполнению код. Но здесь тоже может быть сложность, связанная с архитектурными особенностями той или иной машины. В частности, далеко не все архитектуры позволяют прямо адресовать далеко расположенные объекты, и тогда быстро сгенерированный код может оказаться неработоспособным из-за того, что итоговые адреса лежат слишком далеко друг от друга. Но это можно обойти: поскольку эффективность кода всё равно очень низка, можно генерировать более длинные последовательности команд, гарантирующие досягаемость любой нужной точки (путём, например, неограниченной косвенной адресации вместо ограниченной прямой).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык программирования Кантор
СообщениеДобавлено: 24 апр 2015, 01:43 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
SII писал(а):
Ада в целом больше нравится, чем Паскаль, так как в ней объявление типа записи (структуры) в общем случае делится на две части -- публичную и приватную. Физически обе размещаются в спецификации модуля (...), однако находятся в разных его частях (публичной и приватной). Благодаря этому описание публичной части получается коротким, содержащим лишь объявления собственно публичной части, а все "глубоко интимные" моменты типа описаны отдельно.

Интересно. А пример кода можно? Или ссылку на пример?

Я Аду знаю только в варианте PL/SQL, а в нем всё предельно упрощено с типами. Да, пакеты разделены на объявление и тело, есть такое. Пакет и тело могут идти как в отдельных файлах, так и в одном, но это уже следствие скриптовой природы PL/SQL, как мне видится. Вобщем, пример кода настоящей Ады был бы интересен.

SII писал(а):
в просто Це функции могут не объявляться заранее, но тогда типы их параметров компилятор определяет сам, глядя на вызов функции), то компиляция гарантированно может быть выполнена за один проход.

Это следствие потоковой природы Си: и заголовочники, и макросы, и все эти extern -- из одной оперы. Если правильно понимаю, сейчас этот подход не слишком приветствуется, и новые стандарты кое-что устрожили и выпрямили.

В Канторе я бы мог сделать как в Java, но задача усложняется тем, что из-за активного использования вывода типов и унификации операторов без предварительного объявления не всегда понятно, чему соответствует тот или иной идентификатор: классу, свойству или обобщению. На уровне концепции вообще принято, что класс в объектном коде должен отличаться от свойства битом "класс" в статусе. Так что фактическое число проходов будет определяться, по всей видимости, гибкостью объектной модели и сложностью реализации промежуточного, "недоразобранного" состояния. Удастся всё удачно абстрагировать -- будет честный один проход без предварительных объявлений.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык программирования Кантор
СообщениеДобавлено: 24 апр 2015, 07:48 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Freeman писал(а):
А пример кода можно? Или ссылку на пример?


Код:
package Accounts is

    type Account is private;

    procedure Withdraw(Account : in out Account; Amount : in Money);
    procedure Deposit(Account : in out Account; Amount : in Money);
    function Create(Initial_Balance : Money) return Account;
    function Balance(Account : in Account ) return Integer;

private

    type Account is
        record
            Account_No : Positive;
            Balance    : Integer;
        end record;

end Accounts;


Предельно вырожденный случай: публичная часть типа вообще не содержит никаких полей, вся работа осуществляется исключительно через подпрограммы, за исключением операций присваивания и сравнения -- они по-прежнему доступны (генерируется код для "тупого" копирования или сравнения переменных данного типа). Если же необходимо и сравнение с присваиванием запретить, то публичное объявление типа чуть раздувается:

Код:
type Account is limited private;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Язык программирования Кантор
СообщениеДобавлено: 24 апр 2015, 10:48 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
SII писал(а):
Предельно вырожденный случай: публичная часть типа вообще не содержит никаких полей, вся работа осуществляется исключительно через подпрограммы, за исключением операций присваивания и сравнения

А можно ли описывать переменные типа Account во внешнем коде, вне пакета? И стоит ли мне писать аналог приведенного выше кода на Канторе?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Формальные грамматики
СообщениеДобавлено: 24 апр 2015, 14:09 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Естественно, переменные без проблем описываются и используются где угодно -- просто нельзя получить прямой доступ к тому, что объявлено в приватной части. Это принципиально ничем не отличается от раздела private в структурах Це++ или Дельфей, просто удобней: когда смотришь описание типа, экран не загромождён лишней информацией.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Формальные грамматики
СообщениеДобавлено: 24 апр 2015, 15:52 
Аватара пользователя

Зарегистрирован: 28 май 2012, 23:44
Сообщения: 237
Откуда: Санкт-Петербург
А аналог адовского кода на Канторе не интересен?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Формальные грамматики
СообщениеДобавлено: 25 апр 2015, 01:45 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Ну, хотите -- напишите, посмотрим.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB