从命令提示符编译/解释程序时,命令提示符如何知道在哪里找到所请求的编译器/解释器? 这些文件是存储在特定的地方还是那样的?我只是想要掌握高级编程,但我发现我很难理解引擎盖下发生的事情。
答案 0 :(得分:0)
关于基于unix的系统上的解释器,许多脚本都以所谓的shebang或hashbang(脚本的第一行#!
)开头,它告诉要调用的解释器,请参阅https://en.wikipedia.org/wiki/Shebang_%28Unix%29 。
答案 1 :(得分:0)
当您输入some-program some-arguments
之类的内容时,shell将查看环境变量$PATH
中列出的每个目录,以查找名为some-program
的可执行文件(在Windows上它是%PATH%
{ {1}}和some-program.exe
)。
这不是编译器和口译员特有的 - 无论some-program
是gcc
,python
,firefox
还是notepad
,都会发生这种情况。
答案 2 :(得分:0)
有两个部分:从哪里找到文件的文件名,以及如何处理它。
如果只输入名称,则搜索文件(程序):
Windows(CMD):
有一个变量%PATH%
,它有一个;
列表 - 分隔的目录,例如。 C:\Windows;C:\Windows\system32;C.\somethingelse
。它保存在注册表中的某个位置,可以在CMD本身中设置,也可以在OS配置中的某个位置设置GUI。
Linux等(Bash等等):
类似地,有一个变量$PATH
,它至少可以在shell和各种配置文件中设置,并且条目由:
分隔,例如。 /bin:/usr/bin/even/more
。优先级从左到右。
此外,一些shell(例如Bash)缓存查找结果以其自己的特定于实现的方式(取决于配置),因为它比检查路径变量中的每个目录更快(至少如果搜索的程序是在最后一个目录中,一切都必须检查)。
找到文件后如何处理
<强>窗:强>
在Windows中,一切都使用文件名后缀
.exe
和其他一些是本土程序开始。
.bat
是一个shell脚本,执行方式就像手动写入shell一样。
对于每个其他后缀,可以配置哪个程序属于后缀(存储在注册表中,如何轻松地更改它在很大程度上取决于使用的Windows版本)。例如。你可以说.py
属于你的Python解释器,文件foo.py将启动解释器。顺便说一下,当在GUI文件浏览器中双击文件时,使用相同的后缀程序配置,当然程序安装程序也可以添加它们的条目,而无需用户这样做。
<强> Linux的:强>
对于Linux,后缀并不重要。第一个相关的东西是二进制(是/否)标志x
(x,如e x ecutable),它存在于文件系统上的每个文件,就像文件名,创建时间戳等。等等。
如果x标志设置为yes:
Linux试图从内容中检测出它是什么类型的程序。本机编译的二进制程序与某些脚本语言的未编译脚本之间的区别非常明显。
本机linux程序由内核启动,与预期的一样。可以配置附加的二进制程序类型,例如。有一个Wine软件在Linux上运行一些Windows程序,并且可以添加一个规范,如何在内部识别Windows exe,并且应该使用Wine启动它们。
对于带有x标志的文本文件,下一步是查看第一行,该行应以'#!'开头(称为shebang),后跟解释器的路径(例如#!/bin/bash)
。Shell脚本(如Windows上的bat文件)以这种方式实现,但它不仅限于经典的shell脚本:没有什么可以阻止任何人制作一个#!/bin/python
脚本,其中包含Python内容(当然,必须安装Python才能使其工作)。
如果x标志设置为no:
像普通配置的bash这样的shell将不会做任何事情,如果它是一个真正的程序,只是没有标志或jpg图像等独立。对于GUI文件管理器:
再次,检查内容(也可能是文件名后缀)以获得类型,如jpg图像,mp3音乐,C ++源代码等。 (Linux知道很多类型),然后在由用户和/或程序安装(mime文件类型id&lt; - &gt; program)配置的列表中查找拟合程序。
...
请注意,例如。 Python脚本(它们只是普通的文本文件,不适合内核使用),可以使用和不使用x标志来完成:使用标志和shebang行,或者不使用标志和匹配的mime列表条目。在“没有标志”的情况下,如果它存在的话,shebang不会受到伤害,因为Python(以及许多其他脚本语言)因为#
而将其视为注释。