Здравствуйте, D. Mon, Вы писали:
MZ>>Зачем он в лиспе-то ?
DM>Чтобы пример из первого поста (уже доступен, кстати) работал не 30 секунд, а 3, и при этом не надо было раздувать код аннотациями типов. Вот зачем.
Ну так вывод типов в Лиспе делается тривиально. А вот наоборот, отрубить его от OCaml уже нельзя. Из Лиспа можно сделать OCaml, или OCaml нельзя сделать эффективно Лисп. Следовательно, Лисп фундаментальнее.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, D. Mon, Вы писали:
MZ>>>Зачем он в лиспе-то ? DM>>Чтобы пример из первого поста (уже доступен, кстати) работал не 30 секунд, а 3, и при этом не надо было раздувать код аннотациями типов. Вот зачем. А> Ну так вывод типов в Лиспе делается тривиально. А вот наоборот, отрубить его от OCaml уже нельзя. Из Лиспа можно сделать OCaml, или OCaml нельзя сделать эффективно Лисп.
Я бы предложил сравнение.
Есть у меня подозрение, что примитивный Лисп на ОКамле будет написан где-то между ужином и отходом ко сну.
Тогда как примитивный ОКамл на Лиспе потребует гораздо больше работы.
К тому же зачем сравнивать уже устаревший ОКамл с мощным Лиспом.
Надо упомянуть, что ML был написан на Лиспе (и это на нём сказалось, см. The Zinc experiment) и на Лиспе же был написан один из первых компиляторов Хаскеля: Yake.
А> Следовательно, Лисп фундаментальнее.
По-моему, это поспешный вывод.
И ещё. "Фундаментальней" не значит "удобней".
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[10]: Как написать виртуальную машину на LISP
От:
Аноним
Дата:
12.08.09 09:36
Оценка:
Здравствуйте, thesz, Вы писали:
T>Есть у меня подозрение, что примитивный Лисп на ОКамле будет написан где-то между ужином и отходом ко сну.
Не надо "примитивный". Надо "эффективный". Интерпретатор то минимального Лиспа любой дурак за час напишет.
T>Тогда как примитивный ОКамл на Лиспе потребует гораздо больше работы.
Не гораздо. Два-три часа максимум. Конкретнее — чуть больше тысячи строк кода с комментариями выходит.
T>К тому же зачем сравнивать уже устаревший ОКамл с мощным Лиспом.
Лисп как бы малость куда более "устаревший" и древний.
T>Давайте сравним современный Хаскель.
Интерпретатор. Не интересно. Хотя, на Template Haskell теоретически и компилятор можно было бы сделать.
T>Надо упомянуть, что ML был написан на Лиспе (и это на нём сказалось, см. The Zinc experiment) и на Лиспе же был написан один из первых компиляторов Хаскеля: Yake.
Да и YHC на Схеме написан. И что?
А>> Следовательно, Лисп фундаментальнее.
T>По-моему, это поспешный вывод.
Ну почему же? Фундаментальность — понятие строгое.
T>И ещё. "Фундаментальней" не значит "удобней".
Поскольку Лисп легко включает в себя весь ML, плюс много чего ещё, а в ML есть только ML — то да, удобнее. Но я не говорю "безопаснее", кстати.
Здравствуйте, Аноним, Вы писали:
А> Ну так вывод типов в Лиспе делается тривиально.
А можно чуть подробнее идею? Т.е. вот задумал человек решить задачку на ICFPC, и вместо простой реализации ВМ, которая будет написана быстро, но работать медленно, ты предлагаешь ему самостоятельно реализовывать вывод типов? Там и без этого четыре лиспера набрали в два с половиной раза меньше очков, чем один окамлер.
А> А вот наоборот, отрубить его от OCaml уже нельзя.
1. Зачем здравомыслящему человеку его вдруг отрубать? 2. Динамическая типизация делается на окамле элементарно, для работы с sexp'ами библиотек тоже предостаточно.
A> Из Лиспа можно сделать OCaml, или OCaml нельзя сделать эффективно Лисп. Следовательно, Лисп фундаментальнее.
А Си еще фундаментальнее, не говоря о макроассемблере. Толку то.
Здравствуйте, Аноним, Вы писали:
T>>Тогда как примитивный ОКамл на Лиспе потребует гораздо больше работы.
А> Не гораздо. Два-три часа максимум. Конкретнее — чуть больше тысячи строк кода с комментариями выходит.
Мне, как и многим присутствующим, было бы очень интересно об этом почитать поподробнее. Можно ссылку или описание какое-нибудь?
Re[10]: Как написать виртуальную машину на LISP
От:
Аноним
Дата:
12.08.09 10:56
Оценка:
Здравствуйте, D. Mon, Вы писали:
DM> Т.е. вот задумал человек решить задачку на ICFPC, и вместо простой реализации ВМ, которая будет написана быстро, но работать медленно, ты предлагаешь ему самостоятельно реализовывать вывод типов?
У любого прожженого лиспера таких реализаций готовеньких уже пара-тройка валяется в загашнике.
DM> Там и без этого четыре лиспера набрали в два с половиной раза меньше очков, чем один окамлер.
Там вообще лисперов мало было.
А>> А вот наоборот, отрубить его от OCaml уже нельзя.
DM>1. Зачем здравомыслящему человеку его вдруг отрубать?
Затем, что далеко не всегда и не везде нужна именно такая система типов. Затем, что для реализации DSLей нужно разнообразие возможностей, а не bondage and discipline.
DM> 2. Динамическая типизация делается на окамле элементарно, для работы с sexp'ами библиотек тоже предостаточно.
Я говорю про совсем отрубить, а не про частности.
A>> Из Лиспа можно сделать OCaml, или OCaml нельзя сделать эффективно Лисп. Следовательно, Лисп фундаментальнее.
DM>А Си еще фундаментальнее, не говоря о макроассемблере. Толку то.
Толку то, что Лисп — это метаязык, который тривиально превращается в любой другой язык. Чего не скажешь ни о Си, ни об OCaml-е.
Здравствуйте, D. Mon, Вы писали:
А>> Не гораздо. Два-три часа максимум. Конкретнее — чуть больше тысячи строк кода с комментариями выходит.
DM>Мне, как и многим присутствующим, было бы очень интересно об этом почитать поподробнее. Можно ссылку или описание какое-нибудь?
Ну вот, например — аляповатый но примитивный компилятор ML на Лиспе:
Здравствуйте, Аноним, Вы писали: А>Ну так вывод типов в Лиспе делается тривиально. А вот наоборот, отрубить его от OCaml уже нельзя. Из Лиспа можно сделать OCaml, или OCaml нельзя сделать эффективно Лисп. Следовательно, Лисп фундаментальнее.
Чтобы из лиспа сделать окамл, нужно реализовать компилятор окамла на лиспе.
Чтобы из окамла сделать лисп, нужно реализовать компилятор лиспа на окамле.
И в ту, и в другую сторону получается хороший объем работы.
Так что я не разделяю твоих взглядов на то, что из чего делается и кто фундаментальнее.
Это как если мы начнем выяснять, что фундаментальнее: типизированное лямбда-исчисление или нетипизированное.
Здравствуйте, Аноним, Вы писали: А> Толку то, что Лисп — это метаязык, который тривиально превращается в любой другой язык. Чего не скажешь ни о Си, ни об OCaml-е.
Не соглашусь. Что есть у макров лиспа:
1. Движок и язык преобразований дерева
2. Целевой язык с несложным форматом ast
Итого — просто набор уже готовых инструментов.
Если исходный язык прост или недалек от целевого — да, этот начальный набор инструментов сильно помогает.
В противном случае на любом другом языке можно реализовать пп. 1-2 и точно так же компилировать в лисп или другой подобный язык.
Или воспользоваться другим подобным набором инструментов. Вон, в antlr тоже вроде есть что-то готовое по работе с деревьями, в т.ч. язык для написания обходчиков/преобразователей дерева (могу ошибаться — давно я antlr-ом интересовался).
Будут те же яйца, вид в профиль.
Re[10]: Как написать виртуальную машину на LISP
От:
Аноним
Дата:
12.08.09 11:49
Оценка:
Здравствуйте, Mr.Cat, Вы писали:
MC>Чтобы из лиспа сделать окамл, нужно реализовать компилятор окамла на лиспе.
Причём, компилятор из OCaml в Lisp. Остальное уже имеющийся в наличии компилятор Лиспа сам доделает.
MC>Чтобы из окамла сделать лисп, нужно реализовать компилятор лиспа на окамле.
А вот в этом случае придётся писать компилятор целиком. Работы больше на порядок.
MC>И в ту, и в другую сторону получается хороший объем работы.
Ты не видишь разницу между метаязыком и обычным, однопроходным языком?
MC>Так что я не разделяю твоих взглядов на то, что из чего делается и кто фундаментальнее.
Да не взгляды это. Всё тупо — то, что проще, из чего легче минимальный базис составить, то и фундаментальнее. Тут субъективным оценкам не место.
MC>Это как если мы начнем выяснять, что фундаментальнее: типизированное лямбда-исчисление или нетипизированное.
Term rewriting фундаментальнее. Любое лямбда-исчисление, алгоритмы Маркова, машины Тьюринга, и тому подобное — это всего лишь частные случаи.
On a more serious note, I do want to hold this up as an example
of how extremely simple and natural it is to implement
syntactic-closures compared to alternatives such as syntax-case. The whole macro implementation is about 25 lines of low-level C
code (modulo the extra lines I'll have to add later for bug
fixes), as opposed to say the 4000 or so lines of Scheme for
psyntax.
На хаскеле вообще тогда должно в одну строку писаться.
Re[12]: Как написать виртуальную машину на LISP
От:
Аноним
Дата:
12.08.09 11:57
Оценка:
Здравствуйте, Mr.Cat, Вы писали:
MC>Не соглашусь. Что есть у макров лиспа: MC>1. Движок и язык преобразований дерева MC>2. Целевой язык с несложным форматом ast
Самое важное:
3. Инкрементальный компилятор целевого языка.
Что позволяет любую сгенерённую во время компиляции конструкцию использовать тут же для определения следующих конструкций. В результате появляется возможность инкрементально расширять язык. Никакой ML, при всех его крутых фичах для работы с деревьями, таким образом расширять нелья (если это не MetaOCaml или ещё какой его родственник).
MC>Если исходный язык прост или недалек от целевого — да, этот начальный набор инструментов сильно помогает.
Исходный язык может быть сколь угодно далёким от целевого — поскольку этот набор инструментов позволяет протянуть цепочку из очень простых и коротких шажков от исходного языка к целевому.
MC>В противном случае на любом другом языке можно реализовать пп. 1-2 и точно так же компилировать в лисп или другой подобный язык.
И тогда у нас будет два разных языка. Никак не взаимодействующих.
MC>Или воспользоваться другим подобным набором инструментов. Вон, в antlr тоже вроде есть что-то готовое по работе с деревьями, в т.ч. язык для написания обходчиков/преобразователей дерева (могу ошибаться — давно я antlr-ом интересовался).
Ну и как, можно сам Antlr расширить средствами Antlr? Нельзя.
MC>Будут те же яйца, вид в профиль.
Совсем не те же. Любой метаязык заведомо превосходит любой не-метаязык. Даже если первый — это Форт, а второй — Haskell (без TH).
Что-то я немного запутался.
Сначала ТС поделился своей реализацией ВМ из ICFPC на Лиспе. Я посетовал на ее медлительность и заметил, что причина может быть в том, что Лисп там не вывел типы, поэтому использовалась динамическая типизация, поэтому получилось медленно.
DM>Чтобы пример из первого поста (уже доступен, кстати) работал не 30 секунд, а 3, и при этом не надо было раздувать код аннотациями типов. Вот зачем.
Потом уважаемый Аноним стал говорить:
A>Ну так вывод типов в Лиспе делается тривиально. Из Лиспа можно сделать OCaml, или OCaml нельзя сделать эффективно Лисп. Следовательно, Лисп фундаментальнее. A> Толку то, что Лисп — это метаязык, который тривиально превращается в любой другой язык. Чего не скажешь ни о Си, ни об OCaml-е. А> Ну вот, например — аляповатый но примитивный компилятор ML на Лиспе: А> http://www.meta-alternative.net/MBaseML.zip
Чем меня запутал. В архиве некий компилятор, который, используя готовый фреймворк, обычным образом парсит программу на МЛ и переводит ее в некое промежуточное представление, которое потом большая готовая библиотека вероятно компилит в MSIL. Т.е. сам лисп ни во что не превращается, то же самое так же делается и на любом другом языке. Вопросы:
1. Как из того, что на Лиспе можно воспользоваться генератором парсеров (входит в MBase), получается, что из Лиспа можно сделать Окамл? На нем можно сделать, но это совсем другое. Лисп в этом примере не превращается в другой язык, а просто парсит и компилирует, что можно и на Си делать. Где фундаментальность? Этим способом на окамле можно сделать какой угодно лисп.
2. Как то, что на Лиспе можно сделать вывод типов для некоего внешнего языка, поможет в ускорении ВМ, написанной на самом Лиспе, если тормозит именно он?
PS. Похожие компиляторы мини-МЛ на окамле (см. Programming Language Zoo и MinCaml) выглядят лаконичнее и читабельнее, причем не используют больших фреймворков, скрывающих еще бабиллионы строк кода.
В общем, пока мне свет истины про лисп не открылся.
Здравствуйте, D. Mon, Вы писали:
DM>Сначала ТС поделился своей реализацией ВМ из ICFPC на Лиспе. Я посетовал на ее медлительность и заметил, что причина может быть в том, что Лисп там не вывел типы, поэтому использовалась динамическая типизация, поэтому получилось медленно.
В том конкретном случае их и выводить не надо, кстати.
DM>Чем меня запутал. В архиве некий компилятор, который, используя готовый фреймворк,
ровно тот же самый Лисп. Любой Лисп таким фреймворком работать может.
DM> обычным образом парсит программу на МЛ и переводит ее в некое промежуточное представление,
В Лисп же и переводит.
DM> которое потом большая готовая библиотека вероятно компилит в MSIL.
В MSIL компилируется уже сам Лисп. Точно так же, если бы это было на SBCL, то "большой готовой библиотекой", которая компилирует это промежуточное представление, был бы сам SBCL. Потому как весь "компилятор" завёрнут в макру, которая разворачивает ML в Лисп и подставляет в месте вызова макры.
DM> Т.е. сам лисп ни во что не превращается, то же самое так же делается и на любом другом языке.
Как то же самое сделать на любом другом языке?
DM>1. Как из того, что на Лиспе можно воспользоваться генератором парсеров (входит в MBase), получается, что из Лиспа можно сделать Окамл?
А можно не пользоваться генератором парсеров. Можно использовать тот же самый алгоритм вывода типов для подмножества Лиспа. А это подмножество Лиспа генерить уже из макры (например, той, которая компилирует код VM).
DM> На нем можно сделать, но это совсем другое. Лисп в этом примере не превращается в другой язык, а просто парсит и компилирует, что можно и на Си делать.
Как это Лисп не превращается в другой язык? Можно написать так:
(lisp lisp lisp
(ml "let mlfunction args = something-mlish")
(lisp lisp call-ml-function lisp lisp ...))
DM> Где фундаментальность? Этим способом на окамле можно сделать какой угодно лисп.
Ну и как же? Где в OCaml есть macro, как я могу воспользоваться самим готовым компилятором OCaml? Да ещё и так, чтобы в том же модуле потом сослаться на результат компиляции?
DM>2. Как то, что на Лиспе можно сделать вывод типов для некоего внешнего языка, поможет в ускорении ВМ, написанной на самом Лиспе, если тормозит именно он?
Лисп позволяет вводить аннотации типов. А макронадстройка над Лиспом, выводящая типы автоматически, позволяет эти аннотации опускать.
DM>PS. Похожие компиляторы мини-МЛ на окамле (см. Programming Language Zoo и MinCaml) выглядят лаконичнее и читабельнее, причем не используют больших фреймворков, скрывающих еще бабиллионы строк кода.
Каких таких фреймворков? Там только лисповские макры. И я бы посмотрел на более лаконичную реализацию Хиндли-Милнера, чем компиляция в Пролог.
DM>В общем, пока мне свет истины про лисп не открылся.
Это нормально. Понять, что такое macro, многим удаётся далеко не сразу.
Re[14]: Как написать виртуальную машину на LISP
От:
Аноним
Дата:
12.08.09 12:27
Оценка:
Здравствуйте, D. Mon, Вы писали:
DM>2. Как то, что на Лиспе можно сделать вывод типов для некоего внешнего языка, поможет в ускорении ВМ, написанной на самом Лиспе, если тормозит именно он?
Здравствуйте, Аноним, Вы писали:
А> Лисп позволяет вводить аннотации типов. А макронадстройка над Лиспом, выводящая типы автоматически, позволяет эти аннотации опускать.
Ок, я услышал, что Лисп — такой чудесный мега- т.е. мета-язык с чудо-компиляторами, на котором можно делать суперумные метапрограммы (наверняка именно на нем была написана программа, вычислившая ответ на жизнь, вселенную и вообще всего за 7,5 миллионов лет). И этот язык должен позволить решить исходную задачу (ВМ из ICFPC) очень легко и быстро, причем должно получиться лаконично и эффективно. И я даже понимаю умствования т.е. теорию, почему это так. Но без практики это лишь слова. Я готов уверовать в его силу, если увижу на нем реализацию вышеупомянутой ВМ, работающую не более чем в 2 раза медленнее варианта на Си и ее исходник будет не сильно длиннее окамловского. Спецификация ВМ очень проста, см. первый пост. Ссылка на вариант на Си тут была в теме про Окамл вс. С++.
Здравствуйте, Аноним, Вы писали:
А> Term rewriting фундаментальнее. Любое лямбда-исчисление, алгоритмы Маркова, машины Тьюринга, и тому подобное — это всего лишь частные случаи.
Я вот чо тока не понял, "фундаментальнее" — это ругательство или это круто типа? А то читаю и так и не пойму, у кого ж длиннее.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, thesz, Вы писали:
T>>Есть у меня подозрение, что примитивный Лисп на ОКамле будет написан где-то между ужином и отходом ко сну. А> Не надо "примитивный". Надо "эффективный". Интерпретатор то минимального Лиспа любой дурак за час напишет.
Ну уж анализ-то кода на камле со сравнениями с образцом писать проще, чем на лиспе с CARами да CDRами.
А если подтянуть GADT из Хаскеля...
T>>Тогда как примитивный ОКамл на Лиспе потребует гораздо больше работы. А> Не гораздо. Два-три часа максимум. Конкретнее — чуть больше тысячи строк кода с комментариями выходит.
А это будет "примитивный" или "эффективный" вариант?
Где бы на это посмотреть?
T>>К тому же зачем сравнивать уже устаревший ОКамл с мощным Лиспом. А> Лисп как бы малость куда более "устаревший" и древний. T>>Давайте сравним современный Хаскель. А> Он слишком жирным стал в последнее время.
С их помощью я понимаю, как сделать. Как сделать с помощью TH, мне непонятно.
T>>Надо упомянуть, что ML был написан на Лиспе (и это на нём сказалось, см. The Zinc experiment) и на Лиспе же был написан один из первых компиляторов Хаскеля: Yake. А> Да и YHC на Схеме написан. И что?
Так отошли от него.
Мой любимый аргумент: как много новых языков пишут на каком-либо ФЯ в последнее время?
На Хаскеле всё больше, на Лиспе с окамлом всё меньше.
А>>> Следовательно, Лисп фундаментальнее. T>>По-моему, это поспешный вывод. А> Ну почему же? Фундаментальность — понятие строгое.
А нельзя ли его привести?
T>>И ещё. "Фундаментальней" не значит "удобней". А> Поскольку Лисп легко включает в себя весь ML, плюс много чего ещё, а в ML есть только ML — то да, удобнее. Но я не говорю "безопаснее", кстати.
Вот-вот.
Техника безопасности при работе с компьютером отличается по объёму от техники безопасности ведения боевых действий.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[16]: Как написать виртуальную машину на LISP
От:
Аноним
Дата:
12.08.09 13:29
Оценка:
Здравствуйте, D. Mon, Вы писали:
DM> Но без практики это лишь слова.
Ок, давай практику. Сделай на OCaml аналог макры ast:visit из MBase. То есть, рекурсивный обход ADT без явной рекурсии. Средствами OCaml. И чтоб работало так же эффективно, как вручную написанный код.
DM> Я готов уверовать в его силу, если увижу на нем реализацию вышеупомянутой ВМ,
Вышеупомянутая VM не имеет практической ценности.
DM> работающую не более чем в 2 раза медленнее варианта на Си и ее исходник будет не сильно длиннее окамловского. Спецификация ВМ очень проста, см. первый пост. Ссылка на вариант на Си тут была в теме про Окамл вс. С++.
Разве что если будет свободное время.
Интереснее было бы на более практичном примере сравнить. Только всё равно не спортивно — компилятор с интерпретатором пытаться сравнивать.