我似乎无法就此找到直接答案。使用几个搜索引擎给我非常模糊的结果,或只回答问题的一半。
那么,详细说明一下,当你编写一个程序并对其进行编译/解释时,计算机是按时间顺序依次读取每一行还是默认跳过它?
示例: 使用C风格的源代码,因为这是我想到的第一件事。
printf("I'm the first line of your program! Yay!");
printf("I'm the second, woo!");
printf("And I'm the third, yay!");
上面你可以看到有三行代码,当运行时,它们将按顺序运行并按所述顺序输出到控制台。
我假设,除非被告知跳转到源文件中的特定代码部分,否则它将按顺序读取每行代码。这是如何在计算机中解释程序,并以这种方式编译/解释所有编程语言?程序是如何读取特定语言的?
我知道这是关于编程语言和计算机科学的一个基本问题,但我想澄清一些,并且没有任何具体的答案。
我可能在我的搜索中错误地提出了这个问题 - 这可能就是为什么我找不到任何东西。谢谢!
答案 0 :(得分:0)
答案很大程度上取决于一些先决条件。
首先,存在所谓的“脚本”编程语言。 名称本身几乎总结了这种方法的解释器 当用这种语言编写程序时,语言需要用语言:因为它们 字面上是脚本,它们按顺序读取并执行 口译员会读出完整的陈述。
换句话说,因为应该读取脚本 从上到下,各种东西的定义必须来 早于使用东西的地方。
与那些相反,编译的语言通常会给予更多自由 给程序员。例如,在现代语言中,它经常出现 可以在文本上“声明”使用它们所在位置的类型 声明/定义那些使用的类型或其他类型的变量 那些类型。
但据说“脚本”之间存在着更深刻的区别 和编译语言:对于后者,文件作为媒介更多 声明性而非命令式。
例如,取Go。 Go程序的所有源代码都被组织成“包”。 包由位于特定目录中的所有源文件组成 并有一个共同的包装声明。 现在任何一段代码都位于特定包的文件中 能够使用任何其他符号(包级变量,类型或 该包的一个函数 - 无论是哪个文件,以及该文件中该符号的确切位置。
这就是它“如何”工作的原因。 如果您对编译器如何精确使用源文件感到好奇, 那么我想现在他们倾向于“啜饮”然后批发进入记忆 或者以流式方式阅读它们 - 随时解析它们的内容。
这简直无关紧要,因为编译器不是直接的 转换源代码文件中写的内容,而不是构建 然后,所谓的抽象语法树就是这些内容 将这些AST转换为目标机器(或VM)代码,这本身就是 通常发生在几个阶段 - 都使用自己方便 中间代表。
编译器如何读取文本文件的问题无关紧要: 这是一个无趣的微不足道的实施细节。 ; - )
答案 1 :(得分:0)
在大多数情况下,除非使用多线程,否则代码语句将在" main"线程并按顺序执行,并且在前一个语句完成之前不会转到下一个语句。
如果使用多线程,则无法保证在单独的线程中出现语句的顺序。
但是在同一个线程中,语句总是按顺序执行。
某些高级语言仍然支持" goto"声明,允许你跳转,但这是不赞成的,因为它创造了" spaghetti"代码,使用循环结构和调用方法是首选方法。
答案 2 :(得分:0)
今天广泛使用的几乎所有编程语言实现都将整个源文件读入内存,然后在编译或执行任何之前转换为一个或多个更高级别的表示它的。
例如,如果您运行此Python程序:
print "first line"
print print "<- error on this line"
然后解释器输出:
File "temp.py", line 2
print print "<- error on this line"
^
SyntaxError: invalid syntax
请注意,在报告错误之前,它不打印“第一行”。它在开始执行第一行之前检测到第二行中的语法错误。
早在计算机器发生故障的早期阶段,一些语言确实解析并一次执行一行。但是现在,这种风格很少见。