Yan*_*ang 9 programming-languages
我一直对LunaScript的发布(http://www.asana.com/luna)感到好奇,我想我会在这里调查一下现有的工具是什么类似的 - 特别是积极开发/维护的软件.来自博文:
Lunascript应用程序指定数据模型和从模型到视图或用户界面的函数,使用从用户输入到模型突变的处理函数进行注释.由此,Lunascript编译器生成一个正常运行的Web 2.0应用程序 - 客户端JavaScript,服务器端SQL以及介于两者之间的所有内容 - 完成实时双向数据同步.无需编写单独的代码来帮助服务器确定需要将哪些值发送到客户端:服务器可以通过模拟UI来实现.因为Lunascript应用程序仅指定UI在给定当前数据时的外观(而不是在更改发生时应如何更新UI),因此无法编写正确加载但在更改时保持正确的UI.
感兴趣的主要特征是反应式编程 /增量评估/双向数据绑定/您想要调用的任何内容,但是跨越浏览器,应用服务器和RDBMS,从单个高级程序生成每个平台的代码.
更新7/10/11:看看我在底部的外卖.
有趣,直接受到Lunascript的启发.从这个Quora问题中了解到这一点.从(有点旧)介绍:
首先,信用到期!这个项目的概念灵感来自Justin Rosenstein与他与Dustin Moskovitz和Asana团队一起建立的LunaScript语言的对话,以及与Misko Hevery关于他在Google上构建的HTML编译器的对话.
大多数客户端JavaScript程序都必须修改页面内容,但Ur/Web则基于功能反应式编程.程序分配数据源,然后将页面描述为这些数据源的纯函数.当源更改时,页面会自动更改.
链接:来自Philip Wadler的小组
链路通过为所有三层提供单一语言来减轻阻抗不匹配问题.系统为每个层生成代码; 例如,将一些代码转换为浏览器的Javascript,一些转换为服务器的字节码,一些代码转换为数据库的SQL.
斯威夫特:
在Swift方法中,应用程序代码是用Jif语言编写的,这是一种基于Java的语言,包括信息安全策略.源代码自动分区为在浏览器中运行的JavaScript代码,以及在服务器上运行的Java代码.对于交互式性能,代码和数据尽可能放在客户端.安全关键代码放在服务器上,用户界面代码放在客户端上.代码放置受到高级声明性信息流策略的约束,这些策略强有力地强制执行服务器端信息的机密性和完整性.Swift编译器还可以选择在客户端和服务器上复制代码和数据,同时提高安全性和性能.
乐趣是与我理解Lunascript的精神最接近的语言.特别是,功能反应式编程超越了客户端 - 服务器和服务器 - 数据库的区别,允许您创建直接表示持久数据库状态的UI元素,并在数据库状态更改时动态更新它们.从聊天示例中,请注意当消息附加到全局消息集(使用发送按钮)时,循环生成的消息列表如何动态更新:
<div class="chat">
<input data=userInput class="messageInput"/>
<button>"Send"</button onClick=handler() {
let newMessage = new { text: userInput }
userInput.set("")
global.messages.unshift(newMessage)
}>
<div class="messages">
for (message in global.messages) {
<div class="message"> message.text </div>
}
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
这几乎是一个完整的聊天应用程序!(模数一些声明行.)
然而,该项目仍处于早期和不完整的阶段,语言仍在不断变化.而且我仍然有一个问题,即明确控制动态更新与静态,服务器上运行的内容,发生的通信量等等是多么容易.当然,这种方法的可扩展性如何.作者似乎正在利用业余时间开发这个项目.
Ur(一种ML风格的编程语言)和Ur/Web(Ur的Web框架)给我留下了深刻的印象.Ur有一个类型系统,具有依赖类型,但更传统的类型检查,避免要求用户提供证据帮助.相反,依赖类型为元编程提供了一个框架,允许您编写一个CRUD应用程序,该应用程序通常为任何复合数据类型(数据库模式)生成视图.但是,虽然Ur/Web具有客户端响应式编程功能,但客户端 - 服务器/ AJAX通信是明确的.例如,在递增计数器示例中,还需要更新计数器的RPC调用来获取更新的计数器值(尽管一旦设置了客户端src变量,视图就会动态更新):
sequence seq
fun increment () = nextval seq
fun main () =
src <- source 0;
return <xml><body>
<dyn signal={n <- signal src; return <xml>{[n]}</xml>}/>
<button value="Update" onclick={n <- rpc (increment ()); set src n}/>
</body></xml>
Run Code Online (Sandbox Code Playgroud)
请注意,这只会在您按下按钮时更新计数器,而不会在其他人更新计数器时更新 - 这是Fun聊天应用程序显示的一种反应.
作者相信Ur/Web已准备好用于生产,并提供咨询/支持服务.野外有一些Ur/web用户,虽然看似可手动计算.
Links是Philip Wadler小组的一个项目.我很惊讶地发现它不提供任何类型的功能性反应式编程,而且DOM操作之类的东西也是必不可少的.对于客户端 - 服务器通信,我们再次使用显式RPC.我认为Links有点类似于GWT,因为它只是一种语言(功能上的)可以生成服务器和客户端代码,特别是屏蔽了JavaScript.作为这种屏蔽的一个例子,Links为客户端并发进程提供了明确的消息传递通信(特别是actor).这些在编写阻塞代码(例如RPC)时非常有用,而不会导致整个客户端应用程序被阻止.
以下代码来自他们的可更新自动完成演示(源代码),这是一个应用程序,它列出了您正在键入的单词的DB支持的完成,并可以插入新的完成.从UI开始,我们有一个文本框,完成列表和新定义的表单:
<form l:onkeyup="{handler!Suggest(s)}">
Search: <input type="text" l:name="s" autocomplete="off"/>
</form>
<div id="suggestions"/>
<h3>New definition</h3>
<div id="add">
{addForm(handler)}
</div>
Run Code Online (Sandbox Code Playgroud)
handler 是一个运行客户端的actor,它代表UI阻止RPC:
var handler = spawn {
fun receiver(s) {
receive {
case Suggest(s) -> suggest(s); receiver(s)
case NewDef(def) ->
newDef(def);
replaceChildren(addForm(self()), getNodeById("add"));
if (s <> "") suggest(s) else (); receiver(s)
}
}
receiver("")
};
Run Code Online (Sandbox Code Playgroud)
所以handler!Suggest(s)发送Suggest消息给handler.注意NewDef处理程序如何记住更新完成列表(通过调用suggest,就像Suggest处理程序一样)来保持完成与数据库中的完成同步.
该suggest函数要求服务器查询数据库,然后命令性地更新DOM:
fun suggest(s) client {
replaceChildren(format(completions(s)), getNodeById("suggestions"))
}
fun completions(s) server {
if (s == "") []
else {
query [10] {
for (def <-- defsTable)
where (def.word =~ /^{s}.*/)
orderby (def.word)
[def]
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意函数是如何用它们应该运行的位置注释的.
这还没有得到积极的发展.
Swift与GWT有许多相似之处,但具有自动代码分区功能.这个想法是你可以将某些数据"锚定"到服务器端(动机是为了安全性,而论文将一切形成为信息流控制问题),然后分区器从代码中构造出一个控制流图.使用由大量静态启发式驱动的最小切割来计算边缘成本.它并没有真正专注于语言/表达性,因此在其中编程显然只是编写GWT,系统决定每行代码是在客户端还是在服务器上运行.这还没有得到积极的发展.