我正在编写一个编译语言以获得乐趣,而且我最近因为使我的优化编译器非常健壮而受到了激励.我已经找到了几种方法来优化某些东西,例如,2 + 2总是4,所以我们可以在编译时进行数学运算,如果(false){...}可以完全删除等等,但现在我已经开始循环了.经过一些研究,我认为我正在尝试做的并不是完全循环展开,但它仍然是一种优化技术.让我解释.
请使用以下代码.
String s = "";
for(int i = 0; i < 5; i++){
s += "x";
}
output(s);
Run Code Online (Sandbox Code Playgroud)
作为一个人,我可以坐在这里告诉你,这是100%的时间相当于
output("xxxxx");
Run Code Online (Sandbox Code Playgroud)
换句话说,这个循环可以完全"编译"出来.它不是循环展开,而是我称之为"完全静态",也就是说,没有输入可以改变段的行为.我的想法是,任何完全静态的东西都可以解析为单个值,任何依赖于输入或使条件输出的东西都无法进一步优化.因此,从机器的角度来看,我需要考虑什么?是什么让循环"完全静止?"
我想出了三种类型的循环,我需要弄清楚如何分类.每次运行后总是以相同的机器状态结束的循环,无论输入如何,循环都不会完成,以及我无法通过某种方式弄清楚的循环.在我无法弄清楚的情况下(它有条件地改变了基于动态输入运行的次数),我并不担心优化.无限的循环将是编译错误/警告,除非程序员特别禁止,并且每次循环都应该直接跳到将机器置于正确的状态,而不进行循环.
当然要优化的主要情况是静态循环迭代,当内部的所有函数调用也是静态的.确定循环是否具有动态组件是很容易的,如果它不是动态的,我想它必须是静态的.我无法弄清楚的是如何检测它是否会无限.有没有人对此有任何想法?我知道这是暂停问题的一个子集,但我觉得它是可以解决的; 暂停问题是一个问题,因为对于一些程序子集,你只是不能说它可能永远运行,它可能没有,但我不想考虑那些情况,我只是想考虑这些情况它会停止,或者它不会停止,但首先我必须区分这三种状态.
在我测试的所有浏览器(IE,Firefox,Chrome,Safari,Opera,Yandex)中,window.navigator.appCodeName返回"Mozilla".我知道网络浏览器"劫持"用户代理以欺骗页面的历史,认为它们与所有其他浏览器兼容,而且我满足于appCodeName只是作为该主体的扩展,但是,我读了标准,并且事实证明,标准本身说这将是硬编码的价值"Mozilla".所以这些浏览器实际上都遵循这些标准.
为什么这个价值存在?我认为它留作将来使用,但计划是什么?
这个问题并没有真正解释它,因为它所说的只是因为浏览器劫持了它,我已经理解了,但我更想知道过去或未来的用途是什么.
我正在将脚本从 bash 移植到 PowerShell,并且我希望在两者中保持对参数解析的相同支持。在 bash 中,可能的参数之一是--,我还想在 PowerShell 中检测该参数。然而,到目前为止我所尝试的一切都不起作用。param($-)我无法将其定义为导致编译错误的参数。另外,如果我决定完全放弃 PowerShell 参数处理,只使用$args一切看起来不错,但当我运行该函数时,--参数会丢失。
Function Test-Function {
Write-Host $args
}
Test-Function -- -args go -here # Prints "-args go -here"
Run Code Online (Sandbox Code Playgroud)
我也知道$PSBoundParameters,但该值不存在,因为我无法绑定名为 的参数$-。我可以尝试其他机制或解决方案吗?
有关更多背景信息,请注意我使用 PowerShell 是一个副作用。这预计不会用作普通的 PowerShell 命令,我还围绕此编写了一个批处理包装器,但包装器的逻辑比我想要批量编写的更复杂,因此批处理包装器仅调用 PowerShell 函数,然后进行更复杂的处理。
如何找到传递泛型参数的类的构造函数.例如这样一个类:
class myClass<T> {
public myClass(T val1, Long val2 String val3){
...
}
}
Run Code Online (Sandbox Code Playgroud)
使用通常的反射方法getConstructor()缺少适当的参数:
Constructor<?> myConstructor = myClass.class.getConstructor( ??what here??, Long.class, String.class);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗??