1. JavaScript / Говнокод #27520

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    abstract class Department {
        constructor(public name: string) {}
    
        printName(): void {
            print("Department name: " + this.name);
        }
    
        abstract printMeeting(): void; // must be implemented in derived classes
    }
    
    class AccountingDepartment extends Department {
        constructor() {
            super("Accounting and Auditing"); // constructors in derived classes must call super()
        }
    
        printMeeting(): void {
            print("The Accounting Department meets each Monday at 10am.");
        }
    
        generateReports(): void {
            print("Generating accounting reports...");
        }
    }
    
    function main() {
        let department: Department; // ok to create a reference to an abstract type
        department = new AccountingDepartment(); // ok to create and assign a non-abstract subclass
        department.printName();
        department.printMeeting();
        //department.generateReports(); // error: department is not of type AccountingDepartment, cannot access generateReports
        print("done.");
    }

    Алилуя - я вам абстракты принес :)

    Запостил: ASD_77, 16 Июля 2021

    Комментарии (433) RSS

    • иа даже дампик вам принес :) https://pastebin.com/EBrGf71w
      Ответить
    • Зачем там джва раза абстракт?
      Ответить
      • первый абстракт что бы ты даже и не думал его создавать :)
        Ответить
    • забыл результат работы показать:

      ```cmd
      C:\temp>C:\dev\TypeScriptCompiler\__buil d\tsc\bin\tsc.exe --emit=jit C:\temp\1.ts
      Department name: Accounting and Auditing
      The Accounting Department meets each Monday at 10am.
      ```
      Ответить
    • у меня техническая проблема. как вернуть строку(из стека не глобальной памяти) из вызванной функции в стэк вызывающей функции если размер строки заранее не известен?
      Ответить
      • Чрез кучу, вестимо.

        Ну либо кидать исключение, если вызывающая функция недооценила размер буфера.
        Ответить
      • Как особо извращённое решение, можно подвинуть границу стекфреймов и увеличить буфер в стеке вызывающего. Ты ведь конпелятор, имеешь право (если все указатели и ссылки сможешь запатчить).
        Ответить
        • Ещё немного извращений: вызываемая функция может смёржить свой стекфрейм со стекфреймом вызывающей (eip/ebp восстановить, esp оставить) и вернуть адрес буфера. Тогда владение буфером перейдёт к вызывающему, как-будто бы он его через alloca выделил.

          Но чтобы это работало нужны явные фреймпоинтеры (тот самый ebp).
          Ответить
          • Блин, обязательно заюзаю этот приём, если буду писать свой конпелятор. Можно будет вполне легально возвращать ссылку на локальную переменную со стека. Главное дать ей какой-то специальный тип, чтобы никуда не прикопали потом.
            Ответить
            • Вот так заполнишь в цикле массив указателями, которые возвращает на первый взгляд невинная функция, а потом задаёшься вопросом: а откуда у меня стек 4 МБ?
              Ответить
              • Зато ты сможешь построить на стеке красно-чёрное дерево и выполнить над ним какую-то работу. Или написать фабрику короткоживущих объектов без оверхеда от кучи.

                > невинная

                Ну какой-нибудь TempRef<T> не особо невинно выглядит. Понятно, что обычную ссылку на такое брать нельзя.
                Ответить
          • Дырка в стеке не останется от локальных переменных вызываемой функции? (Прошу прощения, я скриптонять).
            Ответить
            • Останется. Но можно возвращаемые переменные располагать поближе к началу, а остальные тримнуть при возврате.
              Ответить
              • Но размер возвращаемой пельменной же неизвестен по условиям задачи. Придётся все локалки двигать как-то при реаллоке.
                Ответить
                • Ну это для вызывающего он неизвестен. А вызываемый его знает, по крайней мере в момент возврата.
                  Ответить
                  • Не факт, что вызываемая знает заранее. Может строка там как-то динамически питуизируется.
                    Ответить
                    • Ну в момент возврата точно знает.

                      Так то да, в теории эта строка ему могла достаться от ещё более вложенных вызовов. Тогда свои локалки уже не обрезать. Ну без оверхеда на перемещение к началу своего фрейма.
                      Ответить
              • вот я об этом и думаю :) но все равно придется двигать стек. так как мы не знаем какой код у нас в функции и как много он заюзает стека. т.е. если делать "str1" + "str2" то результат будет в стеке после "str1" и "str2"
                Ответить
                • Ну тут можно какое-нибудь trie делать (или как там это правильно называется), а не реальную конкатенацию. И потом при передаче этой строки когда-нибудь склеить всё в кучу.
                  Ответить
        • Тред напомнил царя с его "царскими замыканиями в сишке".
          Ответить
          • Кстати, можно попробовать сделать это на крестах, асмовставках и какой-то матери. Гомоиконность не завезли, к сожалению, но можно и без неё попытаться.
            Ответить
        • кстати, LLVM не убивает этот способ?
          Ответить
          • Х.з., если аккуратно барьерами обмазать, я думаю не испортит. Тут главное чтобы он фреймпоинтер юзал вместо esp.

            Фиг знает, на самом деле...
            Ответить
        • > Как особо извращённое решение, можно подвинуть границу стекфреймов и увеличить буфер в стеке вызывающего.

          У тебя только будет багор, если локальные переменные на стеке содержат указатели на другие локальные переменные на стеке. Двигая куда-то такую питушню, тебе надо и все указатели пересчитывать, да и к тому же где-то надо записывать, что вот там-то и там-то указатели, и если двигаем, то эти указатели надо модифицировать. А если ты не сырые указатели хранишь, а например у тебя там где-то на стеке формируется xor-linked list, где указатели в чистом виде не присутствуют?
          Ответить
          • указатели на переменную на стеке могут скопировать и в кучу, если гарантируют уничтожение их до конца вызова функции, так что придется трекать ВСЕ указатели, и не дай б*г там асмовставки какие-то типа адресации от SP или BP
            Ответить
            • Откуда вообще такие проблемы у конпелятора тайпскрипта? Это же не сишка и не кресты, какие нафиг xor-linked списки, какие нафиг асмовставки...
              Ответить
              • А откуда в тайпскрипте желание возвращать строку не через кучу?

                Кстати, о ксор-линкд листах: я взял указатель на foo, кастанул в intptr_t, прибавил 42, потом отнял 41, потом отнял 1, потом кастанул в указатель.

                Это же не УБ? А все ваши попытки отследить и пропатчить указаители сломаются.

                или не сломаются? Или вы все аргументы у всех инструкций для работы с памятью будете двигать?
                Ответить
              • Да я вооще не понимаю, нафиг делать компилятор тайпскрипта, учитывая что есть вполне себе нормальные типизированные компилируемые в натив языки с GC? Наверное это для тех, кто бекенд на этом тупескрипте писать хочет, и надо чтоб быстро выполнялось? https://govnokod.ru/27511#comment646434

                > Тогда мне надо учить js и давать уроки в нем. Но бекэнд сидит на…, постой, а если мы на бэкенде перейдем на js. А еще лучше на TypeScript перейдет и фронтэнд и бэкенд. Тогда я буду учить студентов на этом языке. Походу учебы студенты сами будут выбирать специализацию. А команды будут получать готовый полуфабрикат. Эврика!


                но компилируемый тупескрипт явно будет подмножеством обычного тупескрипта, вряд ли в нем какой-нибудь там eval() будет работать. Кстати, eval() в тупескрипте будет жабаскрипт выполнять, а не тупескрипт, так что нужен еще и транспилер, лол. https://github.com/Microsoft/TypeScript-wiki/blob/master/Using-the-Compiler-API.md#a-simple-transform-function

                Блядь, какое же говно. Обмажутся своими транспиляторами-полифилами, блядь
                Ответить
                • У тайпскрипта очень хорошая типизация. Намного лучше, чем у джав, котлинов, сишарпов, и прочих мейнстримных говен с ГЦ

                  Вот за скалу и F# не скажу
                  Ответить
                  • > У тайпскрипта очень хорошая типизация. Намного лучше, чем у джав, котлинов, сишарпов, и прочих мейнстримных говен с ГЦ

                    Посмотри на типизацию в Haskell, OCaml, Standard ML.
                    Ответить
                    • Они н попадают в категорию
                      >мейнстримных говен
                      Ответить
                      • Ну так скала и F# тоже не попадает, но ты их зачем-то привел.
                        Ответить
                      • Да и тайпскрипт я не относил бы к мейнстриму.
                        Ответить
                        • >Да и тайпскрипт я не относил бы к мейнстриму.
                          да ладно?

                          На нем сейчас почти все пишут, кому нужен джаваскрипт. Современные фронтэндеры новые проекты точно на голом JS не начнут
                          Ответить
                          • Есть ли реальная статистика, сколько ежедневно пишется строк кода на JS и сколько на TS? Или может есть реальная статистика, сколько людей знает JS, а сколько TS?
                            Ответить
                            • У меня нету, но есть всякие сурвеи типа мост лавд ленгвидж

                              https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-loved

                              По нему видно, что они скорее возьмут TS, чем JS (благо интероп бесплатный)

                              Алсо, на TS написан VSCode, а это охулион строк кода (вместе с плагинами) и они плодятся каждый день
                              Ответить
                              • > Алсо, на TS написан VSCode, а это охулион строк кода (вместе с плагинами) и они плодятся каждый день

                                Хуево он написан, лучше б они на своем C# его писали
                                Ответить
                                • может и хуёво, но у хипстеров он самый популярный ide
                                  Ответить
                              • > По нему видно, что они скорее возьмут TS, чем JS (благо интероп бесплатный)

                                Ну да, там еще на первом месте Rust, только мейнстримом он почему-то не является. А еще есть такая хрень, как voluntary response bias

                                https://web.ma.utexas.edu/users/mks/statmistakes/biasedsampling.html
                                > Voluntary response samples: If the researcher appeals to people to voluntarily participate in a survey, the resulting sample is called a "voluntary response sample." Voluntary response samples are always biased: they only include people who choose volunteer, whereas a random sample would need to include people whether or not they choose to volunteer. Often, voluntary response samples oversample people who have strong opinions and undersample people who don't care much about the topic of the survey. Thus inferences from a voluntary response sample are not as trustworthy as conclusions based on a random sample of the entire population under consideration.
                                Ответить
                                • не является, потому что задач для него куда меньше, чем для JS/TS

                                  Про bias согласен, ты бы вот в таком сурвее участвовать не стал, а хипстер стал бы.

                                  Но если взять всё множество людей, называющих себя программистами, то бОльшая часть среди них будут как раз те, которые пишут на JS или TS и на SO, разве нет?
                                  Ответить
                                  • Именно поэтому я за PHP.
                                    Ответить
                                  • > Но если взять всё множество людей, называющих себя программистами, то бОльшая часть среди них будут как раз те, которые пишут на JS или TS и на SO, разве нет?

                                    Я думаю что далеко не все программисты зарегистрированы на SO. Вот например я там зареган, но ни одного вопроса и ни одного ответа у меня нет. Все мои вопросы обычно уже кем-то задавались, и я их легко нахожу через тот же гугл.
                                    Ответить
                                    • Это правда, тем более что на вопросы сложнее "как вернуть массив в си" на SO редко отвечают

                                      Как ты думаешь, какой процент от всех программистов в мире сидит на SO и на подобных им сайтах?
                                      Ответить
                                      • там сидит https://stackoverflow.com/users/88656/eric-lippert
                                        Ответить
                                      • > Как ты думаешь, какой процент от всех программистов в мире сидит на SO и на подобных им сайтах?

                                        Что понимать под "сидит"? Гуглит какую-то хрень, находит в выдаче гугла ответ и переходит туда? Зарегистрирован? Зарегистрирован и активно задает-отвечает на вопросы?
                                        Ответить
                                        • "активно задает-отвечает на вопросы" конечно
                                          Ответить
                                          • "участвует в revenge downvoting активитях"
                                            Ответить
                                          • > "активно задает-отвечает на вопросы" конечно
                                            А насколько активно?

                                            https://meta.stackexchange.com/questions/269334/

                                            > In September, there were 32,025 generous users who posted five times or more on the Stack Exchange network (including, SO, SF, etc.)

                                            Теперь осталось узнать, 32025 это сколько от общего числа программистов? Мне кажется что это даже меньше 1%
                                            Ответить
                                            • Да, это действительно мало.

                                              Хорошо, какие у нас есть еще источники по теме популярности языков?

                                              TIOBE, кажется, не разделяет TS и JS.


                                              Вот тут утверждается

                                              Did you know that 54% of frontend developers prefer TypeScript over JavaScript?

                                              https://tsh.io/blog/why-use-typescript/
                                              Ответить
                                              • > Did you know that 54% of frontend developers prefer TypeScript over JavaScript?

                                                Это опять опросы какие-то? Более адекватной метрикой будет количество кода, ежедневно выкладываемое на гитхаб на TS и на JS. Или например количество людей, пишущих по работе на TS и на JS. Мало ли кто там что предпочитает. Я вот например считаю что D в режиме betterC это лучше чем C, но прошивки к контроллерам я все равно на C пишу.
                                                Ответить
                                                • >гитхаб

                                                  Какой процент всего написанного в мире кода выкладывается на гитхаб, и как вычесть из него старый код (я говорил о новых проектах, старые могут быть и на JS)

                                                  Как вообще можно определить популярность языка?

                                                  Допустим я утверждаю, что самый популярный язык это Delphi.

                                                  Как доказать, что я не прав?
                                                  Ответить
                                                  • > Допустим я утверждаю, что самый популярный язык это Delphi.

                                                    > Как доказать, что я не прав?

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

                                                      В случае TS и JS есть проблема: множество "JS" будет включать в себя и "TS" тоже (потому что они обычно пишутся через запятую), и нужно сравнивать кол-во TS вакансий и кол-во JS вакансий без упоминания TS.

                                                      Есть ли у нас такая статистика?
                                                      Ответить
                                • > еще есть такая хрень, как voluntary response bias
                                  ой, да ладно!
                                  самое главное, что определенный сорт кодеров (которые протестуют на житхабах прямо посриди суппозитория) подвержен всяким поветриям сильнее любого руснявого хомячка из одноватников

                                  помню какой-то из покойных кодопоисков показывал статы под язык
                                  Ответить
                    • а Haskell, OCaml, Standard ML есть в контроллерах?
                      Ответить
                      • На хаскеле есть DSL которые код на Си синтезируют, например вот https://hackage.haskell.org/package/copilot

                        но рантайма хаскеля там нет.
                        Ответить
                  • чем тупизация тс лучше, чем у шарпа? (я без подъёба)
                    Ответить
                    • в с# можно типизировать такую функцию?
                      flat([1,[2,[3,4]]]) // [1,2,3,4]
                      Ответить
                      • C# точно нет; я видел буквально пару примеров F#, и там вроде необходимые tagged unions для этого были.
                        Ответить
                      • гетерогенные массивы это сомнительное удовольствие
                        Ответить
                        • Думай о них, как о кортежах)
                          Ответить
                        • но типизировать-то можно
                          Ответить
                          • var list = new List<dynamic>();
                            Ответить
                            • разве ты не отказался от проверки типизации в компайлтайме вообще в этом коде?
                              Ответить
                              • Отказался, конечно. Можно строк и других рандомных объектов напихать и никто не заметит пока в рантайме не наебнётся.
                                Ответить
                              • внутри функции `flat` я могу в общем и проверки добавить
                                Ответить
                                • и когда они будут работать, в рантайме?
                                  Ответить
                                • Ну а я тогда в крестах могу всё на std::any ебашить и просто добавить проверок...

                                  Всё-таки фишка была в том, чтобы конпелятор прямо во время запихивания проверял, что ты туда неподходящее говно не суёшь.
                                  Ответить
                                  • ок, вопрос, каким образом подобная функция тупизирована в тс
                                    Ответить
                                    • Как-то так наверное
                                      type Foo<T> = Array<T | Array<Foo<T>>> | T;
                                      
                                      function flat<T>(foo:Foo<T>):void {
                                      
                                      };
                                      
                                      
                                      flat<number>([1,2,3]);
                                      
                                      
                                      flat<number>([1,2,[1,2,3]]);
                                      
                                      
                                      flat<number>([1,2,[1,2,"A"]]); //ПИЗДЫХ
                                      Ответить
                                      • ну скорее

                                        type Foo<T> = Array<T | Foo<T>> | T;


                                        правда тут багор может случиться
                                        Ответить
                                    • type ElementType<T> = T extends ReadonlyArray<infer U> ? ElementType<U> : T;
                                      
                                      function flat<T extends readonly unknown[]>(x: T): ElementType<T>[]
                                      Ответить
                                      • какой unknown )))
                                        Ответить
                                        • а точно

                                          еще ts лучше c# тем что имеет unknown
                                          Ответить
                                          • в C# тоже есть динамик

                                            но он там дорогой, а в JS без разницы
                                            Ответить
                                            • unknon это не динамик
                                              Ответить
                                              • а в чем разница?

                                                в unknown можно положить, что угодно, а достать из него можно только явно проверив тип

                                                по сути ты откладываешь проверку типов на время исполнение (и на программиста)

                                                динамик примерно тоже самое
                                                Ответить
                                                • Ты что, дальтоник, MAKAKA, — зелёный цвет от оранжевого отличить не можешь? Турист.
                                                  Ответить
                                                • я как понял - то динамик как any, ему можно любой метод дергать даже пока он dynamic
                                                  Ответить
                                                  • это правда, методы дергаюца рефлексией

                                                    ну ок, дайнамик это как анноун плюс эни)

                                                    анноун же нужно в эни кастануть чтобы что-то вызвать?

                                                    в C# еще есть object (примерно как void*), он тоже похож на анноун (его нужно кастануть чтобы дернуть метод) но он вероятно боксит вауле тайпы
                                                    Ответить
                                                    • не знаю че вы до unkown доебались, суть не вне вообще

                                                      вот вам без unkown
                                                      type ElementType<T> = T extends ReadonlyArray<infer U> ? ElementType<U> : T;
                                                      
                                                      const flat= <T>(x: T[]): ElementType<T>[] => {
                                                          return x.reduce<ElementType<T>[]>((res, curr) => {
                                                            const flattened = Array.isArray(curr) ? flat<T>(curr) : [curr] as ElementType<T>
                                                            
                                                            return res.concat(flattened)
                                                          }, []);
                                                      };
                                                      Ответить
                                                      • А в чём смысл этой типизации? Что оня проверяет?
                                                        type ElementType<T> = T extends ReadonlyArray<infer U> ? ElementType<U> : T;
                                                        
                                                        export const deepFlatten = <T>(x: T[]): ElementType<T>[] => {
                                                            return x.reduce<ElementType<T>[]>((res, curr) => {
                                                              const flattened = Array.isArray(curr) ? deepFlatten<T>(curr) : [curr] as ElementType<T>
                                                              
                                                              return res.concat(flattened)
                                                            }, []);
                                                        };
                                                        
                                                        console.log(deepFlatten(([1,2,[1,2,"A"]])));  // [1, 2, 1, 2, "A"]

                                                        Ня мой няискушённый взгляд, её можня упростить вот так:
                                                        const deepFlatten = (x: any)=> {
                                                            return x.reduce((res: any, curr: any) => {
                                                              const flattened = Array.isArray(curr) ? deepFlatten(curr) : [curr]
                                                              
                                                              return res.concat(flattened)
                                                            }, []);
                                                        };

                                                        И нячего ня изменится.
                                                        Ответить
                                                        • ты знаешь что значит слово "типизировать"?

                                                          я объясню

                                                          мой пример
                                                          const res = deepFlatten(([1,2,[1,2,"A"]])) // res: (number | string)[]

                                                          твой пример:
                                                          const res = deepFlatten(([1,2,[1,2,"A"]])) // res: any
                                                          Ответить
                                                          • Типизация нужня для того, чтобы ограничивать.

                                                            Сделай, пожалуйста, типизацию правильня — так, чтобы оня работала согласня демонстраци MAKAKИ.
                                                            Ответить
                                                            • Хрюкни.
                                                              Ответить
                                                            • >Типизация нужня для того, чтобы ограничивать.
                                                              >Сделай, пожалуйста, типизацию правильня

                                                              извини, взгляды на типизацию от фанатов джавы и крестов 2000-х мне не очень интересны

                                                              можешь сделать сама, это будет сделать проще чем то что я сделал
                                                              Ответить
                                                              • Для чего же, по мнению современных стильных разработчиков, нужня статическая типизация?
                                                                Ответить
                                                                • просто шаг статической проверки кода

                                                                  если типизация не будет давать мне выражать то что я хочу выразить - то нахуй такую типизацию

                                                                  для фанатов джавы и с++ 2000 типизация - это способ скомпелять программу, поэтому вы никакими категориями кроме ограничения мыслить не можете - шаг в сторону и конпелятор по жопе ремнем даст
                                                                  Ответить
                                                                  • > статической проверки
                                                                    Проверки чего имення? В чём заключается эта проверка?
                                                                    Ответить
                                                                    • >Проверки чего имення

                                                                      преттиер у меня проверяет что отступ 4 пробела и точки с запятой везде
                                                                      линтер проверяет чтобы конста в свиче не было
                                                                      кастомный линтер проверяет чтобы в аргументов хука не было зависимостей которые я объявил как статические

                                                                      тайпскрип проверяет что типы которые выводятся из функций можно привести один к одному
                                                                      Ответить
                                                                      • > тайпскрип проверяет что типы которые выводятся из функций можно привести один к одному
                                                                        А зачем тебе это нужня? Зачем, няпример, может понядобится преттиер, понятня: чтобы код красивый был. А зачем тебе проверять, что типы, которые выводятся из функций, можня привести один к одному?
                                                                        Ответить
                                                                        • чтобы обеспечить гарантию корректной работы программы до запуска
                                                                          Ответить
                                                                          • Ой, ну ладня, пришли умные дяди и всё проспойлерили. Короче, Склифосовский: типизация нужня для того, чтобы запретить тебе писать някоторые (синтаксически корректные) конструкции. Няпример, такие:
                                                                            void foo(const std::string & str) {
                                                                                int x = str;
                                                                            }

                                                                            Всё, это единственный её смысл. И имення запретом няписания някоторых синтаксически корректных конструкций статическая типизация, действительня, обеспечивает пусть и (очень) далеко ня гарантию, но хотя бы повышение шансов корректной работы программы.
                                                                            Ответить
                                                                            • >типизация нужня

                                                                              лично мне типизация нужна чтобы доказать корректность работы программы

                                                                              >И имення запретом няписания някоторых синтаксически корректных конструкций статическая типизация

                                                                              да-да очень интересно продолжайте
                                                                              Ответить
                                                                              • > доказать корректность работы программы

                                                                                Да откуда вы лезете...

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

                                                                                З.Ы. Если в рамках системы типов даже не получается описать что делает функция, о какой корректности может быть речь? 90% контракта в комментах и документации остаётся.
                                                                                Ответить
                                                                                • а еще фанаты жавы и с++ поголовно математики и слова "доказать" и "корректность" кроме как в математическом смысле вопринять неспособны
                                                                                  Ответить
                                                                                  • Это скорее фанаты Coq и OCaml)

                                                                                    Но переопределять значения слов и правда не стоит. Без общего словаря людям будет трудно общаться
                                                                                    Ответить
                                                                                    • я тут кидал уже определение по Пирсу, там типизация - доказательство отсутствия в программе определенных поведений. Для меня это синонимично доказательству корректности но математики не согласны
                                                                                      Ответить
                                                                                  • > "доказать" и "корректность" кроме как в математическом смысле вопринять неспособны
                                                                                    А в каком смысле их нядо воспринимать? Философском? Поэтическом?
                                                                                    Ответить
                                                                                  • > слова "доказать*" и "корректность*" кроме как в математическом смысле

                                                                                    А надо в маркетологическом, когда у каждого слова стоит звёздочка и требуется пояснение?
                                                                                    Ответить
                                                                                • я не понял нахрюка

                                                                                  внезапно совпавшие имена типов дают какие-то контракты

                                                                                  то, что ты лично ты понимаешь под контрактами что-то другое, это как бы твои собственные трудности дела
                                                                                  Ответить
                                                                                  • > дают какие-то контракты

                                                                                    Какую-то часть контракта (совсем небольшую) они формализуют, я согласна.

                                                                                    Какая-то часть кривых/хуёвых/тормозных программ при проверке этого контракта, безусловно, отсеивается. Но далеко не все.

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

                                                                                      > юнит-тест доказывает корректность
                                                                                      - ну в общем именно это он и делает: доказывает корректность на некотором наборе аргументов. на произвольном наборе он понятное дело бесполезен
                                                                                      Ответить
                                                                                  • > лично ты понимаешь под контрактами что-то другое

                                                                                    Ну вот есть у тебя функция:
                                                                                    // рисует кнопку
                                                                                    void draw(Button e);
                                                                                    Часть контракта записана формально: функция принимает кнопку.
                                                                                    Часть контракта записана няформально: функция рисует эту кнопку.

                                                                                    Я одна что ли считаю, что "функция рисует эту кнопку" -- тоже важная часть контракта?
                                                                                    Ответить
                                                                                    • я уже писал по этому поводу: я не считаю неформальную часть контрактом вовсе, потому что в ЯП общего назначения нет никаких способов гарантировать этот "контракт"

                                                                                      нет гарантий – нет контракта

                                                                                      но это мы уже на третий круг пошли вроде
                                                                                      Ответить
                                                                                • > Да откуда вы лезете...

                                                                                  На, изучай:

                                                                                  https://ru.wikipedia.org/w/?curid=484455
                                                                                  Ответить
                                                                              • > чтобы доказать корректность работы программы
                                                                                ...путём запрета части синтаксически корректных конструкций. Всё* правильня.


                                                                                *Ну, кроме того, что в мейнстримных язычках "корректность работы" можня доказать исключительня ручкой и бумажкой.
                                                                                Ответить
                                                                            • Хуйлядня
                                                                              Ответить
                                                                        • > зачем

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

                                                                          > гарантию корректной работы

                                                                          Ну-ну.
                                                                          Ответить
                                                                          • А вот фиг. Синтаксически неверные программы и динамический питух не станет клевать.
                                                                            Ответить
                                                                            • > Синтаксически неверные программы

                                                                              А типизация разве не к синтаксическому уровню относится? Она ведь ничерта не понимает в семантике программы, просто проверяет какие-то правила.

                                                                              Или я туплю?
                                                                              Ответить
                                                                              • Ничто не мешает тебе построить синтаксическое дерево для программы с нарушением системы типов, а вот для синтаксической ошибки ты его уже не построишь

                                                                                Представь синтаксическое дерево для такого кода
                                                                                int main() {
                                                                                return 1.24;
                                                                                }


                                                                                А вот для такого уже хуй
                                                                                asduh erЫЫЫЫЫЫ
                                                                                Ответить
                                                                              • Ну coq, где типы и термы — одно и то же, и для проверки типов нужно выражения вычислять, всё-таки довольно трудно натянуть на синтаксиальные проверки.
                                                                                Ответить
                                                                                • > трудно натянуть на синтаксиальные проверки

                                                                                  Да, но по сути ведь мы на ноды в AST наклеиваем некие этикетки, на которых написан тип. И проверяем, что какие-то правила для этих типов выполнены. О том, какую семантику потом будет иметь это AST, конпелятор во время тайпчека даже не задумывается.
                                                                                  Ответить
                                                                                  • Нууу такое. В Coq тайпчекер (могу ошибаться, конечно) должен эвалюировать код в соответствии с его операционной семантикой. В Erlang dialyzer тоже делает символьные вычисления в соответствии с сёмантикой языка (причём он это делает настолько скурпулёзно, что иногда у людей возникают проблемы с интерпретацией его предупреждений).
                                                                                    Ответить
                                                                                    • К примеру:
                                                                                      -module(gc).
                                                                                      
                                                                                      -export([foo/1, bar/1]).
                                                                                      
                                                                                      foo(A) ->
                                                                                        B = A + 1,
                                                                                        if is_pid(A) ->
                                                                                            A;
                                                                                           is_tuple(A) ->
                                                                                            B
                                                                                        end.
                                                                                      
                                                                                      bar(A) ->
                                                                                        if is_pid(A) ->
                                                                                            A;
                                                                                           is_tuple(A) ->
                                                                                            A
                                                                                        end.


                                                                                      Dialyzer выводит типы:
                                                                                      typer --plt rebar3_23.2.4_plt gc.erl
                                                                                      
                                                                                      %% File: "gc.erl"
                                                                                      %% --------------
                                                                                      -spec foo(_) -> none().
                                                                                      -spec bar(pid() | tuple()) -> pid() | tuple().

                                                                                      Т.е. он знает, что плюсик работает только для намов, и что иф идёт после него, поэтому в первом случае он на основе сёмантики заключает, что функция всегда упадёт. А во втором случае он проходит по обеим веткам, т.е. он знает сёмантику ифа.
                                                                                      Так что не знаю, не знаю.
                                                                                      Ответить
                                                                              • > А типизация разве не к синтаксическому уровню относится? Она ведь ничерта не понимает в семантике программы, просто проверяет какие-то правила.

                                                                                Какие правила тебе проверяет модификатор volatile в C и C++?
                                                                                Ответить
                                                                          • Крестовый поход Борманда против типизации))
                                                                            Ответить
                                                                            • > Крестовый поход Борманда против типизации))

                                                                              Что значит против?

                                                                              Я двумя лапками за типизацию, но я осознаю её ограничения.
                                                                              Ответить
                                                                        • Хуюжня
                                                                          Ответить
                                                                    • Хуимення
                                                                      Ответить
                                                                  • > если типизация не будет давать мне выражать то что я хочу выразить

                                                                    https://youtu.be/TGRDYpCmMcM?t=1635
                                                                    Ответить
                                                                • типизация нужна для валидации правильности кода до его выполнения на стадии компиляции
                                                                  Ответить
                                                              • илита!)))
                                                                Ответить
                                                              • > извини, взгляды на типизацию от фанатов джавы и крестов 2000-х мне не очень интересны

                                                                Она тебе дала определение типизации по Пирсу. А он вовсе не какой-то джава мэн.
                                                                Ответить
                                                                • > определение типизации по Пирсу
                                                                  https://www.youtube.com/watch?v=IJgkocKRmtg
                                                                  Ответить
                                                                  • Ня правильно пишешь, нядо было ответить: да, коллега, буткемпу нядо бы перечитать TAPL.
                                                                    У нас же тут приличный форум.
                                                                    Ответить
                                                                    • Да, у нас самый приличный форум Рунета, а может быть, и всего Интернета!
                                                                      Ответить
                                                                  • http://khizha.dp.ua/library/Benjamin_C_Pierce_-_Types_and_Programming_Languages_%5Bru%5D.pdf
                                                                    Ответить
                                                                • ну дай это определение, чо
                                                                  Ответить
                                                                  • я сам нашел

                                                                    > Система типов — это гибко управляемый синтаксический метод доказательства отсутствия в программе определенных видов поведения при помощи классификации выражений
                                                                    языка по типам вычисляемых ими значений.

                                                                    что-то не вижу тут ничего про ограничения
                                                                    Ответить
                                                                    • > что-то не вижу тут ничего про ограничения
                                                                      > отсутствия в программе определенных видов поведения

                                                                      this
                                                                      Ответить
                                                                      • тут имеется в виду другое: что можно уменьшить множество программ до множества корректно типизированных программ и считать что это подмножество не имеет в себе определенных видов поведения

                                                                        ничего про ограничения я опять же не вижу
                                                                        Ответить
                                                                        • > уменьшить множество программ до множества корректно типизированных программ
                                                                          И, конечно, таким образом мы никоим образом ня ограничиваем множество синтаксически корректных программ, запрещая программисту писать часть из них, нят-нят! Ведь ограничения — это для бумеров из прошлого века.
                                                                          Ответить
                                                                          • Вот тут мы доходим до сути дискуссии

                                                                            У нас есть множество синтаксически корректных программ. система типов - это метод доказательства корректности, мол, вот есть подмножество правильно типизированных программ и в нем нежелательных поведений нет, а есть множество нетипизированных программ и в них нежелательные поведения есть

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

                                                                            и только те кого в детстве пиздил компилятор и у кого опции запустить неправильно типизированную программу нет - те считают что типизация что-то там запрещает
                                                                            Ответить
                                                                            • > просто мы с точки зрения системы типов считаем ее содержащей нежелательные поведения

                                                                              Т.е. в тайпскрипте это просто предупреждения, а не ошибки, обрывающие конпеляцию?
                                                                              Ответить
                                                                              • конпелятор != система типов
                                                                                Ответить
                                                                                • > конпелятор != система типов

                                                                                  Да, но какой смысл что-то там проверять, а потом не использовать результаты этой проверки?

                                                                                  Ты реально после каждого коммита перечитываешь результаты проверки типов глазками и сам принимаешь решение, стоит ли запускать получившуюся хуйню?
                                                                                  Ответить
                                                                                  • я просто пытаюсь объяснить взгляд на типизацию человека начавшего с схемы и js

                                                                                    вопрос как использовать результаты и нахуя из другой плоскости
                                                                                    Ответить
                                                                              • >Т.е. в тайпскрипте это просто предупреждения, а не ошибки, обрывающие конпеляцию?


                                                                                Ошибки системы типов прерывают компиляцию, но их можно заткнуть аннотацией.


                                                                                Забавно, что изначально статическая типизация была нужна компилятору, чтобы отличать как миниум целые от чисел с плавающей точкой

                                                                                А теперь она нужна программисту в первую очередь)
                                                                                Ответить
                                                                                • > отличать как миниум целые от чисел с плавающей точкой

                                                                                  Ну он мог бы въебать там discriminated union и наказать программиста хуёвым пирфомансом. В общем-то JS/TS так и сделают.
                                                                                  Ответить
                                                                                  • Это он сейчас может, а 60 лет назад небось и не мог
                                                                                    Ответить
                                                                                    • Да и тогда мог, лиспы же как-то работали.
                                                                                      Ответить
                                                                                      • Я не знаю кстати как это работало в лисп машине, надо почитать

                                                                                        тормозило поди
                                                                                        Ответить
                                                                            • Нужно просто по-нять, что эффективность статических проверок фундаментально ограничена проблемой остановки.

                                                                              А доказательство проблемы остановки подозрительно няпоминает доказательство теоремы о неполняте, что вкупе с соотношеняем Карри-Ховарда намекает ня неку-ю фундаментальную связь. В связи с этим сами някайте про правильное определение "доказательства" и "корректности".
                                                                              Ответить
                                                                              • это ты к чему?
                                                                                Ответить
                                                                              • > эффективность статических проверок фундаментально ограничена проблемой остановки.

                                                                                тут наверное должны заплакать авторы IDE для скриптовых языков)

                                                                                (имеются ввиду IDE со всякими инспекциями а-ля Intellij)
                                                                                Ответить
                                                                                • > тут наверное должны заплакать авторы IDE для скриптовых языков)

                                                                                  Авторы IDE для крестов смотрят ня этих неженок с нядоумением! (≧◡≦)
                                                                                  Няпоминаю, что определение синтаксической корректности программы ня крестах эквивалентно проблеме останова.
                                                                                  Ответить
                                                                                  • Ну да, пушо шаблоны турингполны
                                                                                    Ответить
                                                                                    • Трапу ответил.
                                                                                      Ответить
                                                                                      • Если я не буду отвечать трапам, то мне придется не говорить с Гостом/Полиной, и вероятно скоро с Бормандом тоже

                                                                                        Что мне тогда тут на говнокоде делать?
                                                                                        Ответить
                                                                                        • Сам не заметишь, как круг твоего общения будет состоять только из трапов и пидоров.
                                                                                          Ответить
                                                                                        • И со мной, т.к. я девочка-волшебница, которая пишет о себе в мужском роде, чтобы мужики-козлы не приставали.
                                                                                          Ответить
                                                                                          • Ну вот видишь

                                                                                            Останутся в итоге одни Ротоёбы: у них-то с полом никаких пробелм нет
                                                                                            Ответить
                                                                                          • > чтобы мужики-козлы не приставали.

                                                                                            Не парься, сестрёнка. Нас тут скоро будет большинство, а потом ГК закроют за пропаганду.
                                                                                            Ответить
                                                                                  • Няпомнил тябе зя щяку, пряверь.
                                                                                    Ответить
                                                                            • 1. Есть множество синтаксически корректных программ

                                                                              2. Есть его подмножество: синтаксически корректные программы, у которых сошлись типы

                                                                              3. У него есть подмножество корректных программ, то есть тех , которые выдают верный (в соответствтии с ТЗ) результат для всего множества входных параметров

                                                                              Под словом "корректная программа" обычно понимают "3"

                                                                              Парсер, строящий AST, гарантирует нам 1.
                                                                              Статический анализ типов гарантирует 2.

                                                                              А вот 3 можно доказать или всякими коками, или перебором всех входных параметров (примерно этим занимаются юнит тесты, с какой-то вероятно надеждой на индукцию:)), но так как тесты проверяют не все входные параметры, то на самом деле корректность и они не доказывают

                                                                              Ты применил термин "корректность" к 2 вместо 3, и тем вызвал волну бугурта
                                                                              Ответить
                                                                              • > А вот 3 можно доказать или всякими коками

                                                                                Даже не совсем так. В 1. есть подмножество 4, не-Тьюринг полных программ, использующих только структурную (ко)?рекурсию. В нём можно доказать соответствие контрактам.
                                                                                Ответить
                                                                                • Я думал, мы называем программами код на тюринг-полных языках)

                                                                                  Так-то наверное можно и статически корректность регулярных выражений доказать.
                                                                                  Ответить
                                                                                  • > Я думал, мы называем программами код на тюринг-полных языках)

                                                                                    Ну ты упомянул кок, а он не Тьюринг-полный. А в целом, Тьюринг-полнота не особо-то и нужна в большинстве случаев, так что зачем ей ограничиваться.
                                                                                    Ответить
                                                                            • Смешались в кучу кони, люди...

                                                                              Система типов запрещает тебе писать синтаксически корректные программы, нярушающие т`иповые контракты. Ня этом её функции заканчиваются.

                                                                              Когда ты запускаешь программу, някорректную с точки зрения типизации, ты всего лишь отказываешься от типизации, ня более того. В этом смысле единственная разница между тайпскриптом и джавой образца 1998-го года — это то, что от типизации тайпскрипта ты можешь отказаться, а от типизации джавы — нят.
                                                                              Ответить
                                                                              • >Система типов запрещает

                                                                                я объяснил как мог почему ты так считаешь и почему не можешь считать по-другому

                                                                                если не получилось объяснить - штош
                                                                                Ответить
                                                                                • У этой тян ты тоже не будешь ментором
                                                                                  Ответить
                                                                                • Да нят, это ты ня понимаешь.

                                                                                  Вот тебе простая задачка ня ночь: няпиши программу, корректную с точки зрения системы типизации, но няправильно типизированную. Это, очевидня, сделать можно, поскольку зумерские системы типов ничего ня запрещают и ня ограничивают.
                                                                                  Ответить
                                                                                  • корректная с точки зрения системы типов программа всегда правильно типизирована
                                                                                    Ответить
                                                                                    • Правильня. Таким образом, ты не можешь няписать корректную с точки зрения системы типов программу, содержащую ошибки типизации. Она тебе это запрещает.

                                                                                      Чтобы всё таки запустить някорректную с т.з.СТ программу (хотя казалось бы: зачем запускать някорректную программу?), тебе нужно отказаться от типизации, только и всего. Твоя свобода от запретов — иллюзия, мистер Андерсон.
                                                                                      Ответить
                                                                                      • тебе запрещает конпелятор а не система типов

                                                                                        неужели так сложно понять?
                                                                                        Ответить
                                                                                        • Пардон, но ведь компилятор, няпример, TypeScript мне как раз ничего ня запрещает. Имення в этом и проблема.

                                                                                          Простой пример:
                                                                                          // https://www.typescriptlang.org/play?jsx=0#code/MYewdgzgLgBAhgEwTAvDAFHAXDMBXAWwCMBTAJwBoYid9jyBKWw0s1APnhgGpqBuALAAoYaEggANiQB0EkAHNMSdAEYqAcgBM6hg0FCgA
                                                                                          
                                                                                          const add = (a: number, b: number): number => a + b;
                                                                                          console.log(add(1, '2'));


                                                                                          С точки зрения системы типов этот код някорректен. Система типов мне запрещает такое писать. Одняко я могу сказать компилятору, что на мнение системы типов мне понякать, и тогда компилятор успешно скомпилирует эту программу. Имення компилятор мне разрешил творить ерунду: компилятор, а не система типов!
                                                                                          Ответить
                                                                                          • >Система типов мне запрещает такое писать

                                                                                            ну ты же написала
                                                                                            Ответить
                                                                                            • > ну ты же написала
                                                                                              Так я и в джаве такое могу няписать, смотри:
                                                                                              class Nya {
                                                                                                  public static int add(int a, int b) {
                                                                                                      return a + b;
                                                                                                  }
                                                                                                  
                                                                                                  public static void main(String[] args) {
                                                                                                      System.out.println(add(1, "2")); 
                                                                                                  }
                                                                                              }

                                                                                              И пример ня TypeScript, и пример ня Java някорректны с точки зрения системы типов.
                                                                                              Одняко компилятор TypeScript может проигнорировать ошибки типизации, а компилятор Java — ня может. Вот и вся разница: не в системе типов, а в компиляторах.
                                                                                              Ответить
                                                                                              • >Вот и вся разница: не в системе типов, а в компиляторах.

                                                                                                я и говорю что запрещают и ограничивают конпеляторы а не системы типов
                                                                                                Ответить
                                                                                                • ...а системы типов ограничивают множество корректных с т.з.СТ программ.
                                                                                                  Ответить
                                                                                              • "2" не значит не корректно .. "2" всегда может стать 2 ... главное вовремя проверить что "фыв" никогда не будет числом
                                                                                                Ответить
                                                                                                • 0x32 не значит не корректно ..0x32 всегда может стать 0x2 ... главное вовремя проверить что 0xd184d18bd0b2 никогда не будет числом
                                                                                                  Ответить
                                                                                                  • а у тебя есть правила перехода 0x32 в 2? Вот у компилятора есть в обе стороны "2" -> 2, 2->"2" и самое главное "2" никогда не будет равно 32... а у тебя?
                                                                                                    Ответить
                                                                                        • >тебе запрещает конпелятор а не система типов


                                                                                          Компилятор проводит статический анализ программы и если у нее не сходятся типы, то компиляция падает

                                                                                          Если что-то не позволяет сделать система типов (например приравнять целое к указателю) то и компилятор этого не позволяет.
                                                                                          Ответить
                                                                                          • >позволяет сделать система типов

                                                                                            система типов ничего не позволяет и не запрещает. Это способ разметить множество програм на 2 подмножества и все
                                                                                            Ответить
                                                                                            • >система типов ничего не позволяет и не запрещает.
                                                                                              > Это способ разметить множество програм на 2 подмножества и все

                                                                                              Отлично

                                                                                              Назовем первое подмножество "корректно типизированные программы"

                                                                                              Компилятор проверяет, что твоя программа относится к первому подмножеству

                                                                                              Нахрюки на "джаву 2000х" связаны не с тем, что компилятор форсил статическую проверку, а с тем, что система типов была насколько убога, что невозможно было написать "корректно типизированную программу" не наплодив говна, бойлерплейта и копипасты

                                                                                              Так что виноват не компилятор, а система типов
                                                                                              Ответить
                                                                                              • я уже не знаю о чем мы спорим
                                                                                                Ответить
                                                                                                • > я уже не знаю о чем мы спорим

                                                                                                  Все давным-давно поняли точку зрения друг друга. Но спорить то о чём-то надо )))
                                                                                                  Ответить
                                                                                • > почему ты так считаешь и почему не можешь считать по-другому

                                                                                  У вас множество программ с "нежелательным поведением" не так сильно бьёт по яйцам, вот и вся разница (мы тоже можем запустить часть программ забив на их "нежелательное поведение").

                                                                                  Но зачем расставлять типы, выполнять проверку и... не пользоваться её результатами я, наверное, никогда не пойму. Мартышкин труд какой-то. Почему бы не взять вместо этого обычный JS?
                                                                                  Ответить
                                                                                  • >множество программ с "нежелательным поведением" не так сильно бьёт по яйцам

                                                                                    Привет, undefined!
                                                                                    С тебя NaN рублей
                                                                                    Ответить
                                                                                    • > Привет, undefined!
                                                                                      > С тебя NaN рублей

                                                                                      Ну, по крайней мере из-за этого на другом конце программы у случайного юзера поле с полом не превратилось в ящик шрёдингера.
                                                                                      Ответить
                                                                                      • А где оно превратилось? В крестах, где неинициализированный int был?
                                                                                        Ответить
                                                                                  • >Но зачем расставлять типы, выполнять проверку и... не пользоваться её результатами

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

                                                                                    только с конпелируемых языках фейл конпелятора значит что проги в итоге не будет
                                                                                    Ответить
                                                                                    • В компилируемых языках ты тоже можешь обмануть систему типов

                                                                                      В джаве ты можешь скастить всё к Object, в C++ ты можешь вообще reinterpreter_castнуть что угодно во что угодно

                                                                                      Такая программа упадет в рантайме*, как и в JS

                                                                                      > моя прога говно и пошел ее деплоить
                                                                                      Всегда так делаю


                                                                                      *упадет она в джаве и C#
                                                                                      В С++ будет UB
                                                                                      Ответить
                                                                                      • >обмануть систему типов

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

                                                                                        обмануть можно конпелятор
                                                                                        и ограничить и запретить может конпелятор

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

                                                                                А что такое "система типов"? Ну вот допустим есть в Си тип uint8_t и тип uint64_t. Предположим, кто-то спрашивает: "Зачем мне uint8_t если есть более жирный тип uint64_t? Очевидно ведь, что можно всегда использовать самый жирный тип, а если нужно чтобы после перехода за 255 становилось 0, просто используй битовую маску или находи остаток от деления на 256, и все будет круто.".
                                                                                Какой будет ответ, и будет ли он иметь отношение к тому, что система типов запрещает писать какие-то программы, нарушающие какие-то там контракты?
                                                                                Ответить
                                                                                • >А что такое "система типов"?

                                                                                  [wiki]
                                                                                  совокупность правил в языках программирования, назначающих свойства, именуемые типами, различным конструкциям, составляющим программу — таким как переменные, выражения, функции или модули
                                                                                  [/wiki]

                                                                                  >Какой будет ответ

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

                                                                                  A = B

                                                                                  все возможные значения типа "B" отображаются на значения из множества типа "A"
                                                                                  Ответить
                                                                                  • > совокупность правил в языках программирования, назначающих свойства, именуемые типами, различным конструкциям, составляющим программу — таким как переменные, выражения, функции или модули

                                                                                    Типы это совокупность каких-то там правил. Гениально

                                                                                    Шерлок Холмс и доктор Ватсон летели на воздушном шаре. Но был такой сильный туман, что они заблудились. Но вот порыв ветра, облака рассеиваются, Шерлок Холмс и доктор Ватсон приземляются и видят человека, пасущего овец.
                                                                                    — Скажите, любезнейший, а где мы находимся? — спрашивает доктор Ватсон.
                                                                                    Подумав, пастух отвечает:
                                                                                    — В гондоле воздушного шара.
                                                                                    Новый порыв ветра подхватывает шар, и Шерлок Холмс с доктором Ватсоном летят дальше.
                                                                                    — Ох, уж эти математики! — восклицает Холмс.
                                                                                    — Постойте, Холмс, но как вы догадались?
                                                                                    — Это элементарно, Ватсон! Он ответил, подумав. И дал совершенно верный, но совершенно бесполезный ответ.
                                                                                    Ответить
                                                                                • В первом приближении, система типов — это нябор ограничений на допустимые множества знячений переменных программы и функция, которая по этому нябору и исходной программе выдаёт ответ ня вопрос, существует ли нябор входных данных, для которых в программе будет нярушено какое-либо ограничение.
                                                                                  Ответить
                                                                                  • > В первом приближении, система типов — это нябор ограничений на допустимые множества знячений переменных программы и функция, которая по этому нябору и исходной программе выдаёт ответ ня вопрос, существует ли нябор входных данных, для которых в программе будет нярушено какое-либо ограничение.

                                                                                    Нет, всё значительно сложнее. В GCC есть __attribute__ ((may_alias)) для типа, который говорит, что вот эта переменная может быть по адресу, где есть какая-то другая переменная другого типа, допстимые множества она никак не ограничивает. Есть _Atomic в Си, который для того, чтобы переменная менялась и читалась атомарно, допстимые множества она никак не ограничивает. Типы это очень сложный концепт, и не всегда типы нужны чтобы компилятор на что-то там ругался если что-то не так как надо.
                                                                                    Ответить
                                                                                    • Разве _Atomic как-то относится к типам?
                                                                                      А volatile?
                                                                                      А register?
                                                                                      А storage class?
                                                                                      Ответить
                                                                                      • > Разве _Atomic как-то относится к типам?

                                                                                        Конечно же относится. А что, нет?

                                                                                        > А volatile?
                                                                                        > А register?
                                                                                        > А storage class?

                                                                                        Да, да, да.
                                                                                        Ответить
                                                                                        • На мой взгляд нет.

                                                                                          Я не математик, но мне кажется, что тип это множество значений

                                                                                          Какие значения добавляет/удаляет ключевое слово "volatile"?
                                                                                          Ответить
                                                                                          • > Я не математик, но мне кажется, что тип это множество значений

                                                                                            Математики наверное тут бы не согласились. Тут я плаваю, так что можете оспаривать. Множества определяются через предикаты, а типы – по конструкции.

                                                                                            В теории множеств имеет смысл следующее утверждение: "множество X – это множество элементов, для которых верен предикат is_X".

                                                                                            В теории типов подобное утверждение смысла не имеет, т.к. для типа X предикат is_X верен по конструкции.
                                                                                            При subtyping, где предикаты вида is_X всё-таки имеют место, тем не менее нельзя определить новый тип через произвольный предикат.

                                                                                            Как-то так. Теория типов и теория множеств оперируют обе оперируют некими коллекциями, но на этом сходство оканчивается.
                                                                                            Ответить
                                                                                            • У меня упрощенное представление о теории типов:)

                                                                                              >нельзя определить новый тип через произвольный предикат.

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

                                                                                              Так какое же правильное определение типа?
                                                                                              Ответить
                                                                                              • > Так какое же правильное определение типа?
                                                                                                А вам правильное с точки зрения какого академика?
                                                                                                В более общем смысле, термин системы типов (или теория типов, type
                                                                                                theory) относится к намного более обширной области исследований в
                                                                                                логике, математике и философии. В этом смысле типы были впервые
                                                                                                формально описаны в начале 1900-х годов как средство избежать
                                                                                                логических парадоксов, угрожавших основаниям математики, например,
                                                                                                парадокса Рассела (Russell, 1902). В течение двадцатого века типы
                                                                                                превратились в стандартный инструмент логики, особенно в теории
                                                                                                доказательств (см. Gandy, 1976 и Hindley, 1997), и глубоко проникли в язык
                                                                                                философии и науки. В этой области основными достижениями были
                                                                                                теория типов Рассела (ramified theory of types) (Whitehead and Russell,
                                                                                                1910), простая теория типов (simple theory of types) Рамсея (Ramsey,
                                                                                                1925)  основа для простого типизированного лямбда-исчисления Чёрча
                                                                                                (Church, 1940), конструктивная теория типов (constructive theory of
                                                                                                types) Мартина-Лёфа (Martin-Löf, 1973, 1984) и чистые системы типов
                                                                                                (pure type systems) Берарди, Терлоу и Барендрегта (Berardi, 1988;
                                                                                                Terlouw, 1989; Barendregt, 1992).


                                                                                                КМК, этот вопрос равнясилен вопросу "в каком языке ООП правильное".
                                                                                                Ответить
                                                                                      • _Atomic и volatile это точно части типа, они даже участвуют в проверках, как и const. Нельзя взять обычный указатель на атомик тип, к примеру.

                                                                                        storage class -- нет.
                                                                                        Ответить
                                                                                        • register и const действительно ограничивают множество действий над объектом, а что мне запрещает делать volatile?

                                                                                          Давайте уже определение типа тогда, потому что если тип это множество значений (ну окей, плюс еще множество допустимых действий над ними) то volatile всё равно выпадает
                                                                                          Ответить
                                                                                          • > что мне запрещает делать volatile

                                                                                            _Atomic int, volatile int и int имеют разную операционную семантику. Просто они выглядят очень похоже.

                                                                                            Система типов в данном случае не даёт их бездумно смешивать между собой.
                                                                                            Ответить
                                                                                            • >имеют разную операционную семантику.

                                                                                              а как это связано с типами?

                                                                                              >Система типов в данном случае не даёт их бездумно смешивать между собой.

                                                                                              Вообще не дают смешивать только указатели, то есть тип всё еще определяется множеством значений и множеством допустимых операций над объектом?
                                                                                              Ответить
                                                                                        • > storage class -- нет.

                                                                                          "register" это storage class. У "register" в Си есть такое интересное свойство, что на него нельзя взять указатель.
                                                                                          register int a = 0;
                                                                                          void *a_p = &a; // error

                                                                                          Все еще думаешь что не имеет?
                                                                                          Ответить
                                                                                    • Так ни "__attribute__ ((may_alias))", ни "_Atomic" — это ня типы, это спецификаторы, которые к теории типов никакого отняшения ня имеют.
                                                                                      Ответить
                                                                                      • > Так ни "__attribute__ ((may_alias))", ни "_Atomic" — это ня типы, это спецификаторы, которые к теории типов никакого отняшения ня имеют.

                                                                                        Не имеют потому что что?
                                                                                        Ответить
                                                                                        • Потому что теория типов рассматривает типы. Правила няписания цифр, к примеру, к теории чисел тоже ня относятся.

                                                                                          "int" и "_Atomic int" — это просто два разных типа с разными множествами допустимых знячений, ня более того.
                                                                                          Ответить
                                                                                          • > "int" и "_Atomic int" — это просто два разных типа с разными множествами допустимых знячений, ня более того.

                                                                                            "int" и "_Atomic int" имеют разные множества допустимых значений? И в чем же они разные?

                                                                                            И если это два разных типа, каким образом это не имеет отношение к теории типов?
                                                                                            Ответить
                                                                                            • > имеют разные множества допустимых значений?
                                                                                              Да. В первом можня хранить только int(0), int(1), int(2) и так далее, а во втором — только "_Atomic int"(0), "_Atomic int"(1), "_Atomic int"(2) и так далее.

                                                                                              > И в чем же они разные?
                                                                                              Я бы сказала "в конструкторе", но, боюсь, тогда дальше по цепочке придётся копипастить какую-нябудь лекцию по теории типов. Так что скажу просто: символами перед открывающей скобочкой.

                                                                                              > И если это два разных типа, каким образом это не имеет отношение к теории типов?
                                                                                              Очень просто: достаточня убрать пробел после "_Atomic" и объявить, что все типы, имена которых нячинаются со слова "_Atomic" (няпример, "_Atomicint"), будут иметь семантику атомарных.
                                                                                              Ответить
                                                                                              • В таком случае и "const int" с "int" разные типы, просто существует функция для отображения "const int" в "int", верно?
                                                                                                Ответить
                                                                                                • Ну да. Существует (в сишке няявня, в крестах для user-defined типов явня) функция "operator=(int, const int)", присваивающая первому аргументу второй, а функции "operator=(const int, int)" ня существует.
                                                                                                  Ответить
                                                                                                  • > "operator=(const int, int)" ня существует.
                                                                                                    а конструктор существует зато)

                                                                                                    В вики есть весьма ротозейское определение типа

                                                                                                    In computer science and computer programming, a data type or simply type is an attribute of data which tells the compiler or interpreter how the programmer intends to use the data

                                                                                                    В таком случае мы можем считать, что множество значений у int и {const,volatile,_Atomic} int одно и тоже (это подмножество N зависящее от sizeof(int)), но вот множество действий (how the programmer intends to use the data) у него разное.

                                                                                                    В твоем же варианте эти множества значений разные (хотя и отображаются на то самое подмножество N и друг на друга биективно)

                                                                                                    Получается два способа определения типа

                                                                                                    * просто множество значений (и тогда int(1) != const int(1))

                                                                                                    * множество значений и множество операций (и тогда int(1) == const int(1))

                                                                                                    Какое же из них ближе к академическому?
                                                                                                    Ответить
                                                                                                    • Ну да, я просто решила ня переусложнять, выведя "множество операций" из области теории в область реализации. С точки зрения моей "упрощённой" теории (разумеется, ня строгой и ня академической), для системы типов важны только "множества" (как сестрёнка ниже подсказывает, это ня те множества, которые вы ищете) допустимых знячений, а "множество" допустимых операций задаётся языком и/или пользователем.
                                                                                                      Ответить
                                                                                                    • > Какое же из них ближе к академическому?

                                                                                                      У каждого типа свои конструкторы.
                                                                                                      Ответить
                                                                                              • > Да. В первом можня хранить только int(0), int(1), int(2) и так далее, а во втором — только "_Atomic int"(0), "_Atomic int"(1), "_Atomic int"(2) и так далее.

                                                                                                И чем отличается "int"(0) от "_Atomic int"(0) ? Символами перед открывающей скобочкой? А еще чем-нибудь отличаются?

                                                                                                > Я бы сказала "в конструкторе", но, боюсь, тогда дальше по цепочке придётся копипастить какую-нябудь лекцию по теории типов.

                                                                                                В Си есть _Atomic, но никаких конструкторов нет. Или речь про какие-то другие конструкторы?

                                                                                                > Так что скажу просто: символами перед открывающей скобочкой.

                                                                                                Не только.

                                                                                                >Очень просто: достаточня убрать пробел после "_Atomic" и объявить, что все типы, имена которых нячинаются со слова "_Atomic" (няпример, "_Atomicint"), будут иметь семантику атомарных.

                                                                                                Как из этого следует, что это не имеет отношения к теории типов?
                                                                                                Ответить
                                                                                                • > А еще чем-нибудь отличаются?
                                                                                                  С точки зрения системы типов — больше ничем.

                                                                                                  То, что в глубинах язычка для типов, нязвания которых нячинаются с "_Atomic ", определены какие-то встроенные функции, ведущие себя особым образом, к теории типов имеет довольно опосредственное отношение.

                                                                                                  > Или речь о какие-то другие конструкторы?
                                                                                                  Да, о других.

                                                                                                  > Как из этого следует, что это не имеет отношения к теории типов?
                                                                                                  Так, что это всего лишь детали реализации конкретного языка. Для типов, нязвания которых нячинаются с "_Atomic ", сишка определяет один нябор функций; для типов с "volatile " или "register " — другой (для последних ня определяет функцию "взять адрес", например).
                                                                                                  Ответить
                                                                                                  • > То, что в глубинах язычка для типов, нязвания которых нячинаются с "_Atomic ", определены какие-то встроенные функции, ведущие себя особым образом, к теории типов имеет довольно опосредственное отношение.

                                                                                                    А то, что для _Atomic гарантируется атомарное чтение и запись? Вот допустим пишу я lock-free структуру данных, надо чтобы у меня там не было состояния гонки, и я через _Atomic делаю некоторые штуки, атомарное сравнение с обменом, ну типа если в эту локфри структуру никто прямо сейчас не пишет, и какая-то функция туда что-то записать хочет, то помечаем в эту _Atomic переменную, что структура занята, потом что-то в этой структуре меняется, и потом она опять помечается как свободная. Потом я этот код формально доказываю на отсутствие race condition на какой-нибудь хрени типа Coq. И теперь _Atomic это про систему типов? Или как вообще? Т.е. _Atomic будет иметь отношение к системе типов только если в компилятор встроят особую питушню для проверки локфри, которая будет учитывать семантику _Atomic?
                                                                                                    Ответить
                                                                                                    • Ну это уже не типы будут, а операционная семантика.

                                                                                                      Т.е. на уровне проверки типов мы убедились, что атомики с обычными числами не смешивают.

                                                                                                      А на уровне операционной семантики мы уже можем рассматривать гонки и всё такое. И там, грубо говоря, у lvalue int и lvalue _Atomic int разная семантика load'ов.
                                                                                                      Ответить
                                                                                                      • > И там, грубо говоря, у lvalue int и lvalue _Atomic int разная семантика load'ов.

                                                                                                        Но можно сказать, что у них разное множество операций.

                                                                                                        Не существует операции деления для строк, не сущетвует какой-нить "CAS" для не атомарной хрени
                                                                                                        Ответить
                                                                                                        • > Не существует операции деления для строк

                                                                                                          Ага. И не существует операции для отрицания int 0x80000000. Поэтому программа с таким отрицанием не well-formed и конпелятор имеет право аппроксимировать её какой-то другой.

                                                                                                          Заметь, что проверку типов это говно проскочило.
                                                                                                          Ответить
                                                                                                          • Ну и что? Мы же понимаем, что корректные типы не равно корректная программа)
                                                                                                            Ответить
                                                                                                          • помоему это не проблема компилятора если они не могут писать -0x80000000. Просто надо дать по рагам производителю процессоров
                                                                                                            Ответить
                                                                                                      • > Т.е. на уровне проверки типов мы убедились, что атомики с обычными числами не смешивают.

                                                                                                        Т.е. если в Си добавить специальный уровень проверки lock-free структур данных, учитывающих _Atomic, то тогда _Atomic уже будет иметь отношение к теории типов? Т.е. "что-то имеет отношение к теории типов, если компилятор или интерпретатот языка как-то это по-особому проверяет", так что ли?
                                                                                                        Ответить
                                                                                                        • Задача системы типов — доказать, что при любых входных данных твоя программа никогда ня вызовет функцию с аргументом, знячение которого не входит во "множество" (набор) допустимых знячений типа соответствующего параметра функции. Всё, остальные твои локфри, волятили и коки — это какие-то расширения системы типов, нядстройки няд ней, которых можня делать сколько угодня.
                                                                                                          Ответить
                                                                                                          • Отрицаю. Есть uniqueness/affine/linear types, которые вполне себе про поведение функций, а не про их домен и ко-ко-домен.
                                                                                                            Вообще, я бы сказала, что статическая типизация – это всё, что позволяет нам сказать, что программа, проходящая тайпчек, не содержит каких-то поведений by construction.
                                                                                                            Отстутсвие сложений строк с числами – один из типов таких поведений, но не единственный.
                                                                                                            Ответить
                                                                                                            • > статическая типизация – это всё, что позволяет нам сказать, что программа, проходящая тайпчек, не содержит каких-то поведений by construction.
                                                                                                              Умножаю. В няиболее обобщённом виде это, разумеется, верня. Но, к сожаленяю, j123123 такое определение ня устроит.

                                                                                                              > Есть uniqueness/affine/linear types
                                                                                                              Таки они где есть? Теорий типов очень много, я (неняучня) описываю самую базовую, которая имеется в абсолютном большинстве типизированных языков (и, няверное, во всех мейнстримных).
                                                                                                              Ответить
                                                                                                              • > Таки они где есть?

                                                                                                                Uniqueness были в Mercury (заместо моняд), linear types популяризировали в Rust.
                                                                                                                Ответить
                                                                                                                • Нят, я про не про языка, я про теорию типов. В каких именно теориях типов они есть?
                                                                                                                  Ответить
                                                                                                              • > Таки они где есть?

                                                                                                                Во всяких хаскелях, коках, идрисах и прочем таком академическом. Линейные типы в Clean есть https://ru-lambda.livejournal.com/131849.html
                                                                                                                Ответить
                                                                                                                • Во множестве языков {L | ¬ царский(L)}.
                                                                                                                  Ответить
                                                                                                                  • ты описал все языки кроме сишки, включая пхп?
                                                                                                                    Ответить
                                                                                                              • >> статическая типизация – это всё, что позволяет нам сказать, что программа, проходящая тайпчек, не содержит каких-то поведений by construction.

                                                                                                                >Умножаю. В няиболее обобщённом виде это, разумеется, верня. Но, к сожаленяю, j123123 такое определение ня устроит.

                                                                                                                Конечно не устроит. Если мне надо хранить много значений от 0 до 255 в массиве, и я могу использовать или массив из uint8_t или массив из uint16_t или массив из uint32_t или массив из uint64_t то это не имеет отношения к тому, чтобы пройти или не пройти тайпчек. И не имеет отношение к тому, что что-то там не содержит каких-то поведений by construction. Но зато это будет иметь отношение к тому, сколько в контроллере просрется памяти на стеке или на хипе или в статической области.

                                                                                                                Типы не только чтобы там что-то проверять и гарантировать, а ими еще можно память экономить.
                                                                                                                Ответить
                                                                                                                • Это всего лишь побочный эффект теории информации, ня более того. К теории типов какие-то там размеры и байты, разумеется, тоже ня относятся.
                                                                                                                  Ответить
                                                                                                                  • Не относятся потому что что?
                                                                                                                    Ответить
                                                                                                                    • Потому что теория типов какие-то "размеры" ня рассматривает. Этим занимается теория информации.
                                                                                                                      Ответить
                                                                                                                      • > Потому что теория типов какие-то "размеры" ня рассматривает.

                                                                                                                        А есть ссылка на авторитетный источник, что вот теория типов размеры не рассматривает?
                                                                                                                        Ответить
                                                                                                                        • Какая именно? Та, о которой мы ведём речь — https://govnokod.ru/27520#comment647553 . Если ты про теории типов вообще, то https://en.wikipedia.org/wiki/Type_theory .
                                                                                                                          Ответить
                                                                                                                          • И где там конкретно фраза "теория типов размеры не рассматривает"? И можно ли считать википедию авторитетным источником?
                                                                                                                            Ответить
                                                                                                                            • А там этой фразы быть ня должно. Иняче бы пришлось делать целый раздел со списком:
                                                                                                                              * Теория типов размеры ня рассматривает;
                                                                                                                              * Теория типов цвета ня рассматривает;
                                                                                                                              * Теория типов длины ня рассматривает;
                                                                                                                              * Теория типов зелёных слоников ня рассматривает;
                                                                                                                              * Теория типов летающих ня орбите чайников ня рассматривает;
                                                                                                                              ...

                                                                                                                              Так что чтобы утверждать, что теория типов что-то рассматривает — нужня няйти об этом упоминание в ней.

                                                                                                                              > И можно ли считать википедию авторитетным источником?
                                                                                                                              Можно, если считать её авторитетным списком ссылок ня источники.
                                                                                                                              Ответить
                                                                                                                              • > Так что чтобы утверждать, что теория типов что-то рассматривает — нужня няйти об этом упоминание в ней.

                                                                                                                                Ну хорошо, в каком авторитетном источнике указан полный и конечный список того, что теория типов рассматривает? Ну, чтобы можно было сказать "вот теория типов только это это это и это рассматривает, а всё остальное - не рассматривает"?
                                                                                                                                Ответить
                                                                                                                                • В любой теории типов. Открывай любую статью с описанием какой-нябудь понравившейся тебе теории типов и проверяй.
                                                                                                                                  https://plato.stanford.edu/entries/type-theory/ — вот, няпример, авторитетный источник с краткой выжимкой по теме.

                                                                                                                                  Блин, ну вот, скинула ссылку — а оня легла.
                                                                                                                                  Ответить
                                                                                                                                  • > В любой теории типов.

                                                                                                                                    Почему в любой? Что мне мешает придумать свою теорию типов, где рассматривались бы размеры?
                                                                                                                                    Ответить
                                                                                                                                    • Это ответ ня вопрос "в каком авторитетном источнике указан...".
                                                                                                                                      Но да, ты спокойня можешь придумать свою теорию типов с любыми нужными тебе свойствами. В конце концов, пример линейных типов, описывающих эффекты, выходящие за рамки того, что можня получить простым описанием нябора допустимых знячений, выше уже приводили.

                                                                                                                                      Просто введение размера в битах в теорию типов выглядит нясколько бессмысленно: если теория типов работает с няборами допустимых знячений (моя работает, няпример), то у каждого типа появляется размер нябора допустимых знячений, размер в битах из которого тривиальня выводится при помощи теории информации.
                                                                                                                                      Правда, если подняться чуть повыше и рассмотреть тип "int" в языке "Python", то окажется, что множество его допустимых знячений бесконечно, и фиксированного размера в битах у няго просто нет.
                                                                                                                                      Ответить
                                                                                                                                      • > Это ответ ня вопрос "в каком авторитетном источнике указан...".

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

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

                                                                                                                                        А если это какой-нибудь double, где дофига всяких NaN?

                                                                                                                                        https://en.wikipedia.org/wiki/NaN
                                                                                                                                        For example, a bit-wise IEEE 754 single precision (32-bit) NaN would be
                                                                                                                                        s111 1111 1xxx xxxx xxxx xxxx xxxx xxxx


                                                                                                                                        where s is the sign (most often ignored in applications) and the x sequence represents a non-zero number (the value zero encodes infinities). The first bit from x is used to determine the type of NaN: "quiet NaN" or "signaling NaN". The remaining bits encode a payload (most often ignored in applications).
                                                                                                                                        Ответить
                                                                                                                                        • Руководствуясь логикой и здравым смыслом, можня с уверенностью утверждать, что теория типов должна рассматривать типы. Если ты хочешь построить теорию, рассматривающую зелёных фарфоровых слоников, летающих по орбите, то будет попросту контринтуитивно нязывать её "теорией типов".

                                                                                                                                          > А если это какой-нибудь double, где дофига всяких NaN?
                                                                                                                                          Детали реализации конкретных языков программирования. Хороший, кстати, пример: моей примитивной теории типов в принципе плевать, какие там у тебя даблы под капотом, она рассматривает только няборы знячений. А уж в каком виде эти знячения представлены "в железе" — вопрос вторичный. Можешь использовать IEEE 754, можешь дроби, можешь десятичные числа с плавающей точкой прикрутить. Для моей теории типов это совершенно ня важня.

                                                                                                                                          Умение абстрагироваться от деталей и выделять общие закономерности очень полезно, рекомендую.
                                                                                                                                          Ответить
                                                                                                                                          • > Руководствуясь логикой и здравым смыслом, можня с уверенностью утверждать, что теория типов должна рассматривать типы. Если ты хочешь построить теорию, рассматривающую зелёных фарфоровых слоников, летающих по орбите, то будет попросту контринтуитивно нязывать её "теорией типов".

                                                                                                                                            Ну так размеры каких-то типов это вполне себе о типах. И кстати если сделать в том же Си структуру с uint64_t и uint8_t внутри, и потом сделать массив таких структур, внезапно окажется, что размер массива из-за выравнивания будет не n*(sizeof(uint64_t)+sizeof(uint8_t)). Теория информации тут почему-то не работает.

                                                                                                                                            > А уж в каком виде эти знячения представлены "в железе" — вопрос вторичный. Можешь использовать IEEE 754, можешь дроби, можешь десятичные числа с плавающей точкой прикрутить. Для моей теории типов это совершенно ня важня.

                                                                                                                                            Если рассматривать 32-битный single precision IEEE 754 и если я хочу доказать, что такая-то функция никогда не вернет NaN или какую-нибудь бесконечность, то мне надо будет копаться в деталях реализации, что так-то работает округления, так-то работают такие-то функции, и при таком-то множестве входных данных функция всегда возвращает что-то из такого-то множества выходных данных. Так что это не всегда вторично.
                                                                                                                                            Ответить
                                                                                                                                            • > внезапно окажется, что размер массива из-за выравнивания будет не n*(sizeof(uint64_t)+sizeof(uint8_t))
                                                                                                                                              Правильня, и это — абсолютня не интересные детали реализации конкретного язычка.
                                                                                                                                              Я уже приводила пример: у типа "int" в "Python" нят и ня может быть фиксированного размера в битах, и это никоим образом ня влияет ня мою теорию типов.

                                                                                                                                              > и если я хочу доказать, что такая-то функция никогда не вернет NaN
                                                                                                                                              ...то при помощи теории типов ты можешь это доказать очень просто: создав новый тип "FloatWithoutNan", в котором ня может быть NaN, и сделав его возвращаемым типом функции (после чего до завтипов останется рукой подать!).

                                                                                                                                              Для теории типов эти детали абсолютня ня важны.
                                                                                                                                              Ответить
                                                                                                                                              • > Правильня, и это — абсолютня не интересные детали реализации конкретного язычка.

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

                                                                                                                                                И вообще, с т.з. кого или чего они не интересны? С т.з. некоторой абстрактной теории типов - возможно. С точки зрения программиста, который что-то пишет под контроллеры - это очень даже важные детали. Типы используют не только чтоб что-то там протайпчекалось, но и чтоб память экономить, и я про это писал в https://govnokod.ru/27520#comment647636
                                                                                                                                                Ответить
                                                                                                                                                • > С т.з. некоторой абстрактной теории типов
                                                                                                                                                  Про которую мы и ведём речь во всём этом треде.

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

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

                                                                                                                                                  Конкретная реализация ТТА может привязать к конкретным типам какие угодня свойства — имя, размер, константность, атомарность, волатильнясть, may_alias, цвет, запах, высота — что угодня — и анализировать эти свойства так, как конкретной реализации удобня.
                                                                                                                                                  Только к изнячальной теории типов это никак ня относится: оня как оперировала няборами знячений, так и оперирует, нязависимо от того, какие свойства ты ня них няклеил.
                                                                                                                                                  Точно так же, как в теорему Пифагора можня ввести поправки ня ветер для рассчёта расхода топлива — исходная теорема от этого никак ня изменится.
                                                                                                                                                  Ответить
                                                                                                                                      • > Просто введение размера в битах в теорию типов выглядит нясколько бессмысленно: если теория типов работает с няборами допустимых знячений (моя работает, няпример), то у каждого типа появляется размер нябора допустимых знячений, размер в битах из которого тривиальня выводится при помощи теории информации.

                                                                                                                                        Ну давайте придумаем такую теорию типов

                                                                                                                                        // переменная "a" у которой тип такой, что она может принимать значения от 0 до 7 включительно и занимает 3 бита.
                                                                                                                                        {$ range(0 ... 7) bits 3 $} a; 
                                                                                                                                        
                                                                                                                                        // а это теперь такой тип, uint3_t
                                                                                                                                        typedef {$ range(0 ... 7) bits 3 $} uint3_t;
                                                                                                                                        
                                                                                                                                        // а если попробовать в трех битах хранить от 0 до 8 включительно,
                                                                                                                                        // то будет ошибка компиляции, в 3 бита не влезает 9 возможных значений.
                                                                                                                                        typedef {$ range(0 ... 8) bits 3 $} uint3_t_bug;


                                                                                                                                        Есть ли такое в каком-нибудь языке? Так ли это бессмысленно?
                                                                                                                                        Ответить
                                                                                                                                        • За исключением битов — это классические dependent types, за которые когда-то рьяно агитировал 1024--. И да, это действительня мощный и интересный инструмент (хотя и очень сложный).

                                                                                                                                          Ня мой взгляд, размер в битах вводить в какую-либо теорию типов (именно в теорию, а не в описание типа) всё же излишне, поскольку это слишком низкоуровневые подробности, которые конкретная реализация языка программирования может легко проверить и без всяких там теорий. То есть "bits 3" в твоём примере может служить ня столько свойством типа, сколько "ассертом", который "раскрывается" во что-то такое:
                                                                                                                                          typedef {$ range(0 ... 8) $} uint3_t_bug;
                                                                                                                                          static_assert(sizeof_bits(uint3_t_bug) == 3);
                                                                                                                                          .
                                                                                                                                          Ответить
                                                                                                                                  • > Блин, ну вот, скинула ссылку — а оня легла.

                                                                                                                                    govnokod - эффект
                                                                                                                                    Ответить
                                                                                                                                  • > \[ F:X \rightarrow \Pow(X) \]

                                                                                                                                    (where \(\Pow(X)\) is the class of subclasses of a class \(X)\) can be surjective; that is, \(F\) cannot be such that every member \(b\) of \(\Pow(X)\) is equal to \(F(a)\) for some element \(a\) of \(X\).

                                                                                                                                    – какая ма-те-ма-ти-чес-ка-я дристня )))
                                                                                                                                    Ответить
                                                                                                                              • > считать её авторитетным списком ссылок ня источники
                                                                                                                                как там в 2011? прежнева переизбрали?

                                                                                                                                Jul 22, 2020 - In the past few years, numerous conservative news outlets have been outright banned as sources for facts on Wikipedia, including Breitbart News. The finding against Fox News came after numerous prior attempts to downgrade the company’s status.
                                                                                                                                Ответить
                                                                                                                • > Но зато это будет иметь отношение к тому, сколько в контроллере просрется памяти на стеке

                                                                                                                  а если ты выберешь другую архитектуру, то у тебя будет другой байтордер

                                                                                                                  или вместо DDR3 будет DDR2

                                                                                                                  или даже вовсе не SDRAM а BEDO какое-нить

                                                                                                                  или даже не DRAM а SRAM на защелках

                                                                                                                  или не будет кеша в процессоре

                                                                                                                  или не будет страничек, а будут только сегменты

                                                                                                                  или вовсе не будет ни того, ни другого

                                                                                                                  или будет байт не восьмибитный

                                                                                                                  Все это имеет такое же отношение к теории типов, как и количество свободного места у тебя в стеке, разве нет?
                                                                                                                  Ответить
                                                                                                                  • > или будет байт не восьмибитный

                                                                                                                    Тогда мне нужно будет особым образом дрочиться с этим не-8-битным байтом если мне надо экономно хранить много чисел в интервале от 0 до 255.

                                                                                                                    > Все это имеет такое же отношение к теории типов, как и количество свободного места у тебя в стеке, разве нет?

                                                                                                                    Приведи реальный пример чего-то, что имеет отношение к теории типов.
                                                                                                                    Ответить
                                                                                                                  • > Все это имеет такое же отношение к теории типов, как и количество свободного места у тебя в стеке, разве нет?

                                                                                                                    В miniagda были т.н. sized types, где размер терма был частью типа. Там это использовалось для termination checking, но при желании sized types, думаю, можно прикрутить для статической проверки свободного места на стеке.
                                                                                                                    Ответить
                                                                                                                    • > можно прикрутить для статической проверки свободного места на стеке.

                                                                                                                      Для статической проверки места на стеке надо рассматривать то, как именно там программа заоптимизируется конкретным компилятором. Если компилятор соптимизирует рекурсию в цикл, требования к стеку будут сильно меньше.
                                                                                                                      А вот про всякие глобальные или статические локальные переменные судить уже проще. Хотя и их компилятор/линкер может почистить на определенном этапе, например убрав глобальный массив, к которому никто никогда не обращается.
                                                                                                                      Ответить
                                                                                                                      • а на всех ли конь-троллерах стек дешевле грязи?
                                                                                                                        Ответить
                                                                                                                    • Вот рассмотрим такой гипотетически Си-подобный язык
                                                                                                                      // Есть у нас массив char-ов, прочитанных из /dev/random
                                                                                                                      char data[1000] = read(1000, /dev/random);
                                                                                                                      // найдем максимальный элемент на несортированном массиве
                                                                                                                      char max_elm = find_max(data, 1000);
                                                                                                                      // Или найдем другим образом, отсортируем по возрастанию и потом возьмем самый последний
                                                                                                                      char max_elm2 = sort(data, 1000, [](char a, char b){return a < b; })[999];
                                                                                                                      // и мы просим чтоб компилятор проверил, что вот в этом месте max_elm == max_elm2 будет всегда выполняться
                                                                                                                      check_compiletime(max_elm == max_elm2);

                                                                                                                      Предположим, компилятор реально смог в компилтайме доказать через какую-то питушню, что какие бы байтики из /dev/random не прочитались, "find_max(data, 1000)" и "sort(data, 1000, [](char a, char b){return a < b; })[999]" будет иметь одинаковое значение. А если б я допустим накосячил и написал "sort(data, 1000, [](char a, char b){return a < b; })[0]" то компилятор бы сказал что-то типа "я не могу гарантировать что max_elm == max_elm2 всегда выполняется" - это вот о типах или не о типах?
                                                                                                                      Ответить
                                                                                                                      • > это вот о типах или не о типах?

                                                                                                                        Теория типов — это же просто альтернативный язык ма-те-матики.
                                                                                                                        Поэтому, если ты сделаешь ма-те-матическую модель сишки, то это будет "о типах".
                                                                                                                        Посмотри в сторону separation logic, Есть проект iris[1] там ухитрились придумать такие типы, которые описывают арифметику указателей с кучей и бог знает чем.
                                                                                                                        У них вроде даже какое-то подобие семантики няшной уже есть на куритсе.

                                                                                                                        [1] https://gitlab.mpi-sws.org/iris/
                                                                                                                        Ответить
                                                                                                                        • > Поэтому, если ты сделаешь ма-те-матическую модель сишки, то это будет "о типах".

                                                                                                                          В вышеприведенном примере никаких описываемых программистом в явном виде "типов" (кроме этого вот char) нет. Есть функция find_max() и компилятор видит ее код. Есть функция sort() и компилятор тоже видит ее код. Компилятор допустим умеет рассуждать над всякой такой хренью, и он может формально доказать, что вызов вот той функции для data даст такой же результат, как и вызов другой функции для data, независимо от того, что там в data записано. Получается что "тип" это семаника (ма-те-ма-тическая модель) кода? Хуйня какая-то.

                                                                                                                          Встретил типы - убей типы
                                                                                                                          Ответить
                                                                                                                  • > или будет байт не восьмибитный

                                                                                                                    Кстати да, если CHAR_BIT > 8, у меня типа uint8_t вообще не будет.
                                                                                                                    Ответить
                                                                                                        • Сам _Atomic имеет отношение к теории типов. Его семантика -- нет. Как-то так, если я не туплю.
                                                                                                          Ответить
                                                                                                          • >Сам _Atomic имеет отношение к теории типов. Его семантика -- нет.

                                                                                                            То есть мы можем ввести ключевое слово "Хуятомик", при использовании которого будет мигать numlock на клавиатуре

                                                                                                            С точки зрения системы типов это будет другой тип, а что там мигает не важно?


                                                                                                            С атомиком правда интереснее: есть алгоритм, который без него тупо некорректен

                                                                                                            Ответить
                                                                                                    • Просто твой язык для типов, нязвания которых нячинаются ня "_Atomic ", определяет нябор встроенных функций ("загрузить из памяти", "записать в память", ...) с какой-то там семантикой, которая для теории типов ну вот вообще ня интересна (хотя мы-то знаем, что семантика эта будет "атомарная").

                                                                                                      Задача системы типов — доказать, что при любых входных данных твоя программа никогда ня вызовет функцию с аргументом, знячение которого не входит во "множество" (набор) допустимых знячений типа соответствующего параметра функции. Всё, остальные твои локфри, волятили и коки — это какие-то расширения системы типов, нядстройки няд ней, которых можня делать сколько угодня.
                                                                                                      Ответить
                                                                                                  • > > Как из этого следует, что это не имеет отношения к теории типов?
                                                                                                    > Так, что это всего лишь детали реализации конкретного языка.

                                                                                                    И что? Любая система типов это детали реализации конкретного языка
                                                                                                    Ответить
                                                                                                    • А вот "ramified theory of types" 1908-го года — она какого языка деталь реализации?
                                                                                                      Ответить
                                                                                                      • > А вот "ramified theory of types" 1908-го года — она какого языка деталь реализации?

                                                                                                        Ма-те-матического
                                                                                                        Ответить
                                                                                                        • А где же для него скачать компилятор? Образца 1908-го года, конячня.
                                                                                                          Ответить
                                                                                                          • Языки не обязаны иметь какой-то компилятор. Можно в мозгах интерпретировать.
                                                                                                            Ответить
                                                                                                            • > Любая система типов это детали реализации конкретного языка
                                                                                                              Если система типов — это деталь реализации, то где же, кхм, реализация?
                                                                                                              Ответить
                                                                                                              • В мозгах того, кто прочитал ту книгу про типы и начал что-то в них себе представлять.
                                                                                                                Ответить
                                                                                                                • А эта реализация — оня Тьюринг-полная или нет? Что ей посчитать можня?
                                                                                                                  Ответить
                                                                                                                  • > А эта реализация — оня Тьюринг-полная или нет?

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

                                                                                                                    > Что ей посчитать можня?

                                                                                                                    Это надо открыть ту книгу "ramified theory of types" 1908-го года и разобраться, что там за типы, и что ими можно считать.
                                                                                                                    Ответить
                                                                                                                    • Ну так открой и разберись. А после уже можня будет делать утверждения о том, является ли оня деталью реализации какого-то языка, или нят.
                                                                                                                      Ответить
                                                                                                                      • > Ну так открой и разберись

                                                                                                                        А зачем?

                                                                                                                        > А после уже можня будет делать утверждения о том, является ли оня деталью реализации какого-то языка, или нят.

                                                                                                                        А что такое "язык"?
                                                                                                                        Ответить
                                                                                                                        • > А зачем?
                                                                                                                          Чтобы делать обоснованные утверждения?

                                                                                                                          > А что такое "язык"?
                                                                                                                          Тебя нужня спросить. В своём комментарии я говорила про языки программирования, про какой язык няписал ты — ня зняю, могу лишь подозревать.
                                                                                                                          Ответить
                                                                                                                          • > Чтобы делать обоснованные утверждения?

                                                                                                                            Ну а почему б тебе не разобраться и не рассказать?

                                                                                                                            >Тебя нужня спросить. В своём комментарии я говорила про языки программирования, про какой язык няписал ты — ня зняю, могу лишь подозревать.

                                                                                                                            Если речь про языки программирования, то тогда да, не для всякой вообразимой системы типов есть какой-то готовый язык программирования, реализующий такую систему типов.
                                                                                                                            Ответить
                                                                                                                            • Так я же в https://govnokod.ru/27520#comment647553 тебе сформулировала свою систему типов, а в дальнейших показала, что оня достаточня хорошо описывает поведение типизации многих мейнстримных язычков (ня примере сишки/крестов с их спецификаторами).
                                                                                                                              Ответить
                                                                        • При этом няизбежно отбрасываются корректные программы, т.к. можно тривиально показать, что для корректной типизации неко-торых программ нужно порешать проблему останова. Ограничения как они есть.
                                                                          Ответить
                                                                          • это ограничение системы типов, она сама не накладывает никаких ограничений
                                                                            Ответить
                                                                            • > это ограничение системы типов, она сама не накладывает никаких ограничений
                                                                              Ты хорошо постарался сломать мне парсер, но я всё-таки понял твой тейк. В целом, да, даже на плюсовый тайпчекер найдётся reinterpret_cast.
                                                                              Ответить
                                                                  • > >Типизация нужня для того, чтобы ограничивать.

                                                                    Ну типа такого. У ме-ня Пирс бумажный, точное определение лень перепечатывать.
                                                                    Ответить
                                                            • Справедливости ради, задачи мы буткемпом решали разные

                                                              Я просто сделал так, чтоб все скалярные типы были одинаковые.

                                                              То есть это или T либо массив от T либо массив от массивов от T и так далее рекурсивно

                                                              Буткемп же видел задачу в том, чтобы принимать любые типы, но выводить их типы в качестве юниона в результат

                                                              То есть ты можешь флэтнуть массив строк и массив буленов, а в итоге получить юнион от буленов и строк

                                                              В каких-то случаях такие решения могут иметь смысл: например флэтнуть массив кошек и собак, и потом померить у всех размер хвоста
                                                              Ответить
                                                        • .
                                                          Ответить
                                            • так я не пони

                                              мой пример с динамиком это фуфло, а пример на тс с анноун это типа заебок? а в чём разница?
                                              Ответить
                                            • а ты думаешь JS делает магию и имеет отдельный CPU инструкции?
                                              Ответить
                                              • Ня самом деле да, имеет.
                                                d: FJCVTZS
                                                Ответить
                                              • У арма есть спец инструкция, мы ржали уже над этим

                                                Сначала в JS сделали флоат вместо интеджера (number), а затем пришлось пилить железо для него
                                                Ответить
                                      • type ElementType<T> = T extends ReadonlyArray<infer U> ? ElementType<U> : T;
                                        
                                        function flat<T extends readonly unknown[]>(x: T): ElementType<T>[] {
                                            return [x[0]];  // Type 'unknown' is not assignable to type 'ElementType<T>[]'.(2322)
                                        }
                                        
                                        console.log(flat([1,2,[1,2,"A"]]));  // [LOG]: [1]

                                        Мы Вам перезвоним.
                                        Ответить
                      • ну ок, а как эта функция типизирована в тс? не могу найти доку
                        Ответить
                        • может не скомпилится, пишу наугад

                          type NestedArray<T> = Array<T | NestedArray<T>>;
                          
                          function flat<T>(value: NestedArray<T>): T[];
                          Ответить
                    • Она структурная, а не номинативная. Другими словами что тип соответствует, если у него есть все необходимые свойства-методы допустимых сигнатур, а не если он отнаследован от кого-то конкретного; та же утиная типизация, но верифицируемая компилятором.
                      Ответить
                      • можно пример?

                        так-то что-то похожее можно и в шарпе намутить на одних интерфейсах
                        Ответить
                        • В шарпе ты будешь обязан наследоваться от интерфейса, тайпскрипту нужно только структурное соответствие

                          type Monies {
                            amount: number;
                            currency: string;
                          }
                          
                          type SelfExplanatory {
                            comment: string;
                          }
                          
                          const transaction: Monies & SelfExplanatory = {
                            amount: 200,
                            currency: 'RUB',
                            comment: 'Компенсация за бездарно потраченный квас'
                          }
                          Ответить
                          • у transaction как бы нет своего типа?
                            Ответить
                            • Он inferred, это объект с тремя полями. Компилятор просто видит, что этот тип является подтипом объединения, и не стреляет ошибкой.
                              Ответить
                    • структурная типизация и возможность делать всякие штуки типа Discriminating Unions
                      Ответить
                    • У Python типизация вообще лучше всех: ня только структурная, но ещё и гомоиконная! (*^‿^*)
                      Ответить
              • но если бы у рыбы был мех, то там водились бы блохи
                Ответить
      • Обычно вызывающий код передаёт (n+1)-м аргументом адрес буфера для получения строки.

        Если буфер в куче, и вызываемая функция сделает ему realloc, то его адрес изменится. Это плохо. Поэтому пойдём дальше: будем (n+1)-м аргументом передавать не адрес буфера, а адрес переменной, указывающей на буфер (указатель на указатель). После возврата из вызываемой функции вызывающий код должен учесть новое значение адреса.
        Ответить
        • при возврате скопировать в свой стек. круто - мне нравиться. только как сказать функции не чистит стек пока не разрешат
          Ответить
          • Я предлагал так:
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            typedef char * pchar;
            
            void balabol(pchar * volatile result) {
                pchar text = "Сорок тысяч обезьян в жопу сунули банан.";
                size_t len = strlen(text) + 1;
                *result = malloc(len);
                memmove(*result, text, len);
            }
            
            int main() {
                pchar buffer = NULL;
                printf("Pointer before call: %p\n", buffer);
                balabol(&buffer);
                printf("Pointer after call: %p\n", buffer);
                printf("%s\n", buffer);
                free(buffer);
                return 0;
            }


            https://ideone.com/2B6rzG

            После возврата можно скопировать из кучи в свой стек и сделать free.
            Ответить
            • Но зачем копировать из кучи в стек? Пусть там и валяется, раз уж потратили время на аллокацию и копирование туда.
              Ответить
          • >> только как сказать функции не чистит стек пока не разрешат

            Раньше было соглашение вызовов «cdecl» — стек чистил вызывающий. В архитектуре «amd64» от него отказались.
            Ответить
            • > Раньше было соглашение вызовов «cdecl» — стек чистил вызывающий. В архитектуре «amd64» от него отказались.

              [Источник не указан 0 дней]

              Скорее от stdcall отказались.
              Ответить
              • Сейчас проверим.

                https://en.wikipedia.org/wiki/X86_calling_conventions

                == 32 бита ==
                Caller clean-up: cdecl, syscall.
                Callee clean-up: pascal, stdcall, куча нестандартных fastcall, register, vectorcall.

                == 64 бита ==
                Caller clean-up: Microsoft x64 ABI, Microsoft vectorcall, System V AMD64 ABI.

                Да, я ошибся. Всё наоборот. Стек чистит вызывающий, как у cdecl, только добавили размещение аргументов в регистрах.
                Ответить
                • > только добавили размещение аргументов в регистрах

                  Ну это потомки fastcall'а, на самом деле. Хм, там callee всё-таки был.
                  Ответить
            • в 64 битах во всех ABI (и виндовом и униксовом) стек чистит вызывающий вроде
              Ответить
              • Смотря от чего, на самом деле. От своего барахла чистит вызываемый, аргументы убирает* вызывающий.

                * На самом деле, с убиранием никто сейчас не парится и место под аргументы вызываемых функций просто зарезервировано в фиксированном фрейме.
                Ответить
                • имелися ввиду аргументы, конечно:)

                  А почему не парятся? потому что стек на x64 такой большой, что всем похуй на место от тех двух с половиной функций, что не влезли в пять (или с колько там?) параметров через регистры, и тронули стек?
                  Ответить
                  • Да нет, просто зачем убирать, если ты аргументы пихал через mov вместо push.
                    Ответить
                    • так а указатель на стек не нужно крутануть разве после выхода из вызываемой функции? Место-то в стеке остается?
                      Ответить
                      • Один раз в начале функции резервируешь место и под локалки и под аргументы вызываемых. В конце функции возвращаешь обратно.

                        Дрочить указатель на каждый вызов и тем более на каждый аргумент смысла никакого.

                        Как-то так, если забить на редзоны и теневой блок:

                        | ... args for callees ... | ... locals .... | ret |
                        Ответить
                        • >под аргументы вызываемых.
                          ага, ну то есть мы откладываем "очистку" на потом.
                          Ответить
                        • эксперемент
                          void foo(int a, int b, int c, int d, int e, int f, int g) {
                          
                          }
                          
                          void bar(int a, int b, int c, int d, int e, int f, int g, int h) {
                          
                          }
                          
                          
                          
                          int main() {
                              foo(42, 43, 44, 45, 46, 47, 48);
                              bar(42, 43, 44, 45, 46, 47, 48, 49);
                          }


                          foo(int, int, int, int, int, int, int):
                                  push    rbp
                                  mov     rbp, rsp
                                  mov     DWORD PTR [rbp-4], edi
                                  mov     DWORD PTR [rbp-8], esi
                                  mov     DWORD PTR [rbp-12], edx
                                  mov     DWORD PTR [rbp-16], ecx
                                  mov     DWORD PTR [rbp-20], r8d
                                  mov     DWORD PTR [rbp-24], r9d
                                  nop
                                  pop     rbp
                                  ret
                          bar(int, int, int, int, int, int, int, int):
                                  push    rbp
                                  mov     rbp, rsp
                                  mov     DWORD PTR [rbp-4], edi
                                  mov     DWORD PTR [rbp-8], esi
                                  mov     DWORD PTR [rbp-12], edx
                                  mov     DWORD PTR [rbp-16], ecx
                                  mov     DWORD PTR [rbp-20], r8d
                                  mov     DWORD PTR [rbp-24], r9d
                                  nop
                                  pop     rbp
                                  ret
                          main:
                                  push    rbp
                                  mov     rbp, rsp
                                  push    48
                                  mov     r9d, 47
                                  mov     r8d, 46
                                  mov     ecx, 45
                                  mov     edx, 44
                                  mov     esi, 43
                                  mov     edi, 42
                                  call    foo(int, int, int, int, int, int, int)
                                  add     rsp, 8 ' <-- Ку!
                                  push    49
                                  push    48
                                  mov     r9d, 47
                                  mov     r8d, 46
                                  mov     ecx, 45
                                  mov     edx, 44
                                  mov     esi, 43
                                  mov     edi, 42
                                  call    bar(int, int, int, int, int, int, int, int)
                                  add     rsp, 16 ' <-- Кю!
                                  mov     eax, 0
                                  leave


                          Что-то я не вижу тут твоего поведения

                          что я делаю не так?
                          Ответить
                        • лол, а на шланге как ты сказал
                          push    rbp
                                  mov     rbp, rsp
                                  sub     rsp, 16 ' <-- овощехранилище
                                  mov     edi, 42
                                  mov     esi, 43
                                  mov     edx, 44
                                  mov     ecx, 45
                                  mov     r8d, 46
                                  mov     r9d, 47
                                  mov     dword ptr [rsp], 48 ' <-- немного овощей
                                  call    foo(int, int, int, int, int, int, int)
                                  mov     edi, 42
                                  mov     esi, 43
                                  mov     edx, 44
                                  mov     ecx, 45
                                  mov     r8d, 46
                                  mov     r9d, 47
                                  mov     dword ptr [rsp], 48 ' <-- немного овощей
                                  mov     dword ptr [rsp + 8], 49 ' <-- немного овощей
                                  call    bar(int, int, int, int, int, int, int, int)
                                  xor     eax, eax
                                  add     rsp, 16 ' <-- очистка
                                  pop     rbp
                                  ret
                          Ответить
                          • Я вроде на студии это поведение впервые заметила. Странно, что gcc под sysv abi так не делает.

                            Для студии это особенно актуально т.к. по виндовому соглашению shadow зона нужна. И резервировать её перед каждым вызовом не особо удобно.
                            Ответить
                            • я годболтом смотрел

                              может gcc бы и сделал так, включи я -O3, но он тогда мне всё заинлайнит нахер)

                              Шедоу зона это вроде место, где коля может хранить регистры, которые не должен портить? Чем это отличается от sysv ред зоны?


                              зы: да, на студии 2017 репродьсится
                              sub	rsp, 72					; 00000048H
                              ; Line 12
                              	mov	DWORD PTR [rsp+48], 48			; 00000030H
                              	mov	DWORD PTR [rsp+40], 47			; 0000002fH
                              	mov	DWORD PTR [rsp+32], 46			; 0000002eH
                              	mov	r9d, 45					; 0000002dH
                              	mov	r8d, 44					; 0000002cH
                              	mov	edx, 43					; 0000002bH
                              	mov	ecx, 42					; 0000002aH
                              Ответить
                              • Шедоу находится выше адреса возврата, по сути дырка от первых четырёх аргументов. В отладочной сборке коля сохраняет в шедоу значения аргументов, чтобы их легко было найти. В этом огромный плюс виндового соглашения. Ну и вариадик коли туда могут скинуть аргументы чтобы их чтение единообразнее было.

                                А редзона находится ниже фрейма функции: [rsp-128; rsp). Обычно её юзают листовые функции, которым никого не надо вызывать. Просто чит, чтобы не двигать rsp лишний раз ради локалок. Ядро и системные либы гарантируют, что они не будут туда срать. Но если ты пишешь ядро, использование редзоны надо запрещать иначе проц запишет туда что-нибудь во время прерываний.
                                Ответить
                                • Действительно, если коля уже насрал в регистры, то узнать что ему передали будет не просто:) Хорошо, что есть шедоу.

                                  Редзона получается позволяет листовым функциям существовать "в стеке" родителя, лол
                                  Ответить
                                  • > существовать "в стеке" родителя

                                    Не... Она формально за пределами фрейма. Это очень тонкий лёд. Просто на данной платформе все договорились, что в эту область срать не будут и твой код может эту область юзать не резервируя её через уменьшение rsp.

                                    Ядру во время прерываний пофиг т.к. у него свой стек, а сигналы просто отступают от rsp на это расстояние.
                                    Ответить
                                    • > Она формально за пределами фрейма
                                      а какая разница?:)

                                      Это же папкин фрейм, папка просто туда не срёт.

                                      Ядерный стек вроде с юзерным никак не связан, это понятно, а для сигналов видимо пришлось вносить костыль
                                      Ответить
                                      • > Это же папкин фрейм, папка просто туда не срёт.

                                        Нет! Это вообще ничейная зона под всеми фреймами. В том и прикол. Ты владеешь только тем, что выше rsp.
                                        Ответить
                                        • Я имел ввиду, что папка точно так же владеет этой зоной, как и коля, просто она не переживает вызов коли

                                          Грубо говоря, я могу пользоваться ею до первого вызова функции

                                          Но я понял твою мысль: зона находится по ту сторону от SP (не где BP, а наоборот)
                                          Ответить
                                  • Эксперемент

                                    Винда:

                                    Коля на винде ныкает в тень содержимое трех регистров
                                    void bar(int a, int b, int c, int d, int e, int f, int g, int h) {
                                    
                                    }

                                    bar	PROC
                                    ; File c:\temp\1.c
                                    ; Line 5
                                    	mov	DWORD PTR [rsp+32], r9d
                                    	mov	DWORD PTR [rsp+24], r8d
                                    	mov	DWORD PTR [rsp+16], edx
                                    	mov	DWORD PTR [rsp+8], ecx
                                    ; Line 7
                                    	ret	0
                                    bar	ENDP
                                    _TEXT	ENDS


                                    Прыщи:


                                    #include <cstdint>
                                    
                                    
                                    void i_use_redzone() {
                                        uint64_t foo[14] = {0}; //влезет
                                    }
                                    
                                    void i_am_fat() {
                                        uint64_t foo[15] = {0}; //уже не влезет
                                    }
                                    
                                    int main() {
                                    
                                    }

                                    i_use_redzone(): ' Влезло
                                            push    rbp
                                            mov     rbp, rsp
                                            lea     rdx, [rbp-112]
                                            mov     eax, 0
                                            mov     ecx, 14
                                            mov     rdi, rdx
                                            rep stosq
                                            nop
                                            pop     rbp
                                            ret
                                    i_am_fat():
                                            push    rbp
                                            mov     rbp, rsp
                                            sub     rsp, 8 ' Уже не влезло, приходится самому как-то
                                            lea     rdx, [rbp-128]
                                            mov     eax, 0
                                            mov     ecx, 15
                                            mov     rdi, rdx
                                            rep stosq
                                            nop
                                            leave
                                            ret
                                    main:
                                            push    rbp
                                            mov     rbp, rsp
                                            mov     eax, 0
                                            pop     rbp
                                            ret
                                    Ответить
                                    • > трех

                                      Четырёх.
                                      Ответить
                                      • да, туплю, спать пора
                                        Ответить
                                        • Спокойной ночи, риббончик.
                                          Ответить
                                          • рушестьшестьохчетыреук
                                            Ответить
                                          • 10 CLS
                                            20 RIBBON = 2
                                            30 PRINT "ДОБРЫЙ ДЕНЬ"
                                            Ответить
                                            • https://devblogs.microsoft.com/commandline/microsoft-open-sources-gw-basic/
                                              Ответить
                                              • > (Alas, sorry, we’re unable to open-source the ISA translator.)

                                                У них был переводчик с одного процессора на другой?
                                                Ответить
                                                • бил гей начинал на 8080, небось с него
                                                  там как раз была такая же нездоровая система с додикейтед регисторз, которую штеуд по 2021 года дотащил
                                                  Ответить
                                            • RUN
                                              Ответить
                                              • Да, самая важная строчка.
                                                Ответить
                                                • Борманд, как на прыщах получить что-то типа виндового `RAMMap`` -- списка всех страничных фреймов с адресами, атрибутами и указанием какая виртуальная страница на них ссылается?

                                                  В ядре есть их лист, из кернел спейс а можно по нему походить, но есть ли что в ``/proc``?
                                                  Ответить
                                                  • похоже, вручную пирдолица надоть
                                                    https://www.kernel.org/doc/html/latest/admin-guide/mm/pagemap.html
                                                    Ответить
                                                  • >как на прыщах получить что-то типа виндового `RAMMap`
                                                    Кстати, совсем забыл про e820

                                                    Там хоть страничек и нету, но есть инфа о регионах памяти
                                                    Ответить
                                                  • /proc/self/pagemap?
                                                    Ответить
                                                    • Мне не нужна виртуальная память конкретного процесса

                                                      Мне была нужна физическая память: список пейдж фреймов.
                                                      Особым бонусом список указывающих на них страниц процессов

                                                      Видал RAMMap?
                                                      Ответить
                                                      • А ядру вообще нужна такая карта для работы?

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

                                                        Так что, скорее всего, в явном виде карты физической памяти нигде нет и тебе придётся по всем процессам бегать чтобы её собрать.
                                                        Ответить
                                                        • Мне казалось, что подсистема работы с физ страницами от вирт памяти не зависит особо.

                                                          Грубо говоря один питух знает про PFN и физические страницы (фреймы) и какие-то их свойства, а поверх него уже тусят виртуальные питухи.

                                                          Есть вот kpagecount, например
                                                          This file contains a 64-bit count of the number of times each page is mapped, indexed by PFN.

                                                          Так что если физ страница за номером 42 замаплена куда-то, то там будет число.
                                                          Ответить
                                                          • > подсистема работы с физ страницами от вирт памяти не зависит особо

                                                            В этом и проблема. Ну будет у тебя инфа в духе "занято, 1 использование". А чьё это и зачем? Да хуй бы знал, этим другая подсистема занимается.
                                                            Ответить
                                                            • А как пинда умеет обратно это всё посчитать по rammap?

                                                              Кстати, можно написить расширение для windbg (теперь и на JS, лол!) которое бы это делало.
                                                              Только чтобы зырить PTE нужно включать ядрёный дебагер, и переключать его в конь-текст процесса

                                                              Оно так-то нахуй не нужно конечно, я уже забыл зачем я хотел это знать
                                                              Ответить
      • 1. через кучу
        2. через выделение в стеке максимального размера строки
        Ответить
        • Это слишком очевидные решения для ГК.
          Ответить
          • я уже увидел, что вы там ебанулись на отличненько, и захотели двигать стек вызываемого петуха в момент возвращения значения
            Ответить
        • это не хардкор - и не тру программинг
          Ответить
          • Но это ровно то, что обычно делают языки, где можно вернуть объект неизвестного размера: кладут его в кучу и возвращают указатель.
            Ответить
      • Интел заебал. Напиши им просто чтобы они нормальные регистры динамического размера сделали. Не сделаешь сейчас - будешь так же до конца жизни прогибаться. Поступи как мужик, а не поступайся.
        Ответить
        • >регистры динамического размера сделали.
          лол это как?

          чтобы там стек хранить?
          Ответить
          • регистры у этого процессора были разработаны настолько, что могли вместить джва стека
            Ответить
      • > как вернуть строку(из стека не глобальной памяти) из вызванной функции в стэк вызывающей функции если размер строки заранее не известен?

        См. https://govnokod.ru/25602#comment477597
        Ответить
        • А вот каким хреном ты будешь прихреначивать такое хитровыебанное соглашение вызова в говноLLVM, чтобы вызываемой фунцкии можно было насрать в стекфрейм вызывающей функции хуйпойми сколько байтиков - это уже твои проблемы. Надо было в ассемблер компилировать.
          Ответить
    • И как эта хрень поможет мне писать условные прошивки на контроллеры? Зачем мне какие-то "классы" и какие-то "абстракты"?
      Ответить
      • >Зачем мне какие-то "классы" и какие-то "абстракты"
        чтобы реализовывать абстрактную фабрику стратегий, разумеется
        Ответить
        • Которая конечно же очень сильно нужна в контроллерах, да
          Ответить
          • эта фича не обязательна к использованию
            Ответить
          • Абстрактная фабрика последовательных портов.
            Ответить
            • class IONamespace implements OutputNamespace
              class MMIONamespace implements OutputNamespace
              Ответить
      • ну ты душный
        Ответить
      • да и тайпскрипта на контроллерах нет, чего греха таить
        Ответить
        • Есть же всякие ардуины с JS
          Ответить
          • Там проц в десять раз мощнее настоящей ардуины...
            Ответить
            • ну вот видите

              пишите на джэй-эс, наслаждайтесь мощными процами!11

              А сишнички пусть пирдоляца с mmuless
              Ответить
          • yun небось? так это не радуина
            Ответить
    • что такое tail call и как его юзать?
      Ответить
      • Что, никто не знает?
        Ответить
      • https://en.wikipedia.org/wiki/Tail_call
        https://stackoverflow.com/questions/310974/what-is-tail-call-optimization
        Ответить
        • Интересно, каково это быть умным и всё знать.
          Ответить
          • Проверь.
            Ответить
            • Всё знать на свете не реально,
              Но я, мечту свою лелея,
              Решил проблему гениально:
              Успокоился и поставил себе более реалистичные цели.
              Ответить
          • Плохо

            начинаешь называть себя в женском роде
            Ответить
      • хвостатая рекурсия знаеш что такое?
        Ответить
      • Это когда вызов второй функции из функции происходит в самом конце, прямо перед возвратом, и на выход ничего не передаётся либо функция возвращает результат вызова второй функции.

        Почему такой случай важен? Очень часто удаётся заменить CALL на JMP, сэкономив при этом место в стеке и сократив цепочку возвратов.
        Ответить
    • всё хуйня, этот пост тоже не перекатится

      нафига они вообще создают такие??
      Ответить
      • Зачем его перекатывать? Догоним до полутора тысяч комментариев, он будет медленно открываться, и боты не смогут ничего из него украсть.
        Ответить
    • ну вы тут нафлудили блин
      Ответить
    • goto будет? https://www.govnokod.ru/22731#comment380588
      Ответить
    • Немножко напрягает, что метод printName уже реализован. Значит, класс не совсем абстрактный, чистым интерфейсом не является? А слово «abstract», чтобы нельзя было создать экземпляр?
      Ответить
      • > не совсем абстрактный

        Немножко беременный.

        Вроде в этом и отличие между интерфейсом и абстрактным классом.

        > А слово «abstract», чтобы нельзя было создать экземпляр?

        Я думаю конпелятор в 99% случаев и сам бы его вывел по наличию abstract на методах. Но остаются всякие утилитарные базовые классы, у которых все методы имеют какие-то заглушки. Вот для них, видимо, это слово и сделали. Чтобы зафорсить абстрактность даже если ни одного абстрактного метода.
        Ответить
      • В том и суть для ts абстрактный класс может в базовые методы, а для интерфейсов есть собственно интерфейсы.

        Ну и хз где тут говнокод. Очевидно, что в явно заданном Department нет метода generateReports. Это так работает практически во всех типизируемых языках...
        Ответить
      • Абстрактный класс != pure abstract

        В абстрактном классе могут быть методы. Часть реализована, часть нет.

        Если хотя бы один метод абстрактный (не реализованный) то это и не говнокод вовсе.

        Как бы ты еще реализовал например "шаблонный метод"?
        Ответить

    Добавить комментарий