以下(奇怪的)代码是有效的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())
}
}
答案 0 :(得分:1)
可以存在不将文件预处理为中间状态的编译器吗?
是的,这样的编译器可能存在。编译器将人类可读的文本转换为机器可读的指令,并且不要求它采用中间形式。但是,数十年来对编译器的研究表明,具有中间形式可以使编译更加容易并产生更好的代码。
可以使用“语言不可知的编译器”吗?
不,这无法完成,就像人类语言无法使用“与语言无关的翻译器”一样。
第一个问题是,不同的语言具有不同的语法,因此您不知道如何将单词和符号组合在一起以构成有效的语句。
第二个问题是,不同的语言具有不同的语义,因此您不知道单词和符号的含义。例如,在Scala中有一个for
语句,在C中有一个for
语句,但是它们的实际作用却大不相同。
如果您很想发明一种与所有其他语言都兼容的新语言,这里是XKCD warning about standards
答案 1 :(得分:1)