Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - kkkk

Страницы: 1 2 [3] 4 5 ... 9
31
Тут ведь есть и другой вопрос - какие радикальные преимущества даёт подход, непременно требующий более сложных инструментов?
Лично мне нравится, что язык позволяет использовать самые простые средства для создания транслятора, что, впрочем, не означает, что эти средства всегда должны использоваться.

32
Вот именно, такое сложное решение я и имел ввиду в начальном сообщении, хотя оно, очевидно, не является единственным. 
Вопрос, насколько оправданно требование к языку, которое требует таких возможностей транслятора или более простых, но менее эффективных?

33
Как я понимаю - проблема в наследовании, да?
Не только. Дело в раздельной трансляции.
Есть, к примеру, интерфейс модуля, являющегося первичным исходником, а не сгенерированным из модуля.
interface A {
    type S = struct {
        a int
    }
    proc Init(var s: S)
    proc Do(var s: S, i: int)
}
Есть возможное воплощение этого интерфейса
module A {
    type S = struct {
        a: int
        b: [16] char
        s: *S
    }
    proc Init(var s: S) {
        ...
    }
    proc Do(var s: S, i: int) {
       ...
    }
}
Есть пользователь модуля A, которому передают интерфейс, а не сам модуль, так как именно интерфейс первичен.
module B {
     import A;

     proc Go {
         var s: [22] A.S
         var a: int
         for i = 0 .. last(s) {
              A.Init(s[i])
              A.Do(s[i], i)
              a = s[i].a
         }
     }
}
Как, имея только интерфейс A, транслятору собрать модуль B с эффективным размещением локального массива s из элементов структур S неизвестного размера.

34
Мы про оберон говорим?
Такое можно провернуть на многих языках.

Цитировать
Я слабо себе представляю как без изменения языка, инструментом я смогу указать
Введением дополнительного спец-языка, с которым работает инструмент. Это, в общем-то, перпендикулярные сущности и пихать это в основной язык совершенно не обязательно. Что-то подобное есть в GNAT, насколько можно судить. Является ли это частью стандарта или собственные заморочки неважно с технической стороны.

Цитировать
модуль первого типа я хочу побить на 4 модуля второго типа
Конкретно это выглядит, на мой вгляд, как блажь, а не потребность.

35
Вот эта разница в модулях может быть реализована инструментами без изменения языка. Если же речь именно об удобстве пользователя, то тоже нет никаких технических проблем - это именно интерфейс уведомительного характера, и мелькающие то здесь, то там DEFINITION говорят о том, что, по крайней мере, для некоторых реализаций Оберона она воплощена, хотя, может, и не полностью.

36
Кто-то считает это необходимым, кто-то - ненужным. Меня интересует техническая сторона, точней одна её деталь. Как эффективно совместить локальные записи и закрытые элементы. В идеале интерфейс не должен содержать информации о скрытых элементах записи, пусть и помеченных как скрытые. Это легко достигается в интерфейсе уведомительного характера, но составляет проблему в интерфейсе для компилятора, так так тогда полный размер записи становится неизвестным, что является препятствием для размещения на стеке.

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

37
Можно ещё ускорить с опцией -C ltoВозможно, из-за того, что 0..arr.len()является синтаксическим сахаром для
std::ops::Range {start: 0, end: arr.len()}

38
Веб наступает. И на стороне клиента нет ничего, кроме жабаскрипта. Точнее есть, конечно, разные трепыхания на тему (Dart, TypeScript), но ни разу не мэйнстрим и со своими фатальными недостатками. И это пугает. Очень скоро мой рабочий мегапроект на теплом ламповом С++ надо будет переписывать под веб. На чем писать? Ну конечно на жабаскрипте. Но почему бы не попробовать самому сделать что-то лучшее, чтоб потом можно было сказать самому себе: "сделал все, что мог, чтоб не писать на жабаскрипте". Тем более, что всегда хотелось поэкспериментировать со своим самым правильным языком.
Не так давно мне и самому довелось хорошо почувствовать, что веб наступает, и возникла необходимость использования моей библиотеки, изначально рассчитанной на микроконтроллер и ПК, в браузере. Поскольку она была написана на Си, то я решил задействовать Emscripten. В целом, всё работает без нареканий, но удобным это было трудно назвать.

В связи с этим возникает вопрос. Помимо исследовательского опыта, удалось извлечь из транслятора практическую пользу? Понадобилось ли переписывать с C++ на что-нибудь другое, или тоже удалось задействовать Emscripten, оставшись на тёплом ламповом? Что думаете по поводу перспектив надвигающегося WebAssembly, который должен усугубить удобство использования С++ в вебе?

39
Общий раздел / Re: Oberon-07/13: заметки
« : Октябрь 25, 2016, 11:15:55 am »
Поскольку речь идёт о сравнении с Си, то всё не совсем так по многим пунктам.

У Rust достаточно зрелый frontend, а backend, в котором и сосредоточен наибольший потенциал для проблем - это ещё более зрелый LLVM. В то же время компиляторы Си для микроконтроллеров, даже сделанными на основе GCC, часто грешат ошибками, но их всё равно задействуют в серьёзных вещах, например, для контроля Li-ion аккумулятора, который вообще-то и загореться может.

"Зрелые" и стандартные библиотеки для Си в системах для надёжного применения применять просто нельзя, так как они не соответствуют требованиям надёжности и защищённости.

Отсутствие статического анализа - это плохо, но немалая часть вещей, которые в Си находятся статическим анализом в Расте решены на уровне языка и компилятора. Heartbleed не был выявлен ни одним статическим анализатором, а вызван он был, насколько мне известно, переполнением буфера. Комментарий от одного из создателей статического анализатора - http://www.opennet.ru/openforum/vsluhforumID3/109478.html#10.

Системы автоматического доказательства корректности - это тяжёлая артилерия и применяется редко. Для Си его использование изрядно подпорчено наличием в языке препроцессора.

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

40
Общий раздел / Re: Oberon-07/13: заметки
« : Октябрь 24, 2016, 10:36:41 pm »
Почему? Пока не сталкивался с таким мнением, так что интересно.

Могу привести пример:
Си со своим беззнаковым sizeof провоцирует использование беззнаковых целых, повышая вероятность переполнения из-за близости нижней границы, которое даже не может вызвать прерывания, так как в стандарте чётко прописано "корректное" поведение. Для Ржавого всё лучше в это плане, и не только. Впрочем, я не имел возможности его использовать широко, могу чего не знать.

41
Общий раздел / Re: Oberon-07/13: заметки
« : Октябрь 24, 2016, 09:43:36 pm »
Исходя из такого понимания, можно сказать, что абзац не устарел, так как в нём не навязывается ни Модула ни Ада, а просто приводятся как пример более удачных языков для надёжных программ, к тому же с оговоркой на их доступность для используемой платформы. Отсутствие специалистов по языку можно рассматривать как недоступность языка.
Сечас абзац можно было бы освежить примерами новых языков, например, Rust.

42
Общий раздел / Re: Oberon-07/13: заметки
« : Октябрь 24, 2016, 07:11:38 pm »
C для надёжного применения теперь подходит лучше Ada?

43
Общий раздел / Re: Oberon-07/13: заметки
« : Октябрь 24, 2016, 03:18:39 pm »
2) См. стандарт MISRA по этому поводу (думаю что это такое все знают):
Мне особенно нравилась редакция 1998 года:
Цитировать
Nonetheless, it should be recognised that there are other languages available which are in general better suited to safety-related systems, having (for example) fewer insecurities and better type checking. Examples of languages generally recognised to be more suitable than C are Ada and Modula 2. If such languages could be available for a proposed system then their use should be seriously considered in preference to C.

44
Общий раздел / Re: Oberon-07/13: заметки
« : Октябрь 24, 2016, 03:03:04 pm »
vlad, скажем так, профессиональное чутье не позволяет мне доверять такому решению. Если уж в WITH дырка обнаружилась..., то тут я бы крепко подумал перед тем как этим пользоваться.
Конкретное решение плохо тем, что меняет смысл NEW
NEW(pb);
IF pb IS PDerived THEN
    NEW(pb);
превращается в
pb = new Base();
if (pb instanceof Derived){
pb = new Derived();
Конечно, можно запретить и NEW, но мало ли, что имел ввиду автор.

45
Общий раздел / Re: Oberon-07/13: заметки
« : Октябрь 24, 2016, 02:08:49 pm »
"\n" не преобразовывается потому что в обероновских строках не предусмотрены специальные символы. Нужно же было уложиться в 16 страниц :)
Что характерно, в C++ рекомендуют использовать std::endl, а "\n" считают устаревшей частью C. Вообще, надо сказать, что интерпретация спецсимволов - вещь очень платформоспецифичная и в учебном проекте совершенна не нужна (да, 16-17-страничный Оберон - это учебный проект)

Страницы: 1 2 [3] 4 5 ... 9