Существует ли математическая модель или Теория языков программирования? [закрытый]

СУБД основаны на Реляционная Алгебра а также модель Codd. У нас есть что-то подобное для языков программирования или ООП?

11 ответов


у нас есть [базовая модель] для языков программирования?

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

  • Церкви нетипизированное лямбда-исчисление - это модель вычислений, которая так же мощна, как машина Тьюринга (не больше и не меньше). Знаменитая "гипотеза Черча-Тьюринга" заключается в том, что эти два эквивалентные модели представляют собой наиболее общую модель вычислений, которую мы знаем, как реализовать. Лямбда-исчисление чрезвычайно просто; в целом язык

    e ::= x | e1 e2 | \x.e
    

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

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

    • Если вы хотите использовать все доступные правила, вы можете написать специализированные инструменты, такие как частичные оценщики и части компиляторов.

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

    • Если вы избегаете уменьшения любого подвыражения под лямбдой, и если вы также настаиваете на уменьшении каждого аргумента до нормальной формы до применения функции, то у вас есть модель готовностью функциональный язык, такой как F#, Lisp, Objective Caml, Scheme или Standard ML.

  • есть также несколько вкусов набрал лямбда-исчисления, из которых самые известные сгруппированы под названием Система F, которые были открыты независимо Жираром (в логике) и Рейнольдсом (в информатике). Система F является отличной моделью для таких языков, как CLU, Haskell и ML, которые являются полиморфными, но имеют проверку типа времени компиляции. Хиндли (по логике) и Милнер (по информатике) обнаружена ограниченная форма системы F (теперь называемая системой типа Хиндли-Милнера), которая позволяет выводить выражения системы F из некоторых выражений нетипизированный лямбда-исчисления. Дамас и Милнер разработали алгоритм этого вывода, который используется в стандартном ML и был обобщен на других языках.

  • лямбда-исчисление просто толкает символы вокруг. Новаторская работа даны Скотт в же семантика показал, что выражения в лямбда-исчислении фактически соответствуют математическим функциям-и он определил, какие из них. Работа Скотта особенно важна в понимании "рекурсивных определений", которые являются обычным явлением в информатике, но бессмысленны с математической точки зрения. Скотт и Кристофер Стрейчи показали, что рекурсивное определение эквивалентно наименее определенному решению рекурсивного уравнения, а также показали, как это решение можно построить. Любой язык, который допускает рекурсию, и особенно языки, которые допускают рекурсию произвольного типа (например, Haskell и Clean), чем-то обязаны модели Скотта.

  • существует целое семейство моделей, основанных на абстрактные машины. Здесь не столько индивидуальная модель, сколько техника. Язык можно определить с помощью машины состояний и определить переходы на машине. Это определение охватывает все, начиная с Машины Тьюринга к машинам фон Неймана к системам перезаписи терминов, но в целом абстрактная машина спроектирована так, чтобы быть "как можно ближе к языку".- Проектирование таких машин и доказывание теорем о них подпадает под рубрику операционная семантика.

Как насчет объектно-ориентированного программирования?

Я не так хорошо образован, как должен быть об абстрактных моделях, используемых для ООП. Модели, с которыми я больше всего знаком, очень тесно связаны со стратегиями реализации. Если бы я хотел исследовать эту область дальше, я бы начал с денотационной семантики Уильяма Кука для Smalltalk. (Smalltalk как язык очень прост, почти так же прост, как лямбда-исчисление, поэтому он является хорошим примером для моделирования более сложных объектно-ориентированных языков.)

Вэй Ху напоминает мне, что Мартин Абади и лука Карделли собрали амбициозную работу над фундаментальные исчисления (аналогичные лямбда-исчислению) для объектно-ориентированных языков. Я недостаточно хорошо понимаю работу, чтобы суммировать ее, но вот отрывок из пролога их книги,который, я считаю, стоит процитировать:--3-->

процедурные языки, как правило, хорошо поняты; их конструкции к настоящему времени стандартны, а их формальные основы прочны. Фундаментальные особенности этих языков были перегнаны в формализмы, которые оказались полезными в выявление и объяснение вопросов реализации, статического анализа, семантики и верификации.

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

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

Я надеюсь, что эта цитата дает представление о вкусе работы.


Lisp основан на лямбда-исчислении и вдохновляет на многое из того, что мы видим сегодня в современных языках.

машины фон-Неймана являются основой современных компьютеров, которые сначала были запрограммированы на языке ассемблера, а затем в Formula TRANslator. Затем была применена формальная лингвистическая теория контекстно-свободных грамматик, лежащая в основе синтаксиса всех современных языков.

теория вычислимости (формальные автоматы) имеет иерархию машинных типов, которые параллельна иерархии формальных грамматик, например, regular-grammar = finite-state-machine, context-free-grammar = pushdown-automaton, context-sensitive-grammar = turing-machine.

существует также теория информации двух типов, Шеннона и Колмогорова, которая может быть применена к вычислениям.

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

и не забывайте предикат-логику в ее разные формы.

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


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


одно понятие может быть Машина Тьюринга.


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

пример:


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

Я давно надеялся увидеть более реальные приложения теории, когда Гуревич присоединился к Microsoft, но кажется, что очень немногие выходят. Вы можете проверить страницу ASML на сайте Microsoft.

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

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

Я думаю, что нам нужно что-то подобное для динамических компонентов программной системы.


есть много измерений для решения вашего вопроса, рассеяния в ответах.

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

затем вам нужно присвоить значения синтаксису. Формальная семантика пригодится; основными игроками являются операционная семантика, денотационная семантика и аксиоматическая семантика.

чтобы исключить плохие программы у вас тип система.

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

Если вы изучаете все это самостоятельно, я настоятельно рекомендуюhttp://www.uni-koblenz.de / ~laemmel / paradigms0910/, потому что лекции записываются на видео и помещаются в интернете.


на раздел История Википедии


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

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


нет математической модели для ООП.

реляционная алгебра в mathemaical модель для SQL. Он был создан в BT E. F. Codd. Дейт тоже был cientist известность, кто помог с этой теорией. Вся идея в том, что вы можете выполнять каждую операцию как операцию набора, влияя на множество значений одновременно. Это, конечно, означает, что Database engine нужно сказать, что выйти, и база данных может оптимизировать ваш запрос.

и Codd и дата критиковали SQL, потому что они были вовлечены в теорию, но они не были вовлечены в создание SQL.

смотрите это видео:http://player.oreilly.com/videos/9781491908853?toc_id=182164

есть много информации от Криса даты. Я помню, что дата критиковала язык программирования SQL как ужасный язык, но я не могу найти бумагу.

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

поскольку SQL-это своего рода логический язык, я думаю, вы могли бы написать реляционную алгебру в прологе. По крайней мере, у тебя был бы настоящий язык. Таким образом, вы можете писать запросы в Prolog. И поскольку в prolog у вас есть много программ для интерпретации естественного языка, вы можете запросить свою базу данных с помощью естественного языка.

По словам дяди Боба, базы данных не будут нужны, когда у всех есть SSD, потому что архитектура SSDs означает, что доступ так быстро, как ОЗУ. Таким образом, вы можете иметь все свои объекты в ОЗУ.

https://www.youtube.com/watch?feature=player_detailpage&v=t86v3N4OshQ#t=3287

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

Итак, да и нет, реляционная алгебра использовалась в качестве вдохновения для SQL, но SQL на самом деле не является реализацией реляционной алгебры.

In в случае с шепелявостью все по-другому. Основная идея заключалась в том, что при реализации функции eval в Lisp вы можете реализовать весь язык. Вот почему первая реализация Lisp - это только половина страницы кода.

http://www.michaelnielsen.org/ddi/lisp-as-the-maxwells-equations-of-software/

немного посмеяться:https://www.youtube.com/watch?v=hzf3hTUKk8U

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

Теперь вернемся к ООП, нет формализации ООП.

интересно, что второй когда-либо созданный язык OO, Smalltalk, имеет только объекты, у него нет примитивов или чего-то подобного. И создатель, Алан Кей, явно создал блоки для работы точно так же, как Lisp функции.

некоторые люди утверждают, что ООП может быть формализован с помощью теории категорий, которая является своего рода теорией множеств, но с морфизмами. Морфизм-это структура, сохраняющая карту между объектами. Таким образом, в общем случае вы можете иметь map( f, collection ) и получить коллекцию со всеми применяемыми элементами f.

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

https://www.youtube.com/watch?feature=player_detailpage&v=o6L6XeNdd_k#t=250

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

An экспериментальный теоретический язык, созданный явно, чтобы попытаться формализовать ООП, является Z. Z выведен из формализма требований.

Javahttp://lucacardelli.name/Papers/PrimObjImp.pdf Javahttp://lucacardelli.name/Papers/PrimObj1stOrder.A4.pdf Javahttp://lucacardelli.name/Papers/PrimObjSemLICS.A4.pdf

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


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