[/b/] [/d/] [/tu/] [/a/] [/34/] [/ph/] [/wa/] [/cg/] [/t/]

[Burichan] [Futaba] [Gurochan] [Photon] - [Home] [Manage] [Archive]

[Return]
Posting mode: Reply
Leave these fields empty (spam trap):
Name
Link
Subject
Comment
File
Verification
Password (for post and file deletion)
  • Supported file types are: GIF, JPG, PNG
  • Maximum file size allowed is 10240 KB.
  • Images greater than 200x200 pixels will be thumbnailed.

File: 1274209837440.jpg -(33883 B, 568x664) Thumbnail displayed, click image for full size.
33883 No.32861  

Есть ли здесь кто-либо, прочитавший SICP, понявший его и оставшийся в своём уме? Кто-либо программящий на lisp? (x)еmacs users?

>> No.32878  
File: 1274253037779.gif -(26723 B, 500x500) Thumbnail displayed, click image for full size.
26723

>>32861

>(x)еmacs users

я пробовал, мне емакс показался полным говном. а так как я недостаточно елитен- емакс отправился на помойку.

>> No.32881  
File: 1274256781919.png -(16943 B, 850x1100) Thumbnail displayed, click image for full size.
16943

>>32861
раз уж зашел разговор, можно поитеерсоваться: зачем нужен lisp-подобные языки? Меня всегда интересовал этот вопрос. Не подумайте, что разжигаю холивар, мне просто интересно. Дело в том, что я несколько лет кодю на С и C++ и пока единственные языки, в которых испытывал потребность, помимо - это скриптовые. А вот куда лиспы использовать никак не смекну. Проясните, пожалуйста, ситуацию. Возможно, я даже начну изучать их.

>>32878
Частично согласен. Мой выбор на сегодняшний день - [g]vim.

>> No.32882  

>>32881
Я далёк от Лиспа, но известно мне (случайно) только одно применение: символьная динамика.
Я тоже vim'ер и радость CLisp'a и суть функционального программирования мне неведомы.

>> No.33035  
File: 1274533147581.jpg -(3300 B, 94x114) Thumbnail displayed, click image for full size.
3300

Приятно общаться с людьми которые думают прежде чем постить а не пишут первое что в голову придёт. Вот вам моя cool story.
Я сам достаточно глубоко (но не до самого конца, где-то дальше середины) залез в C++, это был мой pet language. Но всё чаще я стал обращать внимание на то, что написанные программы приходится переписывать с нуля через некоторое время.
Вот описание процесса программирования которое ИМХО очень хорошо отражает действительность:
"Создание большой программы можно сравнить с постройкой столба из кирпича. Этот столб состоит из тысячи кирпичей, положенных один на другой. Столб может быть выстроен, только если класть кирпичи с большой точностью. Любое отклонение приведет к падению кирпичей. Если кирпич номер 998 отклонится на пять миллиметров, столб, вероятно, сможет выдержать тысячу кирпичей, но если отклонение в пятом кирпиче, столб никогда не станет выше трех десятков.
Это характерная особенность программного обеспечения - фундамент намного чувствительнее к манипуляциям, чем программный код более высоких уровней. В процессе конструирования любой программы разработчик совершает ошибки и вносит изменения по ходу действий. Как следствие, программа обрастает рубцовой тканью измененного кода. В любой программе существуют рудиментарные функции и нереализованные возможности. В каждой программе существуют возможности и процедуры, потребность в которых обнаружилась через какое-то время после начала работы. Каждый из этих шрамов - маленькое отклонение на вертикали кирпичей. Перенос кнопки с одной стороны диалога на другую эквивалентен подталкивание кирпича с номером 998, а изменение кода, отвечающего за отображение всех кнопок, - подталкивание пятого кирпича. Объектно-ориентированное программирование и принципы инкапсуляции данных - эта защитные методы, единственное назначение которых в том, чтобы защитить программу от образования рубцовой ткани. По сути дела, объектно-ориентированный подход разделяет башню из 1000 кирпичей на десять башен по 100 кирпичей."

Осваивая vim я подумал, что при помощи регулярных выражений и особым образом составленных исходников (пригодных для обработки этими regexp) можно делать прототипы программ. В C++ есть шаблоны, но этот способ мне показался более правильным.
Т.е. программный проект состоял бы из неких обобщённых исходников (для компиляции ещё непригодных) и, скажем так препроцессора, который бы обработав их давал бы некий более конкретный валидный для компилятора код.
"Есть ведь препроцессоры у С++, у Паскаля и проч. - кто мне мешает написать свой допустим на perl? Чем он будет хуже?" - думал я. Мне захотелось свою среду программирования, где я описывал бы вещи более общо а затем транслировал в конечный компилируемый язык - я надеялся, что обобщённый код внесённый в такую среду не будет со временем устаревать и на нём не будут появляться упомянутые досадные "рубцы".
Раньше, чем мои попытки кончились каким-либо proof of concept...

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

>> No.33038  
File: 1274535612064.jpg -(278578 B, 670x940) Thumbnail displayed, click image for full size.
278578

>>33035

>ИМХО
>принципы инкапсуляции данных - эта защитные методы
>^.^

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

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

>> No.33040  

>>33038
Посылать надо не меня, а автора цитаты.
Кто-то видит программу как взаимодействие объектов. И ООП-среды инструментально поддерживают такое видение, давая средства для объединения в одно целое частоупотребляемых процедур и данных, как только возникло понимание структур данных и алгоритмов как целого. Прогресс осуществляется за счёт развития структуры классов (или я не прав?).
У меня на тот момент было другое видение. Сидя в среде "vim + системное окружение UNIX (ls, cp, mv и проч)" и имея возможность запускать процессы оболочки, пользоваться pipe-ами (а значит и sed, и grep, и perl) получая результат в буфер vim, меня так и тянуло на обобщённое программирование (см. вики). В голову всё чаще приходили задачи скорее системной интеграции, нежели как таково программирования: сегодня я пишу (например) скрипт и использую утилиту с такими-то ключами - в следующей версии ключи поменяются: как я смогу зная новые ключи автоматически обработать скрипт чтобы он снова работал и смогу ли вообще? Поэтому писать препроцессоры - программы, обрабатывающие другие программы (и писать конечные программы в виде удобном для обработки) - само просилось на ум. У меня было такое видение и мне была нужна среда которая бы это видение поддерживала.
Теперь моя позиция понятна?

>> No.33041  
File: 1274539394403.jpg -(219175 B, 600x480) Thumbnail displayed, click image for full size.
219175

>>33040
более-менее. но это ни разу не программирование, это администрирование.

>> No.33042  

>>33040
Честно говоря сам нередко испытывал желание заиметь что-то среднее между скриптовым языком и кодом на C. Скриптовый язык хорош своей гибкостью и быстротой описания в понятном для компьютера виде. Но у него есть огромный недостаток, нередко способный перекрыть все эти преимущества - скорость работы. Код на C в некоторых случаях может работать в десятки а то и сотни тысяч раз быстрее. Кроме того некоторые функции приходится изобретать заново (или может быть просто в C слишком хорошо реализованы битовые операции?).

>> No.33050  

>>33041
А в чём принципиальная разница? Если я работаю в консоли - почему нельзя сказать, что я программирую компьютер? Покомандно, но всё-таки программирую ведь! Я вырежу из .bash_history нужный кусок, сохраню в файл и обобщу использованием переменных на местах конкретных значений - с какого момента я стану программистом? Как стану использовать переменные - но чем просто обрезок history не программа если он может быть корректно интерпретирован sh(1)?

>> No.33072  

>>33035

>Я сам достаточно глубоко (но не до самого конца, где-то дальше середины) залез в C++

Это самое главное. Разберись лучше с шаблонами, а если и их возможностей не хватит (это кстати, имхо, сам по себе сигнал к тому, что ты плохо понимаешь C++), то изучи boost, там есть целая библиотека для метапрограммирования и прокаченного препроцессора (и все это практически не теряя преимуществ статической типизации).

>>33038

>алсо шаблоны не нужны

Шаблоны - прекрасное средство в сочетании с динамическим полиморфизмом. Если ты это и сам не понял, рекомендую почитать дополнительную литературу на эту тему.

>>33040

>меня так и тянуло на обобщённое программирование

и снова буст и шаблоны

>>33050
Принципиальная разница между скриптовыми языками и классическими языками программирования в том, что скриптовые как правило не учитывают ограничения набора команд целевой платформы и сложностей компиляции. Именно с этим связаны ограничения производительности. В противоположность классические языки очень тесно связаны с платформой, а потому с легкостью транслируются в машинный код и, соответсвенно, быстрее исполняются. Такие высокоуровневые языки, как С++ хороши тем, что являются довольно высокоуровнеными, не теряя при этом связи с аппаратной частью.

Итак, уважаемые лиспокодеры, скажите, в чем же преимущество функционального программирования (я так и не получил нормального ответа)?

>> No.33073  
File: 1274560272451.jpg -(708489 B, 600x1000) Thumbnail displayed, click image for full size.
708489
> Принципиальная разница между скриптовыми языками и классическими языками программирования в том, что скриптовые как правило не учитывают ограничения набора команд целевой платформы и сложностей компиляции.

Ты не прав. Основное отличие - почти каждая команда транслируется непосредственно перед исполнением, на что уходит приличная туча ресурсов. Попробуй прогнать пустой цикл в томже баше и в C и сравнить время исполнения.

> в чем же преимущество функционального программирования

http://ru.wikipedia.org/wiki/Функциональное_программирование#.D0.A1.D0.B8.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.81.D1.82.D0.BE.D1.80.D0.BE.D0.BD.D1.8B

>> No.33075  

>>33073

>почти каждая команда транслируется непосредственно перед исполнением

Нет, не транcлируется. P-код - слышали о таком? (баш здесь несколько не к месту, так как у него несколько другие задачи)

>http://ru.wikipedia.org/wiki/Функциональное_программирование#.D0.A1.D0.B8.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.81.D1.82.D0.BE.D1.80.D0.BE.D0.BD.D1.8B

Прочитал я эти бредни и могу сказать, что не страдал ни разу от вещей, которые тут приписываются императивным языкам, используя C++. Все их антипримеры завязаны на использовании глобальных переменных. Припоминаю свои проекты, в которых было 4000+ строк и ни единой глобальной переменной (за исключением разумеется констант и классов-синглтонов). (Допускаю, что не слишком глубоко понял статью, ибо в данный момент пьян)

>> No.33243  
File: 1274823977952.jpg -(1032792 B, 1000x1415) Thumbnail displayed, click image for full size.
1032792

>>33075
Не знаю, почему там не упомянули тот факт, что при функциональном программировании не возникает такого огромного количества утечек памяти, как в том-же C и программисту не нужно постоянно следить за тем, чтобы выделенная им память освобождалась.

>> No.33256  
File: 1274829959837.jpg -(151710 B, 676x916) Thumbnail displayed, click image for full size.
151710

>>33243
Из той же оперы "чего не возникает в функциональном программировании" на пикрелейтед (SICP): как я понял из SICP, функциональную программу всегда видно как на ладони и можно всегда понять её состояние и предсказать его изменение посмотрев на вызываемую функцию и её аргументы. В языках с явным присваиванием (а не только подстановкой функций) этого сделать нельзя.
wannabe-lisper-кун

>> No.33267  

>>33243
Для C++ это это тоже не слишком актуально. Если пользоваться умными указателями, ни за чем следить не надо. А можно даже не использовать умные указатели, а просто пользоваться идиомой владения и все ресурсы, которые ты выделяешь (не только память) оборачивать в объекты, которые будут все зачищать и закрывать в деструкторе. С опытом перестаешь следить за подобными вещами, так как вырабатывается привычка. Это просто культура программирования. А жалуются на подобные вещи разве что новички.

Кстати в более высокоуровневых языках (Java, C# ...), которые не являются функциональными, следить за памятью не требуется.

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

>> No.33268  

Прочитал статью http://www.paulgraham.com/avg.html
Common Lisp и Scheme отложены на потом (когда нечего делать будет) для изучения.

У меня возник еще один вопрос, а возможно ли эти языки использовать взамен скриптовым? Существуют ли сколь-нибудь доделанные компиляторы/интерпретаторы, возможность интеграции в С-шный код, как это можно делать с Lua, Python и т.п. ?

Можно ли использовать каким-то образом библиотеки, откомпилированные из С?

То есть вопрос в том, насколько готова "инфраструктура" для использования функциональных языков в реальных проектах?

>> No.33269  

>>33267

> которые будут все зачищать и закрывать в деструкторе

Теперь представь ситуацию: в деструкторе какого-то класса, у которого куча разных наследников, высвобождается не вся память. Причем оставшийся кусок не большой, чтобы его можно было сразу заметить, но классы создаются и уничтожаются очень часто в процессе работы программы, так что через некоторое время утечка становится заметной, а вот найти ее почти нереально.
В той-же яве или C# потребление памяти черезмерное, поскольку задача поиска кусков, которые уже не будут использоваться весьма не тривиальная, что нельзя сказать про функциональные языки.

>> No.33271  

>>33269
Во-первых, то, что у вас неабстрактный класс имеет кучу наследников - уже странность.
Также странность то, что идиома владения была реализована криво. Если вы забыли что-то удалить, значит, было много таких сущностей, которые подлежат удалению, а значит, ваш класс требует декомпозиции.
Иными словами, чаще всего в подобных ошибках виноват программист, который неверно использует языковые средства (а программист их имеет).
Если мои доводы вас не убедили, могу сказать еще то, что программист, который хочет "выключить" утечки памяти у себя всегда может перестать работать с указателями напрямую и начать повсеместно пользоваться умными указателями.

В догонку:

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

Создаются объекты класса, а не классы. Но все же.
Для повышения производительности (а также для исключения упомянутой ранее ошибки и подобных) можно соорудить пул объектов (фабрику). Убиваем сразу двух зайцев.

>найти ее почти нереально

valgrind вам в руки

>> No.33272  

>>33271
Добавлю еще, что даже с умными указателями возможны случаи утечек, но это уже особо криворукие случаи.

>> No.33275  

>>33271
Ты случайно не знаешь как пофиксить утечку памяти в vlc при трансляции DVB?

>> No.33276  

>>33275
Нет.
Кривые проекты не говорят о кривости технологий, верно?

>> No.33281  
>прочитавший SICP

в процессе

>понявший его

вроде там всё очень подробно разжевано, же

>Emacs users

а как же

>программящий на lisp

пока что только EmacsLisp, работу за деньги в наших краях, по-моему, вообще не реально найти.

>> No.33282  

>>33256

>как я понял из SICP, функциональную программу всегда видно как на ладони и можно всегда понять её состояние и предсказать его изменение посмотрев на вызываемую функцию и её аргументы.

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

>> No.33283  

>>33281

> работу за деньги в наших краях, по-моему, вообще не реально найти.

Вариант just for lulz не рассматривается?

>> No.33292  
File: 1274906492662.jpg -(9160 B, 200x200) Thumbnail displayed, click image for full size.
9160

>>33282
Да, я читаю SICP на русском. Я не рублю в инглише так, чтобы читать на нём свободно. Но я хочу понять эту книгу полностью и однозначно, так что когда овладею ингилишем то перечитаю на нём. Если я сейчас начну переводить с него - я в конец ох-ею, а я и так ох-ваю от чтения и от того как разбегаются глаза: Lisp, scheme, elisp, MIT Scheme, emacs-Xemacs (не одно и то же, кстати!), продолжения, сопрограммы, компиляция (БЛДЖАД! Я ж быдлокодер был на С++ пять лет назад и думал что компиляция - это CTRL+F9), быстрое прототипирование и проч. и проч. - у меня и так overflow в мозге. SICP для меня совсем не так уж банален меня в быдлоВУЗе и близко не подпускали к осознанию того, что БЛДЖАД могут быть программы обрабатывающие другие программы - когда я что-то такое заявлял окружающим делались круглые глаза и мне пальцем у виска крутили. Почему базы данных, компиляторы, ОС Windows устроены именно так, как устроены не думал НИКТО из преподов, МАТЬ ИХ, они суки думали наверное что это б-жьи творения, что это в одном ряду с Солнцем, Луной и атомом водорода БЛЖАД. Препод по администрированию сетей, работающий админ(!) не смог сходу ответить мне что такое драйвер. Два года я добивался от одного кулхацкера что БЛЖАД такое сервер: он делал круглые глаза и говорил "как что? вот ты в инет выходишь - коннектишься к серверу". ОХ-ЕТЬ объяснение! Серьёзно говорю, это для меня было загадкой ДВА года. Худо-бедно по местам с компьютерной грамотностью всё встало после самостоятельного (sic!) прочтения "Современных ОС" отца Таненбаума - в частности, зачем писать драйвер было объяснено. По-моему я и так неплохо продвигаюсь. Сорри, накипело.

>> No.33295  

>>33282 sicp на русском так плох?

>> No.33296  

>>33292
Сочувствую. С другой стороны мне вобще компьютерную грамотность приходилось самостоятельно постигать. Вопросы задавать было некому, интернет появился далеко не сразу, а настраивать его приходилось самостоятельно. Честно говоря сейчас я вообще удивляюсь, как мне тогда удалось завести винмодем под линуксом и дозвониться до интернетов.

>> No.33309  

>>33292
У меня в универе и среди знакомых, конечно, не такие долбоебы, как у тебя, но тем не менее самостоятельное изучение материала - это для меня обыденность уже несколько лет.
А зачем ты изучаешь лиспы?

>> No.33310  
File: 1274979539043.jpg -(92277 B, 604x461) Thumbnail displayed, click image for full size.
92277

>>33296
Спасибо. Вин-модем под Линуксом - это что-то, я слышал они настраиваются только выкорчёвыванием кусков Винды обеспечивающих HAL, что-ли и прикручиванием к ядру Линукса при помощи чёрной магии.
>>33309
Собстно см. >>33035 . Я хотел собрать среду из утилит UNIX и текстового редактора как интерфейса. Разочаровавшись в vim из-за отсутствия внятного внутреннего языка (одна из статей а-ля "vim vs. emacs" объяснила мне это явным образом) я стал поглядывать на emacs т.к. это "один из двух наикрутейших кулхацкеровских языков". Оттуда я узнал про lisp и понял, что о чём-то таком дааавно догадывался. Например о том, что должна же быть какая-то форма, на которой исходные коды и регэкспы (т.е. система обработки исходников) записывались бы единообразно - выяснилось, что это списочная форма. Пол Грэм в упомянутой здесь статье "Поколачивая посредственных" (как-то так) сказал, что списочная - деревянная - форма это представление любой грамматики внутри компилятора и lisp в этом смысле - псевдоязык, т.к. позволяет работать с этой формой напрямую. Тут-то мне всё стало ясно. И ясно стало как интерпретатор языка может быть написан на том же самом языке да так, что на ладони можно уместить: просто в нём ничего лишнего.
С тех пор конечные (в смысле - специфические) языки у меня интереса не вызывают. Отттакот.

>> No.33331  

>>33310

> я слышал они настраиваются только выкорчёвыванием кусков Винды обеспечивающих HAL, что-ли и прикручиванием к ядру Линукса при помощи чёрной магии

Мне повезло больше. На диске с драйверами попался драйвер под линукс, правда не от моего дистибутива. Прикручивать его уже пришлось при помощи бубна. А таких вещей как HAL в те времена еще не существовало.

>> No.33336  

>>33331

Богопротивный Genius Lucent в своё время нормально заводился под Red Hat и Alt, и почти без бубна.

>> No.33385  
>>>>33292 ну ясно, для меня вот сикп был первой книгой по программированию (bash и си изучал на примерах), поэтому никаких заложенных в подсознание предрассудков не было и всё в общем показалось просто и очевидно.

>>33295 да нет, очень даже качественный перевод (разве что пара очепяток замечено было), но вся остальная лит-ра & документация о ФП доступна в основном на англицком, так что я бы посоветовал изначально читать оригинал (как бонус, кстати, идёт митовский сайтик с решениями/пояснениями к задачам).



Delete Post []
Password

[/b/] [/d/] [/tu/] [/a/] [/34/] [/ph/] [/wa/] [/cg/] [/t/]