Здравствуйте, WolfHound, Вы писали:
WH>Нет тут все на много проще... компилятор просто выкидывает вызов функции которая ни чего не возвращает и не содержит побочных эффектов...
Ну, это возможно. Но если не выкинит, то 0 сек. обеспечено в следствии вылета.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Nick_, Вы писали:
N_>Здравствуйте, VladD2, Вы писали:
VD>>Здравствуйте, Nick_, Вы писали:
N_>>>Синтаксический анализ невозможно сделать до лукапа, а лукап до инстанциации.
VD>>Синтаксический как раз легко. Ты говоришь о разрешение имен.
N_>В том примере, который я приводил синтаксический анализ существенно зависит от того, что такое T::x.
Ёлы-плаы. Ну, загляни в гугль. Погляди чем синтаксический анализ отличается от семантического. Ну, и что такое вообще синтаксический анализ.
N_> Его нельзя провести, если не сделать предположение о том, что T::x — не тип.
Да пофигу для синтаксического разбора чем будет эта конструкция. Тип, не тип — это уже семантика.
Ну, а макросы они вообще без синтаксического разбора работают. Это просто текстовые операции.
N_>Легко провести лексический анализ, что компиляторы и делают. С каждым шаблоном ассоциируется цепочка лексем. А синтаксический анализ проводится при инстанциации.
Нда. Гугль тебе в руки. Ты все перепутал.
N_>Но это не суть. Я все это к тому, что шаблоны в С++ недалеко ушли от макросов.
Да далеко. Но не доконца. Проблем хватает. Но тут оно как. Очень многие недостатки являются продолжениями достоинств. Если гибко, то обязательно будет небезопасно. И наоборот. Вот в дженериках проблем с поздними проврками нет. Но и гибкость ниже.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Alexey Chen, Вы писали:
AC>Включите. Это будет здорово! Хотя, со временем хтелось бы развернутую статью именно по F# с точки зрения его полжения в семействе # и как этим успешно пользоваться.
Дык не зная что такое ОКамл будет практически невозможно понять, что такое F#.
AC>Как мне например вынести из приложения на C# или C++ реально функциональный код и написать его на F#-е. Это было бы очень интересно.
Ну, это вроде как довольно просто. F# порождает стандартные дотнтные сборки. Так что достаточно оформить нужные входные точки (на F#) и использовать эти функции из Шарпа подключив сборку созданную на F# к Шарповскому прокту.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Quintanar, Вы писали:
Q>У меня, например, есть пара парсеров на OCaml. Один интерпретор примитивного языка, а другой конвертатор из bnf в sml yacc. Могу их выложить, хотя я ими не очень доволен, писал их когда еще слабо разбирался в функциональном стиле.
Выкладывай. Хуже не будет. А пример есть пример.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Код вообще некорректен и рабоать вряд ли сможет.
Хм, чем это он некорректен? Полностью соответствует стандарту.
VD>Ну, и столь вольные допущения компиляторы пока что не делают.
Для самых любознательных привожу ассемблерный вид, к которому преобразовал эту программу VC7.1
00401000 xor eax,eax
00401002 ret
Как думаешь, сколько времени это будет выполняться?
А вот еще пример из той же оперы:
int CalcSuperNumber(int n)
{
for( int i=0, k=0; i < 500000000; ++i ) // ПЯТЬСОТ миллионов!!!!!!!
{
k += n;
}
return k;
}
int main()
{
printf( "%i", CalcSuperNumber(10) );
return 0;
}
Тут программа уже посложнее, имеется побочный эффект — вывод результата на консоль. Сколько же она будет работать? Минуту, две? .
А нисколько!
Потому как компилятор нынче пошел на редкость умен и сообразителен. Вот что получим на выходе:
00401070 push 2A05F200h ; А вот это и есть готовый результат :)
00401075 push offset KERNEL32_NULL_THUNK_DATA+2Ch (4060FCh)
0040107A call printf (4010CDh)
0040107F add esp,8
00401082 xor eax,eax
Какая досада, комнилятор сразу подставил готорый результат еще во время компиляции
Здравствуйте, prVovik, Вы писали:
V>Какая досада, комнилятор сразу подставил готорый результат еще во время компиляции
Знал бы ты какой ценой это дается разработчикам компиляторов.
Сначала программа переводится в SSA форму, над которой потом делаются оптимизации.
Так вот сюрпиз! SSA форма — это функциональная программа http://citeseer.ist.psu.edu/appel98ssa.html
В функциональных языках сделать такие оптимизации на порядок проще, потому что компилятору легче вытянуть смысл из того, что написал программист.
Здравствуйте, VladD2, Вы писали:
VD>Ёлы-плаы. Ну, загляни в гугль. Погляди чем синтаксический анализ отличается от семантического. Ну, и что такое вообще синтаксический анализ.
N_>> Его нельзя провести, если не сделать предположение о том, что T::x — не тип.
VD>Да пофигу для синтаксического разбора чем будет эта конструкция. Тип, не тип — это уже семантика.
Почитай на досуге грамматику С++ или С.
Для синтаксического анализа как раз важно, чем является символ — идентификатором или типом.
например:
x y;
Если x — не тип, то возникнет синтаксическая ошибка. До семантического анализа даже не дойдет.
Еще один пример:
если в выражении после `(' стоит тип, то это c-style cast, и по синтаксису, после `)' должно быть выражение.
а если после `(' не тип, то это просто скобки подвыражения, и после них может быть `;'
Хочешь сказать, что это семантика?
Здравствуйте, Nick_, Вы писали:
N_>Здравствуйте, prVovik, Вы писали:
V>>Какая досада, комнилятор сразу подставил готорый результат еще во время компиляции
N_>Знал бы ты какой ценой это дается разработчикам компиляторов. N_>Сначала программа переводится в SSA форму, над которой потом делаются оптимизации. N_>Так вот сюрпиз! SSA форма — это функциональная программа N_>http://citeseer.ist.psu.edu/appel98ssa.html
N_>В функциональных языках сделать такие оптимизации на порядок проще, потому что компилятору легче вытянуть смысл из того, что написал программист.
ты хотя раз видел этот ssa?
а вот в gcc 4 появится ещё одно промежуточное представление императивное(GIMPLE) c С подобным синтаксисом, они говорят после этого возможности оптимизации увеличатся на порядок.
Здравствуйте, naje, Вы писали:
N>Здравствуйте, Nick_, Вы писали:
N_>>Здравствуйте, prVovik, Вы писали:
V>>>Какая досада, комнилятор сразу подставил готорый результат еще во время компиляции
N_>>Знал бы ты какой ценой это дается разработчикам компиляторов. N_>>Сначала программа переводится в SSA форму, над которой потом делаются оптимизации. N_>>Так вот сюрпиз! SSA форма — это функциональная программа N_>>http://citeseer.ist.psu.edu/appel98ssa.html
N_>>В функциональных языках сделать такие оптимизации на порядок проще, потому что компилятору легче вытянуть смысл из того, что написал программист. N>ты хотя раз видел этот ssa?
вот кстати rtl дамп програмки используемой в статье:
как видно от функциональных языков остаётся только схемовский синтаксис и всё, в остальном это просто платформенно независимы асемблер, или кто-то скажет что jump_insn это функциональная конструкция?
Здравствуйте, naje, Вы писали:
N_>>В функциональных языках сделать такие оптимизации на порядок проще, потому что компилятору легче вытянуть смысл из того, что написал программист. N>ты хотя раз видел этот ssa?
Да.
N>а вот в gcc 4 появится ещё одно промежуточное представление императивное(GIMPLE) c С подобным синтаксисом, они говорят после этого возможности оптимизации увеличатся на порядок.
Просто так оптимизации в компиляторы не вставляют. Для любой оптимизации надо сначала доказать, что она не меняет семантику кода. А для этого в свою очередь нужен способ, который бы позволил сказать, что два разных алгоритма делают одно и то же. В общем случае, эта задача алгоритмически неразрешима. Но для более узких типов эквивалентности алгоритмов это можно сделать. Кроме того алгоритм должет быть как-то записан. Для некоторых форм записи провести доказательство правильности оптимизации проще чем для других. SSA — это уже де-факто стандартная форма записи алгоритмов. Большинство доказательств корректности оптимизаций делается для оптимизайций SSA формы. В большинстве современных компиляторов используется SSA форма, как внутреннее представление программы.
Здравствуйте, naje, Вы писали:
N>вот кстати rtl дамп програмки используемой в статье:
N>как видно от функциональных языков остаётся только схемовский синтаксис и всё, в остальном это просто платформенно независимы асемблер, или кто-то скажет что jump_insn это функциональная конструкция?
register transfer language — это действительно, переносимый ассемблер. высокоуровневые оптимизации на этом представлении не сделаешь. И то, что в gcc используется только rtl для представления программы ему чести не делает.
Здравствуйте, Nick_, Вы писали:
N_>Здравствуйте, naje, Вы писали:
N>>вот кстати rtl дамп програмки используемой в статье:
N>>как видно от функциональных языков остаётся только схемовский синтаксис и всё, в остальном это просто платформенно независимы асемблер, или кто-то скажет что jump_insn это функциональная конструкция?
N_>register transfer language — это действительно, переносимый ассемблер. высокоуровневые оптимизации на этом представлении не сделаешь. И то, что в gcc используется только rtl для представления программы ему чести не делает.
вобще-то rtl это какраз и есть представление ssa
я вот только не пойму, если верить той статье, то компилятор из нормальный цикл переводит в рекурсию, после чего обратно в цикл, может покажешь мне продолжение этой статьи, о том как компиляторы из рекурсий в ssa оптять делают циклы?
Здравствуйте, prVovik, Вы писали:
VD>>Код вообще некорректен и рабоать вряд ли сможет. V>Хм, чем это он некорректен? Полностью соответствует стандарту.
Массив не инициализирован и превышает размеры стэка.
VD>>Ну, и столь вольные допущения компиляторы пока что не делают. V>Для самых любознательных привожу ассемблерный вид, к которому преобразовал эту программу VC7.1
V>
V>00401000 xor eax,eax
V>00401002 ret
V>
Дык, ты результат верни и погляди что получится. А так он просто выбрасил с дури код и все.
V>Как думаешь, сколько времени это будет выполняться?
Думаю, что смысла в таком коде еще мешьше чем в заявлениях сделанных на его основе.
V>А вот еще пример из той же оперы: V>
V>Тут программа уже посложнее, имеется побочный эффект — вывод результата на консоль. Сколько же она будет работать? Минуту, две? . V>А нисколько! V>Потому как компилятор нынче пошел на редкость умен и сообразителен.
О! Умища палата. Вот только достаточно переменную в классик вынести или малейшие зачатки разума в алгоритм заложить и вся прыть компилятора куда-то улитучивается.
V>Какая досада, комнилятор сразу подставил готорый результат еще во время компиляции
Вот именно по этому синтетические тесты не имеют смысла. У тебя даже заведомо бессмысленный код скомпилируется. А на рельный код это ровным счетом никакого влияние не окажет.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, naje, Вы писали:
N>вобще-то rtl это какраз и есть представление ssa
Да? А как же jump'ы?
N>я вот только не пойму, если верить той статье, то компилятор из нормальный цикл переводит в рекурсию, после чего обратно в цикл, может покажешь мне продолжение этой статьи, о том как компиляторы из рекурсий в ssa оптять делают циклы?
А зачем?
Здравствуйте, Nick_, Вы писали:
N_>Здравствуйте, naje, Вы писали:
N>>вобще-то rtl это какраз и есть представление ssa N_>Да? А как же jump'ы?
ты можешь привести какое-нибудь другое представление без jump'ов?
N>>я вот только не пойму, если верить той статье, то компилятор из нормальный цикл переводит в рекурсию, после чего обратно в цикл, может покажешь мне продолжение этой статьи, о том как компиляторы из рекурсий в ssa оптять делают циклы? N_>А зачем?
Здравствуйте, naje, Вы писали: N>>>вобще-то rtl это какраз и есть представление ssa N_>>Да? А как же jump'ы?
N>ты можешь привести какое-нибудь другое представление без jump'ов?
Граф.
N>>>я вот только не пойму, если верить той статье, то компилятор из нормальный цикл переводит в рекурсию, после чего обратно в цикл, может покажешь мне продолжение этой статьи, о том как компиляторы из рекурсий в ssa оптять делают циклы? N_>>А зачем?
N>а зачем это ocalm например пытается делать?
Не знаю. Это надо спросить кого-нибудь кто знает ocaml.
Возможно имеется в виду, что рекурсия в ocaml так же эффективна как цикл в Си. Просто многие считают, что рекурсия это плохо, основываясь на своем опыте программирования в Си, где действительно каждый вызов функции приводит к работе со стеком. Поэтому и говорят, что ocaml превращает рекурсию в цикл.
И уверяю тебя что кое-что в этом понимаю. Ты перепутал понятия синтаксического разбора (собственно парсинга) и семантического анализа.
N_>Хочешь сказать, что это семантика?
Даже говорить ничего не хочу. Если тебя интересует этот вопрос, то учебников по построению компиляторов море.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Nick_, Вы писали:
N>>а зачем это ocalm например пытается делать? N_>Не знаю. Это надо спросить кого-нибудь кто знает ocaml. N_>Возможно имеется в виду, что рекурсия в ocaml так же эффективна как цикл в Си. Просто многие считают, что рекурсия это плохо, основываясь на своем опыте программирования в Си, где действительно каждый вызов функции приводит к работе со стеком. Поэтому и говорят, что ocaml превращает рекурсию в цикл.
Хочешь письками помериться?
VD>И уверяю тебя что кое-что в этом понимаю. Ты перепутал понятия синтаксического разбора (собственно парсинга) и семантического анализа.
А я тебя уверяю, что я ничего не напутал.
N_>>Хочешь сказать, что это семантика?
VD>Даже говорить ничего не хочу. Если тебя интересует этот вопрос, то учебников по построению компиляторов море.
То-есть аргументированно возразить уже не можешь?