Да ладно вам. Один IT-журналист (не помню деталей) написал, сославшись на статью в ZDNet, написал, что Линус Торвальдс сменил Linux на Apple (и дал ссылку на статью). Хотя в статье было чёрным по белому написано, что Линус сразу же поставил туда Linux. На моё письмо тот журналист не отреагировал. А тут вообще журналист-общественник. :D
1. Ну почитайте, например, Why Functional Programming Matters. Не книга, а статья, но должно хватить. Есть перевод на русский, но я его не читал и о качестве не могу судить.
А разве вам самим не очевидно, что при вычислении (2+3)*(4+5) всё равно, что вычислять вначале — 2+3 или 4+5?
2. То, что функциональные языки исполняются на императивных процессорах — это просто констатация факта. Компиляция функциональных программ для эффективного выполнения на императивных архитектурах — это очень интересная и важная задача. Что вас так возбудило, я не понимаю.
3. Порядок операций может изменяться настолько, насколько сохраняется семантика программы. В функциональных языках пространства для манёвра куда больше.
4. printf — это пример функции, возвращаемое значение которой в 99% вызовов игнорируется (а возвращает она вовсе не void, JFY). Конечно, в C ничего выкидывать нельзя. Я лишь проиллюстрировал оптимизацию, которая в невозможна в функциональных языках. Насчёт передачи по ссылке — я вас не понимаю. В функциональном языке значения могут передаваться как по ссылке, так и по значению, как решит компилятор. Изнутри программы вы разницу не обнаружите. Причём тут отсутствие переменных, я не понимаю.
5. Оптимизатор — это одна из самых существенных и самых сложных компонент современных компиляторов. Отделить "оптимизатор" от компилятора невозможно.
6. Последовательность выполнения операций зависит от исходных данных в любом невырожденном языке программирования (подумайте об if, switch/case и т.п.). И кстати о логических языках: при выполнении программы правила программы рассматриваются средой выполнения в строго заданном порядке. Потому что если поменять два правила местами, программа зацикливается... Никогда не наблюдали такого при программировании на Прологе? А я наблюдал.
Определяется это средой выполнения только потому, что язык Пролог не компилируется в машинный код, а так или иначе интерпретируется. Есть и интерпретаторы функциональных языков, но с практической и теоретической точки зрения лично меня интересует компиляция.
Ну теперь представьте себе, что printf вызывается где-то опосредованно. Всё, вилы, лишний код не выкинешь.
Функциональные языки с этим справляются. Например, в том же Haskell функции, которые имеют побочные эффекты, имеют особый тип. Эти функции объединяют операции в цепочку, которую потом выполняет окружение. Чистая функция не может обратиться к "нечистой", потому что у неё нет доступа к началу этой цепочки — ведь данные передаются через аргументы, а тип разный...
Себеста не в теме :) Пусть он ознакомится с ленивым функциональным языком Haskell и скажет, в какой последовательности выполняются там функции, это раз. Во-вторых, в чистых функциональных языках компилятор при синтезе объектного кода (раз уж программа выполняется на императивном процессоре) сам планирует, в какой последовательности всё выполнять. Что-то может выкинуть, если обнаружит, что результат не используется. Представьте себе компилятор C, который выкинет вызов printf, возвращаемое значение которого не используется :D
В-третьих, Лисп — не строго функциональный язык, а мультипарадигмный, как Python и JavaScript. И те строки, которые вы привели, как раз используют императивные фичи Лиспа.
А теорема Чёрча-Россера гласит о том, что если мы вычисляем лямбда-выражение в двух разных порядках оба вычисления выдают результат (а не зацикливаются), то результат будет одинаковым.
IronPython — это реализация языка Python для .NET. Python — ни разу не функциональный язык. Там даже лямбд нормальных нет, а то что есть, грозятся выкинуть (а может, уже выкинули, я не слежу). Python — язык с динамической типизацией, F# со статической типизацией.
1. Может быть. Но разработчики ATLAS считают иначе.
2. По поводу P.S. Высказывание, конечно, верное, но почитайте, что написано об опциях -ffloat-store и -ffast-math. Компилятор может такого наоптимизировать, что вместо результата будет погода на Марсе.
А разве вам самим не очевидно, что при вычислении (2+3)*(4+5) всё равно, что вычислять вначале — 2+3 или 4+5?
2. То, что функциональные языки исполняются на императивных процессорах — это просто констатация факта. Компиляция функциональных программ для эффективного выполнения на императивных архитектурах — это очень интересная и важная задача. Что вас так возбудило, я не понимаю.
3. Порядок операций может изменяться настолько, насколько сохраняется семантика программы. В функциональных языках пространства для манёвра куда больше.
4. printf — это пример функции, возвращаемое значение которой в 99% вызовов игнорируется (а возвращает она вовсе не void, JFY). Конечно, в C ничего выкидывать нельзя. Я лишь проиллюстрировал оптимизацию, которая в невозможна в функциональных языках. Насчёт передачи по ссылке — я вас не понимаю. В функциональном языке значения могут передаваться как по ссылке, так и по значению, как решит компилятор. Изнутри программы вы разницу не обнаружите. Причём тут отсутствие переменных, я не понимаю.
5. Оптимизатор — это одна из самых существенных и самых сложных компонент современных компиляторов. Отделить "оптимизатор" от компилятора невозможно.
6. Последовательность выполнения операций зависит от исходных данных в любом невырожденном языке программирования (подумайте об if, switch/case и т.п.). И кстати о логических языках: при выполнении программы правила программы рассматриваются средой выполнения в строго заданном порядке. Потому что если поменять два правила местами, программа зацикливается... Никогда не наблюдали такого при программировании на Прологе? А я наблюдал.
Определяется это средой выполнения только потому, что язык Пролог не компилируется в машинный код, а так или иначе интерпретируется. Есть и интерпретаторы функциональных языков, но с практической и теоретической точки зрения лично меня интересует компиляция.
Функциональные языки с этим справляются. Например, в том же Haskell функции, которые имеют побочные эффекты, имеют особый тип. Эти функции объединяют операции в цепочку, которую потом выполняет окружение. Чистая функция не может обратиться к "нечистой", потому что у неё нет доступа к началу этой цепочки — ведь данные передаются через аргументы, а тип разный...
В-третьих, Лисп — не строго функциональный язык, а мультипарадигмный, как Python и JavaScript. И те строки, которые вы привели, как раз используют императивные фичи Лиспа.
А теорема Чёрча-Россера гласит о том, что если мы вычисляем лямбда-выражение в двух разных порядках оба вычисления выдают результат (а не зацикливаются), то результат будет одинаковым.
Теорему Чёрча-Россера знаете?
Достаточно?
2. По поводу P.S. Высказывание, конечно, верное, но почитайте, что написано об опциях
-ffloat-store
и-ffast-math
. Компилятор может такого наоптимизировать, что вместо результата будет погода на Марсе.Но и общество сойдёт, спасибо. Жаль только, что оно пустое :D
Увы, ссылку не нашёл.
Конечно, редизайном сайта это излечится, но стоит ли...
Правда, в свободное от безделья время, поэтому сроков нет.
class GMarkerManager
.enableScrollWheelZoom();
:)
http://econym.googlepages.com/index.htm
http://mapki.com
Но самое главное &mdsah; описание API. Там правда всё просто :)