Walter Bright使用"冗余"这个词......或者"哎呀这意味着什么?"

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因为为几乎任何可能的输入分配一些含义而闻名(臭名昭着?),所以它几乎是一样的.一个有趣的挑战是弄清楚如果你输入(例如)你的名字会发生什么.

  • 是的,我花了一分钟才发现它(不断在谷歌上获得Tampa电子的热门):http://en.wikipedia.org/wiki/Text_Editor_and_Corrector (3认同)
  • 回覆.TECO:还有一个类似的挑战,包括预测按住Control或Meta并在Emacs中输入你的名字的效果. (2认同)

Dou*_*rie 9

nglsh nclds ll srts of xtr ltrs t mk it ezr t read

  • 事实上,除了fsrit和lsat ltteers之外,所有人都可以使用它,并且可以在lseat smoe snsee上玩耍.并且dha rizn fonetisaizd Ingglish haznt cot on iz dhat it notiasiasly mor difikalt tu rid widhaut dha vizhual kyuz uv dha kurent orthografi. (8认同)

Jam*_*ran 8

好吧,使用C#中的一个例子(因为我不知道D).如果您有一个带抽象方法的类,则该类本身必须标记为abstract:

public abstract class MyClass
{
    public abstract MyFunc();
}
Run Code Online (Sandbox Code Playgroud)

现在,编译器自动将MyClass标记为抽象(这是C++处理它的方式)是微不足道的,但在C#中,您必须明确地这样做,以便您的意图清晰.

virtual方法类似.在C++中,如果在基类中声明virtual,则方法在所有派生类中自动为虚拟.在C#中,该方法必须明确标记override,因此不会混淆您想要的内容.


Dre*_*all 5

我认为他在谈论语言中的句法结构以及如何解释它们.作为一个例子,考虑用几种语言呈现的简陋的"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等).但是,他们也更喜欢包含行/列号和建议分辨率的描述性错误消息.这些目标当然是相互矛盾的 - 你不能吃蛋糕并且吃掉它(至少在保持编译器/解释器的内部实现简单的同时).

  • 考虑所有这些设计权衡是所有这些语言的布局和语法的基础,这是非常巧妙的.它真的让你意识到要注销一种语言的方面,例如,它的语法选择,任意或仅仅是"风格"的功能有点幼稚.所有这些选择都是有意识地进行的(我认为至少在良好语言的情况下)是理性的.所有这些相互冲突的目标之间存在权衡的想法也有助于解释为什么那里有1000多种语言:) (3认同)