LINUX.ORG.RU

Подстановочная модель вычислений


0

1

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

Я понял наконец, с полной ясностью, хотя, вроде и так понимал, что когда мы пишем что-то вроде function(x){xxx}, запись эта, сама по себе, это никакая не «функция» и не «подпрограмма», и даже не программа. Это, всего-лишь, правило для вычислителя, правило для подстановки. Это значит, что когда в наш черный ящик придет некий символ нужно заменить его по тому правилу, которое написано. Сама функция, в смысле, действие, от нас скрыто. Мы просто знаем, что вычислитель «сделает это», как он этобудет делать, нас не волнует. А вопрос о том, «придут» ли эти символы внутри текста программы (т.е. мы сразу их подставим), или потом, в интерактивном режиме, является второстепенным.

Это навело меня на мысль. Всплывает вопрос, а зачем мы пишем аргументные места явным образом? Ведь если для вычислителя нужно просто задать правило подстановок, то можно «договориться» с ним, что я буду писать просто (xxx), например, ((xxx)a) вычислиться в (aaa). Единственная роль аргументных мест тут, это указать порядок подстановок, например, function(x y){y x}, но мы этот порядок можем разруливать просто правильным порядком подачи аргументов. На этом роль «функциональной записи» заканчивается, у нас функция превращается просто в «правило», или «формулу», если угодно.

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

Ответ на: комментарий от PolarFox

Да я писал, и занимал, что это дает? Я знаю, что статические ЯП сосут, но настоящей динамики сейчас почти нигде нет, поэтому приходиться своим умом искать правильный путь. Игрушка — это интерфейс твоего ЯП. А мне хочеться не игрушек, а настоящего понимания. И как можно быстрей.

anonimous
() автор топика

Пока и это не удалили, отвечу про типы данных, которые увидел в rss. Вычисления не имеют значения. Значение имеет именно структура данных. Да, ну и ты в курсе...

sin_a ★★★★★
()
Ответ на: комментарий от PolarFox

Не так-то просто написать что-то рабочее когда считаешь, что «статические ЯП сосут,» потому приходится высирать опусы в девелопменте взамен.

anonymous
()

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

devsdc ★★
()
Ответ на: комментарий от anonymous

Не так-то просто написать что-то рабочее когда считаешь, что «статические ЯП сосут,» потому приходится высирать опусы в девелопменте взамен.

Строго наоборот. Но я не хочу разводить тут холливар банальный. Когда языки были большими, это легко можно было отследить этот вопрос по LISP vs ALGOL. Там сразу было видно, что сильней.

anonimous
() автор топика
Ответ на: комментарий от anonimous

Короче, хочешь эффективности — не наращивай мощность цифромельницы. У тебя и так мощности гораздо избыточны. А самый простой живой организм (с относительно развитой нервной системой) отлично справляется со всеми необходимыми задачами, нифига не умея считать больше чем до одного. Всё дело в волшебных пузыриках^W^W структуре данных.

sin_a ★★★★★
()
Ответ на: комментарий от sin_a

Значение имеет именно структура данных

Вот смотри, что означает структура данных на примитивной модели. Пусть есть 2 реле, которые получают сигнал непонятно откуда, и каждое из них замыкает свою вторичную цепь при подаче сигнала (на катушку). Если оба включены, они включают лампочку. Давай разберемся, где тут данные, а где вычислитель. Это можно выразить выражением R1&&R2--> lamp, это правило, по которому выполняется эта схема. Казалось бы, данные тут — это R1, R2 и Lamp. Но если пристально вглядеться, то, мы выясним, что 1) оба реле являются функциями (в смысле «деятелями»), ибо передают управление из первичных цепей во вторичную. То есть, тот факт, что они являются «данными» для нашего правила, они сами являются «функциями», выраженными правилом if первичная_цепь=сигнал then вторичная_цепь=сигнал. Все зависит от точки зрения.

anonimous
() автор топика
Ответ на: комментарий от sin_a

Даже, для тебя проще будет вот так объяснить. Есть такой список данных в программировании как список. Возьмем чистый шелл. Там фактически, «все есть строка». Вопрос на засыпку: чем отличается строка от списка? Ничем. Мы можем определить операцию над списком, которая будет возвращать его первый элемент? Да. Над строкой — то же самое. Все элементы, кроме первого (хвост)? Конечно. Короче, в том и другом случае, разница только в названии. В ЯП, если мы хотим отдельный тип «список» и отдельную «строку», мы «запрещаем» обращение к последовательности напрямую, и разрешаем это делать только через искуственную прослойку. Мы этого можем и не делать, а просто какие-то операции применять, условно к списку, а какие-то к «строке», но если нас беспокоит возможная ошибка, мы можем обернуть нашу последовательность в функцию, которая будет падать при ошибке. Мы можем это сделать и явно, на уровне бестипового языка, у нас будет «доморощенный тип». Но суть в том, что это ограничение искуственно, объективно же мы имеем просто последовательность символов и в том и в другом случае, вот в чем суть. Это примерно также, как в том удаленном треде пример с веслом, которое не перестает быть деревом. Можно запретить с веслом все операции (как там сжигание — ибо дерево) кроме гребли. Но когда этот запрет навязывается на уровне интерфейса ЯП, у программиста создается ложное ощущение, что весло перестало быть деревом, потому что он с измальства знает, что веслом можно только грести, иначе программа падает. Это называется «барьер абстракции».

anonimous
() автор топика
Ответ на: комментарий от anonimous

список/тип в начале 2-го предложения

//fixed

anonimous
() автор топика

anonimous, шёл бы ты учить дискретную математику. Твоя проблема в непонимании азов. И да, хотя б основы работы ПК надо знать и понимать, что такое абстракция.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Программирование не имеет отношения ни к математике ни к ПК. Это все зомбо-взгляд, очистись от этой грязи, и ты начнешь понимать азы непосредственно программирования.

anonimous
() автор топика
Ответ на: комментарий от peregrine

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

Проблема только одна - в неосознании принудительной эвтаназии.

aedeph_ ★★
()
Ответ на: комментарий от sin_a

А самый простой живой организм (с относительно развитой нервной системой) отлично справляется со всеми необходимыми задачами, нифига не умея считать больше чем до одного. Всё дело в волшебных пузыриках^W^W структуре данных.

Да, и именно поэтому я сказал, что

Как «на самом деле» происходит подстановка, мы не знаем, и никогда не узнаем. Мы можем реализовать даже это, написав исполнитель, но мы не «видим» это, мы никогда не «видим» настоящие функции.

Как работает организм, и, даже, как работает реле, движимое электрическим током, мы, по-настоящему, никогда не узнаем. Когда мы хотим выяснить, что такое глаз, и как он может видеть, мы выясняем, в конечном итоге, что нет никакого глаза и никакого «зрения», есть лишь преломления отражений света в сетчатке, передача сигнала в мозг, бла-бла-бла. Однако глаз по-прежнгему существует, и по прежнему видит, ему плевать, что досужий примитивный человеческий ум его «разоблачил», произведя декомпозицию физ процессов. Мнение ума о глазе во всех случаях ничтожно, сам ум ничтожен, он лишь продукт, такой же как и глаз. Глазу плевать на ум, он просто есть и просто видит. Он самосущь. А мнение о нем человека, червя, и кого бы то ни было, всегда субъективно, и, к истиной реальности не имеет отношения.

anonimous
() автор топика
Ответ на: комментарий от aedeph_

Это ты, со своей математикой ловишь неиллюзорный батхерт. Если у тебя и были когда-то амбиции, по поводу того, что математика — это годный инструмент, который продвинет тебя по-жизни, поможет решать real-задачи, они естественно испарились, все что ты знаешь — это куча синтаксиса, который не знаешь куда засунуть. Покажи мне этих королей бомжатников, типа Перельмана, которые опрокинули Ротшильдов. Все на что-ты способен — это выписывание формул, зубрежка штампов и опускать сантехников, хотя последние, в отличии от тебя, могут хоть что-то реальное.

anonimous
() автор топика
Ответ на: комментарий от aedeph_

принудительной эвтаназии.

Кста, даже языком ты не владеешь, ты не понимаешь его. Принудительная эвтаназия — оксюморон.

anonimous
() автор топика
Ответ на: комментарий от anonimous

Это я не с тобой в лице фила говорил о том, является мозг производителем разума или только интерфейсом к чему то внешнему? А то у меня склероз, а то обсуждение скорее всего уже удалили.

Когда мы хотим выяснить, что такое глаз, и как он может видеть, мы выясняем, в конечном итоге, что нет никакого глаза и никакого «зрения»,

Мужик! Ну ты в курсе... Куда идти и что читать.

sin_a ★★★★★
()

Придумал term rewriting шоле?

anonymous
()
Ответ на: комментарий от sin_a

А, кажись, доперло, о чем ты говоришь. Текст программы — это данные для вычислителя. Тут тонкий вопрос. Одна и та же программа может быть выполнена разными вычислителями, причем, по разному. Это, кстати, тоже хорошая иллюстрация, почему типов данных нет. Например, есть файл со строкой foo и и есть два транслятора, для которых это данные. Один интерпретирует foo как bar, а другой — как «неправильный тип». А правильный тип для него, например «foo» (в кавычках). Тип данных зависит исключительно от вычислителя.

anonimous
() автор топика
Ответ на: комментарий от sin_a

Это я не с тобой в лице фила говорил о том, является мозг производителем разума или только интерфейсом к чему то внешнему?

Филл — это был всегда я, а вот anonimous — не факт:) Со мной, только я не помню точно, это про сердце было наверное? Да, я, пожалуй, склоняюсь к мысли, что и то и другое (и все остальное, материя в том числе), — есть интерфейс к сознанию. Только вот источник всего детерминировать никогда не удастся. А интерфейс — это всегда иллюзия, матрица. На самом деле, сердце героя для меня — самосуще, и оно действительно зорко, а вот умствования — нет. Всегда можно доказать что X истино, но можно и обратное. Логика — это проклятие человека, болезнь его ума.

anonimous
() автор топика
Ответ на: комментарий от sin_a

Более того, кста, само сознание — тоже элемент интерфейса, пожалуй, ибо мы имеем лишь представление о сознании. Само сознание мы увидеть не можем. Это великая тайна тайн. На востоке это называли «Великой Пустотой»

anonimous
() автор топика
Ответ на: комментарий от peregrine

Да не, это банально вдвойне. Слишком мало штампов, давай исчо.

anonimous
() автор топика
Ответ на: комментарий от aedeph_

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

anonimous
() автор топика
Ответ на: комментарий от aedeph_

Сразу 2 грубейшие ошибки в одном коротеньком сообщении кагба намекае на уровень, не правда-ли, товарищ не-сантехник?

anonimous
() автор топика
Ответ на: комментарий от aedeph_

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

anonimous
() автор топика

Не читал, прости.

umren ★★★★★
()

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

Жаль я не мог написать в тему со статической типизацией. Начнем. Жила-была тема про смаллталк, которая в итоге родила вот такую концепцию (и инвайт на хабре): https://www.dropbox.com/s/rft1a8y0t67ctpv/Немного об ООП, ФП и логическом про...

С подачи этой темой я изучил все таки первозданное ООП и вообще ООП в принципе, до этого я посмотрел языки типа лиспа, форта, пролога, эрланга и хаскеля. И вот мой незамутненный объектным программированием разум увидел что смаллталк это ху*вый пролог или не ху*вый, но просто вывернутый на изнанку.

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

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

А теперь про динамическую типизацию, что она из себя представляет в общем виде? Очень большие возможности. Гибкость. Свободу. Но свободу только для одиночки. Почему? Там где большая гибкость и свобода начинают плодится велосипеды с «интересными» колесами и прочими деталями. В контексте написания своих программ это просто превосходно, можно делать что-то максимально быстро и где нужно срезать углы.

А теперь если взглянуть с другого ракурса? Такие языки как организмы все-в-одном типа одноклеточных. Могут менять даже свои гены если очень припрет. Могут обмениваться генами даже с другими видами. Могут иметь в себе овердох*я этих генов. Но в чем их недостаток? За свою уникальность они платят одиночеством. Ибо жизнь уровнем выше образуется только если все клетки следуют единому стандарту, жертвую даже самими собой. Вот тогда мы получаем организм уровнем выше. Ведь у нас, людей, генов очень немного, по сравнению с рекордсменами. И довольно жесткие стандарты, если клетка отличается на два гена или две соседние имеют отличия по гену от эталона начинается рак и эти клетки тут же уничтожаются (или нет).

Более высокий уровень организации получается не за счет свободы, а за счет жестких рамок и ограничений на предыдущем уровне. Можно плодить велосипеды на языках с большим уровнем свободы, динамической типизацией и прочими подобными вещами, но без жесткого контроля на определенном этапе эти проекты просто начнут умирать под собственной тяжестью. И когда это начнет происходить все эти «искусственные ограничения» в виде чистых функций и статической типизации покажутся более чем уместными. Я даже уже сейчас вижу что начинают использовать не то что хаскелл, а даже агду (вакансия в лабораторию касперского и разработчики бд riak). Это все еще выше уровнем и накладывает еще больше ограничений.

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

anonymous
()
Ответ на: комментарий от anonimous

А почему не посмотреть на сознание как на форму жизни зарождающуюся когда появляются подходящие (разумные существа) условия?

anonymous
()

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

У людей такая мысль давно уже крутится на кончике сознания. Почитай, что ли, про лямбда-исчисление, про символьный ИИ, про семантику Монтегю, про исчисления последовательностей (Генцена и проч.), напиши Кризис на Прологе...

proud_anon ★★★★★
()

На этом роль «функциональной записи» заканчивается, у нас функция превращается просто в «правило», или «формулу», если угодно.

А макросы по твоему что такое?

TDrive ★★★★★
()

На Reduceron посмотри.

anonymous
()
Ответ на: комментарий от anonimous

Некомильфо. Я писатель, а не читатель. Прочесть — не значит понять.

дурачек

TDrive ★★★★★
()
Ответ на: комментарий от anonymous

Сознание — это не форма жизни. Если уж рассуждать с этих позиций, это ее манифестация.

anonimous
() автор топика
Ответ на: комментарий от TDrive

А макросы по твоему что такое?

Это инструкции для препроцессора, чем им еще быть? Текст программы сначала проходит через 1-й транслятор — препроцессор, потом через второй. По сути, те же самые правила перезаписи для вычислителя.

anonimous
() автор топика
Ответ на: комментарий от anonymous

Да, я, практически, полностью согласен. Но хочу вставить ремарку по поводу организации организма.

А теперь если взглянуть с другого ракурса? Такие языки как организмы все-в-одном типа одноклеточных. Могут менять даже свои гены если очень припрет. Могут обмениваться генами даже с другими видами. Могут иметь в себе овердох*я этих генов. Но в чем их недостаток? За свою уникальность они платят одиночеством. Ибо жизнь уровнем выше образуется только если все клетки следуют единому стандарту, жертвую даже самими собой. Вот тогда мы получаем организм уровнем выше. Ведь у нас, людей, генов очень немного, по сравнению с рекордсменами. И довольно жесткие стандарты, если клетка отличается на два гена или две соседние имеют отличия по гену от эталона начинается рак и эти клетки тут же уничтожаются (или нет).

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

BTW Это утверждение можно всерьез не воспринимать, я, собственно, дилетант, просто все на все похоже:)

отличия по гену от эталона начинается рак и эти клетки тут же уничтожаются (или нет).

Кстати, это вот очень интересный вопрос. На самом деле, это отличие не всегда деструктивно. На уровне генов заложена возможност мутаций. Мутации — это, возможно, ключ к выживанию вида, когда внешние условия меняются не в лучшую для него сторону. Тут палка о двух концах.

anonimous
() автор топика
Ответ на: комментарий от TDrive

Рекурсия-хуюрсия. S (K(S(I)(I))) (S(S(K(S))(K)) (K(S(I)(I))))

anonymous
()
Ответ на: комментарий от TDrive

А еще есть такие вещи как рекурсия...

Это я не понял, какое отношение имеет к сабжу.

anonimous
() автор топика
Ответ на: комментарий от TDrive

А еще есть такие вещи как рекурсия...

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

anonimous
() автор топика

Ложки не существует. Пользуйся вилкой.

Tark ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.