О высокоуровневости ЯП. Выводы.
От: 0x7be СССР  
Дата: 30.01.11 17:17
Оценка: 119 (9)
Коллеги!

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

Поскольку я писал текст используюя Google Docs, и переносить его сюда со всем форматированием мне лень, я опубликовал текст средствами гуглдокс

Особую благодарность хочу выразить участникам alpha21264, VladD2, Кодёнок, Mystic и Kerbadun, поскольку их реплики направили ход моей мысли в нужное русло.
Re: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 03:34
Оценка: 5 (2) +1
Здравствуйте, 0x7be, Вы писали:

0>Я http://www.google.com/url?q=http%3A%2F%2Frsdn.ru%2Fforum%2Fphilosophy%2F4117382.1.aspx&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNEIWpBlqQ7Qp64cjhcLBQ15zDWAmQ<br />
<span class='lineQuote level1'>0&gt;</span>
недавно завел разговор о пределах высокоуровневости языков программирования и получил много интересных ответов, которые дали мне пищу для размышлений.

0>Результаты этих размышлений я решил изложить в письменном виде и предложить форуму. На сенсацию не претендую, но, может быть, кому-то будет интересно.

В целом не плохо, хотя есть что по править. Особенно раздражает не по делу (и не верно) использование термина "энтропия".

0>Поскольку я писал текст используюя Google Docs, и переносить его сюда со всем форматированием мне лень, я опубликовал текст средствами гуглдокс


А вот это зря по той простой причине, что эту статью (а это уже тянет на статью) нельзя будет найти поиском.

По сему предлагаю прислать нам этот материал на сабмит, подкорректировать и выложить в виде полноценной статьи.

ЗЫ

Что касается вопроса "Так почему же мы не пишем все на Lisp?"...

Тут есть две составляющих. Социально-психологическая (субъективная) и объективна.

Субъектная часть хорошо описывается совсем уж выдающимся примером — оплатой ЖКХ. Чтобы заплатить за жилье можно:
1. Пойти в сбербанк, встать в очередь и оплатить через окошко. При этом убивается море времени, платится больший банковский процент и тратится много нервов.
2. Заплатить через банкомант или спец.терминал.
3. Заплатить через интернет.

Самый сложный и неудобный — это первый вариант. Но как не парадоксально, но это самый популярный вариант.
Нечто похожее происходит и с языками программирования (а так же другими компьютерными технологиями). Люди морально и психологически не готовый к более абстрактным языкам.

Объективные причины так же парадоксальны. Лисп предлагая мощнейшие абстракции (ФП, ООП, МП) при этом умудряется не предоставлять простейшие абстракции вроде привычных всем математических выражений (инфиксные операторы и т.п.). Так же в Лиспе имеются проблемы с типизацией (она динамическая, а при попытках ввести статическую появляются явные описания типов, а это уже повышает объем кода без увеличения объема информации). Кроме того до недавнего времени банально не было эффективных реализаций Лиспа для ПК. Да и те что есть сейчас имеют проблемы под Windows.

Кроме того Лисп хотя и обладает мощной макро-системой, но все же она не позволяет расширять синтаксис, а только меняет семантику. Это приводит к тому, что программы должны быть записаны в виде S-выражений которые с трудом читаются простыми смертными. Справедливости ради надо отметить, что есть эксперименты по прикручиванию к лиспу качественных синтаксических расширений, но он почему-то тоже не выстрелили.

Однако Лисп — это действительно незаслуженно забытое (а многими и не узнанное) достижение человечества.

Среди языков программирования я бы назвал Лисп и Пролог языками которые не смогло оценить интеллектуальное большинство. А жаль. Работы над немерлом — это попытка исправить ситуацию. В немерле исправлены многие недостатки лиспа. Думаю что Nemerle 2 будет идеальным по расширяемости языком. Но, боюсь, что социально-психологический аспект может препятствовать популяризации и Nemerle. Но я уверен, что если не за Nemerle, то за его потомками (последователями) будет будущее. Видимо через несколько десятков лет никого не будет пугать мысль о том, что язык может настраиваться под задачу. Но сегодня это не так. Люди боятся расширяемости даже спустя 50 лет с момента появления первого расширяемого языка — Лиспа.

Кроме того есть еще одна, на мой взгляд намного более серьезная, проблема — гиганты-монополисты просто таки подминают под себя рынок ПО и начинают им управлять. Это приводит к тому, что они просто таки навязывают свою волю большиству и тем самым сами формируют рынок. Создание языков и производство компиляторов перестало быть прибыльным делом. Сегодня уже нельзя выпустить Turbo Lisp и захватить рынок. Массы же ориентируются на отсталые и экстенсивно развивающиеся технологии предлагаемые монополистами просто на том основании, что за ними стоит бабло, а бабло, как известно, на сегодня всегда побеждает бабро.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: О высокоуровневости ЯП. Выводы.
От: fin_81  
Дата: 31.01.11 19:54
Оценка: -1
Здравствуйте, 0x7be, Вы писали:

0>https://docs.google.com/document/pub?id=1THmXkA-F0zjCvt1ZdEdBwd4BlhMrZJBvEOaQ9JVpC3s


Да все плохо. Высокоуровневость ЯП зависит от коррелированности обрабатываемых данных предметной области. Чем "хаотичнее" предметная область, тем сложнее его отобразить в виде программы (упорядоченного набора команд-сообщений) на любом ЯП, где словарь (тезаурус) тоже упорядоченный набор информации. Есть некоторые проблески в виде замены отношения порядка на отношение эквивалентности в лице хеш-функций, но коллизии заставляют упорядочивать. И чем больше набор разнообразной информации тем больше коллизий. Вот когда найдем "серебряную пулю" — словарь с поиском O(1) для любого N, тогда можно поговорить о "самом" высокоуровневом ЯП. А пока все ЯП практически равнозначны, просто они заточены под разные предметные области.
Re[9]: О высокоуровневости ЯП. Выводы.
От: Temoto  
Дата: 31.01.11 21:45
Оценка: :)
T>>Конечно, это вырожденные случаи, просто из любопытства интересно, ловит ли компилятор подобные извороты?

H>А ловит ли компилятор, скажем, Си, извороты вида:

H>
for(;;);

H>

Проверил. Не ловит. Очень удивительно, я ожидал варнинг.
Re[11]: О высокоуровневости ЯП. Выводы.
От: hardcase Пират http://nemerle.org
Дата: 01.02.11 08:01
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Он о том, что компилятор C написан на С же, но это не приводит к тому, что компилятор зацикливается встретив конструкцию for... если я его правильно понял.


Я о том, что задача выявления зацикливания сродни проблеме останова. Если мы, в принципе, можем отловить примитивные случаи, которые на практике почти не встречаются, то со сложными уже сложно что-то поделать, но они наиболее вероятны на практике.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: О высокоуровневости ЯП. Выводы.
От: Temoto  
Дата: 30.01.11 18:11
Оценка:
0>Коллеги!

0>Я http://www.google.com/url?q=http%3A%2F%2Frsdn.ru%2Fforum%2Fphilosophy%2F4117382.1.aspx&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNEIWpBlqQ7Qp64cjhcLBQ15zDWAmQ<br />
<span class='lineQuote level1'>0&gt;</span>
недавно завел разговор о пределах высокоуровневости языков программирования и получил много интересных ответов, которые дали мне пищу для размышлений.

0>Результаты этих размышлений я решил изложить в письменном виде и предложить форуму. На сенсацию не претендую, но, может быть, кому-то будет интересно.

0>Поскольку я писал текст используюя Google Docs, и переносить его сюда со всем форматированием мне лень, я опубликовал текст средствами гуглдокс


0>Особую благодарность хочу выразить участникам alpha21264, VladD2, Кодёнок, Mystic и Kerbadun, поскольку их реплики направили ход моей мысли в нужное русло.


Очень интересно. В двух словах: высокоуровневость — характеристика языка, описывающая множество паттернов, которые язык позволяет устранять. Чем больше разных паттернов можно устранить — тем более высокоуровневый язык.

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

Замечания по оформлению:
— в конце заголовков точка не ставится
— у параграфов отступы разной ширины
— почти все параграфы состоят из 1-2 предложений
— "Как верно было подмечено в обсуждении, для задачи сложения двух чисел язык, позволяющий записать выражение “a + b” будет предельно высокоуровневым" здесь было бы очень уместно поставить ссылку на соответствующую ветку в обсуждении.

Ачепятки:
— Изучая этот я искал модель
— а получателем — компьютер, исполнительное устройства
— Так же мы будем рассматривать
— “Уровень” языка существует только в контексте конкретной задачи его верхняя граница находится там
— по этой шкале шкале высокоуровневости
— шкале высокоуровневости так же есть теоретический предел
— Возможно, что существует
Re[2]: О высокоуровневости ЯП. Выводы.
От: 0x7be СССР  
Дата: 30.01.11 18:18
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Очень интересно. В двух словах: высокоуровневость — характеристика языка, описывающая множество паттернов, которые язык позволяет устранять. Чем больше разных паттернов можно устранить — тем более высокоуровневый язык.

Это один из аспектов высокоуровневости.
Второй — близость к предметной области.
Они ортогональны друг другу.

T>Замечания по оформлению:

T> ...
T>Ачепятки:
Спасибо за замечания, приму меры
Re[2]: О высокоуровневости ЯП. Выводы.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.01.11 21:40
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Очень интересно. В двух словах: высокоуровневость — характеристика языка, описывающая множество паттернов, которые язык позволяет устранять. Чем больше разных паттернов можно устранить — тем более высокоуровневый язык.


Однако паттерны, в свою очередь, тоже могут быть разного уровня. Рекурсия?
... << RSDN@Home 1.2.0 alpha 4 rev. 1490 on Windows 7 6.1.7600.0>>
AVK Blog
Re[3]: О высокоуровневости ЯП. Выводы.
От: Temoto  
Дата: 30.01.11 22:30
Оценка:
T>>Очень интересно. В двух словах: высокоуровневость — характеристика языка, описывающая множество паттернов, которые язык позволяет устранять. Чем больше разных паттернов можно устранить — тем более высокоуровневый язык.

AVK>Однако паттерны, в свою очередь, тоже могут быть разного уровня. Рекурсия?


Не уверен, что понял. Вы про то, что после редукции патернов можно выявить новые патерны (теперь состоящие из новых слов)? Ну да, удобно описать этот процесс с помощью рекурсии.
Re[4]: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 03:39
Оценка:
Здравствуйте, Temoto, Вы писали:

AVK>>Однако паттерны, в свою очередь, тоже могут быть разного уровня. Рекурсия?


T>Не уверен, что понял. Вы про то, что после редукции патернов можно выявить новые патерны (теперь состоящие из новых слов)? Ну да, удобно описать этот процесс с помощью рекурсии.


Более того, на практике так и происходит в языках с поддержкой макросов. Одни паттерны выражаются в терминах других. Скажем упоминавшийся тернарный оператор (аналогом которому является if немерла) используется внутри других макросов, а те при описании третьих. Чем более глобальный паттерн устраняется, тем чаще при их реализации используются более гранулярные абстракции.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: О высокоуровневости ЯП. Выводы.
От: Vlad_SP  
Дата: 31.01.11 08:02
Оценка:
Здравствуйте, 0x7be,

весьма интересная статья. Спасибо. Поддерживаю VladD2 — достойна опубликования.
Re[5]: О высокоуровневости ЯП. Выводы.
От: Temoto  
Дата: 31.01.11 11:26
Оценка:
AVK>>>Однако паттерны, в свою очередь, тоже могут быть разного уровня. Рекурсия?

T>>Не уверен, что понял. Вы про то, что после редукции патернов можно выявить новые патерны (теперь состоящие из новых слов)? Ну да, удобно описать этот процесс с помощью рекурсии.


VD>Более того, на практике так и происходит в языках с поддержкой макросов. Одни паттерны выражаются в терминах других. Скажем упоминавшийся тернарный оператор (аналогом которому является if немерла) используется внутри других макросов, а те при описании третьих. Чем более глобальный паттерн устраняется, тем чаще при их реализации используются более гранулярные абстракции.


Кстати, расскажите, пожалуйста, как вы в немерле боретесь (если) с многопроходностью? Достаточно ли быстро раскрываются шаблоны? Можно сделать рекурсивный макрос? Отследит ли это компилятор?
Re[2]: О высокоуровневости ЯП. Выводы.
От: 0x7be СССР  
Дата: 31.01.11 12:24
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В целом не плохо, хотя есть что по править.

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

VD>Особенно раздражает не по делу (и не верно) использование термина "энтропия".

А вот тут остановимся подробнее. Я говорю вот об этой энтропии здесь и она является ключевым понятием в моих рассуждениях. Если я слажал с ней, то под вопросом ценность всей статьи

VD>А вот это зря по той простой причине, что эту статью (а это уже тянет на статью) нельзя будет найти поиском.

Сказать по правде, я даже не задумался об этом

VD>По сему предлагаю прислать нам этот материал на сабмит, подкорректировать и выложить в виде полноценной статьи.

Хорошо. Я почитаю правила для статей, но для коррекции мне хорошо бы иметь замечания по статье.

VD>ЗЫ

VD>Что касается вопроса "Так почему же мы не пишем все на Lisp?"...
Да, все так. Мне думается, что культурный аспект оказался решающим. Lisp появился слишком рано, когда IT-индустрия в массе была к нему не готова ни в каком смысле. В итоге он выпал из культуры средств разработки и оказался забыт, как и многие другие революционные вещи.
Re[3]: О высокоуровневости ЯП. Выводы.
От: 0x7be СССР  
Дата: 31.01.11 12:35
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Однако паттерны, в свою очередь, тоже могут быть разного уровня. Рекурсия?

Рекурсия возникает в том случае, если один и тот же паттерн повторяется на разных уровнях. В таком случае получаем фрактальное устройство программы Но в остальных случаях на определенном уровне паттерны должны кончиться
Re[4]: О высокоуровневости ЯП. Выводы.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 31.01.11 16:52
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>Рекурсия возникает в том случае, если один и тот же паттерн повторяется на разных уровнях.


MVC — хороший пример такого паттерна.

0>Но в остальных случаях на определенном уровне паттерны должны кончиться


Но как тогда определять высокоуровневость языка? У кого больше низкоуровневых паттернов, или у кого меньше, но они более высокоуровневые?
... << RSDN@Home 1.2.0 alpha 4 rev. 1490 on Windows 7 6.1.7600.0>>
AVK Blog
Re[5]: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 18:02
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>MVC — хороший пример такого паттерна.


MVC как раз очень верхнеуровневый паттерн. На нижних уровнях не встречается.

0>>Но в остальных случаях на определенном уровне паттерны должны кончиться


AVK>Но как тогда определять высокоуровневость языка? У кого больше низкоуровневых паттернов, или у кого меньше, но они более высокоуровневые?


По отсутствию возможности решить задачу без приседаний. Скажем недостаточнось уровня C# для работы с зависимыми свойствами WPF очевидна любому кто с ней связвался. В коде появляется паттерн который мозолит глаза и заставляет копипастить. Устранить его средствами языка не выходит.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 19:52
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>Если напишешь конкретные замечения, скажу большое человеческое спасибо

0>...Хорошо. Я почитаю правила для статей, но для коррекции мне хорошо бы иметь замечания по статье.

Если пришлешь статью в ближайшее время, то обещаю обработать ее первой. При это будут как правки языковые, так и замечания в виде комментариев (в балунах).

VD>>Особенно раздражает не по делу (и не верно) использование термина "энтропия".

0>А вот тут остановимся подробнее. Я говорю вот об этой энтропии здесь и она является ключевым понятием в моих рассуждениях. Если я слажал с ней, то под вопросом ценность всей статьи

По этому поводу чуть позже, так как занят, а чтобы ответить конкретно нужно еще раз читать статью.

0>Да, все так. Мне думается, что культурный аспект оказался решающим. Lisp появился слишком рано, когда IT-индустрия в массе была к нему не готова ни в каком смысле. В итоге он выпал из культуры средств разработки и оказался забыт, как и многие другие революционные вещи.


Пожалуй, но и простота реализации (необходимость программировать в АСТ) тоже сыграла не малую роль.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 20:38
Оценка:
Здравствуйте, 0x7be, Вы писали:

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

Как минимум нужно было сослаться на используемое определение. В общем случае энтропия — это мера неопределенности (или хаоса). Собственно русская википедия дает близкое к этому определение.

Кроме того в твоих рассуждениях этот термин совершенно не нужен. Без него получится даже понятнее.
Скажем, если фразу "Избыточность сообщения — разница между энтропией сообщения и максимально возможной энтропией." перефразировать так — "Избыточность сообщения — разница между информационной насыщенностью сообщения сообщения и максимально возможной информационной насыщенностью сообщения.", то она станет только понятнее. Хотя после этого становится очевидным, что "максимально возможной информационной насыщенностью сообщения" может быть бесконечна. Из чего делаем вывод, что или определение не верное, или логический вывод хромает.

При этом нет нет никакого смысла давать определение понятиям "Информационная насыщенность сообщения" и "Избыточность сообщения". Все и так интуитивно понимают смысл этих слов. Избыточность — кода можно выкинуть лишнее и смысл не потеряется. Информационная насыщенность — когда мало "воды".

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

Усложнять — легко. Упрощать — тяжело. Так что не надо стараться усложнять. Это и так получится .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 20:40
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Кстати, расскажите, пожалуйста, как вы в немерле боретесь (если) с многопроходностью?


В самом компиляторе, или в коде на Nemerle?

Компилятор Nemerle 1.0 однопоточный. Компилятор Nemerle 2 будет многопоточным. Достигнуто это будет в основном за счет преобразования большей части структур в неизменяемые и распараллеливанием типизации тел членов (которая в основном и отнимает время).

Если речь о кода написанном на Nemerle, то тут доступны все средства что есть в дотнет-фрэймворке, плюс домарощенные макросы вроде async (похож на аналог из F#, но реализован в виде макроса).

T> Достаточно ли быстро раскрываются шаблоны?


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

T> Можно сделать рекурсивный макрос?


Опять же что понимать под рекурсией?
Макрос:
1. Может определяться с использованием других макросов или даже себя же самого (прошлой версии).
2. Макрос может производить рекурсивные вычисления.

И то, и другое подходит под понятие рекурсия.

Как я уже говорил, макрос — это функция немерла. Синтаксис макросов это всего лишь точка входа. Внутри макроса возможно все что возможно в немерле. В том числе и использовать рекурсию. В то же время макрос можно выразить через самого себя, если предварильно скомпилировать его и подключить полученную сборку к проекту где определен макрос.

T>Отследит ли это компилятор?


Сначала надо понять о чем идет речь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: О высокоуровневости ЯП. Выводы.
От: Курилка Россия http://kirya.narod.ru/
Дата: 31.01.11 21:21
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Temoto, Вы писали:


T>>Кстати, расскажите, пожалуйста, как вы в немерле боретесь (если) с многопроходностью?


VD>В самом компиляторе, или в коде на Nemerle?


VD>Компилятор Nemerle 1.0 однопоточный. Компилятор Nemerle 2 будет многопоточным. Достигнуто это будет в основном за счет преобразования большей части структур в неизменяемые и распараллеливанием типизации тел членов (которая в основном и отнимает время).


VD>Если речь о кода написанном на Nemerle, то тут доступны все средства что есть в дотнет-фрэймворке, плюс домарощенные макросы вроде async (похож на аналог из F#, но реализован в виде макроса).


Влад, человек вроде про многопроходность, а не про многопоточность спрашивал
Re[7]: О высокоуровневости ЯП. Выводы.
От: Temoto  
Дата: 31.01.11 21:22
Оценка:
T>>Кстати, расскажите, пожалуйста, как вы в немерле боретесь (если) с многопроходностью?

VD>В самом компиляторе, или в коде на Nemerle?


VD>Компилятор Nemerle 1.0 однопоточный. Компилятор Nemerle 2 будет многопоточным. Достигнуто это будет в основном за счет преобразования большей части структур в неизменяемые и распараллеливанием типизации тел членов (которая в основном и отнимает время).


VD>Если речь о кода написанном на Nemerle, то тут доступны все средства что есть в дотнет-фрэймворке, плюс домарощенные макросы вроде async (похож на аналог из F#, но реализован в виде макроса).


В компиляторе, конечно. Многопоточный компилятор, это, конечно, круто, но вопрос был про количество проходов по исходнику, чтобы сгенерить MSIL.

T>> Можно сделать рекурсивный макрос?


VD>Опять же что понимать под рекурсией?

VD>Макрос:
VD>1. Может определяться с использованием других макросов или даже себя же самого (прошлой версии).
VD>2. Макрос может производить рекурсивные вычисления.

VD>И то, и другое подходит под понятие рекурсия.


VD>Как я уже говорил, макрос — это функция немерла. Синтаксис макросов это всего лишь точка входа. Внутри макроса возможно все что возможно в немерле. В том числе и использовать рекурсию. В то же время макрос можно выразить через самого себя, если предварильно скомпилировать его и подключить полученную сборку к проекту где определен макрос.


Я точно не знаю синтаксиса Немерла, надеюсь, такой будет понятен:

macro Infinite
syntax "inf"
{
  output "inf"
}


В принципе, уже такой макрос должен выполняться бесконечно, если после раскрытия макросов компилятор пытается снова найти макросы, до тех пор, пока они перестанут менять код. Но если у вас нет такой логики, то вот другой вариант:

macro Infinite
syntax "inf"
{
  output Infinite()
}


Конечно, это вырожденные случаи, просто из любопытства интересно, ловит ли компилятор подобные извороты?
Re[8]: О высокоуровневости ЯП. Выводы.
От: hardcase Пират http://nemerle.org
Дата: 31.01.11 21:38
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Конечно, это вырожденные случаи, просто из любопытства интересно, ловит ли компилятор подобные извороты?


А ловит ли компилятор, скажем, Си, извороты вида:
for(;;);

/* иЗвиНите зА неРовнЫй поЧерК */
Re[8]: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 22:25
Оценка:
Здравствуйте, Курилка, Вы писали:

T>>>Кстати, расскажите, пожалуйста, как вы в немерле боретесь (если) с многопроходностью?


К>Влад, человек вроде про многопроходность, а не про многопоточность спрашивал


Э... сори. Проклятое зрение!

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

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

Макросы могут раскрыться в код так же содержащий макросы.

Так что при раскрытии макросов никакой многопроходности нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 22:40
Оценка:
Здравствуйте, Temoto, Вы писали:

T>В компиляторе, конечно. Многопоточный компилятор, это, конечно, круто, но вопрос был про количество проходов по исходнику, чтобы сгенерить MSIL.


По исходнику давно уже никто не ходит больше одного раза. Ну, разве что для реализации препроцессора.
Работа ведется на базе АСТ. Сначала создаются токены, потом они трасформируются в АСТ. Макросы уже работают с АСТ (как в Лиспе).

Макрос уровня выражения — это просто функция получающая набор выражений в качестве параметров и возвращающая выражение (АСТ уровня выражения). Мета-атрибуты — это процедуры выполняемые в различные стадии компиляции и способные модифицировать АСТ (императивно).

T>Я точно не знаю синтаксиса Немерла, надеюсь, такой будет понятен:


Дык, может стоит познакомиться?
http://www.rsdn.ru/summary/5099.xml

T>
T>macro Infinite
T>syntax "inf"
T>{
T>  output "inf"
T>}
T>


T>В принципе, уже такой макрос должен выполняться бесконечно,


Дык в том то все и дело, что макросы не выполняются, а раскрываются. В указанном тобой виде макрос можно будет определить только при уловии, что до этого макрос был реализован без рекурсии. Готовый макрос можно подключить (в виде dll) к проекту соберающему тот же макрос. Но это будет предыдущая версия макроса! При своем раскрытии эта версия генерирует код в котором не будет себя же. Этот код и станет результатом работы нового макроса. Кода проект содержащий макрос будет перекомпилирован еще раз, то точно так же раскроется новая весрия, но так как она была создана из старой, то она вернет все тот же АСТ не содержащий себя.

Так что в этом плане рекурсия и есть, и ее нет. Визуально мы можем написать код так:
  macro @if (cond, e1, e2)
  syntax ("if", "(", cond, ")", e1, Optional (";"), "else", e2)
  {
    <[ if ($cond) $e1 else $e2) ]>
  }

Но он все равно раскроется в:
  macro @if (cond, e1, e2)
  syntax ("if", "(", cond, ")", e1, Optional (";"), "else", e2)
  {
    Util.locate(cond.Location,
    <[
      match ($cond : bool)
      {
        | true => $e1
        | _ => $e2
      }
    ]>)
  }

Так как старая версия вернет именно этот код.

Еще раз повторюсь макрос Nemerle должен быть скомпилирован до применения. Так что самого себя он использовать не может.

T>если после раскрытия макросов компилятор пытается снова найти макросы, до тех пор, пока они перестанут менять код.


T>Конечно, это вырожденные случаи, просто из любопытства интересно, ловит ли компилятор подобные извороты?


Они просто невозможны.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 22:44
Оценка:
Здравствуйте, Temoto, Вы писали:

H>>А ловит ли компилятор, скажем, Си, извороты вида:

H>>
for(;;);

H>>

T>Проверил. Не ловит. Очень удивительно, я ожидал варнинг.


Он о том, что компилятор C написан на С же, но это не приводит к тому, что компилятор зацикливается встретив конструкцию for... если я его правильно понял.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: О высокоуровневости ЯП. Выводы.
От: hardcase Пират http://nemerle.org
Дата: 01.02.11 07:59
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Они просто невозможны.


На самом деле возможны (это связано с механизмом разрешения имен функций).

Макрос:
namespace test
{
  macro Macro1()
  {
    <[ Macro1() ]> // Call, НЕ MacroEnvelope
  }
}


Код:
namespace test
{
  module Program
  {
    Main() : void { Macro1(); }
  }
}


Компилятор вылетает с переполнением стека.


Другое дело, что никто в здравом уме не станет такую фигню писать.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[10]: О высокоуровневости ЯП. Выводы.
От: Ziaw Россия  
Дата: 01.02.11 08:18
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Другое дело, что никто в здравом уме не станет такую фигню писать.


Ну почему же. Например макрос json насквозь рекурсивный, другое дело, что для рекурсии можно использовать макрос в виде вызова метода, хотя использование его напрямую в цитатах выглядело бы изящнее.
Re[11]: О высокоуровневости ЯП. Выводы.
От: hardcase Пират http://nemerle.org
Дата: 01.02.11 09:27
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Ну почему же. Например макрос json насквозь рекурсивный, другое дело, что для рекурсии можно использовать макрос в виде вызова метода, хотя использование его напрямую в цитатах выглядело бы изящнее.


В принципе достаточно сделать в компиляторе защиту от неограниченной рекурсии макросов (скажем, 100 итераций), не известно правда, насколько это оправданно. Во всяком случае никто на такие проблемы еще не натыкался.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[8]: О высокоуровневости ЯП. Выводы.
От: FR  
Дата: 01.02.11 12:57
Оценка:
Здравствуйте, Temoto, Вы писали:


T>Конечно, это вырожденные случаи, просто из любопытства интересно, ловит ли компилятор подобные извороты?


C++ или D вполне возможно, используя шаблоны, заставить компилятор задуматься навсегда (до переполнения стека),
в немерле и любом другом языке поддерживающем тьюринг-полное метапрограммирование должно быть аналогично.
Re[12]: О высокоуровневости ЯП. Выводы.
От: Ziaw Россия  
Дата: 01.02.11 12:58
Оценка:
Здравствуйте, hardcase, Вы писали:

Z>>Ну почему же. Например макрос json насквозь рекурсивный, другое дело, что для рекурсии можно использовать макрос в виде вызова метода, хотя использование его напрямую в цитатах выглядело бы изящнее.


H>В принципе достаточно сделать в компиляторе защиту от неограниченной рекурсии макросов (скажем, 100 итераций), не известно правда, насколько это оправданно. Во всяком случае никто на такие проблемы еще не натыкался.


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

А в защите от неорганиченной рекурсии я вообще смысла не вижу, это всего лишь один из нескольких рядовых способов уронить компилятор из макроса (обычную же рекурсию мы ограничивать не собираемся).
Re[4]: О высокоуровневости ЯП. Выводы.
От: 0x7be СССР  
Дата: 01.02.11 13:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кроме того в твоих рассуждениях этот термин совершенно не нужен. Без него получится даже понятнее.

VD>Скажем, если фразу "Избыточность сообщения — разница между энтропией сообщения и максимально возможной энтропией." перефразировать так — "Избыточность сообщения — разница между информационной насыщенностью сообщения сообщения и максимально возможной информационной насыщенностью сообщения.", то она станет только понятнее. Хотя после этого становится очевидным, что "максимально возможной информационной насыщенностью сообщения" может быть бесконечна. Из чего делаем вывод, что или определение не верное, или логический вывод хромает.
Что-то я запутался в твоих рассуждениях. Информационная энтропия по Шеннону имеет одно очень конкретное свойство, на которое я опираюсь в своих рассуждениях — она ограничена сверху. В конечном итоге из этого я делаю заключение, что каждую конкретную программу нельзя сжимать до бесконечности, даже используя сколь угодно продвинутые средства абстракции. Совсем выкидывать энтропию из текста нельзя. Может просто не ссылаться на неё часто, а только в определении насыщенности и там, где используется её свойство ограниченности сверху?

VD>При этом нет нет никакого смысла давать определение понятиям "Информационная насыщенность сообщения" и "Избыточность сообщения". Все и так интуитивно понимают смысл этих слов. Избыточность — кода можно выкинуть лишнее и смысл не потеряется. Информационная насыщенность — когда мало "воды".

С этим соглашусь

VD>В общем, читая это не вольно ловишь себя на мысли, что автор начал заниматься фигней и графоманством давая запутанные определения и так понятным понятиям.

Фигня и графоманство у меня в первой части, где я определения даю.
Это побочный эффект написание текста, как эссе, для приведения собственных мыслей в порядок.
Для публикации в виде статьи можно упростить.

VD>Усложнять — легко. Упрощать — тяжело. Так что не надо стараться усложнять. Это и так получится .

Черт возьми, а ведь ты прав!
Re[4]: О высокоуровневости ЯП. Выводы.
От: 0x7be СССР  
Дата: 01.02.11 13:04
Оценка:
Здравствуйте, VladD2, Вы писали:

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

Постараюсь побыстрее, но не обещаю.
С делами завал.
Re[10]: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.02.11 14:52
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Компилятор вылетает с переполнением стека.


Если это так, то это просто баг. Компилятор не должен видеть имени еще не скомпилированного макроса.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: О высокоуровневости ЯП. Выводы.
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.02.11 15:00
Оценка:
Здравствуйте, 0x7be, Вы писали:

0>Постараюсь побыстрее, но не обещаю.

0>С делами завал.

Если сделаешь сегодня (максимум завта) то включим статью в сдаваемый на днях номер.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: О высокоуровневости ЯП. Выводы.
От: hardcase Пират http://nemerle.org
Дата: 01.02.11 15:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, hardcase, Вы писали:


H>>Компилятор вылетает с переполнением стека.


VD>Если это так, то это просто баг. Компилятор не должен видеть имени еще не скомпилированного макроса.


А он и не видит. Компиляция валится при использовании этого макроса.
Я же для тебя написал комментарий: <[ Macro1() ]> есть ничто иное как обычный PExpr.Call("Macro1", []), тогда как синтаксические макросы в цитатах выглядят как MacroEnvelope, если мне не изменяет память.
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.