是否可以使用“语言不可知的编译器”?

时间:2019-01-19 12:45:33

标签: scala compilation

以下(奇怪的)代码是有效的Scala程序的一部分:

/*
  simple-lang s0.3.35
*/
block main()
For a = 0 to 50 {
  display("Hello World at "+a+" ")
}
// end of simple-lang-like program

尽管此代码块是Scala程序源代码的一部分,但它与program in another language仅相差3个字符。

如果某种语言可以将其他(不相关)语言的源代码视为其自身的源代码,则我觉得它功能强大。

LLVM是一种与语言无关的编译器,但是它通过将另一种语言的源文件编译为中间语言来对其进行“预处理”。

可以存在不将文件预处理为中间状态的编译器吗?


我想问更多问题,但这些问题是投机性的。例如,“我们很快就会有这样的编译器”和“ Scala是朝着这样的编译器迈出的第一步”。

这是我的第一个Scala程序,所以请耐心等待。该程序的唯一目的是表明对于Scala来说看起来很奇怪的代码仍然可以正确解析。

object HelloWorld {

  class Block {
    def main() {}
  }

  val block = new Block()

  class ForClass() {
    var a: Range = 0 to 0;
  }

  val For = new ForClass()

  implicit def removeBody(int: Int) = (body: Unit) => int

  class A() {
    override def toString(): String = "<a>"
  };
  val a = new A()

  var toPrint: Option[String] = None

  def display(s: String) {
    toPrint = Some(s)
  }

  def main(args: Array[String]) {

    /*
      simple-lang s0.3.35
    */
    block main()
    For a = 0 to 50 {
      display("Hello World at " + a + " ")
    }
    // end of simple-lang-like program
    println(For.a)
    println(toPrint.getOrElse())
  }
}

2 个答案:

答案 0 :(得分:1)

  

可以存在不将文件预处理为中间状态的编译器吗?

是的,这样的编译器可能存在。编译器将人类可读的文本转换为机器可读的指令,并且不要求它采用中间形式。但是,数十年来对编译器的研究表明,具有中间形式可以使编译更加容易并产生更好的代码。

  

可以使用“语言不可知的编译器”吗?

不,这无法完成,就像人类语言无法使用“与语言无关的翻译器”一样。

第一个问题是,不同的语言具有不同的语法,因此您不知道如何将单词和符号组合在一起以构成有效的语句。

第二个问题是,不同的语言具有不同的语义,因此您不知道单词和符号的含义。例如,在Scala中有一个for语句,在C中有一个for语句,但是它们的实际作用却大不相同。

如果您很想发明一种与所有其他语言都兼容的新语言,这里是XKCD warning about standards

答案 1 :(得分:1)

否,您不能为多种语言编写编译器。例如,该程序应该做什么?

foo = print "Hello, World!"

在Haskell中,它可以编译,但不执行任何操作,而在Python 2中,它可以打印输出。编译器不知道选择哪种语言,因为这两种语言均有效。

但是,您可以编写一种使用多种语言执行相同操作的程序。这称为polyglot。这是将我们上面的程序修改为Haskell和Python 2多种语言:

main = print "Hello, World!"

对于编写看起来像“ Scala”示例中的代码“看起来很奇怪”的代码,这被称为内部DSL,实际上并不罕见。