Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

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

alt text

Ответ 5

Это зависит от того, о чем вы просите, но ответ, вероятно, нет.

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

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

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

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

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

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

  • Логическое программирование, например Prolog.
  • Evolutionary Computation выводит программу на стандартный язык программирования. Но предположительно можно написать описательный язык, который можно "выполнить", чтобы найти полученную программу и выполнить ее. Это также может использоваться для многих методов машинного обучения.

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

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

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

Ответ 6

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

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

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

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

Были две волны прорыва:

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

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

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

Кроме того, целевые среды программирования меняли много:

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

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

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

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

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

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

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

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

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

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

Существует 3 языковых элемента.

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

    cmp: Сравнить

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

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

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

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

  • Свойства

    cmp.base = 8

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

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

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

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

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

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

Ответ 10

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

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

Ответ 11

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