Comments 136
Большое спасибо :)
Как раз хотел присмотреться к какому-нибудь неизвестному мне языку программирования, для повышения профессионального уровня. Похоже, этим языком программирования будет Io.
Всегда пожалуйста (:
Вот только есть предложение не хвататься за Io, а схватиться за Lisp, например.
В Io желательно приходить уже зная, что могут дать метапрограммирование, лямбда-функции и прочее. К тому же пока по Io очень мало толковой документации, но мы работаем над этим (:
А я рубист, у нас тоже есть всякие вкусные высокоуровневые штуки. Так что вполне представляю, что и почем.
Правда, с Lisp'ом я знакомился один семестр на третьем курсе, и воспоминания не слишком приятные :)
Академический лисп и лисп производственный это настолько разные вещи, что аж зубы сводит. Чаще всего в университетах даже lisp-код форматировать не умеют, не говоря уж о метапрограммировании (которое там совершенно офигенное).
Почитайте «On Lisp» Грэма или «Practical Common Lisp». Ну и «SICP», конечно.
Хотя да, рубистам в Io будет приятно и легко.
Настаиваю, чтобы в русскоязычных текстах язык назывался «Ё»! ;)
А на тему метапрограммирования, лямбда-функций и прочего куда сунуться можно?
Эээ, вопрос интересный. Вообще лямбда-функции вытекают из лямбда-исчисления, это раздел математики (см. википедию). Про метапрограммирование можно почитать учебники по лиспу, например.
А если одним словом, все хорошо расписано в книжке «Структура и интерпретация компьютерных программ». Она вышла у нас на русском и есть в pdf в интернетах.
Дай ссылочку пожевать. И это, почему её до сих пор не задефунил?
http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/
Видео лекции. Сам смотрю сейчас. :)
Для повышения профессионального уровня советую присмотреться к языку Oz вместе с книгой CTMCP
Попробуйте какой нибудь из диалектов Smalltalk, например Dolphin. Обещаю скучно вам не будет и уровень свой поднимите сильно.
Синтаксис и вообще подход похож на ruby. я не помню есть ли в нем лямда функции :)
Между Io и Ruby очень много общего, например один из разработчиков (:
Ну и да, в Ruby есть lambda-функции, они называются блоки.
В общем-то в Io любое сообщение method — лямбда функция. Есть еще block, который еще более лямбда-функция, но про него я как-нибудь в следующий раз.
Тут стоит отметить, что в самом Руби лямбда и блок - разные вещи, хотя с точки зрения лямбда-исчисления, рубишный блок - как раз и есть лямбда-функция :)
не знать нельзя. а вот написать такое можно когда устал и болеешь.. не возмущайтесь тут :)
UFO landed and left these words here
да, делегат это объектно-ориентированная версия указателя на функцию, скажем так :)
UFO landed and left these words here
У нас на курсе, где практика была на OCaml, это называлось каррирование. Я бы назвал это «возможностью каррирования»
В C# замыкания как раз реализуются через статические переменные-члены класса, но это делает за нас компилятор.
было бы еще лучше, если бы не было столько лишних переносов строк.
Проблема в том, что их там нет, это интервал в тэге pre. Меня тоже драконит
именно поэтому я пишу тексты для хабры в чистом штмле и не пользуюсь автоформатированием :)

В данном случае их можно заменить на blockquote
угу, и слетят отступы, или предполагается использования Вуду- ?
UFO landed and left these words here
Здорово, только пример с синглтоном к метапрограммированию как-то мне особо наглядным не показался. Не проникаешься сутью того, что обработчик сообщения может сделать со своими аргументами.
Про метапрограммирование я поподробнее напишу чуть позже, довольно тяжело объяснять систему метапрограммирования, когда она настолько тривиальна, как ни странно.
Из фишек на затравку, Io умеет:

  • На лету брать полную информацию о слотах объекта

  • На лету «декомпилировать» слоты

  • На лету изменять любой фрагмент кода в рантайме

Последнее это что-то вроде лексического замыкания как в Лиспе? Или иное?
Mushroom := Object clone

В этом фрагменте кода мы создаем класс Mushroom


Классов-то нет.

Тут все просто, главно понять, что в Io нет методов и свойств, есть слоты и сообщения.


И чем по-вашему метод «отличается» от «сообщения», а «свойство» от «слота»? По-моему ничем, если учесть что «метод — кусок кода, ассоциированный с объектом или классом».

Больше всего это напоминает мне JavaScript со стейтментами в стиле лисп (с лиспом не знаком).
Про класс мой косяк --- поправил, спасибо.
А про отличия: слот --- абстрактный контейней, который может содержать как значение, так и «метод». Все это в общем случае --- сообщения.
а, да, слоты отличаются
____

интересно, как в более-менее сложном коде предполагается создать два объекта одного типа в разных местах (где клонирование недоступно)… предполагаю, будет уже не так красиво
Вообще Io умеет асинхронные сообщения, через них можно получить доступ к любому месту системы, даже к сильно удаленному (другая нода кластера, например). Проблемы не вижу пока (:
Ну вот в JS я бы написал так:

function Human(name, age, city) {
this.name = name
// что-нить сложное
}

fuction one() { new Human("Elsa", 19, "Hamburg") }
fuction two() { new Human("Egor", 32, "spb") }

Как в данном случае обойтись одним клонированием, мне не оч. понятно… Т. е. извернуться можно, но красиво пока не входит.
Эээ, а почему одним-то клонированием-то? У вас тут два new, значит два поколения, так же и там.

Human := Object clone
Human init := method(name, age, city,
self name := name
self age := age
self city := city
)

One := Human clone
One init("Elsa", 19, "Hamburg")
Two := Human clone
Two init("Egor", 32, "spb")
"В Io нет понятия класс, только объект"
А мне кажется, что объект - это экземпляр класса. Класс — это тип, описывающий устройство объектов — экземпляров.
Про метод/сообщение: метод вызывается, а сообщение посылается. Разница хорошо видна, если попытаться вызвать несуществующий метод - в случае "вызова метода" либо среда исполнения сгенерирует исключение, либо просто всё упадёт, и мы сможем обработать эту ситуацию только в _вызывающем_ объекте, но не в _вызываемом_. При посылке же сообщения мы легко можем обработать ситуацию отсутствия соответствующего метода непосредственно в том объекте, которому посылается сообщение. Такое поведение периодически используется в зрелых динамически типизированных языках. Чем-то это похоже на кодогенерацию на лету, но даёт гораздо больше возможностей.
Введение в Io посредством примера, основанного на теории "Ленин - гриб (и радиоволна)" - это круто :)
UFO landed and left these words here
UFO landed and left these words here
Спасибо. Давно намеревался посмотреть на родственничков любимого Смоллтолка, вот и повод будет.
Вот блин спасибо!!! Узнал новое, посмеялся над туториалом. Пошло говоря, в рот мне щупальца!
Да нет, вроде. Изначально разрабатывался с его поддержкой.
Вот конкретно в модуле Directory под винду есть косяки с юникодом, но только в этом модуле и только под винду.
хм, молодцы, если так

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

да и пример работы со строкой, где по индексу возвращается число, а не символ, тоже усилил подозрения
У чисел есть метод asCharacter, насколько я помню, с его помощью можно сконвертить все куда угодно. Юникод же тоже числами кодируется.
да, но все равно напомнило си и пхп — похоже на отношение к строке как к массиву символов-байтов
Насколько я знаю, пока это самый удобный способ.
Строка в Io это объект наследуемый от Sequence, со всеми вытекающими map/fold и итераторами.
я имею в виду, что си и пхп считают элементы строки байтами, и это не очень сочетается с юникодом ; )
то есть, строка в cp1251 будет увеличиваться в 4-8 раз при преобразовании ко внутреннему формату? 0_0
А слова типа "Сконвертить", "отгрепать" и "программинг" вас не смущают?
Жаргон, фигли, а так можно конечно.
глаз зацепился почему-то только за перфоманс :) ну уж совсем редко используется, нежели остальное. Профессионализмы это, конечно, хорошо, но мера-то должна быть...
Хехе, видимо мы с вами в разных областях обитаем, для меня слово "перфоманс" настолько же привычно, как и "сконвертить" (:
UFO landed and left these words here
Ой не уверен на счет академичности ФП. Когда заканчвали курс ФЛП (функц. лог. прог.) в универе, то для получения зачета нужно было найти ссылки и материалы по реально существующим применениям данных парадигм для разработки коммерческого ПО. Как оказалось не так уж и мало.
UFO landed and left these words here
што то можно тут почитать http://www.myjavaserver.com/~livesystems/stor/IoProgrammingGuide.ru.html
вставил ссылку в адресбар, увидел, что там я уже был. Сёмка, ты съел мой мозг и теперь принялся за хабраразум? ;)
Ну мне, в целом если. Просто Леня — мой дежурный мозг для изнасилования всяким извратом типа io, haskell и лиспа.
Не программист, но прочитал с интересом. Блин, ну почему предки не купили мне компьютер, когда я учился в школе. Ну или хотя бы магнитофон к спектруму для записи кода. Аыыыыы (((
UFO landed and left these words here
Язык весьма интересный. А что насичот производительности?
Вот тут что-то совсем нерадостно.
копетц.

> Совсем недавно, в 2002 году,

это всё было давно опубликовано в 1969 году в спецификации на forth
Круто. Давно форт стал объектно ориентированным? А тем более Ъ-Объектно-ориентированным?
как и любой метаязык он позволяет создать такую объектную модель, которая больше нравится. труъ - у каждого своё.
вы знаете, вот чуть ниже вы хаете метаязыки. не странно ли вам?
на лиспе тоже можно реализовать что угодно. Кроме того у ТруЪ-ООП есть всего одно мерило --- smalltalk.
ну, самый мощный метаязык - это ассемблер ;-) и многие из "простых, но мощных" языков типа лиспа, форта, хаскела - не слишком далеко от него ушли. всё-равно для написания более-менее крупного приложения придётся писать нефиговый "фреймворк" реализующий ту или иную парадигму.

а в смалтолк, хотя и замечательный ооп, но тоже не идеален. например, в нём нет интерфейсов, нет локальной перегрузки стандартных типов. ну и больше всего убивает - ориентированность на то, что пользователь работающий с программой и разработчик оной - одно лицо.
> "Hello world" print

принт куда? возможность "печатать" - это свойство принтера, а не бумаги.

лучше бы сделали так:

con.print( "Hello world" )

при этом метод print должен вызывать "Hello world".toString

это с точки зрения ооп.
с точки зрения синтаксиса, лучше подход цпп:

con все дерево кода доступно в рантайме

только не вздумайте его менять, иначе замучаетесь с отладкой.

два различных синтаксиса вызова методов (со скобочками и без) - это очень плохо.

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

цпп код: console
console << "Hello World"

ну и далее у меня было написано что-то про то, что все эти новомодные языки по сути своей ущербны, ибо на них нельзя написать ядро ос и другие рилтайм приложения. для эффективного использования ресурсов остаются только цпп и ада. печально всё это =(
UFO landed and left these words here
одно исключает другое? неужели существует какая-то принципиальная невозможность создания выразительного и в то же время эффективного языка?
ну вот взять, например, цпп. отрезать нафик указатели, шаблоны, сделать всё объектами, добавить возможность расширения синтаксиса (добавление своих операторов, например), отрезать типизацию, добавить интерфейсы, избавиться от "заканчивающихся нулём строк" и замечательный ведь язык получится. но нет, все лезут в метапрограммирование, рефлексию, полный динамизм, виртуальные машины, автоматические сборщики мусора... и огребают тормоза и повышенное потребление памяти. причём пользы от всего этого не слишком много. высокодинамичные программы сложно отлаживать. сборщик мусора работает не ахти как. байткод не учитывает специфику железа. итд итп
Польза появляется только тогда, когда начинаешь думать что ты делаешь, а не тогда, когда у тебя в руках быстрые костыли в виде плюсов. Высокоуровневый подход банально удобнее и выразительней, а производительности мне зачастую не жалко. А где жалко я напишу на C/Object C, но, упаси господи, не на C++.
угу, так в итоге и получается, что для комфортной работы нехватает гига памяти и всё тормозит. в то время как какая-нибудь миньетОС умещается на дискетку и летает.
Вы точно не путаете Энтерпрайз с динамическими языками со сверхвысокими абстракциями? Тормозят больше всего, почему-то, всякие энтерпрайз монстры написанные на C++.
тормозит всё, что угодно, когда разработчику "зачастую не жалко производительности"
UFO landed and left these words here
неправда. седьмой зип в зависимости от настроек либо быстрее либо лучше жмёт. только что замерил.
но это не самое главное. фишка в том, что потоковая обработка - это халява для функциональных языков. их бич - активная работа с памятью. например, наложение фильтров на изображение.

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

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

а вот винрар - да, хотя и быстрее обоих, но жмёт хуже.
UFO landed and left these words here
мне как-то нет дела до всяких "независимых бенчмарков". своим глазам я доверяю больше.

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

не надо путать декларативные языки с функциональными. на чисто функциональном языке, например, невозможо сделать простой чекбокс на форме. чтобы изменить его состояние, нужно отправить всё окно на съедение автоматическому сборщику мусора и с нуля сгенерировать новое, но с другим состоянием чекбокса.
по этой причине чистый функциональный подход нигде и не применяется - только для отдельных вычислительных тасков.
в то же время декларативный подход вполне допускает динамическое изменение состояния.
например: <a href="javascript:this.innerHTML='yes'">no</a>

не надо судить об императивном программировании лишь по одному убогому, но крайне популярному представителю.

там, где программисты просто используют цикл - там уже нет ФП. это самый обычный императивный язык с функциями, где программа из проского списка комманд переписана через последовательность вызова этих самых функций.
UFO landed and left these words here
1. сам-то замерял?
2. наоборот. ртфм.
3. и что, каждый раз при изменении окна разворачивать по новой?
4. конкретные языки назови.
5. кроме сипипи
UFO landed and left these words here
UFO landed and left these words here
>естественных для человека циклов

То-то я смотрю у нас вся математик в циклах! Для человека циклы настолько же неестественны как и рекурсия, вощемто.
А рекурсия намного более выразительно в большинстве случаев. И довольно глупо тащить на процессор языки отличные от машинных комманд, все равно ведь компилятор их туда развернет.
если показать человеку запись: n! = (n-1)*(n-2)*...*(2)*(1)
он сразу поймёт, что энфакториал - это произведение всех чисел от 1 до эн.
однако в математическую формулировку: n!= n ? n*(n-1)! : 1 - ещё придётся повъезжать, раскладывая мысленно в указанный выше ряд
UFO landed and left these words here
UFO landed and left these words here
затем, что каждое приложение стремится заюзать всю свободную память. чем больше среднему пользователю доступно памяти, тем более развязно пишут свои программы разработчики. как не мог я пять лет назад запустить больше десяти средних приложений без риска угодить в своп, так не могу и сейчас.

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

затем, что мне нужно тестировать свои программы в десяти различных средах и из-за их прожорливости приходится останавливать одну виртуальную машину, чтобы запустить другую.

затем, что на гигабайт usb-диска я лучше залью сотню-другую песен и буду наслаждаться разнообразием репертуара в дороге.
UFO landed and left these words here
UFO landed and left these words here
Прозреваю сиплюсплюсера. Никогда не упирались в потолок выразительности своего языка? Довольно безответсвенно заявлять о ущербности языка, потому что на нем нельзя написать ОС. Гуглить IoL4 до просветления.
Прозреваю очередного тролля, предпочитающего навешивать ярлыки.
l4 - это ядро, написанное на цпп. под ним запускается iovm - виртуальная машина ио, написанная на си. и уже под ней - приложения, написанные на io.
L4 если чо, это не ядро, это спецификация интерфейсов ядра. Насколько я знаю само ядро может быть реализовано на чем угодно. Да, загрузчик на C, а дальше хоть на хаскеле реализуй интерфейсы. Вам что, правда кажется, что все на свете удобно реализовывать на C++?
http://os.inf.tu-dresden.de/L4/impl.html
активных имплементаций всего четыре. 3 из них на цпп, одна - на си. iol4 использует первую - Pistachio.

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

ещё вопросы?
Only those users with full accounts are able to leave comments. Log in, please.