Re[6]: Связанные с типом процедуры должны быть виртуальными
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 11.11.04 09:48
Оценка:
Здравствуйте, Kluev, Вы писали:

K>

void points_write( IBinStream &stm, Point pts[], uint pts_size )
{
    // сначала запишем длинну, заюзав хелпер
    IBinStream_int_put( stm, pts_size );
    // опаньки, для типа Point никто хелпер не написал, юзаем вирт. метод через класс
    stm.write( pts, sizeof(Point) * pts_size );
}



Я бы просто вот так написал и не парился понапрасну:
void WritePoints( IBinStream &stm, Point pts[], uint pts_size )
{
  stm.write(&pts_size, sizeof(pts_size)); 
  if( pts_size > 0 ){
    stm.write(pts,   sizeof(Point)*pts_size);
  }
}
Re[17]: Грамотность
От: Mamut Швеция http://dmitriid.com
Дата: 11.11.04 09:54
Оценка:
Код полугипотетический, бо синтаксиса я уже не помню.


IMPORT MathCalc;

MODULE MathTools;
    PROCEDURE ReturnComplexMathematicalComputation*: INT;
    
    {* *}
    
    PROCEDURE ReturnComplexMathematicalComputation    
    VAR:
        i: INT;
    BEGIN
        i := 100 / MathCalc.CalcSum;
        RETURN i;
    END;
    
END MathTools.



MODULE MathCalc;
    PROCEDURE CalcSum*: INT;
    
    {* *}
    
    PROCEDURE CalcSum    
    VAR:
        i: INT;
        {* other vars *}
    BEGIN
        {* we accept data from external sources and compute it *}
        RETURN ResultingSum;
    END;
    
END MathTools.




Внимание, вопрос! Что произойдет, если MathCalc.CalcSum вернет 0? На этапе компиляции это отловить невозможно, так как данные получаются извне. Кривые руки программиста не поставили проверку на ноль в модуле MathTools, а модуль MathTools и его методы активно используются для представления (например) статистической информации в десяти разных представлениях в десятке различных модулей. Что произойдет? ИМХО, система встанет, причем вся.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>


dmitriid.comGitHubLinkedIn
Re[10]: Связанные с типом процедуры должны быть виртуальными
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 11.11.04 09:55
Оценка:
Здравствуйте, Клапауций, Вы писали:

СГ>>Нет не странно. Без рантайма и сборщика мусора невозможно создать модульную расширяемую систему.

К>Забавно. А я на основе многочисленных споров понял совершенно обратное — можно. Так что приводить это как аксиому по крайней мере странно.

Рантайм нужен (кроме всего прочего) для safety (проверка индексов, динамическое приведение типов, и т.д.), а рантаймовый сборщик мусора нужен для расширяемости. Потому что только во время работы системы можно принять решение об освобождении памяти, но невозможно это сделать во время написания отдельно взятого модуля, когда точно не известно в какой системе он будет запущен на выполнение и кто его будет использовать, какие модули в этот момент будут загружены в систему и т.д.
Re[6]: Связанные с типом процедуры должны быть виртуальными
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 11.11.04 10:01
Оценка:
Здравствуйте, Mr. None, Вы писали:


MN>Будут, это правда на C#, но понятно я думаю будет всё равно:

MN>Microsoft.Web.Services2.Security.X509.X509CertificateStore store = Microsoft.Web.Services2.Security.X509.X509CertificateStore.CurrentUserStore(Microsoft.Web.Services2.Security.X509.X509CertificateStore.MyStore);

А там, нету чтоли возможности для создания коротких псевдонимов для длинных имен? Странно, а Vlad2 тут еще C# во всю нахваливает....

В Component Pascal, по крайней мере, можно было бы так:
IMPORT MCSt := MicrosoftWebServices2SecurityX509X509;

VAR store: MCSt.CertificateStore;
BEGIN
  store := MCSt.CurrentUserStore(MCSt.MyStore);
Re[11]: Связанные с типом процедуры должны быть виртуальными
От: Клапауций Ниоткуда  
Дата: 11.11.04 10:01
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Клапауций, Вы писали:


СГ>>>Нет не странно. Без рантайма и сборщика мусора невозможно создать модульную расширяемую систему.

К>>Забавно. А я на основе многочисленных споров понял совершенно обратное — можно. Так что приводить это как аксиому по крайней мере странно.

СГ>Рантайм нужен (кроме всего прочего) для safety (проверка индексов, динамическое приведение типов, и т.д.), а рантаймовый сборщик мусора нужен для расширяемости. Потому что только во время работы системы можно принять решение об освобождении памяти, но невозможно это сделать во время написания отдельно взятого модуля, когда точно не известно в какой системе он будет запущен на выполнение и кто его будет использовать, какие модули в этот момент будут загружены в систему и т.д.


Замечательно ! Но всё же вопрос такой — зачем нужно это дополнительное неудобство для программиста ?

З.Ы. Насчёт GC можно сильно не нажимать. Я читал эти аргументы. И аргументы оппонентов. И ваши мне не показались убедительными.
Re[18]: Грамотность
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 11.11.04 10:04
Оценка: -2
Здравствуйте, Mamut, Вы писали:

M>Код полугипотетический, бо синтаксиса я уже не помню.


M>Внимание, вопрос! ... Что произойдет? ИМХО, система встанет, причем вся.



Внимание вопрос! А что произойдет если написать:

format c:/

ИМХО, система ляжет, причем вся.
Re[19]: Грамотность
От: Mamut Швеция http://dmitriid.com
Дата: 11.11.04 10:10
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Mamut, Вы писали:


M>>Код полугипотетический, бо синтаксиса я уже не помню.


M>>Внимание, вопрос! ... Что произойдет? ИМХО, система встанет, причем вся.



СГ>Внимание вопрос! А что произойдет если написать:

СГ>

СГ> format c:/

СГ>ИМХО, система ляжет, причем вся.

Нуу.... Это не ответ... Я привел реальный кусок кода. Не всякий программист, увы, будет делать проверки, надеясь на соседа, на бога или на карму. Так что же произойдет в Обероне, если перестанет работать модуль, импортируемый многими другими модулями?

Re[12]: Миф
Автор: Сергей Губанов
Дата: 11.11.04

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


Еще как может
... << RSDN@Home 1.1.4 beta 3 rev. 185>>


dmitriid.comGitHubLinkedIn
Re[19]: Грамотность
От: Клапауций Ниоткуда  
Дата: 11.11.04 10:13
Оценка: +1
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Внимание вопрос! А что произойдет если написать:

СГ>

СГ> format c:/

СГ>ИМХО, система ляжет, причем вся.

Неужели совсем не видно разницы в НАМЕРЕНОМ (специально пишу большими буквами — у оберонщиков там какой-то рефлекс на них вроде...) ОШИБОЧНОМ использовании ?
Re[20]: Грамотность
От: Клапауций Ниоткуда  
Дата: 11.11.04 10:15
Оценка:
Читать так:

К>Неужели совсем не видно разницы в НАМЕРЕНОМ (специально пишу большими буквами — у оберонщиков там какой-то рефлекс на них вроде...) и ОШИБОЧНОМ использовании ?
Re[7]: Связанные с типом процедуры должны быть виртуальными
От: Клапауций Ниоткуда  
Дата: 11.11.04 10:20
Оценка: 1 (1) +3 :))) :)))
Здравствуйте, Сергей Губанов, Вы писали:

СГ>В Component Pascal, по крайней мере, можно было бы так:

СГ>[pascal]
СГ>IMPORT MCSt := MicrosoftWebServices2SecurityX509X509;

Нууу... Зачем это ?
Без этой ерундв еомпилятор и runtime становится еще более простой — постоянное использование полного имени — все единообразно. Например. для встроенных систем чем проще, тем компактнее, тем лучше.
Re[13]: Миф
От: Кодт Россия  
Дата: 11.11.04 10:21
Оценка: +2
Здравствуйте, Сергей Губанов, Вы писали:

<>

Я бы на твоём месте не молился так на невозможность buffer overflow. Вылет за границы индекса — он и в африке вылет за границы индекса, только феерверки будут разными.
В случае языков со слабой защитой памяти — получим расстрел и наведённые ошибки. В случае языков с тотальным контролем — медленно и печально программа завершится, удивив пользователя.

К примеру, написал ты модуль для вычисления процентов по формуле
percentage(x,y) = x*100/y

всё законно, казалось бы.

Через некоторое время твой коллега воспользовался этим модулем для вывода прогресса при копировании файлов. Ну просто зашибись какая красивая программа получилась.

А потом юзер натравил эту программу на каталог, где есть файлы нулевой длины.

И юзеру наплевать, что программа при этом не отформатировала диск, не разослала адресную книгу 50 друзьям из Зимбабве и т.п.
Своё дело она не сделала, а если её дело было аварийный бэкап сервера, то ущерб получился не меньше, чем от расстрела памяти.
Перекуём баги на фичи!
Re[7]: Связанные с типом процедуры должны быть виртуальными
От: Kluev  
Дата: 11.11.04 10:27
Оценка: 1 (1) +2
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Я бы просто вот так написал и не парился понапрасну:

СГ>
СГ>void WritePoints( IBinStream &stm, Point pts[], uint pts_size )
СГ>{
СГ>  stm.write(&pts_size, sizeof(pts_size)); 
СГ>  if( pts_size > 0 ){
СГ>    stm.write(pts,   sizeof(Point)*pts_size);
СГ>  }
СГ>}
СГ>


Это вы не просто написали, это примитивно.
Просто — это вот так:
stm.put(pts_size);
stm.put(pts,pts_size);


В вашем коде все-таки есть небольшой шанс на ошибку в sizeof, а в моем нет.
Почувствуйте разницу между простотой и примитивизмом. С++ — действительно простой язык, на котором можно писать простой и понятный код, а тот оберон который вы продвигаете как простой на самом деле примитивный, начиная с синтаксиса.
Re[9]: Связанные с типом процедуры должны быть виртуальными
От: Кодт Россия  
Дата: 11.11.04 10:30
Оценка: +4
Здравствуйте, Сергей Губанов, Вы писали:

К>> Просто есть некоторые вещи, которые уже особенно сильно не обсуждаются, ибо все принимают их "по дефолту", так вот встроенные типы БОЛЬШИМИ буквами писать имхо — маразм


СГ>По default еще со времен Модулы (70-тые годы) служебные слова пишутся заглавными буквами. Программистам не рекомендуется использовать в своих программах идентификаторы состоящие из заглавных букв, поскольку идентификаторы из заглавных букв зарезервированы на служебные слова, которые, быть может, могут быть добавлены в язык программирования. Так например, существует множество разных версий оберонов (включая версии с generic) чтобы программы были чуть-чуть более удобно переносить между такими версиями, надо просто избегать использование идентификаторов написанных заглавными буквами. Кроме того, существуют экспериментальные системы, в которых есть только простой текстовый редактор, а вот IDE с подсветкой синтаксиса пока нету, в случаях plain text служебные слова из заглавных букв сразуже видны, в результате чего в подсветке синтаксиса нет особо сильной нужды.


Чем напрягать людей ВЫКРИКИВАТЬ КЛЮЧЕВЫЕ СЛОВА, пусть бы они брали не простой нотепад, а нормальные редакторы с подсветкой — FAR, MultiEdit, Vi, Emacs, SciTe...

По поводу разнообразия диалектов. Например, в С++ есть базовый набор ключевых слов (записанный в Стандарте), а всё, что добавляется в диалекте, должно начинаться с __. Идентификаторы с таким префиксом зарезервированы для нужд реализации — ключевых слов и идентификаторов идущей в комплекте стандартной библиотеки.

По поводу заметности. Если человек нормально форматирует код, то все ключевые слова более чем заметны, вне зависимости от регистра и раскраски.
А вычитывать, когда всё свалено в одну строку с минимумом пробелов — так без разницы, будет ли там {} или BEGIN END.
Перекуём баги на фичи!
Re[16]: Миф
От: Кодт Россия  
Дата: 11.11.04 10:37
Оценка: +1
Здравствуйте, AndreyFedotov, Вы писали:
AF> Именно. См. ассемблер. Самые критичные по времени выполнения алгоритмы пишутся на нём. И уж затем C/С++. А вот оберон там рядом не стоял...
AF> Кроме того, если речь идёт о безопасности — то абсолютно никто не мешает использовать smart поинтеры или массивы с контролем пересечения границ. Что до стека — то это вопрос к компилятору, а не к языку.

И между прочим, дебаг и релиз как раз отличаются проверками. Например, std::vector<> в дебаге отслеживает индексы, а в релизе — нет. Компилятор после каждого вызова процедуры в дебаге вставляет call CheckEsp, а в релизе — нет.
Подозреваю, что даже компиляторы Ada и Eiffel не насилуют компьютер повальными рантайм-проверками в релизе.

Потому что — ещё раз — смысла нет это делать.
Юзеру без разницы, каким именно способом рухнет его программа — получив исключение от несостоявшейся проверки или расстреляв стек возврата.
Перекуём баги на фичи!
Re[17]: Миф
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 11.11.04 10:50
Оценка:
Здравствуйте, Кодт, Вы писали:

К>И между прочим, дебаг и релиз как раз отличаются проверками. Например, std::vector<> в дебаге отслеживает индексы, а в релизе — нет. Компилятор после каждого вызова процедуры в дебаге вставляет call CheckEsp, а в релизе — нет.

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

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


Хотя, я слышал, что в компиляторе от XDS, есть такой "экстремальный" режим в котором index check таки отключается (не смотря на то что это противоречит спецификации языка). Программа получается чуток более быстрой, но как знать чем это обернется....
Re[15]: Грамотность
От: Кодт Россия  
Дата: 11.11.04 10:54
Оценка: 37 (6) +2 :))
Здравствуйте, Сергей Губанов, Вы писали:

СГ>То что Вы привели такой пример пытаясь в чем-то уличить сборщик мусора, лишь лишний раз поддтверждает тезис о малограмотности большинства современных программистов. Я склонен, в некоторой части, обвинять в этом (само)образование полученное на основе недисциплинированных языков программирования таких как Си++ когда на изучение принципов создания грамотных алгоритмов уже не остается времени, так как все время уходит на заучивание чрезмерно сложного языка.


Гонево. Злое гонево.
На Обероне такую фигню спороть гораздо легче, чем на С++. Просто хотя бы потому, что программист С++ (и даже, отчасти, на VB6) изначально держит в голове вопросы использования памяти. А Оберон (и другие языки с GC) позволяют ему не париться.

Далее, насчёт наездов на сборщики.
У любого из них есть уязвимое место.

Самый глупый сборщик (например, реализованный в COM) не умеет разгребать циклические графы. Достаточно, чтобы два объекта сослались друг на друга, и всё. Это к упомянутому выше VB6.
Для сборщика с волновым алгоритмом раскраски — мы просто создадим кучу мелких объектов, которые будут ссылаться друг на друга. Пока он их всех оббежит... там будут такие фантастические задержки при выделении памяти, ты расплачешься.
Для ленивого сборщика, который ранжирует объекты по долгоживучести (предполагается, что львиная доля объектов живёт не более одного-двух цикла сборки) мы можем выжрать память, подержать её достаточно долго, чтобы убедить сборщика в безнадёжности её проверок, и только затем отпустить.

Поэтому любой серьёзный программист должен хоть капельку задумываться о том, что он себе позволяет. В документации по языку (и по конкретной реализации) должно рассказываться о таких вещах. А не "язык полупортативный, оснащён ручкой для переноски, на память болт забейте".
Перекуём баги на фичи!
Re[20]: Грамотность
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 11.11.04 10:55
Оценка: :)
Здравствуйте, Mamut, Вы писали:

M>Нуу.... Это не ответ... Я привел реальный кусок кода.


Позвольте с Вами не согласиться. Вы привели как раз НЕРЕАЛЬНЫЙ кусок кода:
i := 100 / MathCalc.CalcSum;


Реальный кусок кода был бы, например, таким:
  d := MathCalc.CalcSum();
  IF d > EPSILON THEN i := 100 / d; ....


Или, на худой конец, таким:
  d := MathCalc.CalcSum();
  ASSERT(d > EPSILON);
  i := 100 / d; ....
Re[14]: Миф
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 11.11.04 11:00
Оценка:
Здравствуйте, Кодт, Вы писали:

К>К примеру, написал ты модуль для вычисления процентов по формуле

К>
percentage(x,y) = x*100/y


Уже проходили. Пример недействительный (я бы так не написал). Точно также, к примеру, не написал бы я format c:/
Re[21]: Грамотность
От: Mamut Швеция http://dmitriid.com
Дата: 11.11.04 11:05
Оценка: 33 (4) +1
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Mamut, Вы писали:


M>>Нуу.... Это не ответ... Я привел реальный кусок кода.


СГ>Позвольте с Вами не согласиться. Вы привели как раз НЕРЕАЛЬНЫЙ кусок кода:


Нуу.... Это не ответ... Я привел реальный кусок кода. Не всякий программист, увы, будет делать проверки, надеясь на соседа, на бога или на карму. Так что же произойдет в Обероне, если перестанет работать модуль, импортируемый многими другими модулями?


Добавим к этому куски кода, написанные в пятницу вечером или в понедельник с утра. Куски кода написаные, когда deadline был вчера, а до milestone — как до Пекина пешком.

Также здесь
Автор: Кодт
Дата: 11.11.04
, также здесь
Автор: Mamut
Дата: 09.11.04
:

Решающим фактором в программировании остается человек (ака кривые ручки ака изобретатель велосипедов). И, увы, ни язык программирования, ни средства разработки не смогут излечить нас от этого. Они могут слегка подлечить симптомы — но не более.

... << RSDN@Home 1.1.4 beta 3 rev. 185>>


dmitriid.comGitHubLinkedIn
Re[15]: Грамотность
От: WolfHound  
Дата: 11.11.04 11:05
Оценка: +2
Здравствуйте, Сергей Губанов, Вы писали:

Обязательные правила

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

Пункт 5

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


ЗЫ Ты уже не первый раз пытаешься ставить под сомнение профпригодность собеседников.
... << RSDN@Home 1.1.4 rev. 185 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.