每个本科生编程入门课程都会回顾常用的无上下文语法子集:LL(k),SLR(k),LALR(k),LR(k).我们还被教导,对于任何给定的k,这些语法中的每一个都是下一个语法的子集.
我从未见过的是解释什么样的编程语言语法特征可能需要转移到不同的语言类.GLR解析器有一个明显的实际动机,即在解析C++时避免解析器和符号表的不合理混合.但是,LL和LR这两个"标准"类之间的差异呢?
两个问题:
通过使k尽可能小来减少语言能力有一个似是而非的理由,因为需要许多许多前瞻标记的语言对于人类来说难以解析,以及机器要解析的"更难".问题(2)隐含地询问相同的推理是否最终在类之间以及在类中保持.
编辑:这是一个例子来说明我正在寻找的各种答案,但对于常规语言而不是无上下文:
当描述一个普通的语言,人们通常得到三大运营商:+,*和?.现在,你可以删除+而不降低语言的力量; 而不是写作x+,你写xx*,效果是一样的.但是,如果x是一些大而多毛的表达,那么x由于人类的遗忘,这两个人可能会随着时间的推移而发散,产生一个与原作者意图不符的语法正确的正则表达式.因此,即使添加+不严格增加功率,它确实使符号更不容易出错.
是否存在具有类似实际(人类?)效果的结构,从LR切换到LL时必须"删除"?
最近我看到一篇关于使用SAT解决难题的Reddit文章[1].这让我对这个"SAT"的事情非常好奇.我阅读了维基百科的文章,但我想请你们中的某些人以更多的外行术语为我解释.
什么是SAT,它有什么用?它可以用于遍历树结构吗?用于解析文本?换线[2]?对于垃圾箱包装[3]?这是一种优化技术吗?
在相关的说明中,我读到NP与P是关于选择哪个数字的集合为零而不是检查某些数字是否总和为零 - SAT是否与此相关?
[1] http://www.reddit.com/r/programming/comments/pxpzd/solving_hexiom_really_fast_with_a_sat_solver/
我对命令模式非常熟悉,但我还不了解Functor和命令之间的理论差异.特别是,我正在考虑Java实现.两者基本上都是编程"动词",表示为对象.但是,在仿函数的情况下,正如我从一些示例中看到的那样,匿名内部类实现似乎很常见.谁能在那里为我清楚地解决这个问题?
好吧,我猜这完全是主观的,但我正在考虑随机数生成器的熵源.大多数发电机都按当前时间播种,对吗?好吧,我很好奇其他资源可以用来生成完全有效的,随机的(宽松的定义)数字.
使用多个来源(例如时间+当前硬盘寻找时间[我们在这里是非常奇妙的])一起创建一个比单个来源更"随机"的数字?来源数量的逻辑限制是什么?真的够多少钱?选择时间只是因为方便吗?
如果不允许这种事情,请原谅我,但我对这些消息来源背后的理论感到好奇.
我理解访问内存意味着什么是对齐但我不明白为什么这是必要的.例如,为什么我可以从一个地址访问一个字节,0x…1但是我不能从同一个地址访问一个半字(两个字节).
同样,我理解如果你有一个地址A和一个大小的对象,s访问是对齐的A mod s = 0.但我只是不明白为什么这在硬件层面很重要.
是否最好明确设置枚举字段而不是仅定义其名称?例如Enum1与Enum2的任何利弊?
Enum1:
enum SomeEnum
{
Something1 = 0,
Something2 = 1
}
Run Code Online (Sandbox Code Playgroud)
Enum2:
enum SomeEnum
{
Something1,
Something2
}
Run Code Online (Sandbox Code Playgroud)
PS此问题与存储在数据库中的枚举无关,需要明确设置值.
编辑:说所有值都是0,1等等......它们不是负数或其他东西.
我有一些分为几个部分的数据,很像StackOverflow Careers的Resume功能(虽然它不是恢复数据),它可以通过jQuery Web应用程序进行编辑/创建.它有点层次化(作业可以有子作业等),所以根据我采用的CRUD方法,它意味着不同的工作量.我不介意花时间去做正确的事,但我不想花很多时间做一些不是最佳用户体验的想象.
是否对"编辑"这种分段的分层文本数据的不同风格进行了任何研究:
在适当的位置编辑(例如,您单击一个表单元素,如作业标题,它变为可编辑,然后您单击"确定",它保存)
编辑按钮,将您带到新屏幕(如当前的StackOverflow)
弹出模态表单的编辑按钮
所有字段都是开放和可编辑的,单个保存按钮(如StackOverflow Careers)
是否应该使用这些不同的表格来提供最佳的用户体验?
可能重复:
类.重点是什么?
我已经阅读了大量的教程,写了许多课程,使用过它们,但我仍然无法弄清楚一些OOP点.
我的意思是,我认为我得到了理论.这是一种范式,一种思考和解决问题的不同方式.我知道所有的共同点:代码重用,封装,更好的错误处理,更容易的维护,继承,合同设计,更好的文档,聚合,组合,一些设计模式......
那就是说,让我们去做真正的交易吧.假设我有以下内容:
所有这一切都很棒,确实很有用但是...我不能停止思考最简单的情况:列出一些人.是的,因为输出表上的每一行都是在一个类实例上创建的.我无法停止思考在未使用的资源上使用了多少内存和CPU.
清单50人意味着创建50个实例,充满了诸如crud,过滤处理上传,验证规则等资源,当我需要的是运行查询并只用简单的循环输出结果时.
这让我很困惑.而且不仅仅是混淆,因为我已经看到了一些应用程序,当业务规则稍微复杂时,运行时会随着数据库的增加而逐渐增加.
我认为,是创建新类或普通脚本来处理输出和报告的情况?如果是,那么这意味着双重努力,使用OOP毫无意义,一旦我需要为同一个数据库实体创建许多不同的类.编码变得更难,维护变得不酷.
我错过了什么吗?或者这是OOP方法的缺点?
我们是否应该直接牺牲一点,更薄,更快的代码以便更快地开发和维护?
编辑
正如所料,我之前提出的一些观点对某些人来说是误导......
首先,我经历了真正非常大的项目(我曾在IBM为Sprint/Nextel USA和Directv North America工作,因此我习惯于看到每天处理一些太字节).
当我说从数据库中检索到50个人时,我并不是指50个人,我只想提出许多记录的想法.我知道50条记录对于今天的服务器来说并不算什么.5000万是.如果合适,想象一下这最后一个数字.
我已经阅读了几个页面,包括处理强类型和弱类型语言的wiki页面http://en.wikipedia.org/wiki/Strong_and_weak_typing.在大多数情况下,我认为我理解差异.但是,我想直截了当地回答两者的区别.
根据我的理解,在弱类型语言中,不必显式调用数据类型.这将是一种像Matlab这样的语言,您可以在不需要进行类型转换的情况下添加4和2.3.强类型语言要求程序员为每个变量和/或值声明数据类型.例如在C中,你需要做类似4 +(int)2.3或(float)4 + 2.3的事情(不记得那是否是有效的C类型转换).
任何扩展或纠正我对这些概念的理解的信息都将不胜感激.
所以我之前已经阅读了很多次,技术上.NET 确实支持尾调用优化(TCO),因为它有操作码,只有C#不生成它.
我不确定为什么TCO需要操作码或它会做什么.据我所知,能够进行TCO的要求是递归调用的结果不与当前函数范围中的任何变量组合.如果你没有那个,那么我看不到操作码如何阻止你必须保持堆栈框架打开.如果你有,那么编译器是否总能轻易地将其编译为迭代的东西?
那么操作码有什么意义呢?显然有一些我不知道的东西.在完全可以使用TCO的情况下,不能总是在编译器级别处理,而不是在操作码级别处理?什么是不能的例子?