根据计算机语言基准测试游戏,LuaJIT实现似乎击败了所有其他JIT-ed动态语言(V8,Tracemonkey,PLT Scheme,Erlang HIPE)一个数量级.
我知道这些基准测试不具代表性(正如他们所说:"哪种编程语言实现具有最快的基准测试程序?"),但这仍然令人印象深刻.
在实践中,情况确实如此吗?有人测试过Lua的实现吗?
在具有惰性语义的纯函数语言(例如Haskell)中,计算结果被记忆,因此对具有相同输入的函数的进一步评估不会重新计算该值,而是直接从memoized值的缓存中获取它.
我想知道这些记忆值是否会在某个时间点被回收?
想象一个程序执行密集的数值分析:例如使用二分法算法找到数十万个数学函数列表的根.
每次程序评估具有特定实数的数学函数时,结果都将被记忆.但是在算法期间,只有很小的概率才会出现完全相同的实数,导致内存泄漏(或者至少是非常糟糕的使用).
我的想法是,也许memoized值只是"范围"到程序中的某些东西(例如到当前的continuation,调用堆栈等),但我无法找到关于这个主题的实际内容.
我承认我没有深入研究Haskell编译器实现(懒惰?),但是,有人可以向我解释它在实践中是如何工作的吗?
编辑:好的,我从最初的几个答案中理解了我的错误:纯语义意味着参考透明度,这反过来并不意味着自动记忆,但只是保证它没有问题.
我认为网上的一些文章对此有误导性,因为从初学者的角度来看,参考透明度属性似乎很酷,因为它允许隐式记忆.
的XULrunner /壁虎似乎是开发GUI密集型应用程序真的很有趣(通过使用广泛使用的技术,比如HTML/CSS/SVG/XUL/JavaScript)的.但是内置的C++ APIS(XPCOM,NECKO,......)看起来如此古老而复杂.此外,普遍缺乏文档/开发工具真的很可怕.
另一方面,QT有一个非常好的平台,并且有很好的文档和支持.UI部分真的是"传统的".
您对XULRUNNER有什么经验,特别是与其他C++桌面应用程序框架(如QT/GTK/MFC ......)相比?缺什么?什么是真棒?
问题:如果我想将现有的MFC应用程序迁移到跨平台的C++桌面应用程序框架,那么使用XULRUNNER而不是QT或GTK是否明智?
参数化类型(如C++模板)是一件好事,但大多数时候它们只能通过其他类型进行参数化.
但是,在C++中有一个特殊情况,可以通过整数对模板进行参数化.例如,固定长度数组是一个典型的用例:
template<typename T, int SIZE> class FixedArray
{
T m_values[SIZE];
public:
int getElementCount() const { return SIZE; }
T operator[] (int i) const {
if (i<0 || i>=SIZE)
throw;
else
return m_values[i];
}
};
void f()
{
FixedArray<float, 5> float_array; // Declares a fixed array of 5 floats.
//The size is known at compile time, and values are allocated on the stack.
}
Run Code Online (Sandbox Code Playgroud)
在C++中只允许使用常量整数和指针,但我认为使用任何值进行参数化(浮点数,类实例等)可能会很有趣.这可以允许在编译时表达前提条件(通常在文档中非正式指定),并在运行时自动检查它们.例如,这是假设的C++方言中的"Interval"模板:
// Interval of type T between TMin and TMax.
template<typename T, T TMin, T TMax> …Run Code Online (Sandbox Code Playgroud) 可以在同一编译单元(即同一文件)中的函数之间进行诸如常量传播的优化.
例如 :
int f(int x)
{
return 3 + x;
}
int main(void)
{
printf("%d\n", 1 + f(4));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在那个例子中,我认为一个足够智能的编译器可以将'4'常量传播到函数'f',用另一个常量'3'求解整数算术,并传回结果值,从而将所有内容折叠到最终值'8'.
(好吧,如果我错了,请纠正我..)
但是,如果函数'f'在另一个编译单元中,会发生什么.由于它们都是单独编译的,因此编译器无法优化这种方式.
这是否意味着优化只能在同一个编译单元中进行,或者是否存在某些形式的链接时延迟优化?
有没有办法在Erlang中拥有一个完整的解释器,而不仅仅是一个"shell".
由于它是一种动态语言,无法在解释器中定义命名函数有点令人失望......我怀疑这是因为编译单元(模块)必须由VM执行才能显式编译,但可能是REPL作为动态/可重新编译模块存在吗?
最近,我发现了一个名为Wagn的有趣的Wiki/CMS/Database混合体,其中最重要的信息单元是"卡片".这个术语立刻让我想到了Hypercard.正如预期的那样,该应用程序中存在一些"Hypercard-ness".
您是否知道其他具有"Hypercard-ness"功能的Web应用程序/框架,或者它的继任者是否仍然必须被发明?
注意:我坚持使用Web应用程序,因为我已经知道桌面应用程序.
我有一台CouchDB实例在一台机器上运行,因此有自己的Erlang VM进程.如果我在该机器上运行另一个单独的Erlang应用程序,那么在CouchDB和我的应用程序之间共享相同的VM是否更好,或者是否建议启动新的Erlang节点?
这是场景:
用户可以访问两台计算机
由于防火墙限制,这些计算机无法与网络套接字通信
但是,两者都可以访问具有第三台计算机上的读/写权限的公共网络共享
我的问题是:是否可以编写在两台机器上执行的小应用程序,允许通过仅使用网络共享上的文件在两者之间建立通信通道?理想情况下,它会模拟流和套接字行为.
我想是这样的:
1)它将涉及两个用于通信的文件,每个方向一个
2)并且有可能在另一个进程正在通过网络写入文件时读取文件.
但我不确定它是否可行,主要是因为我怀疑第2点.但是,在使用NFS的类似Unix的环境中也许是可能的.
可能吗?它已经存在吗?
最近有很多项目将Javascript推向其他方向:作为通用脚本语言(GLUEScript,Rhino),作为扩展语言(QTScript,Adobe Reader,OO Macros),Widgets(Yahoo Widgets,MS Gadgets,Dashboard)甚至是服务器端的JS和Web框架(CommonJS,Helma,Phobos,V8cgi),这似乎很明显,因为它已经是一种广泛用于Web开发的语言.
但等等,一切都是如此新鲜,没有什么是真正成熟的.然而,JS已经存在了近15年,与其他任何脚本语言一样强大,由ECMA标准化,并且是Web开发的强制技术.
为什么要花费这么多时间来接受其他领域而不是网络浏览器呢?
理论上,浏览器可以支持多种编程语言,用于网页的客户端脚本.实际上,ECMAScript是在所有浏览器中广泛实现和使用的唯一一个.因此对大多数人来说,它是网络不可或缺的一部分.
但是,它从未被W3C推荐用于网页脚本.尽管客户端交互变得越来越重要,但HTML5似乎确实促进了它.为什么会这样?
C++逗号运算符用于链接单个表达式,从而产生最后执行的表达式的值作为结果.
例如骨架代码(6个语句,6个表达式):
step1;
step2;
if (condition)
step3;
return step4;
else
return step5;
Run Code Online (Sandbox Code Playgroud)
可以改写为:( 1个陈述,6个表达式)
return step1,
step2,
condition?
step3, step4 :
step5;
Run Code Online (Sandbox Code Playgroud)
我注意到无法对这些代码进行逐步调试,因为表达式链似乎是作为一个整体执行的.这是否意味着编译器能够执行传统语句方法无法实现的特殊优化(特别是如果步骤是常量或内联)?
注意:我不是在谈论表达序列表达方式的编码风格优点!几乎可以通过表达式替换语句来实现可能的优化.
c++ ×2
erlang ×2
javascript ×2
optimization ×2
c ×1
couchdb ×1
ecma262 ×1
file-io ×1
haskell ×1
hypercard ×1
jit ×1
lua ×1
luajit ×1
memoization ×1
qt ×1
sockets ×1
type-systems ×1
w3c ×1
xulrunner ×1