Здравствуйте, Schade, Вы писали:
S>З.Ы. Написано под впечатлением от первого взгляда на среду BlackBox — убожество, застрявшее где-то в 1993 году.
А что, думаете Oberon Microsystems сделала BlackBox бесплатной и собирается открыть его исходные коды, так просто по доброте душевной? Да потому и собирается, что BlackBox писали десять лет назад под Windows 95 и под первый пень (или под 486-ой). В свое время он продавался примерно за 1'500 швейцарских рублесов. А то что info21 продвигает BlackBox в школы, так туда как раз этого хватит на смену Turbo Pascal 7.0
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Schade, Вы писали:
S>>З.Ы. Написано под впечатлением от первого взгляда на среду BlackBox — убожество, застрявшее где-то в 1993 году.
СГ> А что, думаете Oberon Microsystems сделала BlackBox бесплатной и собирается открыть его исходные коды, так просто по доброте душевной? Да потому и собирается, что BlackBox писали десять лет назад под Windows 95 и под первый пень (или под 486-ой). В свое время он продавался примерно за 1'500 швейцарских рублесов. А то что info21 продвигает BlackBox в школы, так туда как раз этого хватит на смену Turbo Pascal 7.0
Раздают древний мусор нахаляву бедным российским школам в качестве подачки?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Serginio1, Вы писали:
S>>Это смотря у кого какая повседневная жизнь. Глядя на исходники классов Net там указатели кишат в огромных количествах. S>> Правда для них и унсейв не указ.
VD>Не кишат они там ни фига. Используются кое-где для оптимизации, и то бестолку, так как никакого толка на сегодня это не дает.
Без указателей на низком уровне ну никак. Другой вопрос, что создав классы без указателей легко можно обойтись.
Но например работая со стримом использовать указатели очень привлекательно особенно работая со структурами валуе типов,
Хотя можно извращаться http://www.rsdn.ru/Forum/Message.aspx?mid=859216&only=1
При проектровании базовых классов для позднего связывания в нативе очнь удобно использовать указатели. В Net же приходится извращаться с рефлекшином, хотя наверное в будущих версиях его оптимизируют (FieldInfo,PropertyInfo).
Просто в Net нельзя напрополую использовать указатели из-за GC.
и солнце б утром не вставало, когда бы не было меня
о простоте Оберона перед С#? Так вот, простейший пример из Тура по Оберону:
MODULE MyHello;
IMPORT StdLog;
PROCEDURE Do*;
BEGIN
StdLog.String("Hello World!!"); StdLog.Ln;
END Do;
END MyHello.
Звездочку видите? Цитата:
ObxHello0 is a minimal "hello world" program in Component Pascal...
Exported items in Component Pascal modules are marked by a trailing asterisk; there are no separate header files, definition modules, or the like.
Что такое еxported items? Почему экспортед? Только потому, что взбрело Вирту в голову, что хедеры — бяка? И опять же, чем это легче в оьбяснении и понимании, чем
using System;
class Class1
{
static void Main()
{
Console.WriteLine("Hello World");
}
}
А сама среда Писать сообщения компилятора в код программы Не, изыди нечистая сила ....
9.5/1 <...> If a union contains <...> a member of reference type, the program is ill-formed.
> Наконец, в С++ есть такая штука, как типы с семантикой ссылки. Конечно, синтаксически они не полностью совместимы (например, не получится обращаться к членам объекта по такой ссылке)
Здравствуйте, Mamut, Вы писали:
M>Что такое еxported items?
Все что написано внутри модуля считается инкапсулированным в нем. Модуль является не только единицей компиляции и исполнения, но и единицей инкапсуляции (что правильно). Для того чтобы что-то из написанного можно было увидеть из других модулей это что-то надо как-то отметить, логично да? Вопрос как это синтаксически отметить так чтобы и видно сразу было и писать не много? Вот для этих отметок придумали использовать "*" и "-". Для переменных "-" означает доступ только для чтения, "*" означает полный доступ. Подробности в Langauge Report, а тут пример:
MODULE Test;
TYPE
MyPrivateType = RECORD(* ... *)END; (* Другие модули этого типа не видят *)
MyPublicType* = RECORD(* Другие модули этот тип видят *)
PrivateVariable : INTEGER; (* Из других модулей эта переменная не видна *)
ReadOnlyVariable- : INTEGER; (* Другие модули могут только читать эту переменную *)
ReadWriteVariable*: INTEGER; (* Другие модули могут и читать и писать в эту переменную *)END;
VAR
PrivateVariable : INTEGER; (* Из других модулей эта переменная не видна *)
ReadOnlyVariable- : INTEGER; (* Другие модули могут только читать эту переменную *)
ReadWriteVariable*: INTEGER; (* Другие модули могут и читать и писать в эту переменную *)PROCEDURE DoSmth1(); (* Другие модули не видят этой процедуры *)BEGIN(* ... *)END DoSmth1;
PROCEDURE DoSmth2*(); (* Другие модули могут вызывать эту процедуру *)BEGIN(* ... *)END DoSmth2;
END Test;
Сам туториал вводит в заблуждение. Как указано в моем предыдущем сообщении, я создал модуль под названием MyHello. Как его запустить? Об этом в начале туториала ничего не сказано. Более того:
Select the string "ObxHello0.Do" below, and then execute command Execute in menu Dev:
ObxHello0.Do
И это срабатывает!! Какого черта? У меня-то модуль называется MyHello. А как мне запустить MyHello? (Ладно, догадываюсь, написать MyHello.Do).
Но, простите, для того, чтобы мне что-то запустить, мне в итоге надо открывать новое окно, писать в нем что-то, выделять, потом выполнять Dev->Execute? Увольте.
А как мне сделать свою собственную рабочую програмку? Которая хотя бы в консоль что-либо выводила? Любой студент/ученик всегда захочет похвастаться результатом, принести ее домой или к другу. И если мне туториал мне на первых паре страниц не показал, как это сделать, зачем мне этот Оберон нужен?
И это все надо обьяснять ученикам. И где простота?
VladD2:
> Напомню, что в разговоре до сих пор не велось обсуждение явное задание ссылок vs. не явное.
ПК> Дык, как ни крути, хоть указатель, хоть ссылка как тип все равно присутствуют. Разница только в том, явно или нет.
Это очень большая разница! В одном случая ты обязан думать о ней. А в другом необязан.
> Разница между указателями и ссылками в первю очередь заключается в наличии явного разыменования, а стло быть резкого заграмождения кода.
Таким образом, ты согласен с тем, что отличия ссылок в C#/Java от указателей в Паскале/С и т.п. за вычетом адресной арифметики исключительно синтаксические, а семантически это одно и то же?
> Что же касается примера, то выброси из него ссылку и ничего ровным счетом не изменится <...>
Изменится, т.к. без ссылки в языке с явным обозначением ссылок s1 при изменении s2 изменяться не будет.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
M>MODULE MyHello;
M> IMPORT StdLog;
M> PROCEDURE Do*;
M> BEGIN
M> StdLog.String("Hello World!!"); StdLog.Ln;
M> END Do;
M>END MyHello.
M>
M> ...взбрело Вирту в голову, что хедеры — бяка? ...
А Вы не сильно расстроитесь если узнаете что в Component Pascal есть хедеры? В среде BlackBox мышью выделите название модуля MyHello, после этого нажмите на правую кнопку мыши и в появившемся PopUp-меню выберите пункт Interface. Среда BlackBox покажет Вам хедер этого модуля. Для Вашего модуля он будет такой:
DEFINITION MyHello;
PROCEDURE Do;
END MyHello.
Хедеры в Component Pascal генерятся автоматом на основании меток видимости "*" и "-", так что вручную их писать излишне.
Кстати, хедеры носят название символьных файлов.
P. S.
Добрый совет. В следующий раз, когда захотите порассуждать что там Вирту в голову взбрело или не взбрело, почитайте хотябы хелп.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Mamut, Вы писали:
M>>Что такое еxported items?
СГ>Все что написано внутри модуля считается инкапсулированным в нем. Модуль является не только единицей компиляции и исполнения, но и единицей инкапсуляции (что правильно). Для того чтобы что-то из написанного можно было увидеть из других модулей это что-то надо как-то отметить, логично да?
Стоп. Предположим я — ученик 7-9 класса. Моя реакция: "Чего?" Переведите с китайского. Что за инкапсуляция. Что за единица компиляции. Что значит увидеть из других модулей?
СГ>Вопрос как это синтаксически отметить так чтобы и видно сразу было и писать не много? Вот для этих отметок придумали использовать "*" и "-". Для переменных "-" означает доступ только для чтения, "*" означает полный доступ.
Для языка, в котором текста и так явно слишком много, это утверждение странно. Почему не пойти по минимизации дальше и не заменить begin end на {}? Или почему не заменить *- на exportable и readonly? Хуже бы от этого не стало. Налицо плохой дизайн языка.
СГ>Подробности в Langauge Report, а тут пример:
Опять же предположим я — ученик 7-9 класса. Зачем мне читать Language Report?
СГ>
СГ>MODULE Test;
СГ>TYPE
СГ> MyPrivateType = RECORD(* ... *)END; (* Другие модули этого типа не видят *)
СГ> MyPublicType* = RECORD(* Другие модули этот тип видят *)
СГ> PrivateVariable : INTEGER; (* Из других модулей эта переменная не видна *)
СГ> ReadOnlyVariable- : INTEGER; (* Другие модули могут только читать эту переменную *)
СГ> ReadWriteVariable*: INTEGER; (* Другие модули могут и читать и писать в эту переменную *)
СГ> END;
СГ>
Для сравнения (гипотетически):
TYPE
MyPrivateType = RECORD (* ... *) END; (* Другие модули этого типа не видят *)
exportable MyPublicType = RECORD
PrivateVariable : INTEGER;
readonly exportable ReadOnlyVariable,
readonly ReadOnlyLocalVariable: INTEGER;
exportable ReadWriteVariable: INTEGER;
END;
тоже криво, но зато сразу видно какая переменная чем является и не используются символы, знакомые всем, как знаки математических операторов. А если есть и грамотная раскраска синтаксиса в ИДЕ, то вообще красота.
Единственная причина, по которой существуют извращения типа readonly exportable и exportable — это отказ от классов и полей private и public, которые являются намного интуитивнее, чем эти извращения.
На счет автономной проги. BlackBox по сути является эмулятором операционной системы Oberon поверх Windows. Oberon является модульной расширяемой операционкой. Ваши личные модули ничем не отличаются от модулей этой оси. Так что все написанные Вами модули надо запускать в runtime envoronment самого BlackBox. Хотите слинковать отдельный экзешник — на здоровье, обращайтесь к разделу хелпа Platform specific issues (Windows). Кстати, там же есть пример того как слинковать сам BlackBox.exe (это если охота внести в него свои изменения).
На сайте info21 есть примеры линковки автономных экзешников.
Кстати этот самый отдельностоящий экзешник, как ни крути, должен будет включать в себя и всю оберонистую операционку (компилятор, сборка мусора и т.д.), так что его размерчик будет что-то около 1 метра. Хотя, если не прилинковывать к нему сборщик мусора с компилятором а прилинковать только модуль с WinAPI, то экзешник будет микроскопический что-то около 3.5 — 4.5 Kb (в зависимости от того вставите Вы в него иконку=1Кб или нет).
Здравствуйте, Mamut, Вы писали:
M>Единственная причина, по которой существуют извращения типа readonly exportable и exportable — это отказ от классов и полей private и public, которые являются намного интуитивнее, чем эти извращения.
Повторяю. Единицей инкапсуляции является модуль. Все остальное следует из этого.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Mamut, Вы писали:
M>>Единственная причина, по которой существуют извращения типа readonly exportable и exportable — это отказ от классов и полей private и public, которые являются намного интуитивнее, чем эти извращения.
СГ>Повторяю. Единицей инкапсуляции является модуль. Все остальное следует из этого.
Отстутствие полей private является следствием того, что "единицей инкапсуляции является модуль"
Я хренею от обероновской логики, по мне дак женская ито намного понятней
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, Сергей Губанов, Вы писали:
СГ>>Здравствуйте, Mamut, Вы писали:
M>>>Единственная причина, по которой существуют извращения типа readonly exportable и exportable — это отказ от классов и полей private и public, которые являются намного интуитивнее, чем эти извращения.
СГ>>Повторяю. Единицей инкапсуляции является модуль. Все остальное следует из этого.
К>Отстутствие полей private является следствием того, что "единицей инкапсуляции является модуль" К>Я хренею от обероновской логики, по мне дак женская ито намного понятней
Вот я и говорю, в результате появляются извращения (а это именно извращения) вроде постфиксов — и *