Практически каждый язык, который я знаю, представляет собой вариацию темы: вы создаете переменные и функции, а затем управляете ими с помощью условных выражений и других конструкций. Я понимаю, что функциональное программирование и тому подобное несколько отличаются от «традиционных» языков, но по сути они почти одинаковы. Вы все еще работаете с переменными (в некоторой степени, даже если они неизменяемы и тому подобное) и создаете функции.
Есть ли какой-нибудь язык или система, которые полностью исключают то, что мы склонны использовать сейчас, и имеют совершенно другой подход?
Существуют ли какие-либо парадигмы программирования, не основанные на управлении переменными и функциями?
Ответы (11)
Не язык сам по себе, но аналоговые компьютеры в некотором смысле сильно отличаются от более популярных цифровых компьютеров. .
Несмотря на ваше самовольное отклонение от функционального программирования, я думаю, вам нужно взглянуть на это еще раз, только это время читать для понимания и изучения вместо того, чтобы использовать предвзятость подтверждения, чтобы отклонить это как «нечто похожее». Написание кода в функциональном стиле сильно отличается от написания кода в императивном стиле. Однако, если для вас это недостаточно, почему бы не взглянуть на любой из них ?:
- Логическое программирование, типичное для таких языков, как Prolog и (IIRC) Mercury < / а>.
- Конкатенативные языки, такие как Forth довольно странно.
- Программирование на уровне функций (в отличие от функционального!) Избавьтесь от переменных, если это оскорбляет вы о вычислении. J - в значительной степени ваш единственный выбор в этой сфере в наши дни.
- Программирование массивов довольно близко связано с вышеизложенным. Взгляните на APL, чтобы увидеть классический пример этого (хотя J и K имеют встроенные элементы).
По сути, просто посмотрите на любую из десятков доступных парадигм программирования и прочтите описания для понимания и просветления. вместо увольнения из-за предвзятости подтверждения. Выучите один язык для каждого, который кажется достаточно разным для расплывчатого определения «разных», которые вы используете, и получайте удовольствие.
Было несколько попыток создания графических языков. Система LabVIEW от National Instruments, вероятно, является наиболее успешной. Он использует график потока данных с компонентами, которые действуют на данные.
Еще одна попытка графического языка - это UML. Я предполагаю, что по этому поводу нет жюри. Вероятно, это было хорошей идеей, прежде чем в нее вмешался комитет по стандартам и превратил ее во что-то для всех.
Огромное количество электромеханических систем контролируется PLC, которые программируются с помощью релейная логика. По сути, это дисциплина для создания высоконадежных конечных автоматов, но она очень мало похожа на процедурные языки.
Кроме того, существуют эзотерические, непонятные и альтернативные языки, которые в основном не служат никакой практической цели, кроме как напоминать людям, что для полноты по Тьюрингу не требуется, чтобы язык был разумным. Некоторые могут поместить в эту категорию саму машину Тьюринга, но BrainF * ck и Piet действительно выделяется для меня в этой толпе.
Эзотерический язык всякий раз, когда также представляет собой интересное упражнение, поскольку в нем вообще нет контроля над потоком.
Изменить: я почти забыл о Befunge. Его исходный текст представляет собой сетку символов ASCII, где каждая ячейка представляет собой код операции. Выполнение выполняется в любом из четырех направлений, поэтому можно выполнить один код операции в четырех различных последовательностях. Это еще один эзотерический язык, и он был спроектирован таким образом, чтобы было как можно сложнее (в 1993 году) написать компилятор. Не то чтобы это действительно помешало кому-то это сделать.
Некоторые из указанных мною языков были эзотерическими языками. Как правило, это языки с небольшими (часто всего одним или двумя) сообществами пользователей. Они создаются по разным причинам, и более серьезными причинами являются исследование границ того, что значит быть полным по Тьюрингу и того, как можно представить программу.
Дедушкой всех эзотерических языков является INTERCAL, созданный в 1972 году. Это язык, внешне напоминающий КОБОЛ, но который среди множества причуд требует, чтобы программа была достаточно вежливой (но не слишком вежливой) для продолжения выполнения. В подтверждение вежливости PLEASE DO
- это вежливая форма DO
. Заметным расширением является оператор COME FROM
, который может вызывать передачу управления сюда из указанного места.
COME FROM
называется аспектно-ориентированным программированием. ;)
- person JUST MY correct OPINION; 07.09.2010
Что ж, есть Piet. Это совсем другое. (Ниже приведен Hello World в Piet.) Хотя даже тогда вы можете возразить, что имеете дело со структурой данных (в данном случае стеком), содержащей некоторое количество целых чисел, а затем добавляете и удаляете вещи из стека, манипулирование значениями и т. д., так что на самом деле это все то же самое.
Это зависит от того, о чем вы спрашиваете, но ответ, вероятно, отрицательный.
Причина в том, что все современные компьютерные языки, являющиеся полными по Тьюрингу, в общем, полны по Тьюрингу. Это означает, что любой из этих языков может быть смоделирован любым другим в этой группе. Тогда любой язык программирования может иметь компилятор или интерпретатор, который может работать на наших текущих компьютерах (приближение). В их архитектуре есть концепция кода и данных.
Итак, если вы думаете, что функциональное программирование и императивное («традиционное») программирование - это одно и то же, потому что они выполняются на компьютере, то других вариантов нет.
Код и данные преобразуются в функции и структуры данных (переменные). Они допускают вариации:
- Неизменяемость - главный фактор функционального программирования.
- Разница между кодом и данными может быть размыта. Например, гомоаконичность означает, что функция может использоваться как структура данных. См. Языки Lisp.
- С этим связан самомодифицирующийся код.
С другой стороны, как выразить программу также можно написать немного по-другому. Использование композиции функций в качестве основы может привести вас к конкатенативному программированию, хотя программирование потоков данных (включая многие графические языки) и функциональное программирование также поддерживают его.
Последняя группа способов выражения языка - это те, которые моделируются как процесс оптимизации или поиска по структуре данных:
- Логическое программирование, например Prolog.
- Evolutionary Computing выводит программу на стандартном языке программирования. Но, по-видимому, можно написать описательный язык, который можно «запустить», чтобы найти получившуюся программу и выполнить ее. Это также можно использовать для многих методов машинного обучения.
Все это в некоторой степени академично. Мой совет: постарайтесь определить, что вы имеете в виду под разным. Скорее всего, функциональное программирование достаточно отличается для ваших целей.
Изменить: я только что заметил, что вы употребляете выражение «манипулировать ими с помощью условных выражений и других конструкций». Конструкции потока управления не обязательно должны отличаться от кода и данных. Например, условное if
может быть выражено как filter
или цикл может быть выражен как map
. Учитывая функции высшего порядка и ленивую оценку, вы можете обойтись без явных if
или for
, используя только функции и структуры данных. Это не значит, что вы на самом деле потеряли способность это делать. Возможно, вас заинтересует Haskell, если вы хотите увидеть что-то подобное.
Также ознакомьтесь с другими ответами для языков, которые выглядят по-разному, таких как графические языки и языки esortic, при этом по-прежнему используются функции, применяемые к структурам данных с подходом структур управления.
Хороший вопрос. Сделаем шаг назад. В своем первом ответе я попытаюсь пояснить, что вы ищете не новый язык, а новую архитектуру, и я уверен, что вы знаете по крайней мере важные из них.
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 на стороне клиента? Абсолютно. Это общая платформа? Да, все браузеры это поддерживают.
Я думаю, что существует достаточно языков программирования низкого уровня, я имею в виду процедурные, ООП или другие полные по Тьюрингу языки. Цель новых языков (не связанных с программированием) - быть более эффективными: более быстрое создание кода, более гибкие приложения, поддержка работы сообщества, масштабируемость, более простое обслуживание, возможность повторного использования и т. Д.
(Я разделяю свой ответ здесь; в следующей части я покажу вам один, с которым я играю некоторое время.)
Прочтите http://en.wikipedia.org/wiki/Programming_paradigm и все связанные страницы в поле ссылки справа. В зависимости от того, как вы на это смотрите, некоторые из них совершенно разные или все в основном одинаковы.
Ознакомьтесь с Forth, это совсем другая система, в которой почти все манипулирование стеком. Это почти как маленькая очень примитивная виртуальная машина.
Как я уже сказал, сегодня существует множество платформ или сред, которые можно программировать. В случае какой-либо платформы вы можете выбрать из длинного списка языков, например 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).
Главное не в языке, а в том, что вы с ним делаете. Многие языки подтолкнут вас в определенном направлении, чистые функциональные языки, такие как Haskell, сделают практически невозможным императивное программирование, например, но до тех пор, пока вы не потратите время на изучение парадигм, большинство языков будут выглядеть так же, как машина. язык, который действительно выполняется, оценивает условные выражения и присваивает значения пространствам памяти.
Парадигмы дают вам абстракции, которые вы ищете. Хороший объектно-ориентированный или функциональный код не будет иметь ничего общего с тем, что вы описываете. И для этого не нужны языки. Я видел отличный объектно-ориентированный код, написанный на простом C, и функциональный код на C ++. Хотя использование правильного языка для правильной работы очень помогает. К сожалению, все работает и наоборот. Если у вас нет времени на понимание парадигм, вы все равно будете писать императивный код на Scheme или Smalltalk.
Изучите машину Тьюринга. В статье Википедии перечислены некоторые симуляторы, на которых можно запускать программы. По крайней мере, эстетически он будет отличаться.