Существует ли математическая модель или Теория языков программирования? [закрытый]
СУБД основаны на Реляционная Алгебра а также модель 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, наследуют свои основные понятия из церковных "лямбда-расчетов" (статья в Википедии здесь). С уважением
Если вы изучаете языки программирования (например, в университете), существует довольно много теории, а не немного математики.
пример:
- Конечные Автоматы
- Официальные Lanugages (и Контекстно-Свободной Грамматики как BNF используется для их описания)
- строительство таблицы анализатора LRish
ближайшая аналогия, которую я могу придумать, - это эволюционирующие алгебры Гуревича, которые в настоящее время более известны под названием "абстрактные государственные машины Гуревича" (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 выведен из формализма требований.
Java
http://lucacardelli.name/Papers/PrimObjImp.pdf
Java
http://lucacardelli.name/Papers/PrimObj1stOrder.A4.pdf
Java
http://lucacardelli.name/Papers/PrimObjSemLICS.A4.pdf
Я не могу читать и понимать, что нотация. Это кажется бесполезным упражнением, поскольку, насколько я знаю, никто никогда не реализовывал это так, как исчисление Ламбы было реализовано в Lisp.