Многоуровневое программирование
Многоуровневое программирование (или бесуровневое программирование ) — это парадигма программирования для распределенного программного обеспечения , которая обычно следует многоуровневой архитектуре , физически разделяя различные функциональные аспекты программного обеспечения на разные уровни (например, клиент, сервер и база данных в веб-приложении). [1] ). Многоуровневое программирование позволяет разрабатывать функциональные возможности, охватывающие несколько таких уровней, в одном модуле компиляции с использованием одного языка программирования . Без многоуровневого программирования уровни разрабатываются с использованием разных языков, например JavaScript для веб-клиента, PHP для веб-сервера и SQL для базы данных. [2] Многоуровневое программирование часто интегрируется в языки общего назначения путем расширения их поддержки распространения. [3]
Концепции многоуровневого программирования были впервые предложены Хопом . [4] и ссылки [5] языки и нашли промышленное применение в таких решениях, как Ocsigen, [6] Опа , [7] ВебШарпер , [8] Метеор [9] или ГВТ . [10]
Многоуровневое программирование обеспечивает глобальное представление о распределенной системе. Этот аспект был показан аналогично другим парадигмам программирования, таким как хореографическое программирование . [11] макропрограммирование , [12] и совокупные вычисления . [13] [14]
Контекст [ править ]
Код разных уровней может выполняться распределенно на разных сетевых компьютерах . Например, в трехуровневой архитектуре система разделена на три основных уровня — обычно уровень представления, бизнес-уровень и уровень данных. Преимущество этого подхода заключается в том, что за счет разделения системы на уровни функциональность, реализованная на одном из уровней, может быть изменена независимо от других уровней. С другой стороны, такое архитектурное решение разбрасывает сквозную функциональность, принадлежащую нескольким уровням, по нескольким модулям компиляции.
В многоуровневом программировании различные уровни реализуются с использованием одного языка программирования. Различные серверные части компиляции учитывают уровень назначения (например, Java для сервера и JavaScript для веб-браузера). Следовательно, функциональность, распределенная по уровням, может быть реализована в одной единице компиляции многоуровневой программы.
Пример [ править ]
По своей сути многоуровневые языки позволяют разработчикам определять для разных частей кода уровни, к которым принадлежит код. Возможности языка, которые позволяют это определение, весьма разнообразны в разных многоуровневых языках: от промежуточного уровня до аннотаций и типов . В следующем примере показано клиент-серверное приложение Echo, иллюстрирующее различные подходы. В этом примере клиент отправляет сообщение на сервер, а сервер возвращает то же сообщение клиенту, где оно добавляется в список полученных сообщений.
Приложение Echo в Hop.js [ править ]
service echo() {
var input = <input type="text" />
return <html>
<body onload=~{
var ws = new WebSocket("ws://localhost:" + ${hop.port} + "/hop/ws")
ws.onmessage = function(event) { document.getElemenetById("list").appendChild(<li>${event.data}</li>) }
}>
<div>
${input}
<button onclick=~{ ws.send(${input}.value) }>Echo!</button>
</div>
<ul id="list" />
</body>
</html>
}
var wss = new WebSocketServer("ws")
wss.onconnection = function(event){
var ws = event.value
ws.onmessage = function(event) { ws.send(event.value) }
}
Hop использует промежуточный этап для встраивания кода, который должен быть запущен на клиенте, в серверную программу: используя нотацию ~{…}, код обработчиков onload (строка 4) и onclick (строка 10) не выполняется немедленно, но сервер генерирует код для последующего выполнения на клиенте. С другой стороны, нотация ${…} позволяет избежать одного уровня генерации программы. Выражения hop.port (строка 5), event.data (строка 6) и input (строки 9 и 10) оцениваются внешней серверной программой, и значения, которые они оценивают, вводятся в сгенерированную клиентскую программу. Hop поддерживает полноэтапное программирование , т. е. выражения ~{…} могут быть произвольно вложены, так что не только программы на стороне сервера могут генерировать программы на стороне клиента, но и программы на стороне клиента могут генерировать другие программы на стороне клиента.
HTML может быть встроен непосредственно в код Hop. HTML, сгенерированный на сервере (строки 2–14), передается клиенту. HTML, сгенерированный на клиенте, можно добавить на страницу с помощью стандартного DOM API (строка 6). Hop поддерживает двустороннюю связь между работающим сервером и работающим экземпляром клиента через свою стандартную библиотеку. Клиент подключается к серверу WebSocket через стандартный API HTML5 (строка 5) и отправляет текущее входное значение (строка 10). Сервер открывает сервер WebSocket (строка 17), который возвращает значение обратно клиенту (строка 20). Так называемые службы, которые выполняются на сервере и создают значение, которое возвращается клиенту, вызвавшему службу. Например, служба echo (строка 1) создает HTML-страницу, передаваемую веб-клиенту приложения Echo. Таким образом, код служебного блока выполняется на сервере.
Приложение Echo в ссылках [ править ]
fun echo(item) server {
item
}
fun main() server {
page
<html>
<body>
<form l:onsubmit="{appendChildren(<li>{stringToXml(echo(item))}</li>, getNodeById("list"))}">
<input l:name="item" />
<button type="submit">Echo!</button>
</form>
<ul id="list" />
</body>
</html>
}
main()
Links использует аннотации к функциям, чтобы указать, выполняются ли они на клиенте или на сервере (строки 1 и 5). По запросу клиента сервер выполняет основную функцию (строка 18), которая создает код, отправляемый клиенту. Links позволяет встраивать XML-код (строки 7–15). Атрибуты XML с префиксом l: обрабатываются особым образом. Атрибут l:name (строка 10) объявляет идентификатор, к которому привязано значение поля ввода. Идентификатор можно использовать где угодно (строка 9). Код, который должен быть выполнен для обработчика l:onsubmit (строка 9), не выполняется сразу, а компилируется в JavaScript для выполнения на стороне клиента. Фигурные скобки обозначают код ссылок, встроенный в XML. Обработчик l:onsubmit отправляет текущий элемент входного значения на сервер, вызывая echo. Элемент возвращается сервером и добавляется в список полученных элементов с использованием стандартных API-интерфейсов DOM. Обращение к серверу (строка 9) не блокирует клиента. Вместо этого продолжение на клиенте вызывается, когда доступен результат вызова. Взаимодействие клиент-сервер основано на стиле передачи возобновления: стиля передачи продолжения Преобразование и дефункционализация . Удаленные вызовы реализуются путем передачи имени функции для продолжения и данных, необходимых для продолжения вычислений.
Приложение Echo в ScalaLoci [ править ]
@multitier object Application {
@peer type Server <: { type Tie <: Single[Client] }
@peer type Client <: { type Tie <: Single[Server] }
val message = on[Client] { Event[String]() }
val echoMessage = on[Server] { message.asLocal }
def main() = on[Client] {
val items = echoMessage.asLocal.list
val list = Signal { ol(items() map { message => li(message) }) }
val inp = input.render
dom.document.body = body(
div(
inp,
button(onclick := { () => message.fire(inp.value) })("Echo!")),
list.asFrag).render
}
}
ScalaLoci — это язык, предназначенный для общих распределенных систем, а не только для Интернета, т. е. он не ограничивается архитектурой клиент-сервер. С этой целью ScalaLoci поддерживает одноранговые типы для кодирования различных уровней на уровне типа . Типы размещения используются для назначения местоположений данным и вычислениям. ScalaLoci поддерживает многоуровневые реактивы — языковые абстракции для реактивного программирования, которые размещаются в определенных местах — для формирования потоков данных, пересекающих разные узлы.
Приложение сначала определяет поле ввода (строка 11), используя библиотеку ScalaTags. [15] Значение этого поля используется в обработчике событий нажатия кнопки (строка 15) для запуска события сообщения с текущим значением поля ввода. Затем значение передается на сервер (строка 6) и обратно клиенту (строка 9). На клиенте значение события накапливается с помощью функции list и сопоставляется со списком HTML (строка 10). Этот список затем используется в HTML (строка 16) для отображения предыдущих входных данных.
Список многоуровневых языков программирования [ править ]
- Хоп/Hop.js [4] [16] [17]
- Ссылки [5] [18]
- Ур/Веб [19]
- Масло/Кислород [6] [20]
- СкалаЛочи [21]
- StiP.js [22] [23]
- Многоуровневый FRP Scala [24]
- Опа [7]
- ЭмбиентТок/Р [25] [26]
- ML5 [27]
- ВебШарпер [8]
- Спешка [28]
- Веселье [29]
- Деревянный [30]
- Многоуровневое исчисление [31]
- Быстрый [32]
- Время [33]
- ГВТ [10]
- Метеор [9]
- J-оркестр [34]
- Хип-хоп [35]
- Распределенный орк [36]
- Джиф/сплит [37]
- Деление [38]
- СИФ [39]
- ВебДСЛ [40]
- Острый [41]
- Мобл [42]
- Высокоуровневые абстракции для веб-программирования [43]
Ссылки [ править ]
- ^ Халл, Ричард; Тиманн, Питер; Уодлер, Филип (2007). «Результаты рабочей группы 07051 – Парадигмы программирования для Интернета: веб-программирование и веб-сервисы» . Парадигмы программирования для Интернета: веб-программирование и веб-сервисы . Материалы семинара Дагштуля. 07051 . Дагштуль, Германия: Международный центр встреч и исследований в области компьютерных наук (IBFI).
- ^ Вайзенбургер, Паскаль; Вирт, Йоханнес; Сальванески, Гвидо (2020). «Обзор многоуровневого программирования» (PDF) . АКМ Компьютер. Сурв . 53 (4): 81:1–81:35. дои : 10.1145/3397495 . S2CID 218517772 .
- ^ Колдуэлл, Сэм (2016). «Языки общего назначения, расширенные для распространения» . Миллер, Хизер (ред.). Модели программирования для распределенных вычислений .
- ↑ Перейти обратно: Перейти обратно: а б Серрано, Мануэль (2012). «Многоуровневое программирование в Hop» . Коммун. АКМ . 55 (8): 53–59. дои : 10.1145/2240236.2240253 . S2CID 2152326 .
- ↑ Перейти обратно: Перейти обратно: а б Купер, Эзра (2006). «Ссылки: веб-программирование без уровней». Формальные методы для компонентов и объектов . Конспекты лекций по информатике. Том. 4709. стр. 266–296. дои : 10.1007/978-3-540-74792-5_12 . hdl : 20.500.11820/ef5f100a-0366-4b85-8ef1-622fd7fbb53a . ISBN 978-3-540-74791-8 . S2CID 16397220 .
- ↑ Перейти обратно: Перейти обратно: а б Балат, Винсент (2006). «Ocsigen: ввод веб-взаимодействия с объективным Caml» : 84–94. дои : 10.1145/1159876.1159889 . S2CID 6131454 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ↑ Перейти обратно: Перейти обратно: а б Райхенбах-Теллер Д. и Сино Франсуа-Режи. (2010). Opa: языковая поддержка для разумного, безопасного и надежного Интернета. Материалы исследования OWASP AppSec , 2010 г. (1).
- ↑ Перейти обратно: Перейти обратно: а б Бьорнсон, Джоэл; Таяновский, Антон; Гранич, Адам (2010). «Составление реактивных графических интерфейсов в F # с использованием WebSharper». Реализация и применение функциональных языков . Конспекты лекций по информатике. Том. 6647. Берлин, Гейдельберг: Springer-Verlag. п. 49. дои : 10.1007/978-3-642-24276-2_13 . ISBN 978-3-642-24275-5 .
- ↑ Перейти обратно: Перейти обратно: а б Стрэк, Исаак (январь 2012 г.). Начало работы с фреймворком Meteor JavaScript . Бирмингем. ISBN 978-1-78216-083-0 . OCLC 823718999 .
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ) - ↑ Перейти обратно: Перейти обратно: а б Кереки, Федерико, 1960- (2011). Essential GWT: создание веб-приложений с помощью набора инструментов Google Web 2 . Река Аппер-Сэддл, Нью-Джерси: Аддисон-Уэсли. ISBN 978-0-321-70563-1 . OCLC 606556208 .
{{cite book}}
: CS1 maint: несколько имен: список авторов ( ссылка ) CS1 maint: числовые имена: список авторов ( ссылка ) - ^ Джяллоренцо, Саверио; Монтези, Фабрицио; Пересотти, Марко; Рихтер, Дэвид; Сальванески, Гвидо; Вайзенбургер, Паскаль (2021). Моллер, Андерс; Шридхаран, Ману (ред.). «Многопартийные языки: хореографические и многоуровневые случаи» . 35-я Европейская конференция по объектно-ориентированному программированию (ECOOP 2021) . Международные труды Лейбница по информатике (LIPIcs). 194 . Дагштуль, Германия: Замок Дагштуль – Центр информатики Лейбница: 22:1–22:27. doi : 10.4230/LIPIcs.ECOOP.2021.22 . ISBN 978-3-95977-190-0 . S2CID 235748561 .
- ^ Касадеи, Роберто (11 января 2023 г.). «Макропрограммирование: концепции, современное состояние и возможности макроскопического моделирования поведения» . Обзоры вычислительной техники ACM . 55 (13с). Ассоциация вычислительной техники (ACM): 1–37. arXiv : 2201.03473 . дои : 10.1145/3579353 . ISSN 0360-0300 . S2CID 245837830 .
- ^ Бил, Джейкоб; Пианини, Данило; Вироли, Мирко (2015). «Агрегатное программирование для Интернета вещей». Компьютер . 48 (9). Институт инженеров по электротехнике и электронике (IEEE): 22–30. дои : 10.1109/mc.2015.261 . hdl : 11585/520779 . ISSN 0018-9162 . S2CID 26413 .
- ^ Одрито, Джорджио; Касадеи, Роберто; Дамиани, Ферруччо; Сальванески, Гвидо; Вироли, Мирко (2022). Али, Карим; Витек, Ян (ред.). «Функциональное программирование для распределенных систем с помощью XC» . 36-я Европейская конференция по объектно-ориентированному программированию (ECOOP 2022) . Международные труды Лейбница по информатике (LIPIcs). 222 . Дагштуль, Германия: Schloss Dagstuhl – Leibniz-Zentrum für Informatik: 20:1–20:28. doi : 10.4230/LIPIcs.ECOOP.2022.20 . ISBN 978-3-95977-225-9 . S2CID 249961384 .
- ^ «СкалаТеги» . www.lihaoyi.com . Проверено 11 октября 2021 г.
- ^ Серрано, Мануэль (2006). «Хоп: язык программирования для Интернета 2.0» : 975–985. дои : 10.1145/1176617.1176756 . S2CID 14306230 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Серрано, Мануэль (2016). «Взгляд на Hopjs». Материалы 21-й Международной конференции ACM SIGPLAN по функциональному программированию . стр. 180–192. дои : 10.1145/2951913.2951916 . ISBN 9781450342193 . S2CID 18393160 .
- ^ Фаулер, Саймон (2019). «Исключительные типы асинхронных сеансов: типы сеансов без уровней» . Учеб. Программа АКМ. Ланг . 3 (ПОПЛ): 28:1–28:29. дои : 10.1145/3290341 . hdl : 1808/27512 . S2CID 57757469 .
- ^ Члипала, Адам (2015). «Ur/Web: простая модель веб-программирования» : 153–165. дои : 10.1145/2676726.2677004 . S2CID 9440677 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Раданн, Габриэль (2018). «Бесуровневое веб-программирование в целом». Спутник веб-конференции 2018 на веб-конференции 2018 — WWW '18 . стр. 681–689. дои : 10.1145/3184558.3185953 . ISBN 9781450356404 . S2CID 3304415 .
- ^ Вайзенбургер, Паскаль (2018). «Разработка распределенных систем с помощью ScalaLoci» . Учеб. Программа АКМ. Ланг . 2 (OOPSLA): 129:1–129:30. дои : 10.1145/3276499 . S2CID 53090153 .
- ^ Филипс, Лора (2014). «К бесуровневой веб-разработке без многоуровневых языков». Материалы Международного симпозиума ACM 2014 года по новым идеям, новым парадигмам и размышлениям о программировании и программном обеспечении . стр. 69–81. дои : 10.1145/2661136.2661146 . ISBN 9781450332101 . S2CID 15774367 .
- ^ Филипс, Лора (2018). «Назначение уровней на основе поиска для оптимизации автономной доступности в многоуровневых веб-приложениях» . Журнал программирования . 2 (2): 3. arXiv : 1712.01161 . doi : 10.22152/programming-journal.org/2018/2/3 . S2CID 11256561 .
- ^ Рейндерс, Боб (2014). «Многоуровневое функциональное реактивное программирование для Интернета». Материалы Международного симпозиума ACM 2014 года по новым идеям, новым парадигмам и размышлениям о программировании и программном обеспечении . стр. 55–68. дои : 10.1145/2661136.2661140 . ISBN 9781450332101 . S2CID 16761616 .
- ^ Карретон, Андони Ломбиде (2010). «Слабосвязанное распределенное реактивное программирование в мобильных одноранговых сетях». Объекты, модели, компоненты, шаблоны . Конспекты лекций по информатике. Том. 6141. стр. 41–60. дои : 10.1007/978-3-642-13953-6_3 . ISBN 978-3-642-13952-9 .
- ^ Дедекер, Джесси (2006). «Амбиентно-ориентированное программирование в Ambient Talk » . Ambient-ориентированное программирование в AmbientTalk . Конспекты лекций по информатике. Том. 4067. стр. 230–254. дои : 10.1007/11785477_16 . ISBN 978-3-540-35726-1 .
- ^ VII, Том Мерфи (2007). «Типобезопасное распределенное программирование с использованием ML5». Надежные глобальные вычисления . Конспекты лекций по информатике. Том. 4912. стр. 108–123. дои : 10.1007/978-3-540-78663-4_9 . ISBN 978-3-540-78662-7 . S2CID 12534714 .
- ^ Экблад, Антон; Классен, Коэн (11 мая 2015 г.). «Бесшовная, ориентированная на клиента модель программирования для типобезопасных веб-приложений» . Уведомления ACM SIGPLAN . 49 (12): 79–89. дои : 10.1145/2775050.2633367 . ISSN 0362-1340 .
- ^ «Fun (язык программирования для Интернета в реальном времени)» . marcuswest.in . Проверено 4 мая 2020 г.
- ^ Лейен, Даан (2014). «Кока: программирование с использованием типов полиморфных эффектов строк» . Электронные труды по теоретической информатике . 153 : 100–126. arXiv : 1406.2061 . дои : 10.4204/EPTCS.153.8 . S2CID 14902937 .
- ^ Нойбауэр, Матиас (2005). «От последовательных программ к многоуровневым приложениям путем преобразования программ». Материалы 32-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования . стр. 221–232. дои : 10.1145/1040305.1040324 . ISBN 158113830X . S2CID 10338936 .
- ^ ЧонгСтивен; ЛюДжед; С, МайерсЭндрю; ЦиСинь; ВикрамК; ЧжэнЛаньтянь; ЧжэнСинь (14 октября 2007 г.). «Защита веб-приложений с помощью автоматического разделения» . Обзор операционных систем ACM SIGOPS . 41 (6): 31–44. дои : 10.1145/1323293.1294265 . hdl : 1813/5769 .
- ^ Манолеску, Драгош (2008). «Вольта: разработка распределенных приложений путем перекомпиляции» . Программное обеспечение IEEE . 25 (5): 53–59. дои : 10.1109/MS.2008.131 . S2CID 24360031 .
- ^ Тилевич, Эли (2002). «J-Orchestra: автоматическое разделение приложений Java». ЭКООП 2002 — Объектно-ориентированное программирование . Конспекты лекций по информатике. Том. 2374. стр. 178–204. дои : 10.1007/3-540-47993-7_8 . hdl : 1853/6531 . ISBN 978-3-540-43759-8 .
- ^ Берри, Жерар; Николас, Сиприен; Серрано, Мануэль (2011). «Хип-хоп» . Материалы 1-го международного семинара ACM SIGPLAN по языкам программирования и системным технологиям для интернет-клиентов . Нью-Йорк, Нью-Йорк, США: ACM Press. п. 49. дои : 10.1145/2093328.2093337 . ISBN 978-1-4503-1171-7 . S2CID 1280230 .
- ^ Тайвиссен, Джон А. (2016). «Неявное распространение повсеместно параллельных программ: расширенное резюме» : 1. doi : 10.1145/2957319.2957370 . S2CID 6124391 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Зданцевич, Стив (2002). «Безопасное разбиение программ» . АКМ Транс. Вычислить. Сист . 20 (3): 283–328. дои : 10.1145/566340.566343 . S2CID 1776939 .
- ^ Гуха, Арджун; Жаннен, Жан-Батист; Нигам, Рахит; Танген, Джейн; Шамбо, Риан (2017). Лернер, Бенджамин С.; Бодик, Растислав; Кришнамурти, Шрирам (ред.). «Fision: безопасное динамическое разделение кода для JavaScript» . 2-й саммит по достижениям в языках программирования (SNAPL 2017) . Международные труды Лейбница по информатике (LIPIcs). 71 . Дагштуль, Германия: Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik: 5:1–5:13. doi : 10.4230/LIPIcs.SNAPL.2017.5 . ISBN 978-3-95977-032-3 .
- ^ Чонг, Стивен (2007). «SIF: Обеспечение конфиденциальности и целостности веб-приложений» .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Гроневеген, Дэнни М. (2008). «WebDSL: предметно-ориентированный язык для динамических веб-приложений» : 779–780. дои : 10.1145/1449814.1449858 . S2CID 8073129 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Сьюэлл, Питер (2005). «Острый: разработка языка программирования высокого уровня для распределенных вычислений» : 15–26. дои : 10.1145/1086365.1086370 . S2CID 1308126 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Хемель, Зеф (2011). «Декларативное программирование мобильного Интернета с помощью Mobl». Материалы международной конференции ACM 2011 года по языкам и приложениям объектно-ориентированных систем программирования . стр. 695–712. дои : 10.1145/2048066.2048121 . ISBN 9781450309400 . S2CID 10480906 .
- ^ Ричард-Фой, Жюльен (2013). «Эффективные абстракции высокого уровня для веб-программирования». Материалы 12-й международной конференции «Генераторное программирование: концепции и опыт» . стр. 53–60. дои : 10.1145/2517208.2517227 . ISBN 9781450323734 . S2CID 14305623 .