• Что такое полная группа событий?

    tw1ggyz
    @tw1ggyz Автор вопроса
    "События в полной группе должны быть несовместны и противоположны." такое определение мне нравится значительно больше, чем "одно и только одно". Вы ее откуда-то конкретно взяли в таком виде или просто переформулировали для меня версию с "одно и только одно"?

    Но тогда такой вопрос - Кп, Кб, Кт, Кч являются, однозначно, несовместными. Но разве они являются противоположными? Ведь если взять Кп и Кб - невыпадение пик вовсе не значит выпадение бубей. Или говоря о противоположности нужно все события группы обязательно рассматривать вместе? Если рассматривать вместе, тогда вроде бы условие несовместности уже покрывает все нужды - "выпадение одного блокирует выпадение другого в одном испытании" и противоположность уже как бы и не нужна.
  • Entity Framework - не нужен?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Ссылку посмотрел, но требуется больше времени, чтобы попробовать\осознать. Главный вывод, который я сделал - EF тоже позволяет сделать, то что я описывал, просто надо научиться настраивать. Может какие-нибудь еще ссылки\ресурсы\книги посоветуете, где бы нормально про EF писалось?
  • Entity Framework - не нужен?

    tw1ggyz
    @tw1ggyz Автор вопроса
    В БД она не денормализована, потому что как раз "Заказ" хранит число-идентификатор клиента, а сами клиенты лежат в отдельной таблице. А что касается объектов, когда они уже загружены в RAM, то там понятие нормализации звучит странно. Да и вообще насколько мне известно, нормализация в РЭУБД - скорее тема из университетов, а на деле бывает выгоднее даже провести денормализацию, чтобы данные считывались быстрее.

    Статью посмотрел, но там смутило
    Owned entities are essentially a part of the owner and cannot exist without it, they are conceptually similar to aggregates.

    Как раз-таки в моем примере клиент - весьма самостоятельная сущность, которая может существовать сама по себе. Но надо подробнее ознакомиться будет с тем что там написано.
  • Entity Framework - не нужен?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Правильно ли я понял, что если я захочу сделать как я написал - собрать единый объект модели из данных, лежащих в разных таблицах, то в случае использования EF мне все равно придется иметь дело с объектами-таблицами, а из них уже вытаскивать данные и формировать объект модели?
  • Как посмотреть, во что разворачивается синтаксический сахар C#?

    tw1ggyz
    @tw1ggyz Автор вопроса
    pfemidi, не получается. Более того, он мне метод, в котором написано
    var fs = new FileStream(@"C:\tmp\text.txt", FileMode.Open);
    try
    {
    
    }
    finally
    {
        if (fs != null)
            ((IDisposable)fs).Dispose();
    }

    ужал до
    using (new FileStream("C:\\tmp\\text.txt", FileMode.Open))
    {
    }

    То есть наоборот все сделал - полную версию показал как бы она выглядела с сахаром. А сахар показывает как есть, без развертки.
  • Как посмотреть, во что разворачивается синтаксический сахар C#?

    tw1ggyz
    @tw1ggyz Автор вопроса
    freeExec, в данном случае не изменится. Но сам факт того, что редактор не все понимает, в каком-нибудь другом случае может не позволить увидеть преобразованный код. Поэтому я и спросил про альтернативы.
  • Как посмотреть, во что разворачивается синтаксический сахар C#?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Спасибо, хороший сайт. А есть какие-нибудь оффлайн инструменты?
    Потому что он, похоже, не все понимает. Допустим, ругается на пространство имен System.Data.SqlClient
    https://sharplab.io/#v2:CYLg1APgAgTAjAWAFBQAwAIpwH...
  • Как в C# запретить подклассам переопределять метод суперкласса?

    tw1ggyz
    @tw1ggyz Автор вопроса
    На сайте майкрософт нашел вот такое "When you define new methods or properties in a class, you can prevent deriving classes from overriding them by not declaring them as virtual." То есть методы, которые не предполагается переопределять, говорят просто не объявлять виртуальными. Но при этом все-таки оставили возможность применять sealed к методам. По-моему это странно.
  • Как в C# запретить подклассам переопределять метод суперкласса?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Предупреждение есть и у меня. Я думал может есть что-то, что не просто намекнет, а прямо-таки не позволит.

    Sealed не подходит, потому что он позволяет "заблокировать" дальнейшее переопределение только уже переопределенного метода. То есть если бы я действительно сделал переопределение в RegexModifier, то мог бы снабдить его sealed. Вот тогда потомки RegexModifier'а уже не смогли бы его переопределить. А сделать sealed в исходном асбстрактном Modifier нельзя.
  • Сколько раз выделяется память под локальные переменные цикла в С++?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Поэтому, содавать тяжелый обьект в цикле, если можно сделать это один раз, не очень хорошая идея.

    Другими словами, "сделать это один раз" - это создать его до цикла, а в цикле просто присваивать значение?
  • Сколько раз выделяется память под локальные переменные цикла в С++?

    tw1ggyz
    @tw1ggyz Автор вопроса
    И тем не менее: в этом примере переменная stripped нигде не обнуляется явным образом. Значит, она либо действительно должна в конце шага while удаляться, а в начале создаваться заново, либо как-то обнуляться, иначе ее значение от шага к шагу копилось бы, приводя не к тому поведению, которое нужно. Компилятор ведь не может дописать сам такое обнуление, это слишком трудно вроде? Значит просто удаляет и создает каждый раз?
  • Для кого все же предназначен код, полученный из CIL (байт-кода .net)?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Saboteur, ну в таком случае едва ли есть смысл копаться в этих вещах дальше. Остановлюсь на том, что CIL преобразуется в машинный код и все. С практической точки зрения, похоже, едва ли надо знать больше, если конечно не собираешься писать какую-нибудь очередную реализацию .net. Спасибо за уделенное внимание.

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

    Таким образом, в CLI обычный машинный код, который выполняется процессором, но который содержит определенные закладки, вызовы функций операционных систем для того, чтобы этот код успешно работал в определенной ОС, чтобы он не загребал под себя 100% CPU на пустые циклы и так далее.
    Это не значит, что там немашиный код, это значит что машинный код написан для работы в определенных условиях и содержит определенные вызовы.
  • Для кого все же предназначен код, полученный из CIL (байт-кода .net)?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Про прерывания я прочитал. Только к чему это в данном вопросе?

    вы видимо плохо себе представляете, что такое операционная система

    Видимо, плохо. Потому что по Таненбауму, которого все советуют, как раз и выходит, что все, находящееся над уровнем цифрового логического уровня - это "виртуальные машины". Совокупность средств, неважно, аппаратных ли, программных ли, которые создают абстракции над двоичными командами. В том числе и операционная система - точно такая же абстракция, пускай и сложная, но все также содержащая команды, объединяющие под собой команды с предыдущего уровня в разных комбинациях. Какая-то команда, если она низкоуровневая, может транслироваться в машинную один-в-один, а более высокоуровневая в десятки. Операционная система загружается в память и соответственно все эти команды могут использоваться прикладными программистами. Либо напрямую, если это какое-то сравнительно низкоуровневое программирование, либо вот через абстракции в виде всяких дотнетов.

    Если все это не так, но вообще не вижу смысла дальше разговаривать, потому что получается, все что я в Таненбауме читал - устаревший теоретический бред, не имеющий к реальному положению вещей отношения. А следовательно как я могу что-то говорить и обдумывать ответы, если у меня ложное представление обо всем. Если это так, то какие более актуальные источники можно изучить? Желательно конечно комплексные, чтобы для начала равномерно узнать про весь процесс, а не однобоко углубляться в конкретное направление.
  • Для кого все же предназначен код, полученный из CIL (байт-кода .net)?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Saboteur, "суть" мной понята была еще до публикации вопроса и озвучена в первых его двух строках, а именно:
    Компилируя исходный код на на .net-совместимом языке, получаем CIL, который впоследствии транслируется виртуальной машиной в, так сказать, "окончательный" код, предназначенный для конкретной платформы.


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

    и хотелось бы получить подтверждение или опровержение, но вы почему-то эту самую главную часть сообщения оставили без внимания.

    Если вдруг вы чувствуете, что сами не совсем до конца понимаете, как это работает и не можете дать четкого ответа, то ничего страшного, на этом и закончим.
    Хорошим же я вижу ответ примерно в такой форме: "CIL преобразуется в машинный код. Но "машинный" в данном случае вовсе не означает, что он выполняется непосредственно процессором. Он выполняется операционной системой по ее правилам (например, попытка прямого доступа к устройствам блокируется) и имеет вид (двоичных команд (1100 0101 и т.д.) | ассемблерных команд (mov ax, bx) | другой вариант). Если интересно, как именно выполняются программы внутри конкретных ОС - обратитесь к соответствующей литературе. Таким образом, потребителем кода, получаемого из CIL, является операционная система, которая разбирает его и уже отправляет конкретные команды процессору посредством системы прерываний".
    Это просто пример и реальные шаги могут быть другими, но суть в том, что эта формулировка не оставляет белых пятен в объяснении на текущем уровне абстракции. То есть если хотите узнать как именно ОС выполняет программы - читайте дополнительную литературу. Не хотите - пожалуйста, просто знайте, что получаемый из CIL код уходит именно операционной системе, а не процессору или еще куда-то.
  • Для кого все же предназначен код, полученный из CIL (байт-кода .net)?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Saboteur, где вы сказали, что выполнять код напрямую можно? Вы сказали
    Работая в рамках операционной системы, вы не можете выполнять произвольный код на процессоре. И Linux и Windows выполнят вашу программу в защищенном режиме, в своей среде, блокируя например попытки прямого доступа к устройствам.


    В итоге значит CIL компилируется в ассемблер и он выполняется операционной системой, имея возможность вызывать ее функции через прерывания?
  • Для кого все же предназначен код, полученный из CIL (байт-кода .net)?

    tw1ggyz
    @tw1ggyz Автор вопроса
    freeExec, так и есть, полная каша и у меня складывается впечатление, что люди, пишущие эти книги, статьи, тоже слабо понимают, о чем они пишут. Потому что иначе я не понимаю, как можно столько "скользких" формулировок делать.

    Вам не кажется странным, что программы распространяются в виде для Винды, для Линукса, для Мака и т.д.

    Не кажется и я вижу это так: в каждой ОС есть своя реализация стандарта CLI. В Windows это .net Framework, в Linux, Mac OS - Mono ну и так далее. Реализации различаются, в .net Framework есть куски, не реализованные в Mono и наоборот. Соответственно, я должен либо писать программу, которая использует только полностью пересекающийся функционал реализаций, тогда мне не придется иметь несколько версий программы, мой скомпилированный в CIL код будет работать на всех ОС идентично. Либо я должен оформить некое "ядро" своей программы из общего функционала реализаций, а все остальное для каждой версии написать отдельно с помощью тех самых различающихся средств. И вот тут у меня появляется "версия для Винды", "версия для Линукса" и все остальное.

    Ещё больше заблуждение. От того как это отобразиться на экране машинный код: двоичный вид, хекс или ассемблерное представление - суть не меняется.


    Ну, значит Таненбаум вводит людей в
    заблуждение
    5c8fdaaec26fc228428096.jpeg
    . Либо это не до конца объяснено. Вот
    дальше
    5c8fdaf0ceffb655679074.jpeg
    он уже утверждает, что первая версия Unix была написана на ассемблере, а вторая на C. Хотя если следовать его логике, если она писалась на ассемблере, значит она находится на уровне ассемблера, а не на уровне ОС. А вторая версия тогда вообще переходит на уровень 5, "языка прикладных программистов".
  • Для кого все же предназначен код, полученный из CIL (байт-кода .net)?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Saboteur, я как раз слушаю и очень внимательно, потому что мне интересно разобраться, но книги не дают полной картины. Именно поэтому я задаю вопрос людям, потому что только так есть возможность задавать дополняющие вопросы и дойти до сути. Я ни на чем не настаиваю, я пользуюсь исключительно информацией, полученной из книг, статей и других обсуждений, пытаясь домысливать по минимуму.

    Если в рамках ОС нельзя выполнять код напрямую на процессоре, значит этот "машинный код", который якобы получается из CIL, вовсе не машинный, а некая очередная промежуточная форма кода, предназначенного на этот раз для конкретной ОС, который она как-то дальше запускает по цепочке преобразований, пока он не превратится в команды процессору?
    Или это действительно готовый двоичный код для процессора и ОС никак его уже не преобразует, а просто является посредником в его передаче процессору? Но в таком случае при чем здесь вызовы каких-то функций стандартных библиотек, если у нас есть готовые к исполнению команды?
  • Для кого все же предназначен код, полученный из CIL (байт-кода .net)?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Такое понятие есть и оно описано тем же самым Таненбаумом в его книге. Операционная система предлагает API разного уровня, а компиляция, интерпретация и иже с ними суть - перевод из одного вида в другой. И переводить можно сколько угодно раз, так что тот же самый CIL вполне можно перевести в команды ОС, а они уже пойдут по цепочке дальше и в итоге где-то там наконец-то станут командами для процессора. Другое дело, что я не нашел вразумительного ответа нигде, как же это работает на самом деле, поэтому решил спросить непосредственно у людей. Но пока что-то ответа не видать.
  • Для кого все же предназначен код, полученный из CIL (байт-кода .net)?

    tw1ggyz
    @tw1ggyz Автор вопроса
    freeExec, судя по третьему абзацу код С++ компилируется в "binary", то есть в программу в двоичном виде. Однако Таненбаум пишет, что код уровня операционной системы тоже является цифровым, а буквенное представление команд впервые появляется на уровне ассемблера. В таком случае становится не очень понятно, как с виду понять, это машинный код или код ОС, если они оба представлены цифрами. Если вы знаете точный ответ на свой вопрос, хотелось бы его услышать.
  • Для кого все же предназначен код, полученный из CIL (байт-кода .net)?

    tw1ggyz
    @tw1ggyz Автор вопроса
    Что представляет из себя эта "определенная среда", о которой вы говорите?
    Машинному коду дано определение как коду, непосредственно исполняемому процессором. Машинный код существовал до изобретения микрокода и тем более до появления самой первой операционной системы. Следовательно, машинный код никак не может обращаться к функциям операционной системы, потому она находится выше уровнем и как раз ее команды являются надстройкой над машинными. Какие-то могут иметь отношение одна-к-одной, какие-то быть сложными комбинациями машинных команд.

    Таким образом, вопрос остается открытым. Если он не понятен, могу переформулировать: CIL компилируется в команды, которые процессор выполняет непосредственно или он компилируется в очередную промежуточную форму? Если последнее, то в какую именно и как выглядит выглядит его дальнейший путь по превращению в окончательные команды, которые непосредственно может выполнить процессор.