作为一名自学成才的程序员,我的定义有时会变得模糊。
我很习惯C和ObjC。在这两个代码中,您的代码必须遵循语言“结构”。你只能在某些地方做某些事情。例如,这是一个错误:
// beginning of file
NSLog(@"Hello world!"); // can't do this
@implementation MYClass
...
@end
然而,在Ruby中,任何放在任何地方的东西都会在解释器通过时执行。那么Ruby和Objective-C之间的区别是什么呢?
起初我以为是一个被解释而另一个被编译。然后我读了一些SO帖子和维基百科的定义。解释或编译是实现的属性而不是语言。那么这意味着(理论上)可以是Objective-C的解释实现吗?在这种情况下,语句不能在实现之外的事实不能是编译语言的属性,反之亦然,如果有Ruby的编译实现。或者我错误地认为语言的不同实现会以相同的方式工作吗?
答案 0 :(得分:2)
我不确定它是否有技术术语,但在大多数编程语言中,语句的上下文非常重要。
Ruby有一个允许代码的根或main
上下文的概念。其他脚本语言遵循这个惯例,大概是像Perl这样的语言流行,它允许非常简洁的编程。
这样可以使这样的事情成为一个完整而有效的程序:
print "Hello world!\n"
在其他语言中,您需要定义一个入口点,例如main
例程。顶层并不真正允许使用任意代码,而是保留用于函数,类型,常量,结构和类定义等内容。
像Ruby这样的语言可以很好地控制代码的执行顺序。相比之下,C通常由单独的源文件组成,然后将这些源文件链接在一起,而事物的链接方式没有固有的顺序。所有模块都可以简单地组装到最终的库或可执行文件中。这就是需要main
入口点的原因,它定义了首先运行的函数。
简而言之,它归结为语法,上下文和语言设计注意事项。
答案 1 :(得分:1)
Ruby隐藏了很多东西。
Ruby就像C ++,Objective C和Java一样,并且像C一样main
,但你没有看到这一点。
puts(42)
是方法调用。它是名为main
的主对象的方法。您可以通过输入puts self
来查看。
如果你没有指定接收者(receiver.method()),Ruby将使用隐式的main
。
检查可用方法:
puts Object.private_methods.sort
C / C ++寻找名为main
的主要方法,当C / C ++找到它时,它将被执行。
Ruby在其他方面不需要main
或其他方法/类来首先运行。
它从第一行执行代码,直到它到达文件末尾(或单独行上的__END__
)。
class Strongman
puts "I'm the best!"
end
只是Class.new
方法的语法糖:
Strongman = Class.new do
puts "I'm the best!"
end
“模块”也是如此。
for
调用每个并返回某种对象。所以你可能会认为它类似于方法。
a = for i in 1..12; 42;end
puts a
# 1..12
最后,无论是方法调用还是C int main()
之类的结构都无关紧要。 编程语言决定它应该先运行什么。