Ты пробовал опа? и если нет, то почему
Сеть растет не только по размеру, но и по важности. Современная сеть, как мы знаем, имеет мало общего с ее ранними днями появления статических страниц; сегодня это совсем не статично. Некоторые страницы даже получают название веб-приложений — например, Google Docs — приложений, доступ к которым осуществляется через браузер, и которые начинают представлять серьезную конкуренцию более традиционным моделям распространения.
Разработка этих приложений не проста. Они по своей природе распределены между клиентом — браузером — и сервером. Оба, как правило, разрабатываются с использованием различных технологий, и необходимо приложить значительные усилия для их взаимодействия.
Мы часто получаем сложный технологический стек. Язык программирования для серверной части, часто с платформой поверх него, язык программирования для клиентской стороны (обычно JavaScript) с некоторыми библиотеками (jQuery, Dojo, Prototype, …) и база данных и ее язык запросов , Все разные технологии, с разными концепциями и моделями. Добавьте конфигурацию и настройте связь между ними, и вы получите картину довольно сложной головоломки. Объединить все элементы не так просто.
Цель новой платформы веб-программирования, Opa, состоит в том, чтобы упростить эту картину и заменить этот сложный технологический стек одним языком программирования. Давайте посмотрим на некоторые простые программы Opa, чтобы понять, как они пытаются облегчить жизнь веб-разработчику.
Привет Опа!
Возможно, самая простая программа Opa заключается в следующем:
Server.start(Server.http, { title: "Hello web", page: function() { <h1>Hello web</h1> } } )
Давайте попробуем понять, что здесь происходит. Во-первых, Server.start — это функция, которая запускает веб-сервер. Он принимает два аргумента, первый — это конфигурация сервера, включая порт, параметры шифрования и т. Д. — здесь мы просто используем настройки http по умолчанию.
Второй аргумент — это описание того, как сервер должен обрабатывать входящие запросы. Есть много вариантов для этого второго аргумента, здесь мы используем простой вариант одностраничного сервиса, который принимает запись с двумя полями: заголовок и страница.
Заголовок — это просто строка с заголовком этой страницы. Страница — это функция без аргументов, которая возвращает HTML-содержимое страницы. Обратите внимание, как мы использовали анонимную функцию для этого поля и что последнее выражение в функции — это возвращаемое значение. Также обратите внимание, как Opa «понимает» HTML и принимает его с помощью обычного синтаксиса.
Opa построен по современным стандартам, поэтому он поддерживает HTML5, о чем свидетельствуют существующие проекты сообщества, использующие: векторную графику WebGL , Canvas и SVG . Он также предлагает подключение к существующим сервисам, включая обширные библиотеки для: Facebook, Twitter, Dropbox и GitHub.
компиляция
Как мы запускаем приложение? В Opa это двухэтапный процесс. Сначала мы должны скомпилировать эту программу: (при условии, что мы сохранили ее в файле с именем hello.opa)
opa hello.opa
и тогда мы можем запустить его с:
./hello.exe
С ростом популярности интерпретируемых языков можно задаться вопросом, почему Opa требует компиляции. Помимо обычного аргумента, что компиляция позволяет оптимизировать и улучшить общую производительность, у этого подхода есть как минимум два преимущества.
Компилятор Opa собирает и упаковывает все ресурсы приложения (включая изображения и тому подобное) в один конечный исполняемый файл (в нашем случае hello.exe). Это означает, что для его развертывания на сервере необходимо просто скопировать этот единственный файл и запустить его там. Нет внешних зависимостей. Нет забытых файлов.
Второе преимущество …
Проверка типа
Opa — это язык строго статической типизации, и на этапе компиляции выполняется много проверок, включая проверку типов. Это означает, что компилятор может обнаружить большой класс ошибок в программировании и указать на них вам даже до запуска вашей программы. Это очень важно и фактически является одним из решающих различий между Opa и некоторыми другими веб-технологиями, такими как Node.js.
Чтобы лучше понять это, давайте взглянем на нашу простую программу. Что если мы сделаем опечатку в одном из имен функций или полей? Что если мы забыли один аргумент? Что если страница вернула строку, а не фрагмент HTML? Во всех этих ситуациях компилятор указывает на ошибку с четким указанием проблемы.
Но проверки идут намного дальше, чем это. Существует много вариантов для второго аргумента функции Server.start. Средство проверки типов Opa достаточно сильное, чтобы определить, какие варианты допустимы, и принимать только те. Я сказал, что выводим, потому что в большинстве случаев вам не нужно аннотировать ваши программы типами (как, скажем, в Java), и вместо этого компилятор выполнит для вас вывод типов . Особенно в больших проектах: это спасатель жизни.
Простая демонстрация
Трудно судить о языке по тому, как пишется «Hello world», поэтому давайте рассмотрим немного более сложную, хотя и очень основную, программу Opa.
database mydb @mongo { int /counter = 0; } function action(_) { /mydb/counter <- /mydb/counter + 1; #msg = <>Hello, user number {/mydb/counter}!</>; } function page() { <h1 onclick={action}>Hello, world</h1> <div id="msg">Click the header</div>; } Server.start(Server.http, { ~page, title: "Hello, world" });
Что делает эта программа? Он представляет страницу с заголовком «Hello, world» и сообщением «Нажмите на заголовок». При нажатии на заголовок сообщение заменяется на «Привет, пользовательский номер X», где X заменяется на количество нажатий на заголовок с момента создания службы, то есть: оно не будет сброшено при экземпляр, перезапуск веб-сервера.
База данных
Давайте внимательнее посмотрим на эту программу. Для подсчета кликов он использует базу данных и поэтому начинает с объявления базы данных mydb, содержащей единственное значение типа int в path / counter. Пути к базам данных в Opa — это места для значений БД, которые концептуально несколько похожи на пути к файловой системе. Это очень скромная база данных, но по существу нет ограничений на количество и сложность (то есть типы) путей.
Как вы можете видеть из функции действия, Opa тесно интегрирует программирование базы данных на базовом языке, обеспечивая удобный синтаксис для чтения и обновления базы данных; а также запросы , хотя это выходит за рамки этой статьи. С помощью простой аннотации (@mongo, здесь) можно выбрать механизм базы данных, который будет обеспечивать работу приложения, причем MongoDB является основным выбором в Opa на данный момент.
интерактивность
На страницу функции. Интересно, что статический HTML содержит обработчик событий, который указывает на функцию в нашей программе.
<h1 onclick={action}>Hello, world</h1>
где указанная функция выполняет некоторые операции с базой данных и DOM с использованием специального синтаксиса:
#msg = <>Hello, user number {/mydb/counter}!</>;
Здесь есть две вещи. Во-первых, #id = content означает: заменить содержимое элемента DOM, идентифицируемого по id, на content. Во-вторых, фрагмент HTML содержит вставку , которая является простым и безопасным (подробнее об этом позже) способом вставки значений в строки / фрагменты HTML. Например, Java:
System.out.println(x + " + " + y + " = " + (x+y));
стал бы в Опе стать:
println("{x} + {y} = {x+y}");
Унифицированное клиент / серверное кодирование
Во фрагменте из функции действия вставка является операцией чтения в базе данных. Интересной особенностью этой функции является то, что очевидно, что все манипуляции с базами данных должны выполняться на сервере, тогда как все манипуляции с DOM должны выполняться на клиенте. Компилятор Opa не только выясняет, что и где должно произойти, но также автоматически генерирует Javascript для клиента и прозрачно заботится обо всем взаимодействии клиент-сервер.
Конечно, разработчик может лучше контролировать происходящее и сам решать, куда и куда идти, с помощью простых аннотаций функций. Но приятно то, что перемещение функции с клиента на сервер (или наоборот) сводится к замене ключевого слова client на server, а все остальное обрабатывается компилятором.
Стоит также отметить, как легко программировать обработчики событий и добиться интерактивности в Opa. На самом деле, язык даже предлагает мощные конструкции для веб в реальном времени. Это, однако, выходит за рамки этой короткой статьи.
Безопасность
Одной из основных проблем веб-приложений, на которую Opa обращает особое внимание, является безопасность . С постоянным взаимодействием клиент-сервер и интерактивным характером веб-приложений очень сложно убедиться, что конфиденциальная информация не протекает и что пользователи не могут делать вредных вещей. Опа использует двоякий подход к этой проблеме.
Помимо аннотаций функций клиент / сервер, он предоставляет две дополнительные функции сервера: открытые и защищенные, которые различают точки входа сервера, которые могут быть оптимизированы для производительности, и точки, которые не должны быть доступны даже для скомпрометированного клиента.
Вторая мера безопасности проистекает из вышеупомянутой типовой безопасности Opa. С одной стороны, это означает, что (как и для некоторых других языков высокого уровня) переполнение буфера или исключения нулевого указателя просто не могут произойти в Opa. С другой стороны, он предлагает защиту от самых популярных угроз безопасности, таких как XSS-атаки и инъекции кода. Эта защита возможна, потому что, благодаря вводу, Opa знает, что такое URL, что такое HTML и что такое запрос к базе данных (в отличие от языков с динамической / слабой типизацией, где все вышеперечисленное будет просто неразличимыми строками) и, следовательно, может правильно дезинфицировать все входы.
… и более
В этой короткой статье у меня была только возможность рассказать о том, что предлагает Opa, но я надеюсь, что этого было достаточно, чтобы заинтересовать вас языком. Я надеюсь продолжить в ближайшем будущем больше новостей и учебных пособий об Opa. В настоящее время, если вы хотите узнать больше, я предлагаю вам посетить Opa в веб — сайт , где вы можете скачать его , прочитать руководство , в блог (с многочисленными учебники) и кучу других статей о Opa . И если вы хотите узнать больше, вы можете познакомиться с полезным сообществом Opa на форуме .