tel*_*tel 16 error-handling parsing programming-languages d semantics
所以我正在阅读Walter Bright关于Bitwise D语言的采访(http://www.bitwisemag.com/copy/programming/d/interview/d_programming_language.html),我看到了这个非常有趣的关于语言的引用解析:
然而,从理论角度来看,能够生成良好的诊断要求语法中存在冗余.冗余用于猜测预期的内容,冗余越多,猜测的可能性就越大.它就像英语一样 - 如果我们偶尔拼写错误,或者如果一个单词缺失,冗余使我们能够正确地猜出其含义.如果语言中没有冗余,则任何随机字符序列都是有效的程序.
而现在我正试图弄清楚当他说"冗余"时他意味着什么.
我几乎无法绕过最后一部分,在那里他提到可以使用一种语言,其中"任何随机的字符序列都是有效的程序".我被告知有三种错误:句法,运行时和语义.是否存在唯一可能的错误是语义的语言?这样的集会吗?机器代码怎么样?
小智 24
我会关注为什么(我认为)Walther Bright认为redunancy是好的.我们以XML为例.这个片段:
<foo>...</foo>
Run Code Online (Sandbox Code Playgroud)
有冗余,如果我们使用S-Expressions代替,则结束标记是冗余的:
(foo ...)
Run Code Online (Sandbox Code Playgroud)
它更短,并且程序员不必foo更频繁地键入以理解该片段.减少冗余.但它有缺点,例如来自http://www.prescod.net/xml/sexprs.html的示例显示:
(document author: "paul@prescod.net"
(para "This is a paragraph " (footnote "(better than the one under there)" ".")
(para "Ha! I made you say \"underwear\"."))
<document author="paul@prescod.net">
<para>This is a paragraph <footnote>(just a little one).</para>
<para>Ha! I made you say "underwear".</para>
</document>
Run Code Online (Sandbox Code Playgroud)
在两者中,缺少脚注的结束标记/关闭表单.一旦解析器看到,xml版本就会无效</para>.S-Expression只在文档末尾无效,并且只有在其他地方没有不需要的结束时才会失效.因此,在某些情况下,redunancy确实有助于udnerstand作者的意思(并指出他表达错误的方式).
Jer*_*fin 10
汇编语言(大多数汇编语言,无论如何)都不是那样 - 它们具有相当严格的语法,并且大多数随机字符串将被诊断为错误.
机器代码更接近.由于没有涉及从"源"到"对象"代码的转换,所有错误都是语义的,而不是语法的.大多数处理器确实有他们拒绝的各种输入(例如,执行"坏操作码"陷阱/中断).你可以争辩说,在某些情况下,这将是语法(例如,根本没有被识别的操作码),其他的是语义的(例如,一组操作数不被允许用于该指令).
对于那些记得它的人来说,TECO因为为几乎任何可能的输入分配一些含义而闻名(臭名昭着?),所以它几乎是一样的.一个有趣的挑战是弄清楚如果你输入(例如)你的名字会发生什么.
nglsh nclds ll srts of xtr ltrs t mk it ezr t read
好吧,使用C#中的一个例子(因为我不知道D).如果您有一个带抽象方法的类,则该类本身必须标记为abstract:
public abstract class MyClass
{
public abstract MyFunc();
}
Run Code Online (Sandbox Code Playgroud)
现在,编译器自动将MyClass标记为抽象(这是C++处理它的方式)是微不足道的,但在C#中,您必须明确地这样做,以便您的意图清晰.
与virtual方法类似.在C++中,如果在基类中声明virtual,则方法在所有派生类中自动为虚拟.在C#中,该方法必须明确标记override,因此不会混淆您想要的内容.
我认为他在谈论语言中的句法结构以及如何解释它们.作为一个例子,考虑用几种语言呈现的简陋的"if"语句.
在bash(shell脚本)中,它看起来像这样:
if [ cond ]; then
stmts;
elif [ other_cond ]; then
other_stmts;
else
other_other_stmts;
fi
Run Code Online (Sandbox Code Playgroud)
在C(具有单个语句,没有花括号):
if (cond)
stmt;
else if (other_cond)
other_stmt;
else
other_other_stmt;
Run Code Online (Sandbox Code Playgroud)
你可以看到,在bash,有很多语法结构if语句比存在C.事实上,在bash所有的控制结构都有自己的结束定界符(例如if/then/fi,for/do/done,case/in/esac,...),而用C大括号随处可见.这些独特的分隔符消除了代码含义的歧义,从而提供了解释器/编译器可以诊断错误条件并将其报告给用户的上下文.
然而,有一个权衡.程序员通常更喜欢简洁的语法(la C,Lisp等)来详细说明语法(la Pascal,Ada等).但是,他们也更喜欢包含行/列号和建议分辨率的描述性错误消息.这些目标当然是相互矛盾的 - 你不能吃蛋糕并且吃掉它(至少在保持编译器/解释器的内部实现简单的同时).
| 归档时间: |
|
| 查看次数: |
770 次 |
| 最近记录: |