Ур (язык программирования)
Парадигмы | функциональный , реактивный |
---|---|
Семья | ML , Хаскелл |
Разработано | Адам Члипала |
Впервые появился | декабрь 2014 г [1] |
Стабильная версия | 20200209
/ 9 февраля 2020 г |
Дисциплина набора текста | статический , ряд |
Платформа | х86-64 |
ТЫ | ПОСИКС |
Лицензия | С |
Расширения имен файлов | .ур, .урс, .урп |
Веб-сайт | непредсказующий |
Под влиянием | |
ML , Хаскелл [2] |
Ur, также называемый Ur/Web, представляет собой мультипарадигмальный , высокоуровневый , чистый , строгий , функциональный язык программирования . Это диалект языка ML , предназначенный для веб-разработки и созданный Адамом Члипалой в Массачусетском технологическом институте. [3] что одна программа может генерировать код для сервера , клиента веб-браузера и SQL , специфичный для конкретной данных базы . Полная реализация является бесплатным программным обеспечением с открытым исходным кодом, выпущенным под лицензией MIT . [2]
Начало и корни Ur лежат в замененном языке-прародителе под названием Laconic/Web . [4] в 2006 году. [5]
Функция
[ редактировать ]Ur поддерживает мощный вид метапрограммирования, основанный на строк типах данных . [2]
Ur/Web — это Ur плюс специальная стандартная библиотека и связанные с ней правила парсинга и оптимизации. Ur/Web поддерживает создание динамических веб-страниц и приложений, поддерживаемых базами данных SQL . Сигнатура стандартной библиотеки такова, что правильно типизированные программы Ur/Web «не ошибаются» в очень широком смысле. Они не выходят из строя во время определенных поколений страниц и не могут: [2]
- Страдают от любых видов с внедрением кода атак
- Вернуть неверный HTML-код
- Содержать мертвые ссылки внутри приложения.
- Имеют несоответствия между HTML-формами и полями, ожидаемыми их обработчиками.
- Включите клиентский код, который делает неверные предположения об услугах в стиле Ajax , предоставляемых удаленным веб-сервером.
- Попытка недействительных SQL- запросов
- Использовать неправильный маршалинг или демаршалинг при обмене данными с базами данных SQL или между веб-браузерами и веб-серверами.
Такая безопасность типов является лишь основой методологии Ur/Web. Также возможно использовать метапрограммирование для создания важных частей приложения путем анализа структуры типов. [2]
Компилятор Ur/Web также создает очень эффективный объектный код, не использующий сборку мусора . [2]
Шаблоны синтаксиса SQL , встроенные в язык, облегчают обработку таблиц.
Хотя синтаксис основан на стандартном машинном обучении, язык включает в себя концепции Haskell с добавленной манипуляцией с типами.
Вызов/ответ Ajax сериализуется через монаду, называемую транзакцией (соответствует вводу/выводу (IO) Haskell), а ее маршалинг и декодирование инкапсулируются в функции rpc .
Клиентская часть браузера включает функциональные реактивного программирования с использованием средства (source a)
тип и сигнальная монада .
Ur/Web не только упрощает написание веб-приложений, но и делает их более безопасными.
«Предположим, вы хотите разместить виджет календаря на своей веб-странице и собираетесь использовать библиотеку, предоставляющую виджет календаря, и на той же странице также есть рекламный блок, основанный на коде, предоставленном рекламной сетью. ", - сказал Члипала.
«Чего вы не хотите, так это того, чтобы рекламная сеть могла изменить работу календаря или чтобы автор кода календаря мог вмешиваться в показ рекламы».
Пример программы
[ редактировать ]Это демонстрационная программа, показывающая код клиента, сервера и базы данных с помощью связи Ajax из веб-демонстраций, [7] с дополнительными комментариями для описания каждого из компонентов:
Файл интерфейса ( подпись типа ML ) с расширением .urs:
(* the environment monad is called transaction, corresponds to Haskell's IO monad *)
val main : unit -> transaction page
Файл реализации (расширение .ur):
datatype list t = Nil | Cons of t * list t
table t : { Id : int, A : string }
PRIMARY KEY Id
(* server side database access, called through AJAX XmlHttpRequest
encapsulated as ''rpc'' function (remote procedure call) *)
fun add id s =
(* sql dml template with {[expression]} *)
dml (INSERT INTO t (Id, A) VALUES ({[id]}, {[s]}))
fun del id =
dml (DELETE FROM t WHERE t.Id = {[id]})
fun lookup id =
(* haskell style monadic code *)
ro <- oneOrNoRows (SELECT t.A FROM t WHERE t.Id = {[id]});
case ro of
None => return None (* return is the ''monad'' lifting function *)
| Some r => return (Some r.T.A)
(* ''check'' called by client side onClick event handler,
so it will be compiled to JavaScript as page embedded client script *)
fun check ls =
case ls of
Nil => return ()
| Cons (id, ls') =>
ao <- rpc (lookup id); (* Ajax call to server side *)
alert (case ao of
None => "Nada"
| Some a => a
);
check ls'
fun main () =
idAdd <- source "";
aAdd <- source "";
idDel <- source "";
(* generates web page with JavaScript inclusions *)
return <xml><body>
<button value="Check values of 1, 2, and 3"
onclick={fn _ => let val mylist = 1 :: 2 :: 3 :: []
in
check mylist
end
}/><br/>
<br/>
<button value="Add"
onclick={fn _ => id <- get idAdd;
a <- get aAdd;
rpc (add (readError id) a) (* Ajax call to server side *)
}/>
<ctextbox source={idAdd}/>
<ctextbox source={aAdd}/><br/>
<br/>
<button value="Delete"
onclick={fn _ => id <- get idDel;
rpc (del (readError id)) (* Ajax call to server side *)
}/>
<ctextbox source={idDel}/>
</body></xml>
Файл проекта (расширение .urp) должен содержать необязательный список директив, за которым следует список модулей проекта: [8]
# hash prefixed line comments rewrite url Module1/main # set root URL to Module1/main function exe myexename database dbname=test # database attrib. and parameters sql noisy.sql
$/list # stdlib modules prefixed with "$/" module2 # if used by module1 it must precede it module1 # main module
- на стороне сервера функции получения страниц без побочных эффектов (метод http GET) доступны через URL-адрес как /ModulePath/functionName; они должны иметь тип (единица → страница транзакции) .
- Чтобы экспортировать страницу, которая может вызывать побочные эффекты и доступна только через HTTP POST, включите один аргумент обработчика страницы типа Basis.postBody . [9]
Скомпилировать:
urweb module1 # looks for module1.urp
Выполнить как веб-сервер (другие режимы — CGI , FastCGI , ...):
./module1.exe -p 8081 # -h : RTS options help
Библиотеки
[ редактировать ]- Предопределенный API
- Стандартная библиотека
- Функциональные тесты
- Ur wiki — Библиотеки и привязки FFI
Особенности и проблемы
[ редактировать ]- Обновление записи
datatype mystruc k v = Empty | Node of {Key: k, Value: v}
fun setKey [k][v] (* type polymorphism *)
(_: ord k) (* implicit instance of class ord *)
(callerErrNote: string) (k1: k) (my: mystruc k v) : mystruc k v =
if k1 < kmin
then error <xml>setKey: illegal k1 {[callerErrNote]}</xml>
else case my of
Node r => Node (r -- #Key ++ {Key = k1})
| _ => error <xml>setKey: not a Node {[callerErrNote]}</xml>
соответствующая подпись (вид аннотации (:::) неявный; (::) явный):
con mystruc :: Type -> Type -> Type (* two param. type constructor *)
val setKey : k ::: Type -> v ::: Type -> ord k -> string -> k -> mystruc k v -> mystruc k v
- Запись полей с многоточием
case my of
Node {Key = k, ...} => doWhatever k
| _ => ....
- Ошибка «Замена в конструкторе заблокирована слишком глубокой переменной объединения» [10]
Эта ошибка возникает с типами арности > 0
во вложенных case
или let
предложений и исчезает по типу, аннотируя переменные во вложенных предложениях.
См. также
[ редактировать ]- Opa — язык для совместной фронтенд-бэкенд-разработки.
Ссылки
[ редактировать ]- ^ UrWeb вышел из бета-тестирования.
- ^ Jump up to: а б с д и ж «Семейство языков программирования Ur» . Impredicative.com/ur . Проверено 3 апреля 2016 г.
- ^ Члипала, Адам (январь 2015 г.). «Ur/Web: Простая модель программирования для Интернета» . MIT / Ассоциация вычислительной техники (ACM) . Проверено 5 января 2015 г.
- ^ Члипала, Адам (2006). «Семейство лаконичных языков программирования» . СоурсФордж .
- ^ Члипала, Адам (2006). «Откажитесь от шаблонного веб-приложения или метапрограммирование с типами строк» . Адам.Члипала.net .
- ^ Хардести, Ларри (23 декабря 2014 г.). «Избавление от рутинной работы в веб-разработке» . Массачусетский технологический институт: Новости MIT . Проверено 29 декабря 2016 г.
- ^ Демонстрационные программы на вашем языке
- ^ Члипала, Адам (январь 2015 г.). «Руководство Ur/Web – Файлы проекта» . Гитхаб . Проверено 8 января 2015 г.
- ^ Руководство Ur/Web - Структура веб-приложений
- ^ Неожиданная ошибка типа: «Замена в конструкторе заблокирована слишком глубокой переменной объединения»
Внешние ссылки
[ редактировать ]- Языки программирования высокого уровня
- Функциональные языки
- Семейство языков программирования ML
- Семейство языков программирования Haskell
- Языки программирования, созданные в 2014 году.
- Бесплатное программное обеспечение с открытым исходным кодом
- Программное обеспечение Массачусетского технологического института
- Программное обеспечение, использующее лицензию MIT