На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (31) 1 2 [3] 4 5 ...  30 31  ( Перейти к последнему сообщению )  
> идеальный язык программирования , каким он должен быть?
    Цитата Flex Ferrum @
    И попытался продемонстрировать, что при определенной сноровке и в императивном языке можно использовать элементы функционального подхода.
    Так никто вроде и не спорил, что можно. :)
    Цитата Flex Ferrum @
    Вот если реализуется одна моя идейка - то можно будет попробовать С++ в качестве декларативного языка...
    С++ -- наше всё? :D По-моему лучше когда каждая задача решается с помощью наиболее подходящего языка.
      Цитата Relan @
      С++ -- наше всё? :D По-моему лучше когда каждая задача решается с помощью наиболее подходящего языка.

      В общем случае - да. Но иногда из спортивного/академического интереса можно попробовать универсальность "на зуб".
        Насколько я понимаю, чисто императивные языки (без всяких примесей функционального и декларативного подхода) практически уже не встречаются. Так описывая функцию программист прячет часть императивности за функциональный вызов.
        А C++ со своими библиотеками шаблонов (STL, Boost), вообще часто выглядит функциональным языком (что и было выше наглядно продемонстрировано).
        И не очень то принято, чтобы функция меняла собственные аргументы. Кроме того, думаю, большинство функциональных языков умеют изменять значения объектов программы, LISP то уж точно умеет.
        Да и мышление у человека не чисто декларативное. Собравшись в магазин за хлебом, я не ограничиваюсь постановкой задачи, а беру сумку, одеваюсь, обуваюсь, иду в магазин, отсчитываю деньги, то есть выполняю последовательность действий, что есть "императив".
          Relan, кстати, попробуй рарзаботать более-менее сложный шаблон в С++, используя чисто императивный подход - у тебя ничего не получится. Т. е. если рассматривать механизм шаблонов в С++ как самостоятельный язык, то он отнюдь не императивный, а скорее функциональный.
            Во нафлудили! (шутка, я уже соскучился по такому количеству осмысленных ответов. Вот что значит правильно поставить вопрос!)

            Буду отвечать по порядку.

            Цитата LuckLess @
            Напиши программу на форте которая прочитает текстовый файл "text1.txt", создаст "text2.txt" и запишет в него все слова но задом наперед.
            т.е. text1.txt содержит "asd dsa" к примеру -- выход "dsa asd" в text2.txt .. ты говоришь просто что на форте все записи короче выходят... вот сравнимс..

            Уже пишу! А ты на своём языке (видимо, С++) напиши, вот и сравним.

            Цитата LuckLess @
            1) Хорошая стандартная библиотека
            2) Понятный короткий синтаксис
            3) Возможности обобщенного программирования
            4) Возможность АСМ вставок.

            Чем форт лучше С++?

            1) К сожалению, в моём форте функций пока мало, зато в коммерческих фортах их, насколько я понимаю, недостаточно. И вообще, функции - дело наживное. В крайнем случае можно ДЛЛ-библиотеки юзать.
            2) В Форте синтаксис как таковой отсутствует. То есть правильной программой на Форте является любая последовательность ранее (в том числе и в тексте программы) определённых слов. За счёт этого размер, например, моего Форт-ядра в скомпилированном виде не превышает 6 килобайт.
            3) Как я уже говорил, такие возможности в Форте фактически безграничны. В двух словах про них не расскажешь, это надо читать Броуди "Начальный курс программирования на языке Форт" (хотя, если есть желающие, я могу небольшую статью написать). Для создания общего представления о мощности языка скажу, что слова вроде for, if, repeat и прочие базисные слова определяются непосредственно на Форте в одну (!) строчку (правда, с использованием машинных кодов) и компилируются в память при каждом запуске Форт-системы. Кто хочет убедиться - посмотрите файл system.f.
            4) В стандартном Форте такая возможность есть, но мне с головой хватает машинных кодов (как справочник использую fasm+win32dasm).
              antigen, вот список того, что ИМХО стоит почитать по функ. программированию:
              1. Хендерсон П. Функциональное программирование. Применение и реализация. — М.: Мир, 1993.
              2. Филд А., Харрисон П. Функциональное программирование. — М.: Мир, 1993.
              3. Барендрегт Х. Ламбда–исчисление. Его синтаксис и семантика. — М.: Мир, 1985.
              4. Хювенен Э., Сеппянен И. Мир Лиспа. Методы и системы программирования. — М.: Мир, 1990. (это вообще классика)
              5. Backus, J. Can Programming be Liberated from the von Neumann Style: A Functional Style and Its Algebra of Programs. Article, 1978. (тоже классика)
                Цитата LuckLess @
                Напиши программу на форте которая прочитает текстовый файл "text1.txt", создаст "text2.txt" и запишет в него все слова но задом наперед.
                т.е. text1.txt содержит "asd dsa" к примеру -- выход "dsa asd" в text2.txt .. ты говоришь просто что на форте все записи короче выходят... вот сравнимс..

                Написал! Затратил 2 часа 20 минут, при условии, что меня отвлекли где-то на час. Итак:

                ExpandedWrap disabled
                  var out
                   
                  : backparse ( a n -- aw nw ) tuck + dup rot for 1- dup c@ 32 <= if rdrop 0 >r 1+ then next tuck - ;
                  : write_word ( aw nw -- ) out @ -rot writefile 2drop ;
                  : write_space ( -- ) s"  " write_word ;
                  : write_reversed ( a n -- ) false repeat if write_space then 2dup backparse tuck write_word 1+ - true over <=0 until 2drop ;
                  : reverse_file ( a1 n1 a2 n2 -- ) openfilewrite out ! loadfile write_reversed ;
                  : filenames s" file1.txt" s" file2.txt" ;
                   
                  filenames reverse_file

                Юзать так: запускаешь qf.exe и вводишь в командной строке

                ExpandedWrap disabled
                  uses" reverse.f"

                , она файл file1.txt переводит в файл file2.txt. Вот что она делает со своим же исходным текстом:

                ExpandedWrap disabled
                  reverse_file filenames    ; file2.txt" s" file1.txt" s" filenames :  ; write_reversed loadfile ! out openfilewrite ) -- n2 a2 n1 a1 ( reverse_file :  ; 2drop until <=0 over true - 1+ write_word tuck backparse 2dup then write_space if repeat false ) -- n a ( write_reversed :  ; write_word "  s" ) -- ( write_space :  ; 2drop writefile -rot @ out ) -- nw aw ( write_word :  ; - tuck next then 1+ >r 0 rdrop if <= 32 c@ dup 1- for rot dup + tuck ) nw aw -- n a ( backparse :    out var

                10 строчек, включая две пустые, 6 определений функций, 483 байта. Кто меньше? 8-) (не исключаю, что на функциональных языках меньше)

                Добавлено
                З. Ы. Для выхода надо ввести bye
                Сообщение отредактировано: wormball -

                Прикреплённый файлПрикреплённый файлreverse.zip (0.35 Кбайт, скачиваний: 106)
                  Цитата Relan @
                  А он поддерживает списки?

                  У него словарь является списком. Вообще такой структуры данных, как список, в Форте нет (равно как и любых других структур данных), но при желании организовать собственный список довольно легко (равно как и в других языках программирования). Если ставить вопрос "является ли список основной структурой данных?", то нет.

                  Цитата Relan @
                  Если серьезно заинтересуешься этой темой, могу скинуть список литературы и сами книги.

                  Кидай!

                  Цитата Relan @
                  Функциональное программирование -- подмножество декларативного, основано на аппликативной вычислительной модели. Существует еще логическое программирование (например Пролог).

                  Я всё время думал, что функциональное программирование - подмножество императивного. Например, есть у тебя в Паскале функция (или в Форте слово), она говорит компьютеру, что делать, когда ты её вызываешь. А функция на функциональном языке тоже говорит компьютеру, что делать, просто она ограничена более жёсткими рамками. Таким образом, если в императивном языке есть понятие функции, на нём можно писать в функциональном стиле, как, кстати, я и сделал в вышеприведённой программе: у меня там всего одна переменная out, представляющая собой хэндл выходного файла, а всё остальное обходится без переменных. А из декларативных языков (таких, операторы которых совсем нельзя трактовать как команды) я знаю только Пролог, который, насколько мне известно, как язык программирования с треском провалился и представляет лишь академический интерес.

                  Цитата Relan @
                  Точка означает композицию

                  Неясно выражаешься. Насколько я понял, выражение sqrt . sqr эквивалентно sqrt(sqr()) или на Форте sqr sqrt ? То есть в ФП используется префиксная запись?

                  Раз уж заговорили про запись, то придётся рассказать про Форт. В нём используется постфиксная запись, например, чтобы сложить 1 и 2 и вывести сумму на экран, надо написать:

                  ExpandedWrap disabled
                    1 2 + .

                  Все операции Форта производятся через стек (не обычный стек, а дополнительный - так называемый стек данных). Слово 1 кладёт на стек единицу, слово 2 - двойку, слово + берёт два верхних числа со стека и замещает эти числа их суммой. Слово . выводит на экран верхнее число на стеке, при этом оно уничтожается. Такой принцип работы и определяет всю гибкость и простоту Форта: компилятору не надо заботиться о том, чтобы на вход функции подавались правильные аргументы, ведь они всё равно берутся со стека. А контроль правильности программы целиком лежит на программисте. Это кажется дикостью, но лучше всего про это, пожалуй, сказал Броуди (цитата дословная):

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

                  Как же так можно жить, спросите вы? Очень просто: при каждом запуске Форт-системы все исходники компилируются в память, более того, во время работы из командной строки можно вводить любое выражение языка, в том числе определять новые функции. Например, вам приспичило написать функцию, находящую длину гипотенузы. Вы запускаете Форт-систему и вводите:

                  ExpandedWrap disabled
                    : pifagor fsqr fswap fsqr f+ sqrt ;

                  Двоеточие обозначает начало определения функции, pifagor - имя функции, затем идёт последовательность действий, которые должны выполняться при вызове этой функции, заканчивается определение точкой с запятой. Написав это, вы сразу же можете проверить, работает ли ваша функция, путём подачи на её вход различных чисел:

                  ExpandedWrap disabled
                    3. 4. pifagor f.
                    6.456 34. pifagor f.
                    1.435 2.45 pifagor f.

                  Аналогичным способом проверяются и все остальные функции. Если обнаружилась ошибка, можно тут же, не выходя из Форт-системы, переопределить неправильную функцию под тем же именем и сразу её испробовать. Но что же делать, когда функция сложная? Здесь обнаруживается одна важная особенность Форта. Оказывается, "страшный" вид программы на Форте (я намеренно не говорю "синтаксис" - его нет) - это не его недостаток, а преимущество! Написать сколько-либо большую функцию на Форте... нет, не невозможно, но крайне проблематично. Уже через 10-20 слов человеческий мозг становится не в состоянии уследить за перипетиями действий со стеком, и приходится разбивать функцию на более мелкие функции. Поэтому получается, что средняя функция на Форте занимает одну, изредка две строчки. А это не что иное, как функциональное разбиение - главная черта хорошего стиля программирования! На Паскале (да и на С++) функция обрамляется настолько помпезно (а в MSVC ещё и помпезно вызывается: в 10 раз медленнее, чем на Форте), что программист десять раз подумает, прежде чем заводить новую функцию. На Форте же всё обрамление состоит из слов : , ; и собственно имени функции, что также благоприятствует функциональному разбиению. Отлаживать такие функции - одно удовольствие: хочешь - отлаживай снизу вверх, хочешь - сверху вниз, хочешь - прямо в теле функции пиши вывод промежуточных результатов, никаких дебуггеров. С такими функциями и остальные программистские операции превращаются в праздник: чтение, изменение, сопровождение и т. п. Повторная используемость кода (экономия за счёт уже написанного кода) вырастает в разы, если не в десятки раз. Да и само программирование доставляет такое удовольствие, которого я не знал даже на первом курсе (кстати, биофака), когда я впервые решил научиться программировать.

                  Возьмём для примера вывод чисел в римской системе. Программируй я на Паскале с его обманчиво "интуитивно понятным" синтаксисом, я бы, конечно, вместил бы все операции в одну-две функции. Но когда настала бы пора отлаживать, наступил бы кромешный ад. Да, компилятор старательно указал бы мне на мои синтаксические ошибки и неправильное приведение типов, ну написал бы я пару раз char() и byte(). Но я бы запустил - а она бы не работала, и сиди думай, в какой хромосоме у тебя ошибка. На Форте же это вылилось у меня в 11 функций, конечно, с первого раза не заработало, зато я методично проверил каждую функцию, заодно выяснил, что у меня глючил цикл for (это было, когда я только начинал свой проект, сейчас он уже не глючит).

                  Да, хотел написать ответ, получилась лекция по Форту. Пожалуй, оно и к лучшему.

                  Одним словом, вывод такой: всем читать Броуди. 8-)
                  Сообщение отредактировано: wormball -
                    Цитата Relan @
                    Но есть конечно и проблемы.

                    С этого места поподробнее :rolleyes:

                    Цитата Relan @
                    также сложно, как бросить курить (императивный стиль -- это вредная привычка).

                    бросить
                    Цитата Monty @
                    курить асм до полного просветления

                    ? :lol:

                    Цитата Flex Ferrum @
                    если рассматривать механизм шаблонов в С++ как самостоятельный язык, то он отнюдь не императивный, а скорее функциональный.

                    А что можно про шаблоны прочитать?

                    Слава тебе господи, всем ответил 8-)

                    Добавлено
                    Цитата Relan @
                    5. Backus, J. Can Programming be Liberated from the von Neumann Style: A Functional Style and Its Algebra of Programs. Article, 1978. (тоже классика)

                    Аффтар бессмертного фортрана? Неужели на русский не переведена? Было бы интересно почитать.
                      Ладно, я, пожалуй, влезу не в свое дело (да и от темы, пожалуй, отойду), не знаю я никаких языков, кроме "императивных" (т.е. активно использую тока C/C++ и изредка Pascal/Delphi - остальное - по мелочи). Так вот. Мне тут просто интересно стало:

                      1. Можно ли на тех самых вышеупомянутых языках (типа форт, Lisp и т.д. - кстати, надо бы про них почитать для общего развития, ссылки не подкините ли)
                      сделать... хмм.. ну, типа интерпретатор этого же языка? Думаю, что на императивных при должной сноровке это не составит труда (или компилятор - в констексте вопроса это не важно)
                      2. Можно ли на этих самых языках сделать вывод собственного текста программы? (интроспектива это вроде называется). Но без всяких приколов, таких как в hq9+
                      Помнится, засев за это дело, на Delphi я это сделал за минут 15 (когда еще писал на pascal/delphi). На C/C++ до сих пор не осилил :unsure:

                      А что касается идеального языка программирования. Мое мнение, что такого явления не может быть да и быть не должно. Всегда должно быть развитие языка (как и любой другой идеи в этом мире (ИМХО)), должна существовать здоровая оппозиция (всему, практически абсолютно всему). Иначе будет, ну, скажем... работать/развлекаться/жить с компьютерами уж очень скучно.

                      Представьте себе, что появился... ну, язык программирования, близкий к ИИ. И тогда любой сможет написать все, что угодно. Какой-нибудь забитый жизнью садист сможет написать вирус, способный убить винчестер (ну, головки в резонанс войдут (вспоминая компьютерные страшилки), подастся на него вольт 50, и т.д. :) :) :) ). Это будет не счастье для всех, а смерть IT. Таково мое мнение...
                      Сообщение отредактировано: Narsil -
                        Цитата wormball @
                        А из декларативных языков (таких, операторы которых совсем нельзя трактовать как команды) я знаю только Пролог, который, насколько мне известно, как язык программирования с треском провалился и представляет лишь академический интерес.
                        Тебя дезинформировали. ;) Пролог успешно применяется, например, в экспертных системах, в работах по искусственному интелекту и т. д.
                        Цитата wormball @
                        Неясно выражаешься. Насколько я понял, выражение sqrt . sqr эквивалентно sqrt(sqr()) или на Форте sqr sqrt ? То есть в ФП используется префиксная запись?
                        Можно и так сказать. Композиция -- в математическом смысле.
                        Цитата wormball @
                        С этого места поподробнее :rolleyes:
                        Недостатки функ. языков таковы:
                        1) Программы на них медленнее по определению. Хотя железо сейчас вполне позволяет не волноваться о таких мелочах. Кстати, существуют аппаратные реализации Лиспа.
                        2) Мало библиотек.
                        3) Сложно организовать взаимодействие программ на функ. языках с программами на императивных языках, каковыми являются системные вызовы ОС.
                        4) Остсутствие стандарта для большинства декларативных языков.
                        5) Проблемы переносимости. Например, написав программу на С можно быть уверенным, что его компилятор есть почти на любой машине. У функ. реализаций всё гораздо хуже.
                        6) Слабые инструментальные средства (отладчики, профилировщики и т.д.).

                        Цитата wormball @
                        Аффтар бессмертного фортрана?
                        Он самый. :) Малоизвестный факт: он же автор языка FP, которому он пророчил ведущие позиции в декларативном программировании. Но увы.

                        Залил пару неплохих брошюр по теории (читать там надо не всё :)):
                        http://rapidshare.de/files/12797064/matimaticheskoe_vvedenie_declarat_programmirovalnie_ru_.pdf.html
                        http://rapidshare.de/files/24669261/fpLectures.pdf.html

                        Добавлено
                        Цитата Narsil @
                        Можно ли на тех самых вышеупомянутых языках (типа форт, Lisp и т.д. - кстати, надо бы про них почитать для общего развития, ссылки не подкините ли)
                        сделать... хмм.. ну, типа интерпретатор этого же языка?
                        Можно. Нам препод когда-то говорил, что транслятор Лиспа на Лиспе займет ЕМНИП 16 строчек. Собственно говоря, функ. языки являются полноценными языками программирования, если ты об этом вспрашивал.
                        Цитата Narsil @
                        Можно ли на этих самых языках сделать вывод собственного текста программы? (интроспектива это вроде называется). Но без всяких приколов, таких как в hq9+
                        Лисп/Scheme: http://www.nyx.net/~gthompso/self_lisp.txt
                        Haskell: http://www.nyx.net/~gthompso/self_hask.txt
                        Prolog: http://www.nyx.net/~gthompso/self_prolog.txt
                        Forth: http://www.nyx.net/~gthompso/self_forth.txt

                        P.S. Особенно приколола одна quine на Лиспе:
                        ExpandedWrap disabled
                          T
                        И всё. :D
                          Цитата Narsil @
                          А что касается идеального языка программирования. Мое мнение, что такого явления не может быть да и быть не должно. Всегда должно быть развитие языка (как и любой другой идеи в этом мире (ИМХО)), должна существовать здоровая оппозиция (всему, практически абсолютно всему). Иначе будет, ну, скажем... работать/развлекаться/жить с компьютерами уж очень скучно.

                          Ничего идеального не бывает, поэтому стремление к идеалу в этом смысле безопасно. 8-)

                          Цитата Narsil @
                          1. Можно ли на тех самых вышеупомянутых языках (типа форт, Lisp и т.д. - кстати, надо бы про них почитать для общего развития, ссылки не подкините ли)
                          сделать... хмм.. ну, типа интерпретатор этого же языка? Думаю, что на императивных при должной сноровке это не составит труда (или компилятор - в констексте вопроса это не важно)

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

                          Цитата Narsil @
                          2. Можно ли на этих самых языках сделать вывод собственного текста программы? (интроспектива это вроде называется). Но без всяких приколов, таких как в hq9+

                          Ну, на моём форте я написал следующее:

                          ExpandedWrap disabled
                            >in @ 6 - 17 type

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

                          Добавлено
                          Цитата Relan @
                          P.S. Особенно приколола одна quine на Лиспе:
                          T

                          И всё.

                          А чаво этот оператор делает? :wacko:
                            Цитата wormball @
                            А чаво этот оператор делает? :wacko:
                            А ты как думаешь? :D Ничего. Просто выводится результат этого выражения, который равен T. Можно с таким же успехом написать F или nil. На своем FP я тоже могу просто сказать T, F или undef. Или даже <undef, T, F>. :)
                            Сообщение отредактировано: Relan -
                              Цитата wormball @
                              Писать интерпретатор на Форте не имеет смысла, ибо программа на Форте фактически является расширением самого языка, то есть она уже содержит интерпретатор Форта.


                              Ну, писать компилятор C на C тоже не имеет смысла, вопрос чисто теоретический. Не, наверняка это сделать можно, вопрос в том, на сколько это трудно. Мне почему-то кажется, что компилятор C на C будет на порядок проще - но это абсолютно субъективное мнение.

                              Цитата wormball @
                              Не знаю, прикол это или не прикол, но работает потому, что исходный текст программы хранится в буфере в памяти.

                              Да, по-моему, это прикол. Даже если исходник хранится в памяти, все-таки нехорошо его использовать. Это то же самое, что открывать файл с исходником и выводить на экран. Я имею ввиду, принципиально(!) одно и то же.
                                Цитата Narsil @
                                Ну, писать компилятор C на C тоже не имеет смысла, вопрос чисто теоретический. Не, наверняка это сделать можно, вопрос в том, на сколько это трудно. Мне почему-то кажется, что компилятор C на C будет на порядок проще - но это абсолютно субъективное мнение.

                                Интерпретатор лиспа, написанный на лиспе, занимает около 15 строчек.
                                Компилятор C, написанный на C, весит вполне прилично.
                                Не понял, почему нету смысла? Они как раз так и пишутся.

                                Добавлено
                                Цитата Narsil @
                                Я имею ввиду, принципиально(!) одно и то же.

                                А если программа на языке с рефлексией выведет себя именно таким способом? Все вполне честно.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (31) 1 2 [3] 4 5 ...  30 31


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0677 ]   [ 14 queries used ]   [ Generated: 20.05.24, 12:00 GMT ]