После шести месяцев разработки представлен релиз проекта LLVM 9.0 (Low Level Virtual Machine) - GCC-совместимого инструментария (компиляторы, оптимизаторы и генераторы кода), компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизации). Сгенерированный псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы...Подробнее: https://www.opennet.me/opennews/art.shtml?num=51523
Как его на винду установить?
запускаешь setup.exe и все дела
https://devblogs.microsoft.com/cppblog/clang-llvm-support-in.../
Как что-то скомпилировать без студии?
https://releases.llvm.org/Бинарники под маздайку еще не собрали, а так 8.0.1 есть.
А собирается что-либо через clang.exe
Час ведь собираться будет ....
Купи комп нормальный
Даже больше... поверь старому гнентушнику. Часа два (если у тебя не 8-ядерный ксеон конеш)
Когда у меня был первый пень - все говорили - о всего за час :-)
> Добавлена реализация специфичного для GCC выражения "asm goto", которое позволяет выполнить переход из ассемблерного inline-блока к метке в коде на языке Си.Вот это правильно! Даёшь ещё более запутанный код!
В ассемблере нет ни while, ни for, если ты не в курсе. Только goto (jmp* в x86, b* в arm).
repn cmpsb ? :)
> repn cmpsb ? :)Пфф, слишком узкоспециализированно:
; FASM, assembly time
macro showPos msg, val
{
bits = 16
display msg
repeat bits/4
x = '0' + val shr (bits-%*4) and 0Fh
if x > '9'
x = x + 'A'-'9'-1
end if
display x
end repeat
display 13,10
}
xor ecx, ecx
.REPEAT
PrintText "this is MASM, runtime"
inc ecx
.UNTIL ecx == 10
.WHILE ecx <= 10
PrintText "это тоже MASM"
inc ecx
.ENDW
Впрочем, в NASM/TASM высокоуровневщины тоже хватает (о HLA вообще лучше не будем упоминать), поэтому все таки следует различать "assembler","assembly" и собственно то, что можно получить из второго с помощью первого ;)
goto-фобам среди нормальных программистов делать нечего, это мощный инструмент, который имеет свое применение к примеру для выхода из вложенных циклов, при чем читаемость гораздо выше, чем при использовании разных флагов. Это мощный инструмент, но который надо использовать с умом
Из вложенных циклов надо выходить выносом оных в отдельные функции, а не созданием говнолапши с goto и флагами.
А я-то думал что хорошим тоном является вынос в функции логически законченных блоков, а оказывается функции нужны для выхода из вложенных циклов. Век живи -- век учись...
> является вынос в функции логически законченных блоковКак бы и да, и нет. Смотря что и где. Для повышения читаемости и поддерживаемости кода иногда лучше просто куски убрать в отдельные функции. А потом и станет очевидным, на какие логические блоки разделить можно. И вот в таком случае как пример вынос цикла или куска цикла в отдельную функцию - вполне ок, вместо лапши goto или каких-нибудь break. Если нет каких-то особых требований по стилю, производительности, чему-то ещё... Но, судя по вашим утверждениям выше, вы будете упираться и настаивать на своём. А ведь конкретных подход оч. сильно зависит от проекта.
>Для повышения читаемости и поддерживаемости кода иногда лучше просто куски убрать в отдельные функции.и срать в стек
>А ведь конкретных подход оч. сильно зависит от проекта.
бред, все должно сводиться к оптимальному набору инструкций.
>>Для повышения читаемости и поддерживаемости кода иногда лучше просто куски убрать в отдельные функции.
> и срать в стек"Преждевременная оптимизация есть корень всех зол" (с)
System V AMD64 ABI для первых 6-ти параметров использует регистры процессора. Это в случае, если не будет произведена подстановка (inline) функции.
>>А ведь конкретных подход оч. сильно зависит от проекта.
> бред, все должно сводиться к оптимальному набору инструкций.
> "Преждевременная оптимизация есть корень всех зол" (с)что за ересь несете? я посмотрел бы если бы с таким утверждением писали бы математические алгоритмы.
> System V AMD64 ABI для первых 6-ти параметров использует регистры процессора. Это
> в случае, если не будет произведена подстановка (inline) функции.читайте конвенции системных вызовов
>> "Преждевременная оптимизация есть корень всех зол" (с)
> что за ересь несете? я посмотрел бы если бы с таким утверждением писали бы математические алгоритмы.Это
> The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at > the wrong times; premature optimization is the root of all evil (or at least most of it) in programming.(c) некий Knuth в каком-то "Computer Programming as an Art"
> я посмотрел бы если бы с таким утверждением писали бы математические алгоритмы.Алгоритм Кнута — Морриса — Пратта, Алгоритм X … хм, и правда – кто такой Кнут супротив опеннетчиков? 🙄
> кто такой Кнут супротив опеннетчиков?Это уж точно.
>> The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at > the wrong times; premature optimization is the root of all evil (or at least most of it) in programming.читайте внимательно, "уделяют заботе об эффективности в неправильных местах и в неподходящее время" - где бл*ть обоснование? что значить оптимизация в его понимании? когда необходимо использовать слово оптимальность.
> Алгоритм Кнута — Морриса — Пратта, Алгоритм X … хм, и
открою вам секрет, мои студенты сами додумываются до этого алгоритма
>"в неправильных местах и в неподходящее время"попробуйте обосновать за него, что это значить? как понимать неправильное место в алгоритме и темболее неправильное время? эт когда луна не в той фазе? или проснулся не с той ноги?
>>"в неправильных местах и в неподходящее время"
> попробуйте обосновать за него, что это значить?Зачем мне за него что-то обосновывать, если он сделал это сам?
> programmers in the past have tended to be so preoccupied with efficiency that they have produced needlessly complicated code; the result of this unnecessary complexity has been that net efficiency has gone down, due to difficulties of debugging and maintenance.[ ...]
> My point is that there is a time and place for efficiency; I have discussed its proper role in my paper on structured programming, which appears in the current issue of Computing Surveyshttp://www.kohala.com/start/papers.others/knuth.dec74.html#e...
> Knuth, Donald E. Structured programming with go to statements.
> a methodology of program design, beginning with readable and correct, but possibly inefficient programs that are systematically transformed if necessary into efficient and correct, but possibly less readable code. The discussion brings out opposing points of view about whether or not go to statements should be abolished;[...]
> Experience has shown (see [46], [51]) that most of the running time in non-IO-bound programs is concentrated in about 3 % of the source text....
> There is no doubt that the grail of efficiency leads to abuse. Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97 % of the time: pre mature optimization is the root of all evil.Классика, вообще-то.
Можно соглашаться, можно не соглашаться, но умничать про алогритмы и не знать хотя бы в общих чертах, о чем это высказывание … "This is Spa^W Opennet!", угу.
> как понимать неправильное место в алгоритме и темболее неправильное время? эт когда луна не в той
> фазе? или проснулся не с той ноги?Это когда, для начала, не умеют отличать алгоритм от его реализации и начинают заявлять, что использование функций вместо goto == "срать в стек", при этом совершенно независимо от конкретных затыков конкретной реализации конкретного алгоритма, использованного для этой реализации ЯП и компилятора (профайлинг, инлайнинг, да хоть макросы – не, не слышали).
> открою вам секрет, мои студенты сами додумываются до этого алгоритма
Да-да! Все мы (особенно почему-то опеннетчики на опеннете) очень крепки задним умом.
Ну вот просто не повезло нам, великим опенетчикам, родиться позже и всё уже успели "застолбить" до нас всякие Кнуты, Дейкстры, Таненбаумы и Торвальдсы! А не то бы мы ух, всем показали бы! 🙄
> Зачем мне за него что-то обосновывать, если он сделал это сам?ну конечно, что и требовалось доказать. а собственных мыслей как нет так и не будет.
> Классика, вообще-то.
"""
Программисты тратят огромное количество времени на размышления или беспокойство по поводу скорости некритических частей своих программ, и эти попытки повышения эффективности на самом деле оказывают сильное негативное влияние при рассмотрении вопросов отладки и обслуживания.
"""ну конечно, программистам нужно думать как срубить быстрей бабла. Да бля хрен с эффективностью в угоду отладки и обслуживания.
> Можно соглашаться, можно не соглашаться, но умничать про алогритмы и не знать
> хотя бы в общих чертах, о чем это высказывание …
> "This is Spa^W Opennet!", угу.все у вас походу в общих чертах, поэтому вам чужда оптимизация и оптимальность.
>Это когда, для начала, не умеют отличать алгоритм от его реализации и начинают заявлять, что использование функций вместо goto == "срать в стек", при этом совершенно независимо от конкретных затыков конкретной реализации конкретного алгоритма, использованного для этой реализации ЯП и компилятора (профайлинг, инлайнинг, да хоть макросы – не, не слышали).и что значить уметь "отличать алгоритм от его реализации"? вы хоть представляете для чего нужны функции и тот же goto? Алгоритму пофиг на чем он будет написан, его на листе бумаге ребенку можно объяснить. И собственно - вы не согласны с тем что, вызов функции "срет в стек"?
>Да-да! Все мы (особенно почему-то опеннетчики на опеннете) очень крепки задним умом.
У вас походу и заднего ума нет, раз принимаете все на веру.
>Ну вот просто не повезло нам, великим опенетчикам, родиться позже и всё уже успели "застолбить" до нас всякие Кнуты, Дейкстры, Таненбаумы и Торвальдсы! А не то бы мы ух, всем показали бы!
Вы им про Евклида расскажите, а Торвальдс - бездарь.
>> Зачем мне за него что-то обосновывать, если он сделал это сам?
> ну конечно, что и требовалось доказать. а собственных мыслей как нет так и не будет.Доказать что и кому? Похоже, кто-то что-то себе придумал (или взял из методички) и сам же, гордо подтвердил/опроверг придуманное.
Вообще-то, это был контекст цитаты. Более подробные разъяснение автора, так сказать.
Причем тут вообще "собственные мысли", кроме как очередной попытки ad hominem-балаб^W демагогии – не ясно. Ну да *рен с ним - мне ваши дальнейшие фантазии на эту тему абсолютно не интересны.> """
> Программисты тратят огромное количество времени на размышления или беспокойство по поводу
> скорости некритических частей своих программ, и эти попытки повышения эффективности на
> самом деле оказывают сильное негативное влияние при рассмотрении вопросов отладки и
> обслуживания.
> """
> ну конечно, программистам нужно думать как срубить быстрей бабла. Да бля хрен
> с эффективностью в угоду отладки и обслуживания.Остальное, особенно ту часть где описывается, что "огромная часть сил" тратится на "оптимизацию" кода, который в общем случае занимает пару процентов времени выполнения вы, походу, выборочно не ос^W увидели?
Причем, это писалось в те времена, когда о профайлерах и прочих современных инструментах могли только мечтать.
Жаль (ну, почти).>> Можно соглашаться, можно не соглашаться, но умничать про алогритмы и не знать
>> хотя бы в общих чертах, о чем это высказывание …
>> "This is Spa^W Opennet!", угу.
> все у вас походу в общих чертах, поэтому вам чужда оптимизация и оптимальность.Когда нечего возразить по теме, упомяни что-то про общие черты и погадай по аватарке.
>>Это когда, для начала, не умеют отличать алгоритм от его реализации и начинают заявлять, что использование функций вместо goto == "срать в стек", при этом совершенно независимо от конкретных затыков конкретной реализации конкретного алгоритма, использованного для этой реализации ЯП и компилятора (профайлинг, инлайнинг, да хоть макросы – не, не слышали).
> и что значить уметь "отличать алгоритм от его реализации"? вы хоть представляете
> для чего нужны функции и тот же goto? Алгоритму пофиг на
> чем он будет написан, его на листе бумаге ребенку можно объяснить.Вам лучше знать, что вы там себе придумали. Конкретно тут, в #25 речь шла о реализации чего-то
>> Для повышения читаемости и поддерживаемости кода иногда лучше просто куски убрать в отдельные функции.Вы, в #55 обозвали этот шаг мудрым "и срать в стек", а в #55 приплели алгоритмы, заодно назвав довольно известную цитату "ересью".
> И собственно - вы не согласны с тем что, вызов функции "срет в стек"?
Конечно не согласен с тем, что оно "вообще и всегда делает " <это-самое> в стек. C чего бы? Есть инлайнинг, есть макросы - пиши не хочу.
Так же, не согласен с тем, что <это-самое-в-стек> всегда плохо.
Потому что кэш не резиновый. И есть такая штука, как вытеснение из кэша, когда более компактная реализация с вызовом функции будет быстрее простыни с анроллами, просто потому что будет меньше "выпадать" из кэша. Тем более, есть еще такая штука, как пайплайны, так что "лишний" call может вообще обойтись в "копейки" (а уж по сравнению с кэшмисом). Ну вот такой я "чуждый оптимизации", да.И вообще, с таким подходом остается вообще упростить процедуры-функции и все писать в одну гигантскую простыню, на лейблах (правда, далеко не факт, что результат будет быстрее).
Вот это вот, когда начинают заранее "оптимизировать" непонятно что и непонятно как (а потом вылезает очередной "go to fail") и называется "premature optimization".
>>Да-да! Все мы (особенно почему-то опеннетчики на опеннете) очень крепки задним умом.
> У вас походу и заднего ума нет, раз принимаете все на веру.Конкретно что, конкретно как и конкретно где я "все приял на веру", о Великий?
Или конкретики не будет, будут и далее непонятные приписывания мне непонятно чего?Разъясняю детально: попытки "опустить" Кнута от авторитетного анонима выглядят в лучшем случае убог^W забавно, не более. А уж переход на личности и инкрементирование чего-то там, вместо конкретного, аргументированного опровержения заявления так и вообще …
Кстати, Кнут, в отличие от анонима, аргументировал свое высказывание в целом "paper is from Computing Surveys, Volume 6, Number 4, December 1974, pages 261-301.". (ссылку я привел выше)
Это помимо того, что его утверждение подтверждается субъективными наблюдениями как в целом, так и тут, в этой ветке.
А вот аноним "аргументировал" аж на опеннете. Целым высказыванием "это ересь!".
Отличный аргумент, о да - я прям бегу верить анониму …>>Ну вот просто не повезло нам, великим опенетчикам, родиться позже и всё уже успели "застолбить" до нас всякие Кнуты, Дейкстры, Таненбаумы и Торвальдсы! А не то бы мы ух, всем показали бы!
> Вы им про Евклида расскажите, а Торвальдс - бездарь.На более-менее известный и применяемый алгоритм имени Sw00p-aka-Jerom или Sw00p-aka-Jerom's-student где-то можно глянуть? Нет? Значит закроем и эту тему.
> На более-менее известный и применяемый алгоритм имени Sw00p-aka-Jerom или Sw00p-aka-Jerom's-student
> где-то можно глянуть? Нет? Значит закроем и эту тему.закрыли тему, удачи
>Причем, это писалось в те времена, когда о профайлерах и прочих современных инструментах могли только мечтать.дополню, Колмогоров мечтал о профайлере :)))))
>> System V AMD64 ABI для первых 6-ти параметров использует регистры процессора. Это
>> в случае, если не будет произведена подстановка (inline) функции.
> читайте конвенции системных вызововВ самом деле, давайте, наконец, почитаем. Цитату из System V AMD64 ABI приводить пока не буду. Дам шанс исправиться "преподу" в глазах студентов.
Грош цена тому студенту, который на слово верит учителю, и не осмеливается его поправить.Грош цена тому учителю, который намерено не выскажет ложное утверждение, дабы выявить способности студента к здравому рассудку.
Ой, ой, полегче на поворотах с экзаменационный и индивидуальным подходом на публичном ресурсе.Ложная гипотеза "какания в стек" была сразу же опровергнута ссылкой на документ, название которого ты вот прям тогда впервые увидел, а за предоставленное время не смог найти и прочесть.[*]
Это при том, что в подавляющем большинстве случаев о конвенции вызова говорить не приходится (см. в скобках про встраивание).
Это при том, что есть ещё один интересный документик, название которого ты сейчас впервые увидишь, и потому я потрудился за тебя и скопировал из него замечательный фрагментик:
Intel® 64 and IA-32 Architectures Optimization Reference Manual
2.5.2.5 Stack Pointer Tracker
The Intel 64 and IA-32 architectures have several commonly used instructions for parameter passing and procedure entry and exit: PUSH, POP, CALL, LEAVE and RET. These instructions implicitly update the stack pointer register (RSP), maintaining a combined control and parameter stack without software intervention. These instructions are typically implemented by several micro-ops in previous microarchitectures.
The Stack Pointer Tracker moves all these implicit RSP updates to logic contained in the decoders themselves. The feature provides the following benefits:
• Improves decode bandwidth, as PUSH, POP and RET are single micro-op instructions in Intel Core microarchitecture.
• Conserves execution bandwidth as the RSP updates do not compete for execution resources.
• Improves parallelism in the out of order execution engine as the implicit serial dependencies between micro-ops are removed.
• Improves power efficiency as the RSP updates are carried out on small, dedicated hardware.Если коротко и доступно (а тебе не понятно, что в книжках пишут, потому ты и избрал тактику "а вам слабо меня научить") -- фигня твои какашки в стеке, лет эдак десять.
[*] Так что не оправдывайся, в касту учителей ты не вхож. Даже учителей риторики. Но ежели тебя кто-то допустил играть роль препода -- призадумайся, тому ли ты учишь. Это мой тебе добрый совет.
>Ложная гипотеза "какания в стек" была сразу же опровергнута ссылкой на документ, название которого ты вот прям тогда впервые увидел, а за предоставленное время не смог найти и прочесть.так, так , тут по поподробней, где тут моя ложная гипотеза про обсирание стека?
чем и кем опро..... как её там опровергнута?
пс: дальше продолжим разговор
>>Ложная гипотеза "какания в стек" была сразу же опровергнута ссылкой на документ, название которого ты вот прям тогда впервые увидел, а за предоставленное время не смог найти и прочесть.
> так, так , тут по поподробней, где тут моя ложная гипотеза про
> обсирание стека?Выше. Ищи сам. Ctrl+F и вперёд.
> чем и кем опро..... как её там опровергнута?
> пс: дальше продолжим разговорПфф. Размечтался. Тебе был дан шанс признать, что ты ошибался.
Тем более, что теперь есть анонимные функции.
В Си или в Си++?
Лейблы даже в javascript есть для выхода из вложенных циклов. Это мощный инструмент, особенно когда ты не можешь сказать компилятору, что эта функция должна быть заинлайнена.
Ага это сразу сделает все понятным. :)Ну даже в случае тривиальнейшего поиска элемента по n-мерной матрице.
Это мощный инструмент для убогих языков. В нормальных языках брейку можно сказать, куда именно выходить.
И чем это принципиально отличается от goto кроме названия?
Тем, что break прикончит всё сам, а после goto нужно убирать.
Кто на ком стоял ?
Кто и что прикончит брейки и что нужно убрать после goto?
Давайте вы покажете, как вы используете своё гото на примере? Только, пожалуйста, больше контекста. Хотя бы строк 200
> Давайте вы покажете, как вы используете своё гото на примере? Только, пожалуйста,
> больше контекста. Хотя бы строк 200Смотрите #26 и прекращайте выдумывать новые контексты.
Example:```
struct some_t *some(const void *const args) {
const int err;
struct some_t *result;
result = malloc(...);
if (result == nullptr) {
err = enomem;
goto out;
}
for (iterator i = c.first(); i++; i != nullptr) {
if (...) {
err = 2;
goto out;
} else {
result ...
}
}
err = 0;
out:
if (err != 0) {
some_free(result);
rsult = nullptr;
}
return result;
}
```
Что за чушь приведена в качестве примера? Где там "asm goto" из новости?
Угадай, на каком это языке:
10 IF ( ... ) THEN
...
GO TO 10
END IF
Английский?
На FORTAN-77 похоже.
> На FORTAN-77 похоже.Он самый.
Метка и GO TO используются для организации цикла.
http://rosettacode.org/wiki/Flow-control_structures#Fortran
Из полезного там ещё ссылаются на текст Кнута:
Настоящие программисты используют продолжения, а на ваше гоуту смотрят как на детскую игрушку.
> Настоящие программисты используют продолжения, а на ваше гоуту смотрят как на детскую
> игрушку.а кто-то понимает, что goto суть рекурсивный вызов.
>> Добавлена реализация специфичного для GCC выражения "asm goto", которое позволяет выполнить переход из ассемблерного inline-блока к метке в коде на языке Си.
> Вот это правильно! Даёшь ещё более запутанный код!Упрощай. Для тебя ведь код не запутан, не так ли?
static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
{
asm_volatile_goto("1:"
".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t"
".pushsection __jump_table, \"aw\" \n\t"
_ASM_ALIGN "\n\t"
".long 1b - ., %l[l_yes] - . \n\t"
_ASM_PTR "ю + а - .\n\t"
".popsection \n\t"
: : "i" (key), "i" (branch) : : l_yes);return false;
l_yes:
return true;
}https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/lin...
Переходи на FreeBASIC*, не страдай.
* FreeBASIC is a free/open source (GPL), BASIC compiler for Microsoft Windows, DOS and Linux.
Скажи ещё, что это я жаловался на запутанность, которую якобы даст goto, а не ты. ;)
> Скажи ещё, что это я жаловался на запутанность, которую якобы даст goto,
> а не ты. ;)Разве я жаловался? Наоборот же, анон, я горячо приветствую каждое прогрессивное начинание. Выпрыгивание из ассемблерной вставки куда-нибудь в сишечный код подальше очень и очень улучшит понятность и управляемость программы. Я ни секунды не сомневаюсь в этом. Я за прогресс!
>> Скажи ещё, что это я жаловался на запутанность, которую якобы даст goto,
>> а не ты. ;)
> Разве я жаловался? Наоборот же, анон, я горячо приветствую каждое прогрессивное
> начинание.То есть вообще не понимаешь, о чём в идёт речь новости. Объясняю. Код с таким goto существует давно. Добавили возможность трансляции имеющегося кода.
Интересно, когда Julia на него переедет....
> Обеспечено преобразование вызовов memcmp в bcmp в некоторых ситуациях.Зачем?
> функций с типом void
Функция не может иметь тип void. Функция может возвращать void.
>Функция не может иметь тип void.как и вообще типы, ибо функция - не данные (получаемые, возвращаемые и т.д.), а набор инструкций. Про функции высшего порядка промолчу.
>В компоновщик LLD добавлена экспериментальная возможность партицирования, позволяющая разделить одну программу на несколько частей, каждая из которых размещается в отдельном ELF-файле. Указанная возможность позволяет запускать основную часть программы, которая по мере необходимости в процессе работы будет подгружать остальные компонентыDOS overlay?!
Всё новое - хорошо забытое старое…
Почему же забытое? Ты мог это делать через dlopen/dlclose сколько угодно.
Мог прилагать усилия, а теперь оно само но вопрос про оверлеи они были сами или их надо было деать
А что с поддержкой Intel HEX в llvm-objcopy, вроде добавляли её?
Clang 10 отлично работает, хоть и nightly.
а чё там по сборке ядра?
а чё там по чтению текста новости?
Может еще смузи не пить? Читать новости давно не в тренде (чиатать надо только заголовки не более 140 символов).
Читаете новости через SMS шлюз?
Давно LLVM стал всего лишь «набором компиляторов»?
"The LLVM Project is a collection of modular and reusable compiler and toolchain technologies."Ну да, не совсем точный перевод
Товарищь админ, не используйте пожалуйста расшифровку (Low Level Virtual Machine). На сегодняшний день это уже не так, и LLVM просто бренд, который никак ни расшифровывается:"The name "LLVM" was once an acronym, but is now just a brand for the umbrella project"
цитата взята от: http://www.aosabook.org/en/llvm.html
на эту книгу есть ссылка из официальной документации: http://llvm.org/docs/ (Intro to LLVM)
GNU - Gnu's Not Unix. LLVM - LLVM's Not Linux.
Во FreeBSD 12 кое-что начало компилироваться с -flto=full. Но надо использовать егойный /usr/local/llvm90/bin/ld.lld. Firefox/Thunderbird у мну не получилось :(
> Firefox/Thunderbird у мну не получилосьЭто, возможно, как-то связано с: http://blog.llvm.org/2019/09/closing-gap-cross-language-lto-...
Линк-тайм оптимизации плохо заходят на границах между языками. Требуют специальной доводки.
Во время линк-тайм оптимизаций нет никаких языков и границ между ними.
Есть кривые руки авторов компилятора rust.
> Во время линк-тайм оптимизаций нет никаких языков и границ между ними.Теоретически. Все такие заявления теоретичны по своей сути, и большинство попыток эту теорию перевести в разряд практической реализации разбиваются о реальность в мелкую щепу.
> Есть кривые руки авторов компилятора rust.
Ну если ты хочешь сводить всё к кривым рукам, то авторы компилятора rust как раз справились. Кроме rust'а, LTO работает с C/C++, Haskell'ом, и может ещё одним-двумя языками. При таком раскладе, выходит, кривые руки почти у всех, но не у разработчиков rust'а. Остающиеся проблемы, в общем, связаны скорее с багами LLVM, которые не проявляют себя на оптимизациях C/C++, но проявляют себя на оптимизациях rust'а, в силу того, что rust позволяет больше оптимизаций проводить.
Я выше кинул ссылку на статью, которая в общих чертах описывает эпопею с запиливанием межъязыкового LTO для раста, чтобы компилировать firefox не парясь о недооптимизации на границе между C++ и Rust. Ты почитай её на досуге, чтобы оценить сложность проблемы, это позволит тебе более обоснованно судить о том, является ли неспособность запилить для языка LTO с C/C++ признаком кривых рук или нет.
Я-то эту статью прочитал. И, в отличие от тебя, понял, что там написано.
И как компиляторы работают я знаю получше тебя, так что не надо меня поучать.
> Я-то эту статью прочитал. И, в отличие от тебя, понял, что там
> написано.
> И как компиляторы работают я знаю получше тебя, так что не надо
> меня поучать.Это видно, просто на лбу написано. Что ж ты глупости такие говоришь тогда? У меня, впрочем, есть возможный ответ на этот вопрос: твоё "лучшее" знание компиляторов сугубо теоретично. Книжку прочитал какую, аль убелённый сединами препод тебе курс теории трансляторов прочитал? Я очень уважаю теорию, но при всём при этом, я всегда помню одну вещь (и тебе очень рекомендую): теория не подкреплённая практикой -- пустое место. Если ты читал книжку по теории трансляции и не написал ни одного транслятора, и не попытался использовать код существующих компиляторов для чего-либо, то лучше бы ты использовал эту книжку для дел сортирных, больше пользы бы извлёк.
Ну реально, если бы у тебя был опыт программирования, то после прочтения той статьи, ты бы не обвинял никого в кривых руках. Ты бы аплодировал стоя тому, через какие сложности ребятам удалось прорваться. Потому что мало лишь на это способен.
Ну хорошо, допустим, я тупица, теоретик и не видел ни одного компилятора.
Просвети же меня, о мудрейший, какие такие свойства раста мешали использованию Rust+C LTO?
Я еще, видимо, и английский не понимаю. Может твои объяснения по-русски пойму?
> Ну хорошо, допустим, я тупица, теоретик и не видел ни одного компилятора.
> Просвети же меня, о мудрейший, какие такие свойства раста мешали использованию Rust+C
> LTO?Я где-то говорил, что свойства раста мешали использованию Rust+C? Ты продолжаешь мыслить теоретически. LTO -- это не теоретическая штука, это не какая-то абстрактная идея о том, как можно проводить link-time оптимизации. LTO -- это кусок кода внутри llvm. _Внутри_, то есть не стоЯщий отдельно, а искусно погнутый так, чтобы без зазоров соединяться с другими кусками кода. Кусок кода имеющий множество точек входа, и каждая точка входа может принимать аргументы как явно, так и неявно. Чтобы понять как нужно дёргать этот кусок кода, чтобы он сделал именно то, что тебе нужно, требуется куча времени по изучению этого куска кода и смежных с ним. Иногда это происходит потому, что что-то там недокументировано, иногда потому что документировано, но ты не нашёл документацию, иногда потому, что ты что-то совершенно другое сделал не так и не заметил, и оно падает с ошибкой, несмотря на то, что здесь ты делаешь всё правильно, дёргаешь нужные функции API, в нужном порядке и с нужными аргументами. Ты знаешь, что косяки лезут в файле X в N'ой строке, но ты знаешь, что там всё правильно сделано, реальная ошибка где-то ещё. И вот ты сидишь в дебуггере, отслеживая как выполняется программа, которая работает, и сравнивая это с тем, как работает твоя программа, которая не работает. Тебе не знаком этот опыт? Это видно, и именно поэтому я и говорю о том, что у тебя какой-то излишне теоретический взгляд на чисто техническую проблему.
А как насчёт версий llvm? llvm меняется от версии к версии, rust идёт за llvm и привязывается к нему, но нигде нет гарантий, что clang и rust основаны на достаточно близких версиях. Эта проблема уже почти организационного уровня, и очевидно напрашивающийся способ решить её полностью -- это синхронизировать выпуски и их нумерацию шланга и раста. Но это будет очень неудобно, потому что сейчас нумерация версий rust'а привязана к плану разработки rust'а. При этом даже использовать "стабильные" версии llvm будет затруднительно, потому что подчастую используются версии llvm собранные по номеру ревизии в git, потому что именно там был исправлен блокирующий баг llvm.
Пока вместо этого они завели табличку совместимости между версиями, чтобы в ней отмечать удачные комбинации версий. Что делать в будущем, они пока ещё не знают, это требует более широкого обсуждения с привлечением других разработчиков, не только тех, кто занимался LTO.
> Я еще, видимо, и английский не понимаю. Может твои объяснения по-русски пойму?
Я думаю, что дело не в способности понимать, а в способности удерживать внимание на тексте достаточно долго, чтобы дочитать до конца. Могу предположить, что дело было так, ты прочитал два абзаца, не увидел ничего нового для себя, и решил что такому специалисту как ты, зазорно читать статью, потому как она написана для нубов. Вместо этого ты пролистал статью сверху вниз, выхватывая отдельные слова. Среди них не оказалось незнакомых, поэтому ты решил, что знаешь всё, что написано в статье. Впрочем это лишь предположение, основанное на моём прошлом опыте совершения подобных ошибок.
Подожди-ка, мы начали с того, что я сказал, что во время LTO нет уже никаких языков.
Ты мне начал возражать. А теперь начинаешь мне впаривать про интеграционные проблемы.
Эти проблемы не новость и хорошо известны.
Я всего лишь хотел тебе сказать, что эти чуваки поимели бы те же самые проблемы, если бы пытались
точно таким же образом написать свой фронтенд для С, а не Rust. Конкретный язык тут вообще
непричем.В статье они описали, как их (не)понимание работы LLVM не совпало с тем, как оно работает на самом
деле. Ну, разобрались, молодцы, починили, статью написали.
Но это никакой не подвиг и не прорыв. Обычная работа.На прощанье могу тебе только посоветовать придерживать свою проницательность и свое ЧСВ,
и пытаться слышать других а не только себя любимого.
Иногда попадаются умные люди (это я не про себя), у которых многому можно научиться и узнать.
> Подожди-ка, мы начали с того, что я сказал, что во время LTO
> нет уже никаких языков.
> Ты мне начал возражать. А теперь начинаешь мне впаривать про интеграционные проблемы.Да, естественно, я начал возражать, заявив, буквально следующее "Теоретически [нет никаких языков и границ между ними]. Все такие заявления теоретичны по своей сути, и большинство попыток эту теорию перевести в разряд практической реализации разбиваются о реальность в мелкую щепу."
Это как-то у тебя не состыковывается со всем остальным, что я написал?
> Эти проблемы не новость и хорошо известны.
> Я всего лишь хотел тебе сказать, что эти чуваки поимели бы те
> же самые проблемы, если бы пытались
> точно таким же образом написать свой фронтенд для С, а не Rust.Не совсем. Баги, ради исправления которых разработчики rust'а шлют патчи в llvm, подчастую носят как раз характер багов, не проявляющихся на C/C++, но проявляющихся на rust'е. LTO тестировался до rust'а на C, C++ и Haskell'е. Пришёл rust и нашёл новую пачку багов. Некоторые из них, вероятно, порождение реализации, и другая реализация rust'а или C, может и не столкнулась бы с ними, а некоторые вызваны особенностями rust'а как языка, и с ними у компилятора C было бы примерно ноль шансов столкнуться.
> В статье они описали, как их (не)понимание работы LLVM не совпало с
> тем, как оно работает на самом
> деле. Ну, разобрались, молодцы, починили, статью написали.
> Но это никакой не подвиг и не прорыв. Обычная работа.Ну, да. Но и "кривые руки" тут не при чём, не так ли? Ребята справились с этой работой, мне хочется их поздравить -- я представляю себе через какие глубины фрустрации им пришлось пройти, решая описанные проблемы.
> На прощанье могу тебе только посоветовать придерживать свою проницательность и свое ЧСВ,
> и пытаться слышать других а не только себя любимого.Мне показалось, или я что-то слышал про бревно в глазу?
> Иногда попадаются умные люди (это я не про себя), у которых многому
> можно научиться и узнать.Где? Где тебе попадаются такие люди? Реально мало таких мест. И с каждым годом всё меньше и меньше. Я никак понять не могу -- это мои стандарты к уму собеседника растут, или люди тупеют.
Всегда интересовался вопросом, что такое "релиз" а что такое "выпуск". Берем эту тему, тут "релиз". Берем соседнюю тему "https://www.opennet.me/opennews/art.shtml?num=51522" в которой пишут что Выпуск Samba 4.11.0, но потом "Представлен релиз" Может кто внятно объяснить чем релиз лучше выпуска?
Если зарелизили, то релиз. Если выпустили, выпуск. Если наваяли, ...
> Если зарелизили, то релиз. Если выпустили, выпуск. Если наваяли, ...Не, наоборот. Релизят выпуск, а выпускают релиз. Иначе тавтология получается :)
Выпуск релиза нового обновления
Есть спринты (майлстоны) их результат это выпуск,
а есть функиональные требования от заказчика и их удовлетворяющий выпуск это релиз.
А может и на оборот
В чём кайф если ядро клангом собрать?
Кто-нибудь собирал ядро клангом на х86_64 и может объяснить какой-то практический профит? Быстрее компиляция или это как-то отразилось на работе системы?
Варнингов больше будет - выше шанс найти ощибок выхода за границы и тд
Если соберётся. то, возможно, в панику впадать начнёт.
ни в чём. при компиляции сначала придётся включить игнор [не помню уже каких именно] ворнингов. а затем ловить корки ядра.
> компилирующего программы в промежуточный биткод RISC-подобных виртуальных инструкций (низкоуровневая виртуальная машина с многоуровневой системой оптимизаций). Сгенерированный псевдокод может быть преобразован при помощи JIT-компилятора в машинные инструкции непосредственно в момент выполнения программы.Зачем мне это? Компилятор во время я компиляции должен давать сразу бинарник заточенный под мой проц.
Выполняют компиляцию один раз, во время установки с исходников, с максимальной заточькой под мой проц. Не хочу чтобы исполняемый код изменялся во время компиляции вирусной или каким-то JIT.
Я хз зачем это в новости, LLVM _может_ использоваться так как описано, но в основном его используют как обычный компилятор под конкретную архитектуру (как GCC, он с ним почти полностью совместим).
Вам может не надо, кому-то JIT надо =)
> проекты Android и ChromeOS уже переведены на использование Clang для сборки ядра и Google тестирует Clang в качестве основной платформы для сборки ядер для своих рабочих Linux-системв чём профит для гугла от этого?
Лицензия у ГЦЦ требует лизать ботинки авторам а в кланге только писать что использовался шланг
Уменьшение зоопарка инструментария. gcc крайне сложно использовать для чего-либо, кроме компиляции. llvm можно использовать для подсветки синтаксиса, для написания статических анализаторов, и для любых других задач требующих парсера языка. При желании можно использовать не только фронтенд llvm, но и бекенд. С gcc тоже так можно, но теоретически, потому что практически проще использовать llvm: какой бы убогой не была его документация, у gcc всё ещё хуже.
клэнг - это изначально кросс-компилятор, по определению. Ставишь клэнг из пакетов - и нужна только sysroot. GCC же нужно компилировать свой для каждой платформы - в нём пути жёстко захардкожены. В результате можно будет не поставлять компиляторы в составе ndk.
>В компоновщик LLD добавлена экспериментальная возможность партицирования, позволяющая разделить одну программу на несколько частей, каждая из которых размещается в отдельном ELF-файле. Указанная возможность позволяет запускать основную часть программы, которая по мере необходимости в процессе работы будет подгружать остальные компоненты (например, можно выделить встроенный PDF-просмотрщик в отдельный файл, который будет загружаться только когда пользователь открыл PDF-файл).Это уже было в TurboPascal ещё в 90е... :)