编译器是一种计算机程序(或程序集),它将用编程语言(源语言)编写的源代码转换为另一种计算机语言(目标语言,通常具有称为目标代码的二进制形式) )。想要转换源代码的最常见原因是创建可执行程序。
但是下面这段代码可以被认为是编译器吗?
class S {
public static void main( String ... args ) {
if( "1".equals(args[0]) ) {
System.out.println("echo Hi");
}
}
}
我知道这是一个过于简单化,但是,你什么时候能说一个给定的程序实际上是一个“编译器”?
答案 0 :(得分:3)
由字符串“1”组成的语言是否具有打印“Hi!”的语义。一种编程语言?我不会这样说,所以这不是编译器。
当它接受一种真正的编程语言,并将其转换为另一种不同的语言时,你就称之为编译器。这通常涉及解析源语言以提出语义,然后将其更改为其他语言。
答案 1 :(得分:1)
有人可能会使用Turing-completeness作为标准,但这有点严格(特殊目的编程语言可能不是Turing-complete),所以我会选择一些不太严格的东西。
我认为关键是输出是指令系列,并且在输出和输入之间存在一些非平凡的对应关系。您给出的示例违反了后一个标准,因为无论输入有多复杂,只有两个可能的输出:"echo Hi"
并且没有。
对应关系可以非常接近(在FORTRAN和汇编之间)或更远(Prolog或Lisp和汇编),但只要可以通过连贯的输入语言产生大量行为,它就是编译器。