OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 17 Ноябрь, 2019 14:02

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




Начать новую тему Ответить на тему  [ Сообщений: 132 ]  На страницу 1, 2, 3, 4, 5 ... 7  След.
Автор Сообщение
СообщениеДобавлено: Четверг, 13 Январь, 2011 21:39 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья, почему Вы не пишете программы на ассемблере? Там Вы будете очень ясно представлять стоимость...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обсуждение проекта PureBuilder
СообщениеДобавлено: Четверг, 13 Январь, 2011 21:50 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
Потому что есть чувство меры. Балансом является класс "универсальных компилируемых системно-применимых языков".... Хорошее описание задач и требований к этому классу есть, кстати, у Страуструпа в "Дизайн и эволюция С++". Прекрасно удовлетворяет этим требованиям КП. Грамотно спроектированная и простая альтернатива С++.

Go и Rust, кстати, пример работ как раз в этом классе языков... И мотивы к этим работам - завышенность уровня Java/C#/....

См. viewtopic.php?p=56100#p56100

И не будем захламлять ветку Сергею.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обсуждение проекта PureBuilder
СообщениеДобавлено: Четверг, 13 Январь, 2011 22:44 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
Потому что есть чувство меры. Балансом является класс "универсальных компилируемых системно-применимых языков".... Хорошее описание задач и требований к этому классу есть, кстати, у Страуструпа в "Дизайн и эволюция С++". Прекрасно удовлетворяет этим требованиям КП. Грамотно спроектированная и простая альтернатива С++.

Откровенно говоря, мне сложно считать КП альтернативой С++. По многим причинам. Хороший инструмент для других задач -- пожалуй. Но не альтернатива.

А чувство меры оно у каждого своё + зависит от задачи. Скажем итераторы в С++ мне никогда не мешали точно знать где какая трудоёмкость операций. Более того, они позволяли легко ею управлять.

Илья Ермаков писал(а):
Go и Rust, кстати, пример работ как раз в этом классе языков... И мотивы к этим работам - завышенность уровня Java/C#/....

Не скажу за C#, но например ява является более низкоуровневым языком нежели тот же С++. Поясню -- у каждого языка есть некий диапазон абстракций в пределах которого можно работать. Минимум абстракции ... максимум абстракции. Так вот, диапазон явы уже чем у С++, он полностью лежит внутри диапазона С++, по сути является его подмножеством. Т.е. минимальная абстракция в java выше, максимальная ниже.

Диапазон абстракций не меньший чем у С++ есть, пожалуй, только у D2, ну и у Ады, с некоторой натяжкой. Ну, может ещё у хаскеля (причем именно в реализации ghc), но это уже очень большая натяжка. Просто огромадная.

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

Илья Ермаков писал(а):
См. viewtopic.php?p=56100#p56100

И не будем захламлять ветку Сергею.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обсуждение проекта PureBuilder
СообщениеДобавлено: Четверг, 13 Январь, 2011 22:52 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
Alexey Veselovsky писал(а):
Не скажу за C#, но например ява является более низкоуровневым языком нежели тот же С++. Поясню -- у каждого языка есть некий диапазон абстракций в пределах которого можно работать. Минимум абстракции ... максимум абстракции. Так вот, диапазон явы уже чем у С++, он полностью лежит внутри диапазона С++, по сути является его подмножеством. Т.е. минимальная абстракция в java выше, максимальная ниже.


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

Касательно же высокоуровневости - если брать за критерий количество гарантируемых инвариантов, то всё же нельзя никак сказать что "ява является более низкоуровневым языком, нежели С++".
Может быть, сказать: менее "абстракциеконструктабельным" :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обсуждение проекта PureBuilder
СообщениеДобавлено: Четверг, 13 Январь, 2011 23:09 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
Ну да, т.е. получается, что при не-большей максимальной абстракции мы имеем серьёзное повышение уровня минимально-возможной абстракции. Ничего не приобретаем.

Я бы сказал -- при существенно меньшей максимальной абстракции. Т.е. когда после плюсов пишу на яве, то остро ощущаю себя калекой. Не могу сделать то, и это. В высокоуровневом плане. Низкоуровневый фиг с ним, для этого можно и JNI использовать в конце концов, если приспичит.

Но в принципе, в яве мы приобретаем. Дуракоустойчивость приобретаем. Т.е. никто, по простоте душевной, уже в память не нагадит просто так. Чтобы нагадить в память тут уже нужны существенные знания :-) Т.е. кластер индусов на яве таки родит нечто что будет даже работать, причем в обозримые сроки родит (КАК работать -- вопрос десятый). На плюсах они не родят это никогда. Отсюда, кстати, и любовь к яве в ынтырпрайз-приложениях (документооборот и проч).

Илья Ермаков писал(а):
Касательно же высокоуровневости - если брать за критерий количество гарантируемых инвариантов, то всё же нельзя никак сказать что "ява является более низкоуровневым языком, нежели С++".
Может быть, сказать: менее "абстракциеконструктабельным" :)

Низкоуровневые инварианты (случайно не нагадить в память) да, в яве гарантируются лучше, просто за счет более высокого низкого уровня :-) С другой стороны, при желании таки возможно сложить jvm не вылазя в нативный код, причем сложить так, что она и вякнуть не сможет (никаких исключений естественно выкинуто не будет). Но это конечно надо сильно постараться и владеть соответствующими знаниями. Случайно это сделать почти не реально.

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

Но всё конечно имеет цену. Во-первых такие проверки приводят к долгой компиляции. Во-вторых в плюсах они смотрятся хм... несколько инопланетно :-)

В D2 с одной стороны низкоуровневые инварианты хорошо проверяются (пожалуй лучше чем в java), так называемый safe D, с другой стороны высокоуровневые проверяются проще быстрее и лучше чем в С++ (на подмножестве D можно банально писать функции времени компиляции, что существенно читабельней чем шаблонная магия), с третьей стороны доступны все низкоуровневые штучки в духе Си/С++, если приспичит.

D2 мешает ровно одно чтобы стать более-менее популярным -- он не понимает сишные хедеры. А без этого он приемником C/C++ стать не сможет. А как это сделать, хотя бы в теории, я пока до конца не представляю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 08:13 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Geniepro писал(а):
Валерий Лаптев писал(а):
Но ведь условие явное, причем после него - выход. Это же просто поиск первого подходящего. Зачем перебирать ВСЕ элементы?

Так ведь всё равно перебирать придётся, так почему бы не удобной заготовкой в виде foreach?

Не, ну конечно, было бы удобнее что-то типа:
Код:
SomeObject obj = objs.FindBy(SomeCondition);
if (obj != null)
    SomeAction(obj);
Сходу не вспомню, есть ли у той коллекции метод типа FindBy, завтра уточню. Если найду, то перепишу код ))

Забавно, не нашёл того цикла вообще, недавно я его переделал так, что вообще там цикла не стало.

Пошерстил свой текущий небольшой проект из 4-х подпроектиков, нашёл:

32 цикла while, из них 1 с оператором break (можно переписать без break с небольшим ухудшением понятности),
а несколько циклов без break стоило бы на мой взгляд переписать так, что бы их завершение было прописано не в условии цикла, а внутри через break -- был бы более понятный код, чем это нагромождение флажков. Надо попробовать, проверить...

27 циклов for, из которых 6 по сути являются циклами while, но со счётчиками внутри. То есть эта дополнительная обвязка для организации счётчика спрятана внутри оператора for. В принципе, количество сущностей не уменьшилось, просто код уменьшился на пару строчек.

24 цикла foreach, из них 1 с двумя операторами break внутри, остальные -- действительно полный проход с какими-то действиями над каждым элементом

4 цикла do-while


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 13:06 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Geniepro писал(а):
32 цикла while, из них 1 с оператором break (можно переписать без break с небольшим ухудшением понятности)
Переписал вот такой код, вполне нормальный для сишника, но ужасно кривой для паскалиста:
Код:
            string message;

            while ((message = TCPStreamIO.ReceiveString(POSIPStream)) != null)
            {
                safeLogAppend(message);
                if (SrvIPStream != null && SrvIPStream.CanWrite)
                {
                    TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
                }
                else
                    break; // Отправлять некому, закончим работу
            }
вот в такой:
Код:
            bool   breaked = false;
            string message = TCPStreamIO.ReceiveString(POSIPStream);

            while (!breaked && message != null)
            {
                safeLogAppend(message);
                if (SrvIPStream != null && SrvIPStream.CanWrite)
                {
                    TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
                    message = TCPStreamIO.ReceiveString(POSIPStream);
                }
                else
                    breaked = true; // Отправлять некому, закончим работу
            }
Ну и какой вариант лучше? Мне кажется, что первоначальный.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 13:27 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 530
Откуда: Москва
Просьба уточнить, почему проверки SrvIPStream и SrvIPStream.CanWrite нельзя вынести из цикла. Что, внутри цикла SrvIPStream может стать == null?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 13:41 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2316
Откуда: Россия, Томск
Geniepro писал(а):
Ну и какой вариант лучше? Мне кажется, что первоначальный.
Достаточно сделать так, чтобы safeLogAppend возвращал message != null, при необходимости - написать простенькую обёртку:
Код:
string message = null;
while (safeLogAppend(message = TCPStreamIO.ReceiveString(POSIPStream)) && SrvIPStream != null && SrvIPStream.CanWrite)
{
    TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
}
Ещё лучше - написать процедуру getAndLogMessage, которая будет в журналировать сообщение при успешном получении:
Код:
bool getAndLogMessage (string* message);
{
    message = TCPStreamIO.ReceiveString(POSIPStream);
    if (message != null)
        safeLogAppend(message);
    return message != null
}
...
string message = null;
while (getAndLogMessage(&message) && SrvIPStream != null && SrvIPStream.CanWrite)
{
    TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 13:51 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Peter Almazov писал(а):
Просьба уточнить, почему проверки SrvIPStream и SrvIPStream.CanWrite нельзя вынести из цикла. Что, внутри цикла SrvIPStream может стать == null?

По идее цикл бесконечный, так что мало ли что там может отвалиться со связью по потоку SrvIPStream через неопределённое время после начала цикла...

ЗЫ. Приложение многопоточное, так что так что SrvIPStream может быть убитым где-то в другом потоке.


Последний раз редактировалось Geniepro Пятница, 14 Январь, 2011 13:56, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 13:53 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 530
Откуда: Москва
Мне просто непонятен синтаксис - кто меняет SrvIPStream внутри цикла?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 13:57 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2316
Откуда: Россия, Томск
Peter Almazov писал(а):
Мне просто непонятен синтаксис - кто меняет SrvIPStream внутри цикла?
Я так понимаю, что ReceiveString возвращается через неопределённое время, т.е. сначала ожидает строку. Параллельно с этим может происходить что угодно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 13:57 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Peter Almazov писал(а):
Мне просто непонятен синтаксис - кто меняет SrvIPStream внутри цикла?

Его может поменять другой процесс.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 14:13 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Александр Ильин писал(а):
Достаточно сделать так, чтобы safeLogAppend возвращал message != null, при необходимости - написать простенькую обёртку:

Код:
string message = null;
while (safeLogAppend(message = TCPStreamIO.ReceiveString(POSIPStream)) && SrvIPStream != null && SrvIPStream.CanWrite)
{
    TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
}
Интересно, это уже ФП-стиль, ну или намёк на него.
Однако, как же быть с требованием Илья Ермакова видеть все эти стоимости? Они же тут будут частично упрятаны обёртку для safeLogAppend...

Александр Ильин писал(а):
Ещё лучше - написать процедуру getAndLogMessage, которая будет в журналировать сообщение при успешном получении:
Код:
bool getAndLogMessage (string* message);
{
    message = TCPStreamIO.ReceiveString(POSIPStream);
    if (message != null)
        safeLogAppend(message);
    return message != null
}
...
string message = null;
while (getAndLogMessage(&message) && SrvIPStream != null && SrvIPStream.CanWrite)
{
    TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
}
Честно говоря, у меня аллергия на процедуры, модифицирующие свои параметры.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 14:22 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 530
Откуда: Москва
Geniepro писал(а):
Честно говоря, у меня аллергия на процедуры, модифицирующие свои параметры.
Да, мне тоже это сразу не понравилось. Я бы сделал так
Код:
string message;

while ((message = getAndLogMessage(POSIPStream)) != null && SrvIPStream != null && SrvIPStream.CanWrite) {
  TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
}
Кроме того, напрашивается, чтобы safeLogAppend(message) принимал бы null и сам бы с нем разбирался.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 14:39 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Peter Almazov писал(а):
Кроме того, напрашивается, чтобы safeLogAppend(message) принимал бы null и сам бы с нем разбирался.
safeLogAppend достаточно туп -- он просто печатает в окне лога переданный ей текст и логгирует его в файл. Делать он это должен безопасно при вызове из разных потоков.
Какая-то дополнительная логика на проверки что ему передали -- null или нет -- не его задача.

А проверка на null сделана для того, что бы узнать, работает канал связи POSIPStream или там тоже уже обрыв связи произошёл. Причём тут safeLogAppend?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 14:58 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Ну хорошо, вот в результате что получилось:
Код:
    string ReceiveAndLogString(Stream stream)
    {
        string message = TCPStreamIO.ReceiveString(stream);
        safeLogAppend(message);
        return message;
    }

    ...

            string message;
            while (((message = ReceiveAndLogString(POSIPStream)) != null)
                && ((SrvIPStream != null && SrvIPStream.CanWrite)))
            {
                    TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
            }

Действительно ли это лучше, чем первоначальный вариант:
Код:
            string message;

            while ((message = TCPStreamIO.ReceiveString(POSIPStream)) != null)
            {
                safeLogAppend(message);
                if (SrvIPStream != null && SrvIPStream.CanWrite)
                {
                    TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
                }
                else
                    break; // Отправлять некому, закончим работу
            }


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 15:23 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Наверное, можно так:
Код:
string message;

message = TCPStreamIO.ReceiveString(POSIPStream);
if (message != null) safeLogAppend(message);

while (message != null && SrvIPStream != null && SrvIPStream.CanWrite)
{
   TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
   message = TCPStreamIO.ReceiveString(POSIPStream);
   if (message != null) safeLogAppend(message);
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 15:29 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
А если печатать сообщение в лог нужно только если его можно отправить, то вообще так можно

Код:
string message;

message = TCPStreamIO.ReceiveString(POSIPStream);

while (message != null && SrvIPStream != null && SrvIPStream.CanWrite)
{
   safeLogAppend(message);
   TCPStreamIO.SendMsg(SrvIPStream, message + "\n");
   message = TCPStreamIO.ReceiveString(POSIPStream);
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 15:33 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 700
Откуда: Псков
А , если последний не отосланный message за пределами while не нужен, то можно написать функцию с параметрами: откуда однократно прочитать, логить?, куда передать. А возвращать флаг "эндец" (нет собщения или некому отправлять) и заwhileить её


Последний раз редактировалось albobin Пятница, 14 Январь, 2011 15:49, всего редактировалось 1 раз.

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

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


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB