Автор Тема: Oberon-07M  (Прочитано 52726 раз)

DIzer

  • Гость
Re:Oberon-07M
« Ответ #30 : Март 21, 2011, 01:07:49 pm »

Делается это очень просто:
CONST
  unknown = 0;
...
VAR
  arr : POINTER TO ARRAY unknown OF CHAR;
...
arr := MALLOC(len); (* :-) *)
Плохое  решение - почему 0 (и нафига это нужно) (лучше POINTER TO ARRAY OF CHAR ), что это такое малок  - вид специальной пропер функции (а как мусорка, к тому же уже есть NEW)... нет уж лучше новый тип ввести, другое дело если new -придать "функциональный" вид - эта идея мне гораздо более нравится...

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #31 : Март 21, 2011, 01:56:36 pm »
Плохое  решение - почему 0 (и нафига это нужно) (лучше POINTER TO ARRAY OF CHAR ), что это такое малок  - вид специальной пропер функции (а как мусорка, к тому же уже есть NEW)... нет уж лучше новый тип ввести, другое дело если new -придать "функциональный" вид - эта идея мне гораздо более нравится...
0 потому, что 0. Ибо размер там от 0 и до куда хочешь. Это стандартный прием, в общем то.

MALLOC это низкоуровневая функция которая непосредственно из системы выбивает память. Конечно лучше на NEW заменить.

Нет, добавлять еще одну спецформу в язык я не хочу, ибо хочу чтобы язык был тот же самый. А по Оберону-07 констркция POINTER TO ARRAY не валидна.

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

DIzer

  • Гость
Re:Oberon-07M
« Ответ #32 : Март 21, 2011, 02:34:52 pm »
Плохое  решение - почему 0 (и нафига это нужно) (лучше POINTER TO ARRAY OF CHAR ), что это такое малок  - вид специальной пропер функции (а как мусорка, к тому же уже есть NEW)... нет уж лучше новый тип ввести, другое дело если new -придать "функциональный" вид - эта идея мне гораздо более нравится...
0 потому, что 0. Ибо размер там от 0 и до куда хочешь. Это стандартный прием, в общем то.

MALLOC это низкоуровневая функция которая непосредственно из системы выбивает память. Конечно лучше на NEW заменить.

Нет, добавлять еще одну спецформу в язык я не хочу, ибо хочу чтобы язык был тот же самый. А по Оберону-07 констркция POINTER TO ARRAY не валидна.

NEW придать фунциональный вид не получится, вообще NEW это не процедура а черти что – результат работы зависит от типов аргументов, что, вообще говоря, не характерно для обычных процедур в обероне (перегружать их ведь нелья). Если сделать NEW в виде функциональном, то получится совсем снос мозга – результат работы функции будет зависеть от типа переменной куда записывается результат возвращенный функцией.
1 А если  будет 10 то что это даст  ;) ведь в малоке у вас другой параметр ?
2 Что такое малок в си я знаю..
3 лучше бы она была валидной...
4 По этому такого рода функуции\\процедуры  называются proper, а вот насчет смысла мозгов  я не понимаю...  - в оберонах new - oчень простой смысл, создание динамического обьекта ИЗВЕСТНОГО ТИПА и передача адреса его в соответствующую переменную (указатель), над указателями разрешены только операции сравнения и присваивания (это не си) - или я ошибаюсь?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #33 : Март 21, 2011, 03:03:37 pm »
1 А если  будет 10 то что это даст  ;) ведь в малоке у вас другой параметр ?
10 не даст, а отнимет :-) Отобьет понималку на счет того, что размер массива не известен на этапе компиляции. То есть я могу создать экземпляр массива размером 10, но не могу создать его размером 0. Таким образом 0 это явный признак того, что массив будет неизвестного (на этапе компиляции) размера. В Си это очень часто применяется.

4 По этому такого рода функуции\\процедуры  называются proper, а вот насчет смысла мозгов  я не понимаю...  - в оберонах new - oчень простой смысл, создание динамического обьекта ИЗВЕСТНОГО ТИПА и передача адреса его в соответствующую переменную (указатель), над указателями разрешены только операции сравнения и присваивания (это не си) - или я ошибаюсь?
arr := NEW(len);
Какой именно тут NEW будет вызван будет зависеть от типа arr. Вот в этом снос мозга. Это сильно не обычная функция получается. Очень не обычная. NEW как proper procedure конечно тоже не обычная. Который NEW будет вызван там зависит от типа аргумента. Однако такая перегрузка процедур-функций более привычна, ибо она встречается повсеместно в других языках.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #34 : Март 21, 2011, 03:10:45 pm »
Конечно можно и так написать:
CONST
  unknown = 0;
...
VAR
  arr : POINTER TO ARRAY unknown OF CHAR;
...
NEW(arr, len);
Я некий левый MALLOC использовал лишь для того, чтобы показать, что это все можно легко сделать библиотекой а не частью рантайма/компилятора.

Кстати, вот что было бы точно полезно ввести, так это ещё одну встроенную функцию: TYPEID(Val) и TYPEID(Type), функция должна вернуть целочисленное уникальное значение для даденого типа соответственно переменной, или типа.

То есть:
intTypeId0 : INTEGER;
intTypeId1 : INTEGER;

intTypeId0 := TYPEID(INTEGER);
intTypeId1 := TYPEID(intTypeId1);

ASSERT(intTypeId0 = intTypeId1);

Это позволит писать собственные библиотечные аллокаторы.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #35 : Март 21, 2011, 03:18:28 pm »
Хотя лучше не INTEGER возвращать, а ссылку на структуру с описанием данного типа. Сравнивать их все равно можно, а вот бесполезные операции вроде <,>,+ и так далее, для записей бесполезны. Алсо можно будет например узнать подробности, вроде имени типа и его параметров (если тип параметризуем, как например массив).
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #36 : Март 21, 2011, 03:32:25 pm »
Хотя нет, я ошибся, этого не достаточно для того, чтобы можно было написать аллокатор в Обероне-07 и удобно им пользоваться.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re:Oberon-07M
« Ответ #37 : Март 21, 2011, 04:27:08 pm »

arr := NEW(len);
Какой именно тут NEW будет вызван будет зависеть от типа arr. Вот в этом снос мозга. Это сильно не обычная функция получается. Очень не обычная. NEW как proper procedure конечно тоже не обычная. Который NEW будет вызван там зависит от типа аргумента. Однако такая перегрузка процедур-функций более привычна, ибо она встречается повсеместно в других языках.
Это снос мозга сишника -в си с указателями можно сделать многое... в обероне только присваивать и сравнивать ("равно" и "неравно") с NIL и  значением переменной-указателя ТАКОГО же типа... впрочем я повторяюсь...  :)

DIzer

  • Гость
Re:Oberon-07M
« Ответ #38 : Март 21, 2011, 04:29:46 pm »
Хотя нет, я ошибся, этого не достаточно для того, чтобы можно было написать аллокатор в Обероне-07 и удобно им пользоваться.
А вот это вроде против философии мусоросборщика... если этим заниматься - тогда нужно четко представлять нафиг и кому это нужно...

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #39 : Март 21, 2011, 04:37:28 pm »

arr := NEW(len);
Какой именно тут NEW будет вызван будет зависеть от типа arr. Вот в этом снос мозга. Это сильно не обычная функция получается. Очень не обычная. NEW как proper procedure конечно тоже не обычная. Который NEW будет вызван там зависит от типа аргумента. Однако такая перегрузка процедур-функций более привычна, ибо она встречается повсеместно в других языках.
Это снос мозга сишника -в си с указателями можно сделать многое... в обероне только присваивать и сравнивать ("равно" и "неравно") с NIL и  значением переменной-указателя ТАКОГО же типа... впрочем я повторяюсь...  :)
Про ограничение операций над указателями тут вообще не в тему. Замени arr на любой другой тип (INTEGER, BOOL, RECORD какой-нибудь (не ссылка на него)) – ничего не изменится. Крышесном останется.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #40 : Март 21, 2011, 04:39:48 pm »
Хотя нет, я ошибся, этого не достаточно для того, чтобы можно было написать аллокатор в Обероне-07 и удобно им пользоваться.
А вот это вроде против философии мусоросборщика... если этим заниматься - тогда нужно четко представлять нафиг и кому это нужно...
Пулы мусоросборщику никак не противоречат. Потому как нужны иногда. Особенно в задачах критичных по скорости. Хотя да, в Обероне с пулами будет тяжко в том плане, что для того, чтобы вероятность ошики (утечеки) придется городить системе каллбэков. Иначе никак.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re:Oberon-07M
« Ответ #41 : Март 21, 2011, 05:19:07 pm »
Цитировать
Цитировать
arr := NEW(len);
Какой именно тут NEW будет вызван будет зависеть от типа arr. Вот в этом снос мозга. Это сильно не обычная функция получается. Очень не обычная. NEW как proper procedure конечно тоже не обычная. Который NEW будет вызван там зависит от типа аргумента. Однако такая перегрузка процедур-функций более привычна, ибо она встречается повсеместно в других языках.
Это снос мозга сишника -в си с указателями можно сделать многое... в обероне только присваивать и сравнивать ("равно" и "неравно") с NIL и  значением переменной-указателя ТАКОГО же типа... впрочем я повторяюсь...  :)
Про ограничение операций над указателями тут вообще не в тему. Замени arr на любой другой тип (INTEGER, BOOL, RECORD какой-нибудь (не ссылка на него)) – ничего не изменится. Крышесном останется.
Там может быть только  ССЫЛКА на конкретный экземпляр RECORD либо NIL... произвольный адрес присвоить указателю нельзя ... или можно ?
« Последнее редактирование: Март 21, 2011, 05:32:50 pm от valexey »

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:Oberon-07M
« Ответ #42 : Март 21, 2011, 05:34:31 pm »
Там может быть только  ССЫЛКА на конкретный экземпляр RECORD либо NIL... произвольный адрес присвоить указателю нельзя ... или можно ?
Можно через SYSTEM. Но то, какие именно значения может принимать ссылка к крышесносу, мною обозначенному, никакого отношения не имеет.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re:Oberon-07M
« Ответ #43 : Март 21, 2011, 05:43:23 pm »
Там может быть только  ССЫЛКА на конкретный экземпляр RECORD либо NIL... произвольный адрес присвоить указателю нельзя ... или можно ?
Можно через SYSTEM. Но то, какие именно значения может принимать ссылка к крышесносу, мною обозначенному, никакого отношения не имеет.
Систем это систем.... Но все равно не понимаю чем хуже P:=NEW() в сравнении с NEW(P), хотя возможно это потому, что привык шлепать фабричные функции для  составных сущностей.... Ну и ладно ... :)

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:Oberon-07M
« Ответ #44 : Март 21, 2011, 07:35:48 pm »
Выложил описание компилятора: http://exaprog.com/userguide.pdf