Jump to content

Ур (язык программирования)

Ур, Ур/Веб
Парадигмы функциональный , реактивный
Семья ML , Хаскелл
Разработано Адам Члипала
Впервые появился декабрь 2014 г .; 9 лет назад ( 2014-12 ) [1]
Стабильная версия
20200209 / 9 февраля 2020 г .; 4 года назад ( 09.02.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]

Такая безопасность типов является лишь основой методологии Ur/Web. Также возможно использовать метапрограммирование для создания важных частей приложения путем анализа структуры типов. [2]

Компилятор Ur/Web также создает очень эффективный объектный код, не использующий сборку мусора . [2]

Шаблоны синтаксиса SQL , встроенные в язык, облегчают обработку таблиц.

Хотя синтаксис основан на стандартном машинном обучении, язык включает в себя концепции Haskell с добавленной манипуляцией с типами.

Вызов/ответ Ajax сериализуется через монаду, называемую транзакцией (соответствует вводу/выводу (IO) Haskell), а ее маршалинг и декодирование инкапсулируются в функции rpc .

Клиентская часть браузера включает функциональные реактивного программирования с использованием средства (source a) тип и сигнальная монада .

Ur/Web не только упрощает написание веб-приложений, но и делает их более безопасными.

«Предположим, вы хотите разместить виджет календаря на своей веб-странице и собираетесь использовать библиотеку, предоставляющую виджет календаря, и на той же странице также есть рекламный блок, основанный на коде, предоставленном рекламной сетью. ", - сказал Члипала.

«Чего вы не хотите, так это того, чтобы рекламная сеть могла изменить работу календаря или чтобы автор кода календаря мог вмешиваться в показ рекламы».

[6]

Пример программы

[ редактировать ]

Это демонстрационная программа, показывающая код клиента, сервера и базы данных с помощью связи 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

Библиотеки

[ редактировать ]

Особенности и проблемы

[ редактировать ]
  • Обновление записи
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 — язык для совместной фронтенд-бэкенд-разработки.
  1. ^ UrWeb вышел из бета-тестирования.
  2. ^ Jump up to: а б с д и ж «Семейство языков программирования Ur» . Impredicative.com/ur . Проверено 3 апреля 2016 г.
  3. ^ Члипала, Адам (январь 2015 г.). «Ur/Web: Простая модель программирования для Интернета» . MIT / Ассоциация вычислительной техники (ACM) . Проверено 5 января 2015 г.
  4. ^ Члипала, Адам (2006). «Семейство лаконичных языков программирования» . СоурсФордж .
  5. ^ Члипала, Адам (2006). «Откажитесь от шаблонного веб-приложения или метапрограммирование с типами строк» ​​. Адам.Члипала.net .
  6. ^ Хардести, Ларри (23 декабря 2014 г.). «Избавление от рутинной работы в веб-разработке» . Массачусетский технологический институт: Новости MIT . Проверено 29 декабря 2016 г.
  7. ^ Демонстрационные программы на вашем языке
  8. ^ Члипала, Адам (январь 2015 г.). «Руководство Ur/Web – Файлы проекта» . Гитхаб . Проверено 8 января 2015 г.
  9. ^ Руководство Ur/Web - Структура веб-приложений
  10. ^ Неожиданная ошибка типа: «Замена в конструкторе заблокирована слишком глубокой переменной объединения»
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 731d430343236623ab80577e35e8de96__1715924220
URL1:https://arc.ask3.ru/arc/aa/73/96/731d430343236623ab80577e35e8de96.html
Заголовок, (Title) документа по адресу, URL1:
Ur (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)