Применение некоторых языков
Для Коммонлиспа я знаю библиотеку Common Music. О репутации ее можно сказать следующее: отдельно взятые эффекты из нее энтузиасты переделывают в VST для не соприкасающихся с Лиспом.
Но она опенсырцная, так что под твои критерии не подходит.
Типа, слабо самому сходить посмотреть?Во-во. Слабо самому выклевать те крохи софта, что худо-бедно разработали под ЛИСПами вместе с огромным количеством native кода на каком-нибудь Си.
огромным количеством native кода на каком-нибудь Си.если код библиотечного уровне, или в низкого уровня, то его просто необходимо писать на C. Прелелесть всех этих "некоторых языков", по словам их сторонников, в том, что можно относительно просто создавать приложения со сложной логикой.
если код библиотечного уровне, или в терминах низкого уровня, то его просто необходимо писать на C. Прелелесть всех этих "некоторых языков", по словам их сторонников, в том, что можно относительно просто создавать приложения со сложной логикой.Ну да, да. А мы выразили в этом сомнения. Все наезды на тот же Си++ пока что были по незнанию.
чтобы не начинать новый клон треда "еще раз о насильниках", не будем останавливаться на недостатках/преимуществах с++. В теме ищутся проекты, в которых используются "некоторые языки", причем, требовать, чтобы проект был одноязычен, не стоит в силу описанных в моем предыдущем сообщении причин.
Никто не озаботился тем, чтобы выкладывать такие сведения.
---
"Аллах не ведёт людей неверных."
требовать, чтобы проект был одноязычен, не стоит в силу описанных в моем предыдущем сообщении причинДа, без Си редко обходятся. Поэтому мы всё понимаем и ничего не требуем.
http://en.wikipedia.org/wiki/Common_Lisp#Applications
заметим, что самое пропиаренное из написанных на лиспе приложений, в итоге переписали на плюсах![](/images/graemlins/smile.gif)
в википедии есть их - заметим, что самое пропиаренное из написанных на лиспе приложений, в итоге переписали на плюсах
![](/images/graemlins/smile.gif)
ней дано описание семи компаний/проектов:
На hashell.org есть список компаний/проектов, которые используют Haskell. Дается четыре категории: математика, исследования, обучение и индустрия. Для народного хозяйства наибольший интерес представляет последняя категория. В * Aetion Technologies LLCМое мнение — чо-то негусто.
Aetion is a defence contractor offering AI applications based on Bayesian nets. Rapidly changing priorities make it important to minimize the code impact of changes, which suits Haskell well. Aetion have developed three main projects in Haskell, all successful. Haskell's concise code was perhaps most important for rewriting: it made it practicable to throw away old code occasionally. DSELs allowed the AI to be specified very declaratively.
* Bluespec, Inc.
Developing a modern integrated circuit (ASIC or FPGA) is an enormously expensive process involving specification, modeling (to choose and fix the architecture design (to describe what will become silicon) and verification (to ensure that it meets the specs all before actually committing anything to silicon (where the cost of a failure can be tens of millions of dollars). Bluespec, Inc. is a three year-old company that provides language facilities, methodologies, and tools for this purpose, within the framework of the IEEE standard languages SystemVerilog and SystemC, but borrowing ideas heavily from Term Rewriting Systems and functional programming languages like Haskell. In this talk, after a brief technical overview to set the context, we will describe our tactics and strategies, and the challenges we face, in introducing declarative programming ideas into this field, both externally (convincing customers about the value of these ideas) and internally (using Haskell for our tool implementation).
* Credit Suisse
This group's business is derivative trading for clients. Valuing complex derivatives is computationally costly, requiring nightly runs on thousands of CPUs. There is a real competitive advantage in being able to build models quickly, since some exotic derivatives may only be traded 10-100 times in total. Previously models were built using Excel, with heavy computations delegated to C++ plugins. Most of the Excel code has now been replaced by Haskell, with Excel just providing the user interface (which in turn is generated by DSELs).
* Erlang Training and Consulting Ltd
* Galois Connections
Galois designs and develops high confidence software for critical applications. Our innovative approach to software development provides high levels of assurance, yet its scalability enables us to address the most complex problems. We have successfully engineered projects under contract for corporations and government clients in the demanding application areas of security, information assurance and cryptography.
* iba Consulting Gesellschaft - Intelligent business architecture for you
iba CG develops software for large companies:
* risk analysis and reporting solution for power supply company;
* contract management, assert management, booking and budgeting software for one of the worldwide leading accounting firm.
* Linspire
Linspire, Inc. has used functional programming since its inception in 2001, beginning with extensive use of O'Caml, with a steady shift to Haskell as its implementations and libraries have matured. Hardware detection, software packaging and CGI web page generation are all areas where we have used functional programming extensively. Haskell's feature set lets us replace much of our use of little languages (e.g., bash or awk) and two-level languages (C or C++ bound to an interpreted language allowing for faster development, better code sharing and ultimately faster implementations. Above all, we value static type checking for minimizing runtime errors in applications that run in unknown environments and for wrapping legacy programs in strongly typed functions to ensure that we pass valid arguments.
О! (source code management system который почти весь написан на Haskell — больше мегабайта Хаскела и 50 Кб сей.
Orbitz на CL.
Например, К тому же, есть ещё куча примеров неудачных отказов от лиспа.
---
"Аллах не ведёт людей неверных."
желательно подтверждать ссылками на проекты, чтобы не сильно уклоняться в сторону фантазий.
Небольшое число проектов свидетельствует о:
— малом числе программистов, знающих его;
— сложности изучения языка;
— недостаточном количестве документации;
— отсутствии развитой инфраструктуры (в том числе, учебных курсов, где преподают Haskell).
Данные факторы, конечно важны, однако не связаны напрямую с выразительностью языка, скоростью разработки на нем, а также со свойствами разрабатываемых на нем программ.
Если ты считаешь, что подобная связь есть — обоснуй ее.
![](/images/graemlins/smile.gif)
я собираюсь в ближайший месяц заботать Haskell и ищу причины, почему это будет правильным деянием
подпозреваю, что многие современные системы этого типа базируются на лиспоподобных языках
скорость разработки напрямую связана с:
> малом числе программистов, знающих его;
> — сложности изучения языка;
> — недостаточном количестве документации;
> — отсутствии развитой инфраструктуры (в том числе, учебных курсов, где преподают Haskell).
даже свойства программы тесно связаны с этими же пунктами.
простейший пример: компилятор содержит ошибку или неоптимальность.
если этим компилятором пользуется десять человек, то вероятность оказаться именно тем "счастливчиком" наткнувшемся на эту ошибку/неоптимальность очень высока.
если же компилятором пользуется 10 тыс. человек, то вероятность быть "счастливчиком" - очень низкая.
тоже самое с поддержкой каких-то либ и т.д.
опять же очень высокая вероятность, что придется быть тем самым "счастливчиком", который будет прикручивать к языку/платформе, например, поддержку zip-а, или работу с графами, большими числами, или работу с многоядерным компами и т.д.
Community играет большую роль. На примере CL убедеждаюсь.
Но кроме Java, C# & C++ есть языки без перечисленных недостатков и с массой достоинств.
Python, Ruby — например.
Поэтому (по-моему) надо останавливаться на них для коммерческих продуктов.
для Ruby/python есть сильный компилятор?
сильный компилятор?А что есть сильный компилятор? Вроде MS собирается в следующую студию включить IronPython.
А что есть сильный компилятор?сильный — это оптимизирующий. Чтобы программист не думал, как быстрее написать. Так:
for (int i = 0; i < N; i++)
{
a[i] = b[i] * 5 / Math.PI / N;
}
или так
double k = 5 / Math.PI / N;
for (int i = 0; i < N; i++)
{
a[i] = b[i] * k;
}
Вместо этого программист мог бы сосредоточиться на функционале и читаемости программы.
![](/images/graemlins/smile.gif)
Систему надо писать на 2-х языках: Python & C например.
Профайлером ловить медленные места и переписывать на С.
Поэтому "зачем _сильный_ компилятор?"
Не заостряй внимание на слове компилятор. Сильный интерпретатор тоже очень полезен по причинам, которые раскрыты выше.
Для оптимизации конкретных модулей на си существует несколько библиотек, генерирующих C/C++ модуль по питномодулю (там правда есть некоторые ограничения).
А вообще думать о сложных оптимизациях в языке c динамическим типизированием...
Мы тут с мадкрозом пытались придумать чем мог бы JIT пригодиться - не удалось пока.
Мы тут с мадкрозом пытались придумать чем мог бы JIT пригодится - не удалось пока.странно
мадкроз же рюхает, он не мог не придумать...
я, когда начал говорить про сильный интерпретатор, как раз в голове держал psyco. Помнил, как ты про него рассказывал, но не помнил название. Наличие таких вещей сильно уменьшает количество шаманских знаний, которые надо держать в голове, чтобы писать эффективный по производительности код.
сделает модуль psycoА ты не узнавал почему оптимизатор не поставляется в питон стандартно?
Я так понял что памяти много ест. Так что халявы не бывает.
Программисты бывают до того ленивы, что написать простенький makefile в две строки проблема.
> А вообще думать о сложных оптимизациях в языке c динамическим типизированием...
Использование штатного for-each или tail вместо рукописного цикла --- такая оптимизация.
---
"Аллах не ведёт людей неверных."
Я в курсе. Псико - это оптимизация по процу. В том числе за счет памяти.
>Использование штатного for-each или tail вместо рукописного цикла --- такая оптимизация.
Или я тебя не понял или ты не прочитал пост про псико.
Мне очень интересно, как оптимизатор порюхает такое:
(let len (length alist (res
(dotimes (i len)
(when (> i n) (setf res (append res (list (cdr (car alist
(setf alist (cdr alist
res
---
"Аллах не ведёт людей неверных."
http://reddit.com
http://www.pkbasstackle.com/
http://en.wikipedia.org/wiki/Macsyma:
http://en.wikipedia.org/wiki/Crash_Bandicoot_%28video_game%2...
http://en.wikipedia.org/wiki/Jak_and_Daxter
http://www.franz.com/success/ также содержит много интересной информации
псико такое не порюхает. псико для питона.
Во-первых, я не знаю лисп или что это там.
Во-вторых, я не в курсе ни всех оптимизаций CPython ни Psyco. Тем более я не в курсе, как они работают. Меня это мало волновало.
> тем "счастливчиком" наткнувшемся на эту ошибку/неоптимальность очень высока.
> если же компилятором пользуется 10 тыс. человек, то вероятность быть "счастливчиком" - очень
> низкая.
В рамках одного языка — да.
Но между разными языками — полностью неверное утверждение.
Глючность компилятора зависит от языка в гораздо большей степени, чем от кол-ва людей.
Некоторые языки очень просты и компилятор там пишется относительно легко и особых багов не содержит.
Некоторые другие языки, например С++, имеют описания на 1000 страниц, и разобраться в них очень сложно. Поведение многих языковых конструкций не ясно или не описано. Для таких языков компиляторы невероятно глючны даже если их использует миллион человек.
ML, например имеет строгую формальную семантику, записанную математически (причем всего в 100-200 страниц). Наличие такой семантики очень сильно упрощает написание любого компилятора/интерпретатора.
> тоже самое с поддержкой каких-то либ и т.д.
> опять же очень высокая вероятность, что придется быть тем самым "счастливчиком", который будет
> прикручивать к языку/платформе, например, поддержку zip-а, или работу с графами, большими числами,
> или работу с многоядерным компами и т.д.
В языках которые тут упоминаются уже все такое давно прикручено. Есть средства автоматической генерации marshalling-кода. Не вижу тут никакой проблемы.
для Ruby/python есть сильный компилятор?А для C# компилятор "сильный"?
Это не под**ка, я не в курсе.
> опять же очень высокая вероятность, что придется быть тем самым "счастливчиком", который будетопять же, если библиотека на C, то с хорошей вероятностью для её "прикручивания" нужно будет просто запустить уже существующий генератор обёрток по h-файлам
> прикручивать к языку/платформе, например, поддержку zip-а, или работу с графами, большими числами,
> или работу с многоядерным компами и т.д.
В языках которые тут упоминаются уже все такое давно прикручено.
это к вопросу отличия C от C++
Между прочим, псико позволяет оптимизировать конкретные функции, не трогая остальных. Поэтому я понимаю, почему поддержку не включили непосредственно в интерпретатор, но не понимаю, почему не включили в стандартную либу. Впрочем, она и так разбухла уже.
---
"Аллах не ведёт людей неверных."
А для C# компилятор "сильный"?да. Достаточно часто там, где надо делаются inline-ы. Также оптимизируются вещи навроде:
Это не под**ка, я не в курсе.
int sum = 0;
for (int i = 0; i < a.Length; i++) //Из цикла выносится константа a.Length, которая
//по идее должна получаться вызовом getter-а свойства
{
sum += a[i];
}
Для генериков (некий аналог c++ шаблонов) в зависимости от специфицирующего типа может генериться разный код, который оптимален для данного типа.
Словом, проводятся все основные локальные оптимизации и некоторые глобальные (inlining).
Ну, перенеси это на питон.на кой? типа твой пример, ты им хотел что-то другим сказать. Вот и перенеси на питон. А то, боюсь, мысль потеряется.
А типа бенчмарки, которые это подтверждают, есть?
"Whole-program" уже научились?
---
"Аллах не ведёт людей неверных."
есть. По ссылке обсуждение оптимизатора в .net 2.0 и участники проводят много сравнений и тестов с .net 1.1 и c++
"Whole-program" уже научились?Нет. Очень большие ограничения накладываются необходимостью поддержки reflection-а.
которые надо держать в голове, чтобы писать эффективный по производительности код."
Вот я и спросил, как "псико" помогает избежать употребления шаманских знаний
по развёртыванию отображения "map" или "for-each" (а также "every" и т. д.) в циклы.
---
"Аллах не ведёт людей неверных."
псико (и подобные ему вещи) не идеальны, они не смогут устранить все проблемы. Но, по крайней мере, не будет ситуации, в которую я попал пару лет назад: какой-то достаточно сложный с алгоритмической точки зрения скрипт на php не укладывался в 30 секундный таймаут. Причем не укладывался сильно — раза в три-четыре. После ручного constant propagation и inlining-а удалось сократить время исполнения до 10 секунд. При этом код стал абсолютно нечитаемым. Аналог psyco бы смог сделать такие оптимизации самостоятельно.
как пример, могу привести intel-овские соревнования на topcoder-е.
замеченные тенденции:
1. сильные C#-ные решения появлялись в несколько раз быстрее, чем плюсовые
2. серьезный отрыв C++-вых решений от C# происходил за счет использования asm-а, использующего ssi, ssi2, ssi3.
3. соответственно чистые C++-решения шли вровень с C#. разброс на уровне 10%
причем это были задачи как раз на обработку/расчет данных
Кстати в .NET оптимизатор из MSIL в машинные коды нормальный?
замеченные тенденции:хм, это не в пользу плюсовиков
1. сильные C#-ные решения появлялись в несколько раз быстрее, чем плюсовые
2. серьезный отрыв C++-вых решений от C# происходил за счет использования asm-а, использующего ssi, ssi2, ssi3.
3. соответственно чистые C++-решения шли вровень с C#. разброс на уровне 10%
Могу только посочувствовать, если php был выбран не тобой.
Просто вытаскивание постоянных и встраивание --- очень примитивные техники,
гордиться ими в наше время смысла особого не имеет.
---
"Аллах не ведёт людей неверных."
да, про него речь и шла. Сам компилятор в msil совершенно не оптимизирующий
Могу только посочувствовать, если php был выбран не тобой.
более того, это была даже не моя программа. Соседу помогал порюхать проблему.
Просто вытаскивание постоянных и встраивание --- очень примитивные техники,совершенно верно. Это настолько простые вещи, что очень-очень хочется, чтобы интерпретатор/компилятор их умели делать. Если они даже этого не умеют, очень грустно становится.
гордиться ими в наше время смысла особого не имеет.
эта штука будет компилировать нормально, когда её допишут ^_^
Круто, тогда Приведите, пожалуйста, примеры реальных коммерческих проектов (не провальных написанных на ML, CL и Haskell.Не очень известные проекты, но отнюдь не провальные:
Дозор-Джет СМАП — написан на Scheme и C.
Дозор-Джет СКВТ — следующая версия пишется на Scheme и С++, часть кода написана на OCaml.
На сайте (http://jetsoft.ru) действительно ничего про используемые языки не сказано, разве только в документации некоторые программы имеют расширение scm.
В AltLinux'е вроде многое пишут на Haskell.
Дозор-Джет СМАП — написан на Scheme и C.А нам джетовцы какую-то хрень на яве показывали
Дозор-Джет СКВТ — следующая версия пишется на Scheme и С++, часть кода написана на OCaml.
![](/images/graemlins/mad.gif)
и что дальше?
основная проблема в том, что очень желательно чтобы либы поддерживали идеологию платформы.
типичный пример:
если у нас платформа поддерживает gc и exception-ы, то winapi-шный метод GetCurrentDirectory должен превращаться во что-то такое:
string GetCurrentDirectory
{
int size = Native::GetCurrentDirectory(0, NULL);
if (size == 0)
throw MakeExceptionFromLastError;
StringBuffer buffer = new StringBuffer(size);
int ret = Native::GetCurrentDirectory(size, &buffer);
if (ret == 0)
throw MakeExceptionFromLastError;
return buffer.ToString;
}
Про Руби и Питон у меня вопрос не стоит.
Под непровальным коммерческим проектом я подразумеваю такой, который доведен до стабильного работающего состояния (не брошен на полдороги) и либо успешно приносит деньги, либо был адекватно оплачен заказчиком. Критерий не слишком четкий, но по крайней мере хочется исключить только начатые (пусть и перспективные) проекты и те, что делаются в виде хобби или научных изысканий.
А что ты имеешь против научных изысканий? Они оплачиваются заказчиком.
основная проблема в том, что очень желательно чтобы либы поддерживали идеологию платформыну если у тебя 10 библиотек уже есть нормальных, а одной нет, а становиться тем первым, который её прикрутит идеологически верно, не хочется, то есть вариант прикрутить по-быстрому
LISP plus plus а плюсов на лиспе - нет =)
о выразительности говорит такой факт: лисп на плюсах есть(Респект.
Люди не от замечательной выразительности C++ пишут такие библиотеки. А тем, кто пишет на Лиспе, С++, написанный на Лиспе, нафиг не нужен.
Кстати, подобную lpp библиотеку пишет Столяров, называется InteLib.
если это Лисп, то CLOS - надмножество C++ на Лиспе
> должен превращаться во что-то такое:
И? В чем проблема? Именно такой код и генерят тулзы для генерации оберток.
Именно такой код и генерят тулзы для генерации оберток.Ну нужно как минимум, чтобы тулзе кто-то объяснил, что у функции
int getstring(char *)
настоящее возвращаемое значение - это таки строка, а не число, да ещё и размер буфера указать
то есть расставить аннотации типа
(ERROR int) getstring OUT STRING[512] char *
Научные изыскания и эксперименты энтузиастов могут быть сколь угодно смелыми - то веб-сервер на bash'e напишут, то Лисп на С++. Это очень круто, это все возможно, но не слишком практично обычно.
Научные изыскания и эксперименты энтузиастов могут быть сколь угодно смелыми - то веб-сервер на bash'e напишут, то Лисп на С++. Это очень круто, это все возможно, но не слишком практично обычно.На то, что непрактично, и гранты не дают.
сильный — это оптимизирующий. Чтобы программист не думал, как быстрее написать.
И что, есть такой компилятор? Можно ссылочку? Эта тема меня сильно интересует.
Эта тема меня сильно интересует.
Да, имею в виду, что не только приведённые тобой примеры должны компилироваться в один и тот же код, но и:
1) забивание нулями массива элементов произвольного типа должно как по волшебству превращаться в вызов memset или, ещё лучше в подходящую последовательность строковых, mmx, 3d now!, sse/sse2/... операций (с учётом выбора выравнивая массива и т.д.);
2) код, который может быть проинтерпретирован (то есть имеющий детерминированный результат, не зависящий от недетерминированного окружения программы при её запуске) должен быть полностью удалён и заменён на результат его работы; например — вызов функции, вычисляющей факториал числа, от константы должен быть заменен на результирующую константу (если надо — пусть функция определена в том же модуле компиляции); но так должно быть с любым кодом, а не только с написанном через #define или шаблоны;
3) деление на константы (или последовательности делений на одну и ту же переменную) должно заменяться умножением по известным алгоритмам;
4) умножение на константы должно выполняться оптимальным способом (из сложений, сдвигов, операций lea, умножений, ...);
5) элементы структур в памяти должны размещаться оптимальным способом (если это позволяет логика приложения а не в порядке, заданном в исходном коде;
...
Poirot в режиме оптимизации (также он умеет работать, как обфускатор). Т.е. оптимизация, приведенная мной, будет сделана парой тулза+компилятор (уже пофиг какой).
как минимум для С этого можно достичь, если натравить до компиляции Да, имею в виду, что не только приведённые тобой примеры должны компилироваться в один и тот же код, но икому должны?
ты тут привел некие дополнительные клевые штуки, которые хочется, чтобы умел делать компилятор. Я буду очень рад, если ты расскажешь о таком, который это умеет, но, очевидно, я о таком компиляторе речи не вел.
кому должны?Мне должны привести ссылку на компилятор, только при условии, что он это умеет. Ссылки на компиляторы, которые этого не умеют мне не интересны. В таком смысле — должны.
ты тут привел некие дополнительные клевые штуки, которые хочется, чтобы умел делать компилятор. Я буду очень рад, если ты расскажешь о таком, который это умеет, но, очевидно, я о таком компиляторе речи не вел.
Я сам буду рад, если мне расскажут про такой компилятор. Вообще, меня интересует задача перевода корректной программы на входном языке, в корректную и оптимальную (в каком именно смысле — толи в плане объёма, толи в плане времени выполнения — пусть задаётся ключами).
Любой другой компилятор, предполагает, что для достижения оптимальности результирующей программы не достаточно просто написать корректный код и не париться. Что, насколько я понимаю, подразумевается под твоими словами
Чтобы программист не думал, как быстрее написать.и
Вместо этого программист мог бы сосредоточиться на функционале и читаемости программы.
Не стоит понимать мои слова настолько буквально. Да, мы не имеем сейчас действительно сильного компилятора, но есть те, которые ближе других к цели. Лидеров и будем называть сильными. Для лидеров число шаманских знаний будет меньше, чем у тех компиляторов, которые вообще никаких оптимизаций не выполняют.
Пункт 2 входил в функции штуки, называемой "суперкомпилятор", реализован был на Рефале и для Рефала. Кажется, Турчин этим занимался. Подробностей не знаю, просто был как-то на лекции про это дело.
Я чего-то читал на эту тему, но так и не понял, что это? Чем это отличается от просто хорошего оптимизирующего компилятора?
> Чем это отличается от просто хорошего оптимизирующего компилятора?
"просто хороший оптимизирующий компилятор" - это нечто неформализованное с не очень понятными свойствами
суперкомпиляция - вполне конкретный алгоритм преобразования кода, основанный на частичной специализации
с учётом того, что соответствующая теория активно развивалась в 70-80х годах, сейчас в этом уже мало чего "супер" и результаты могут "просто" использоваться
сейчас в этом уже мало чего "супер"Так просто смысл приставки "супер-" тогда использовали другой - то есть что-то вроде "сверх-" или "над-", т.е. компилятор, который работает на уровне выше обычного компилятора.
![](/images/graemlins/smile.gif)
Не стоит понимать мои слова настолько буквально. Да, мы не имеем сейчас действительно сильного компилятора, но есть те, которые ближе других к цели. Лидеров и будем называть сильными. Для лидеров число шаманских знаний будет меньше, чем у тех компиляторов, которые вообще никаких оптимизаций не выполняют.
Меньше, но не намного. Шаманские знания о сортировке Шелла, сортировке деревом, чёрно-красных деревьях и т.д. ни один существующий компилятор не отменяет. По этому, когда пишешь программу, на которую накладываются требования эффективности, приходится не просто писать корректную программу на входном (для компилятора языке но и понимать, как эта программа будет скомпилирована. Вообще, очень полезно до конца понимать что же стоит за той или иной строчкой исходного кода, со всеми её побочными последствиями. В этом плане непредсказуемые GC (GC, начинающие освобождать память не при выходе из области видимости объекта, а в неопределённый момент) могут подложить свинью.
Шаманские знания о сортировке Шелла, сортировке деревом, чёрно-красных деревьях и т.д. ни один существующий компилятор не отменяет.я не называю шаманскими знания алгоритмического плана. Шаманскими в моем понимании являются знания навроде: "а если эти две строчки переставить, будет круто", или "а вот связывание у нас позднее, да еще и неоптимально реализовано. Если мы сделаем имя покороче, производительность возрастет в полтора раза." Даже вынос константы из цикла, в принципе, уже на грани шаманских знаний и нормальных.
Вообще, очень полезно до конца понимать что же стоит за той или иной строчкой исходного кода, со всеми её побочными последствиями.Полезно — да, в некоторых случаях, когда требуется действительно хорошая программа. Плохо, когда такие знания требуются для реализации типичного функционала, не завязанного на мега-алгоритмы. Тут подходит тот же пример про длину имен в неэффективно реализованном позднем связывании.
зы. Про GC спорить не готов, т.к. рядом и так есть тема про насильников, где это обсуждается
> чёрно-красных деревьях и т.д. ни один существующий
> компилятор не отменяет.
Умные люди рассказывали, что в далёкие 80-е рефалисты
сотворили примочку, которая прямой поиск подстроки
умудрилась превратить в КМП.
---
...Я работаю антинаучным аферистом...
На лекции приводился пример проги, которая решала какую-то численную задачу. Обычный оптимизирующий компилятор сделал бы так, чтобы эта задача решалась быстро. А суперкомпилятор упростил программу до одной команды - вывести ответ (который сам посчитал).
> чтобы эта задача решалась быстро. А суперкомпилятор
> упростил программу до одной команды - вывести ответ
> (который сам посчитал).
Всё правильно он сделал: быстрее вывода заранее
подсчитанного ничего не получится.
---
"Аллах не ведёт людей неверных."
А если бы я написал программу, которая зависает, то компилятор бы тоже завис?
нет
на всякий случай напишу, как это работает
для программы строится дерево возможных путей выполнения
строится оно вширь и обрезается с помощью некоторой эвристики (например, по глубине в результате чего оказывается конечным
то, что получилось, сворачивается обратно в программу (возможно, на другом языке)
у алгоритма есть два места, в которых требуется противоестественный интеллект: эта эвристика и проверка условных выражений, влияющих на ход выполнения (иногда условие перехода не позволяет разумно разделить состояния для ветвей)
PS
КМП из двойного цикла поиска подстроки получается за счёт того, что результаты сравнений на предыдущих итерациях известны, поэтому, если очередное сравнение символов не удалось, можно сразу перескочить на нужную итерацию внешнего и внутреннего циклов
внутренний цикл в итоге разворачивается полностью в условные переходы, а внешний остаётся
![](/images/graemlins/smirk.gif)
У тебя уже есть готовая реализация на SQL?
---
...Я работаю антинаучным аферистом...
Да, я имел в виду, конечно, некоторые особые языки программирования, и ни sql, ни html, ни xml туда не входят
![](/images/graemlins/confused.gif)
можно перевести на язык, любую программу в языке можно перевести в язык МТ",
то что нового ты сказал?
---
...Я работаю антинаучным аферистом...
А если бы я написал программу, которая зависает, то компилятор бы тоже завис?Он бы свернул её до "while(1);"
![](/images/graemlins/smile.gif)
А суперкомпилятор упростил программу до одной команды - вывести ответ (который сам посчитал).
Для полностью детерминированной программы всё так и должно быть.
Но большинство реальных программ не являются до такой степени детерминированными. Обычно в программе есть хотя бы ввод данных из внешнего источника. Но есть и полностью детерминированные участки, вот для них хотелось бы полной интерпретации в момент компиляции.
Оставить комментарий
karkar
Начал читать тред про насильников, но не осилил. Зато стало любопытно.Приведите, пожалуйста, примеры реальных коммерческих проектов (не провальных написанных на ML, CL и Haskell.
А то сложно воспринимаются теоретические споры о практических вещах.