Существуют ли какие-либо парадигмы программирования, не основанные на управлении переменными и функциями?

Практически каждый язык, который я знаю, представляет собой вариацию темы: вы создаете переменные и функции, а затем управляете ими с помощью условных выражений и других конструкций. Я понимаю, что функциональное программирование и тому подобное несколько отличаются от «традиционных» языков, но по сути они почти одинаковы. Вы все еще работаете с переменными (в некоторой степени, даже если они неизменяемы и тому подобное) и создаете функции.

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


person bennybdbc    schedule 07.09.2010    source источник
comment
Вы хотите что-то, что не имеет функций и не может хранить результаты?   -  person foraidt    schedule 07.09.2010
comment
Вам следует взглянуть на en.wikipedia.org/wiki/Programming_paradigm   -  person Abhinav Sarkar    schedule 07.09.2010
comment
@mxp - Нет, я спрашиваю, есть ли альтернатива нашей нынешней системе. Очевидно, должен быть способ хранить значения, я просто спрашиваю, есть ли другой подход к этому.   -  person bennybdbc    schedule 07.09.2010
comment
Если вы думаете, что функциональные языки почти идентичны процедурным / объектно-ориентированным языкам (что бы это ни значило!), То я утверждаю, что вы на самом деле мало что знаете о функциональном программировании. (Или вы делаете довольно поверхностное наблюдение, что все это работает на одном и том же процессоре под крышками?)   -  person JUST MY correct OPINION    schedule 07.09.2010
comment
@JMcO - я имею в виду эстетически. Конструкции языка во многих случаях схожи. Сказав это, я лишь немного занимался функциональным программированием. Я могу быть далеко.   -  person bennybdbc    schedule 07.09.2010
comment
Выражения не сильно изменились со времен FORTRAN, но организационные принципы точно изменились. Функциональные языки, доведенные до своего логического предела, сильно отличаются по ощущениям от чисто процедурного подхода.   -  person RBerteig    schedule 07.09.2010
comment
@bennybdbc: если вам нужен способ хранения значений, я действительно не могу придумать способ, который не заставит их изменяться (переменные) и не сделать их неизменными (неизменяемые). В (чистом) функциональном программировании у вас нет переменных, у вас есть константы. Однако основное выполнение зависит от машины.   -  person Muhammad Alkarouri    schedule 07.09.2010
comment
Что ж, я думаю, все они будут работать как варианты друг друга, потому что компьютеры работают так.   -  person Oliver Friedrich    schedule 07.09.2010


Ответы (11)


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

person Martin Liversage    schedule 07.09.2010
comment
Этот ответ наиболее близок к варианту определения темы, предложенному на плакате. - person Muhammad Alkarouri; 07.09.2010

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

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

person JUST MY correct OPINION    schedule 07.09.2010
comment
+1 Хороший ответ. Для протокола, я не упоминал о функциональном программировании в своем вопросе, я просто хотел получить другие ответы. - person bennybdbc; 07.09.2010
comment
Я не думал, что вы это опускаете. Я думал, вы отклонили его по недействительным причинам. ;) - person JUST MY correct OPINION; 07.09.2010
comment
В чем разница между самовольным увольнением и унижением? Фактически, Тат вовсе не отвергал функциональное программирование, и ваш ответ грубый, поскольку он обвиняет его в том, что он не понимает или не извлекает уроки из того, что он прочитал. Параметры его вопроса полностью законны, а термины, которые он использует, верны. И функциональная парадигма, и объектно-ориентированная парадигма идентичны постольку, поскольку они содержат объявление переменных и функций, что и касается его вопроса. - person Shon; 01.01.2013

Было несколько попыток создания графических языков. Система LabVIEW от National Instruments, вероятно, является наиболее успешной. Он использует график потока данных с компонентами, которые действуют на данные.

Еще одна попытка графического языка - это UML. Я предполагаю, что по этому поводу нет жюри. Вероятно, это было хорошей идеей, прежде чем в нее вмешался комитет по стандартам и превратил ее во что-то для всех.

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

Кроме того, существуют эзотерические, непонятные и альтернативные языки, которые в основном не служат никакой практической цели, кроме как напоминать людям, что для полноты по Тьюрингу не требуется, чтобы язык был разумным. Некоторые могут поместить в эту категорию саму машину Тьюринга, но BrainF * ck и Piet действительно выделяется для меня в этой толпе.

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

Изменить: я почти забыл о Befunge. Его исходный текст представляет собой сетку символов ASCII, где каждая ячейка представляет собой код операции. Выполнение выполняется в любом из четырех направлений, поэтому можно выполнить один код операции в четырех различных последовательностях. Это еще один эзотерический язык, и он был спроектирован таким образом, чтобы было как можно сложнее (в 1993 году) написать компилятор. Не то чтобы это действительно помешало кому-то это сделать.

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

Дедушкой всех эзотерических языков является INTERCAL, созданный в 1972 году. Это язык, внешне напоминающий КОБОЛ, но который среди множества причуд требует, чтобы программа была достаточно вежливой (но не слишком вежливой) для продолжения выполнения. В подтверждение вежливости PLEASE DO - это вежливая форма DO. Заметным расширением является оператор COME FROM, который может вызывать передачу управления сюда из указанного места.

person RBerteig    schedule 07.09.2010
comment
@hydrogen, хотя это, конечно, не тот язык, на котором я бы писал код, это определенно красиво. - person RBerteig; 07.09.2010
comment
Отличный ответ, спасибо. Конечно, лестничная логика выглядит интересно. - person bennybdbc; 07.09.2010
comment
Спасибо тебе за этот пост. В течение нескольких месяцев я искал такой язык, как «Всегда», и наконец нашел что-то, по крайней мере, относительно близкое к тому, что мне нужно. - person P Shved; 07.09.2010
comment
Да, и современная версия COME FROM называется аспектно-ориентированным программированием. ;) - person JUST MY correct OPINION; 07.09.2010
comment
На самом деле я написал несколько сложных систем управления в релейной логике, и это определенно требует нового мышления. @RBerteig .. представьте, насколько красочной будет вся ОС, написанная на Piet: o) - person hydrogen; 07.09.2010
comment
Здесь я должен высказать противоположное мнение. Как инженер-электрик, который раньше программировал несколько ПЛК, меня поразило, насколько похожа релейная логика на процедурные языки. Просто типичные приложения ПЛК больше используют логические операторы, чем типичные программные приложения. - person Muhammad Alkarouri; 07.09.2010
comment
Самым привлекательным в Intercal является то, что это руководство - одна из самых забавных вещей, связанных с компьютером, которые я когда-либо читал. - person David Thornley; 11.09.2010

Что ж, есть Piet. Это совсем другое. (Ниже приведен Hello World в Piet.) Хотя даже тогда вы можете возразить, что имеете дело со структурой данных (в данном случае стеком), содержащей некоторое количество целых чисел, а затем добавляете и удаляете вещи из стека, манипулирование значениями и т. д., так что на самом деле это все то же самое.

alt text

person MatrixFrog    schedule 07.09.2010

Это зависит от того, о чем вы спрашиваете, но ответ, вероятно, отрицательный.

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

Итак, если вы думаете, что функциональное программирование и императивное («традиционное») программирование - это одно и то же, потому что они выполняются на компьютере, то других вариантов нет.

Код и данные преобразуются в функции и структуры данных (переменные). Они допускают вариации:

  1. Неизменяемость - главный фактор функционального программирования.
  2. Разница между кодом и данными может быть размыта. Например, гомоаконичность означает, что функция может использоваться как структура данных. См. Языки Lisp.
  3. С этим связан самомодифицирующийся код.

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

Последняя группа способов выражения языка - это те, которые моделируются как процесс оптимизации или поиска по структуре данных:

  1. Логическое программирование, например Prolog.
  2. Evolutionary Computing выводит программу на стандартном языке программирования. Но, по-видимому, можно написать описательный язык, который можно «запустить», чтобы найти получившуюся программу и выполнить ее. Это также можно использовать для многих методов машинного обучения.

Все это в некоторой степени академично. Мой совет: постарайтесь определить, что вы имеете в виду под разным. Скорее всего, функциональное программирование достаточно отличается для ваших целей.

Изменить: я только что заметил, что вы употребляете выражение «манипулировать ими с помощью условных выражений и других конструкций». Конструкции потока управления не обязательно должны отличаться от кода и данных. Например, условное if может быть выражено как filter или цикл может быть выражен как map. Учитывая функции высшего порядка и ленивую оценку, вы можете обойтись без явных if или for, используя только функции и структуры данных. Это не значит, что вы на самом деле потеряли способность это делать. Возможно, вас заинтересует Haskell, если вы хотите увидеть что-то подобное.

Также ознакомьтесь с другими ответами для языков, которые выглядят по-разному, таких как графические языки и языки esortic, при этом по-прежнему используются функции, применяемые к структурам данных с подходом структур управления.

person Muhammad Alkarouri    schedule 07.09.2010
comment
Замечание по поводу вашего второго абзаца: полнота по Тьюрингу характеризует последовательные вычисления. Но у нас нет такой универсальной модели параллелизма: параллельные языки (особенно те, которые моделируют распространение) действительно имеют разную выразительность. - person Gilles 'SO- stop being evil'; 08.09.2010
comment
@Giles: Можете ли вы привести пример параллельного языка, который более мощнее, чем полный Тьюринг? Или, если я вас неправильно понял, что вы имеете в виду под выразительностью? Существуют модели для параллельного программирования, такие как исчисление Пи. - person Muhammad Alkarouri; 08.09.2010

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

20 лет назад компьютерные программы создавались с использованием «последовательной» логики, как и базовая программа:

10 INPUT "PASSWORD: ";A$
20 IF A$="PASSWORD" THEN GOTO 40
30 PRINT "TRY AGAIN" : GOTO 10
40 PRINT "WELCOME"

Программы MS-DOS такие же: они запускаются для хитрости, затем ждут ввода пользователя, а затем снова запускаются. В системах Unix, даже если это многозадачная система, игра очень похожа, более одного пользователя могут запускать программы таким образом.

Было две сквозные волны:

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

Между тем, компиляция и построение программы изменены, но я думаю немного меньше:

  • метапрограммирование (генератор кода на базе IDE, препроцессор),
  • подключение техники,
  • динамические библиотеки.

Также сильно изменились целевые среды программирования:

  • виртуальные машины (Java),
  • платформы интерпретаторов (PHP),
  • системные службы,
  • каркасы
  • портальные системы (Drupal).

Платформой стали несколько больших и жирных программ:

  • Lotus Notes (собственный язык, теперь Java),
  • MS Excel (Visual Basic).

Я не упоминал ни о каком новом языке, но это может быть совсем другое программирование даже на одном языке, например, написание игры J2ME для мобильного телефона и написание хранимых процедур для Oracle SQL, как на JAVA.

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

  • Сценарий PHP выполняет запрос SQL, а система шаблонов вставляет полученные данные в подготовленный шаблон HTML.
  • Сценарий PHP помещает данные, полученные из SQL, в XML, а браузер преобразует их в окончательный HTML с помощью преобразования XSLT.
  • Приложение JavaScript запрашивает данные из сценария PHP, который отправляет результат SQL обратно в формате JSON, а затем приложение JS визуализирует окончательный HTML-код.

HTML + XSLT - это язык программирования? Нет. Выполняют ли они ту же задачу, которую выполняет PHP на стороне сервера или JS на стороне клиента? Абсолютно. Это общая платформа? Да, все браузеры это поддерживают.

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

(Я разделяю свой ответ здесь; в следующей части я покажу вам один, с которым я играю некоторое время.)

person ern0    schedule 10.09.2010

Прочтите http://en.wikipedia.org/wiki/Programming_paradigm и все связанные страницы в поле ссылки справа. В зависимости от того, как вы на это смотрите, некоторые из них совершенно разные или все в основном одинаковы.

person ysth    schedule 07.09.2010

Ознакомьтесь с Forth, это совсем другая система, в которой почти все манипулирование стеком. Это почти как маленькая очень примитивная виртуальная машина.

person harald    schedule 07.09.2010

Как я уже сказал, сегодня существует множество платформ или сред, которые можно программировать. В случае какой-либо платформы вы можете выбрать из длинного списка языков, например Microsoft .NET, который можно программировать на VisualBasic, C # и т. Д .; в других случаях один и тот же язык используется на очень разных платформах, например JAVA, который используется в Android, хранимые процедуры сервера Oracle SQL и так далее.

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

Программирование потока данных - один из таких видов программирования. Давайте посмотрим в Википедии, что такое программирование потока данных (также называемое программированием на основе потока):

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

из: http://en.wikipedia.org/wiki/Flow-based_programming, см. также http://en.wikipedia.org/wiki/Dataflow_programming

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

Есть 3 языковых элемента.

  • Объявление компонента

    cmp: Сравнить

Это относится к экземпляру компонента с именем «cmp», который является типом сравнения.

  • Определение сообщения

    src.out >> cmp.value cmp.gt >> dst1.in cmp.lt >> dst2.in cmp.eq >> dst3.in

Слова перед точками - это имена экземпляров компонентов, слова после точки - имена портов, левая пара компонент-порт - источник, правая - место назначения. (Порты - это точки компонентов для отправки или получения сообщений. См. Статьи Wkikpedia.)

  • Характеристики

    cmp.base = 8

Это определяет значение порта экземпляра компонента.

(Собирая эти строки вместе, мы получаем короткую программу потока данных, что означает: значение поступает из src, cmp проверяет его значение и передает его в dst1, если оно больше 8, dst2, если оно меньше 8, и dst3, если это ровно 8.)

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

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

(У меня еще нет веб-страницы для моего проекта потока данных, он находится в разработке.)

Программы потока данных могут отображаться или редактироваться в виде графика (см. SynthEdit).

person ern0    schedule 11.09.2010
comment
+1 Спасибо за отличный ответ, спасибо, что приложили все усилия. Пожалуйста, добавьте ссылку на свой проект, когда веб-страница будет готова, это звучит очень интересно. - person bennybdbc; 12.09.2010
comment
Мы немного замедлились, но мы работаем над этим homeaut.com - person ern0; 19.08.2015

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

Парадигмы дают вам абстракции, которые вы ищете. Хороший объектно-ориентированный или функциональный код не будет иметь ничего общего с тем, что вы описываете. И для этого не нужны языки. Я видел отличный объектно-ориентированный код, написанный на простом C, и функциональный код на C ++. Хотя использование правильного языка для правильной работы очень помогает. К сожалению, все работает и наоборот. Если у вас нет времени на понимание парадигм, вы все равно будете писать императивный код на Scheme или Smalltalk.

person Mendelt    schedule 07.09.2010

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

person David Thornley    schedule 10.09.2010