Questions tagged «language-design»

涉及编程语言的设计和结构的问题。

4
JavaScript中确切未定义的含义是什么?为什么在那里?它有什么用途?它怎么可能有用?
在JavaScript中,我们有一个叫做undefined的东西。我说了些什么,是因为我真的不知道它是基类,内置变量,关键字还是其他。我只知道它在那里。 要查看其实际效果,您只需编写以下代码: undefined; typeof undefined; 谁能向我解释为什么将这个东西插入JavaScript?我们null在这种语言中具有价值,因此不应该像null。在其他语言中,当我们不知道属性或变量的值时,只需将其设置为null。在这里,我们可以做同样的事情。 我们如何在JavaScript中使用这个东西?

2
语言开发框架应该多么容易使用?
这是一系列问题的一部分,这些问题集中于一个称为抽象项目的项目,该项目旨在以框架的形式抽象语言设计中使用的概念。 可以在此处查看与它相关的与结构化类型相关的另一个页面。可以在此处找到与有关框架和适当发布位置的查询相关的元主题。 使用语言开发框架应该有多容易? 我编写了大规模的代码生成框架,其中还包括将结果发送到特定语言的编译器的功能。易用性主题来自这样一个框架示例:CodeDOM或代码文档对象模型。 它是由Microsoft编写的框架,描述了常见的代码结构,但通常忽略了很多(表达强制),并且在表示某些结构时趋于抽象,完全根据您的工作发出错误的代码:当使用的类型是通用接口时,CodeDOM不能很好地处理PrivateImplementationTypeon CodeMemberMethod。CodeDOM是我编写第一个代码生成器的最初原因。 为了简化框架,我正在尝试做的一件事是减少要做某件事所需的工作量,并着重于动作与构成这些动作的特定类型。 这是我正在编写的框架的并行比较: //Truncated... /* * * From a project that generates a lexer, this is the * state->state transition character range selection logic. * */ var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference())); //... char start = rangeElement.B.Value.Start; char end = rangeElement.B.Value.End; /* * * 'start' …

5
一流的功能
我本周末开始认真看一下Lisp(这意味着我只是在学习Lisp,而不是回到C#中的项目),必须说我喜欢它。我曾涉猎其他功能语言(F#,Haskell,Erlang),但没有感受到Lisp给我的吸引力。 现在,当我继续学习Lisp时,我开始怀疑为什么非功能语言不支持一流的功能。我知道诸如C#之类的语言可以对委托执行类似的操作,并且在某种程度上您可以使用指向C / C ++中的函数的指针,但这是否有理由为什么它永远不会成为这些语言的功能?使函数成为一流有缺点吗?对我来说,它非常有用,所以我迷失了为什么更多的语言(功能范式之外)没有实现它。 [编辑]我很感谢到目前为止的回答。由于已经向我证明许多语言现在都支持一流的功能,因此我将问题重新表述为:为什么语言要花费这么长时间来实现它们?[/编辑]

1
C ++中的静态全局变量和匿名名称空间
为什么在引入静态全局变量(内部链接)和未命名的命名空间中的符号(外部链接,无论如何都无法从外部引用它)之间进行区分? 这些原因是否仍然有效,还是有新的原因? 除了匿名全局(或命名空间范围)联合必须具有static的任意规则之外,还剩下什么地方,它们又是什么? 对于积分,如果没有充分的理由使它们有所不同,是否有要求使它们相等的要求? 当C ++引入名称空间(C ++ 98),特别是未命名的名称空间时,由于热情高涨,静态全局变量被弃用,不如新事物,尽管C ++ 11对此进行了还原: 弃用static关键字…不再? 在C ++ 11之前,不能将具有内部链接的符号用作模板参数:为什么C ++ 03要求模板参数具有外部链接?


1
Swift为什么需要见证表?
我正在尝试阅读Swift的实现细节,我无法确定的一件事是它的“见证表”。看起来它们是用于结构的单独vtable指针。 但是你为什么需要那个呢?结构是按值复制的,因此在编译时您已经知道它们是什么类型。那么,您是否不只是硬编码要调用的方法并完成该方法呢?为什么要对这些方法执行虚拟调度?

1
一流的延续在现代的面向对象的编程语言中有用吗?
连续在功能性编程语言(例如ContHaskell中的monad)中非常有用,因为它们允许对命令式代码进行简单且规则的表示。它们在某些较旧的命令式语言中也很有用,因为它们可用于实现缺少的语言功能(例如,异常,协程,绿色线程)。但对于内置支持这些功能流行的面向对象的语言,什么样的参数会有的还加入了一流的延续支持(无论是更现代的风格定界reset和shift或方案类call-with-current-continuation)? 除了性能和实现的复杂性之外,是否还有反对增加支持的论点?

12
为什么没有更多的语言能够将一个值与另一个值进行比较?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 考虑以下: if(a == b or c) 在大多数语言中,这需要写成: if(a == b or a == c) 这有点麻烦并且会重复信息。 我知道我上面的示例语法有点笨拙,但是我确信有更好的方法来传达这个想法。 为什么没有更多的语言提供它?是否存在性能或语法问题?

3
如何实现if()的惰性求值
我目前正在根据以下条件实现表达式评估器(单行表达式,如公式): 输入的表达式被标记化以分隔文字布尔值,整数,小数,字符串,函数,标识符(变量) 我实现了Shunting-yard算法(经过微调以处理具有可变数量的参数的函数)以消除括号并以后缀顺序将运算符以适当的优先级排序 我的调车场只是产生了一个(模拟的)令牌队列(通过数组,我的Powerbuilder Classic语言可以定义对象,但只有动态数组作为本机存储-不是真实列表,没有字典),我使用简单堆垛机 我的评估人员工作得很好,但我仍然缺少if(),我想知道如何进行。 使用分流后缀和基于堆栈的评估,如果我添加if()具有真假部分的另一个函数,则单个if(true, msgbox("ok"), msgbox("not ok"))消息将显示两条消息,而我只希望显示一条消息。这是因为当我需要评估一个函数时,它的所有参数都已经被评估并放置在堆栈中。 您能给我一些if()偷懒实现的方法吗? 我虽然将它们作为一种宏进行处理,但是在早期我还没有条件评估。也许我需要使用队列以外的其他结构来分别保存条件和true / false表达式?目前,表达式在评估之前已被解析,但我还计划将中间表示形式存储为一种预编译的表达式,以供将来评估之用。 编辑:经过一些问题后,我认为我可以构建表达式的树表示形式(AST而不是线性令牌流),从中我可以轻松地忽略自己的一个或另一个分支if()。

4
精巧的编程,好的/坏的设计方法
我最近发现了识字编程的概念。我觉得这很有趣。但是我还没有遇到过声称这是构造程序的一种坏方法的说法。似乎没有覆盖很多地方。我什至在这里都找不到任何与此有关的问题。 我的问题不是关于它的缺陷或处理文档的方法。我认为文档对识字编程流程的影响是副作用。我知道设计本来是为了易于文档编制以及正向编程流程的概念。 将问题分为基于小句子的问题的想法似乎确实是一个绝妙的主意。因此,它将简化对程序流程的理解。 素养的设计方法的结果还在于,所需功能的数量将受限于程序员的想象力。代替为特定任务定义功能的方法,可以scrap在识字方法中将其创建为。这将产生代码的自动插入,而不是单独的函数编译,并且随后需要过程间编译优化步骤来获得等效速度。实际上,由于这个事实,唐纳德·E·克努斯(Donald E. Knuth)的第一次尝试执行时间较差。我知道编译器可以解决很多问题,但这不是我关心的问题。 因此,我想获得为什么应该认为这是一种不好/好的设计方法的反馈?

6
如何验证/证明编程语言的正交性?
我知道正交性的概念,但是从编程语言的角度来看,有没有一种方法可以验证/证明它呢? 例如在C#中,可以使用public或static进行方法签名。您可以使用其中之一,也可以使用两者,并且它们不会互相干扰,因此它们彼此正交,对吗? 我的问题是,我该如何处理其余功能,尤其是互不相关的功能? 所有功能都必须共存/堆叠在一起吗? 是否有100%正交的编程语言?



1
用于推断类型参数的类型参数的技术名称?
设置:假设我们有一个名为type的类型Iterator,该类型具有type参数Element: interface Iterator<Element> {} 然后我们有一个接口Iterable,该接口具有一个将返回的方法Iterator。 // T has an upper bound of Iterator interface Iterable<T: Iterator> { getIterator(): T } Iterator泛型的问题是我们必须为其提供类型参数。 解决此问题的一种方法是“推断”迭代器的类型。以下伪代码表达了这样的想法:存在一个类型变量Element,该类型变量被推断为Iterator: interface <Element> Iterable<T: Iterator<Element>> { getIterator(): T } 然后我们在这样的地方使用它: class Vec<Element> implements Iterable<VecIterator<Element>> {/*...*/} 这个定义在其定义中Iterable没有使用Element任何其他地方,但在我的实际用例中却使用了。使用的某些函数Iterable还需要能够约束其参数以接受Iterables,该s仅返回某些迭代器,例如双向迭代器,这就是为什么返回的迭代器被参数化而不是元素类型的原因。 问题: 这些推断的类型变量是否有确定的名称?整个技术呢?由于不知道特定的术语,因此很难在野外搜索此示例或了解特定于语言的功能。 并非所有具有泛型的语言都具有此技术;这些语言中有类似技术的名称吗?

4
拥有诸如yield这样的生成器语言设施是一个好主意吗?
PHP,C#,Python和可能的其他几种语言都有yield用于创建生成器函数的关键字。 在PHP中:http://php.net/manual/en/language.generators.syntax.php 在Python中:https://www.pythoncentral.io/python-generators-and-yield-keyword/ 在C#中:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/yield 我担心作为一种语言功能yield会破坏一些约定。其中之一就是我所说的“确定性”。该方法每次调用都会返回不同的结果。使用常规的非生成器函数,您可以调用它,并且如果给定相同的输入,它将返回相同的输出。使用yield时,它会根据其内部状态返回不同的输出。因此,如果您在不知道生成函数的先前状态的情况下随机调用生成函数,则不能指望它返回某个结果。 这样的功能如何适应语言范式?它实际上违反了任何约定吗?拥有并使用此功能是个好主意吗?(举例说明什么是好事,什么是坏事,goto这曾经是许多语言的功能,现在仍然是,但是它被认为是有害的,因此已经从某些语言(例如Java)中消除了)。编程语言的编译器/解释器是否必须突破任何约定才能实现此功能,例如,语言是否必须实现多线程才能使此功能正常工作,或者可以不使用线程技术来完成?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.