什么是鲜为人知的有趣的编程语言?

后记。 PostScript的独特之处在于,除了操作数堆栈(如Forth)外,它还具有字典堆栈,该字典堆栈使用户可以完全控制变量范围。 尽管这可能会被滥用,但实际上,这是有才华的开发人员掌握的一种优雅而强大的编程范例。 程序从字典堆栈开始,其中包含一个只读系统字典,该系统的堆栈底部具有内置功能和值,其上方是可修改的全局用户字典,顶部是可修改的本地用户字典。 定义变量后,它们将被添加到词典堆栈顶部的词典中。 但是,使PostScript与众不同的是,该程序可以直接控制词典堆栈。 程序可以随时将字典推送到字典堆栈,从而创建新的变量作用域。 它可以取消定义和修改在字典堆栈中任何位置找到的变量。 它可以将整个作用域/框架保存到操作数堆栈,将其传递给其他函数,然后随时还原。 这个单一功能替代了其他语言中的几个专用功能,使用户可以创建函数局部变量[1],名称空间和导入[2],以及参数和配置的默认值[3]。 更重要的是,它还开辟了智能,简洁的DSL的可能性: Postscript词典堆栈是语言设计方面的真正创新,尽管很少对此进行讨论。 它允许显式且动态地操作名称范围规则,而无需更改语言实现,这允许使用非默认范围规则轻松创建“迷你语言”,以适合单个程序甚至单个功能。 这创建了一种与Lisp宏所提供的功能类似的功能,尽管绝不是与Lisp宏直接相关的功能。 (c2.com/cgi/wiki?ForthPostscriptRelationship) 另一个强大的功能是PostScript的VM快照,有点类似于自动重售池。 save操作员创建VM快照并将其推送到快照还原堆栈。 然后,当运行restore操作符时,撤消上次save后对字典堆栈的所有更改(除了明确添加到全局字典的变量之外)。…

Erlang的基于actor的并发模型比C#或Java的多线程如何好?

您问题的简单答案是,Erlang进程的语义与OS进程的语义相似。 换句话说,它是完全隔离的。 如果崩溃,则释放所有资源,并且围绕它的其他进程不会受到与OS进程相同的影响。 如果您的C#或Java线程崩溃,那么如果不将其与系统的其余部分一起使用,则可能无法死亡。 您很容易陷入无法恢复的不一致状态。 这是因为您具有共享的可变状态和锁。 那么问题就变成了为什么我们不使用类似于fork()和一些消息队列的东西? 因为在OS进程之间发送消息比在Erlang中发送消息要重。 因为一个OS进程(特别是一个带有VM的进程)比Erlang中的要大得多(认为要大3到4个数量级,所以值得一提的是,从理论上讲,精简的C进程可以小到4KB,仍然是一个阶的数量级比在Erlang中大)。 Erlang使用epoll()和kqueue(),因此在处理套接字时,我们不必使用libev(C)和grizzly(Java)之类的库即可获得可接受的性能。 Erlang具有完善的容错设计模式,例如超级用户树,这些模式很难自行实现。 垃圾收集的完成速度足够快,以启用诸如语音和视频之类的软实时应用程序(由于进程之间的隔离,之所以可以这样做)。 fork()不可移植。 您还应该阅读此“红色和绿色回调”,它应该使您了解NodeJS之类的情况。 还有其他原因,但是我没有时间讨论。 但是,请随时进行澄清。