Questions tagged «programming-languages»

与编程语言的设计,实现和分析有关的问题。不适用于有关如何编程的问题,该问题不在本网站上。


1
属于头等公民
来自C ++背景,我不明白为什么一个人需要作为一等公民的类型/类型表达式?我知道支持该功能的唯一语言是Aldor。 是否有人拥有有关头等公民的类型的文献或知道其有用性的一些原因?


2
是什么让lambda演算与研究相关?
我将于明年秋天开始一个本科计算机科学课程,但是我不能真正理解函数式编程中的λ微积分。我可能会完全误解这一点,但是根据斯坦福哲学百科全书中的定义,它只是功能的另一种表示法。 如果仅仅是这样,为什么在常规函数符号上使用λ微积分来计算算法运行时间有什么好处?



3
多态和归纳数据类型
我很好奇。我一直在OCaml中处理此数据类型: type 'a exptree = | Epsilon | Delta of 'a exptree * 'a exptree | Omicron of 'a | Iota of 'a exptree exptree 可以使用显式类型的递归函数(最近添加的功能)进行操作。例: let rec map : 'a 'b. ('a -> 'b) -> 'a exptree -> 'b exptree = fun f -> begin function | Epsilon -> …

2
变量和指针有什么区别?
Whist阅读了一篇概述OO和函数式编程差异的文章,我遇到了函数指针。自从我完成计算机科学学位(2003年)以来已经有一段时间了,所以我查找了一些指针来刷新自己的记忆。 指针是包含对内存地址的引用的变量。如果存在,则可以认为它们指向该内存地址中包含的数据。或者,如本文中的情况一样,它们可能指示代码段的入口点,并可用于调用该代码。 为什么这不同于变量?变量是内存地址的符号名称,编译器会将名称替换为实际地址。这意味着变量包含对内存位置的引用,如果存在这样的数据,则可以认为变量指向该地址处的数据。 如果行为不同(也许不能在运行时重新分配指针,或者只能分配符号变量名称,不能分配其他任何值),这是否意味着它只是特定类型的变量,即指针类型?以相同的方式,声明为整数类型的变量在其用途上受到编译的限制。 我在这里想念什么?

2
自行编译编程语言
我是计算机科学专业的学生。我想创建自己的编程语言(一种基本语言,几乎没有说明)。 我知道如何进行语法分析器,我已经在Perl中做到了。在一篇文章中,我阅读了一些有关编译器的信息,编译器本身就是完成的。 例如,C编译器是用C编写的。这怎么可能?我可以使用自己的语言,但不知道如何执行?任何的想法? 这确实是一个很好的问题,我可以为该项目写博客。

3
为什么状态在while循环的小步操作语义中保持不变?
通常,我看到在while循环的结构化操作语义表示中,程序状态没有改变: (whileBdoS,σ)→(ifBthenS;(whileBdoS)elseSKIP,σ)(whileBdoS,σ)→(ifBthenS;(whileBdoS)elseSKIP,σ)(while \> B \> do \>S, \sigma) \rightarrow (if \>B \> then \>S; (while \> B \> do \>S) \> else \> SKIP, \sigma) 对我来说,这不直观,如果状态没有改变(即内存状态保持不变),则将继续保持为真,并且程序将永远不会终止。B乙B 谁能解释为什么州在这条规则上没有改变?

1
当用作调用堆栈时,无垃圾的意大利面条堆栈会形成DAG吗?
我正在研究用于编程语言的实现技术,并且最近遇到了意粉堆栈,该堆栈被认为非常适合连续传递样式模型(假定它们在例如 Scheme和SML / NJ中使用)。为了简单起见,我们仅考虑此问题的单线程进程。 但是,我对Wikipedia上的图表有些困惑 (也可以在其他地方找到)。特别是,我不明白这种情况如何发生。我只能想象,变灰的分支是无法访问的,应该进行垃圾回收。另一方面,由于我对如何使用意大利面条堆栈实现CPS的含糊理解,我无法想象如何在该结构中实现循环。我必须得出一个结论,它实际上是一个有向无环图,而不是一个“父指针树”,其非垃圾源与线程一样多,宿(与)(潜在)“退出点”一样多。 但是我对这种实现的理解很模糊,所以我想我可能缺少了一些东西。我希望有人可以在“意大利面条调用堆栈”上给我启发,我的意思是指Scheme和/或SML / NJ中用于实现基于CPS的过程的数据结构。 给定以下意大利面条调用堆栈: [exit point] <-- ... <-- [frame A] <-- [frame B (active)] ^ `---- [frame C] 据我了解,来自B的任何流控制要么通过跳到父级(A变为活动状态,现在不可访问的B现在是垃圾)来取消堆栈,要么用子图代替活动帧,仅使用B持有的引用或引用来连接到新的框架。执行无法流向框架C,这必须表示框架C是垃圾。 与以前的情况不同,我认为可能会出现以下无垃圾情况: [exit point] <-- ... <-- [frame W] <-- [frame X] <-- [frame Z (active)] ^ | `---- [frame Y] <---´ 例如,我可以想象Z帧属于某个决策函数,该决策函数要么继续到X帧,要么继续到Y帧(两者都会返回到W)。这意味着意大利面条调用栈不是“父指针树 ”。 但是,我无法想象可以构造循环的任何情况。以以下情况为例: …

1
静态类型检查过于保守的无人为例是什么?
在程序设计语言的概念,约翰米切尔写道,静态类型检查是必要的保守(过于严格的),因为停机问题。他举了一个例子: if (complicated-expression-that-could-run-forever) then (expression-with-type-error) else (expression-with-type-error) 有人可以提供一个确实会引起实际关注的非故意答案吗? 我了解到Java允许针对以下情况进行动态检查的类型转换: if (foo instanceof Person) { Person p = (Person) foo; : } 但我认为这是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.