gedit 如何检测语言,即使它们没有安装?
这是 Gedit 检测 Java 的示例。
但是当我尝试从终端运行 Java 时,它说java is not installed。
同样,即使它没有安装在我的系统上,它也可以检测到ada 。
其他语言也是如此……
如果没有安装语言,gedit如何根据语言的语法显示格式?
如果我选择Objective-C 而不是 Ada,它不会显示格式。
但是,如果我用 Objective-C 替换 Ada 的代码,它会显示正确的格式
即使默认情况下没有安装这些语言,gedit如何区分它们?
这篇文章 说 PHP、Ruby 和 Python 预装了 Ubuntu。但是,我的系统也可以运行 C 和 C++。为什么会这样,它与 Gedit 的语法高亮有什么关系?
TL;DR:与同一语言相关的不同功能由不同的程序和库提供,通常可以单独安装。应用语法高亮、将源代码编译成可执行代码以及运行可执行代码都需要不同的软件。做这些事情所涉及的程序或库实际上都不是语言本身。
与任何一种语言一样,编程语言是一个抽象概念。它在概念上不同于任何有助于在其中开发实际程序的软件,也不同于支持这些程序并允许它们运行所需的任何软件。一种语言无法真正安装在您的计算机上。以不区分语言及其实现的方式书写和说话是很常见的。这种习惯很难避免。但这可能会导致混乱,这已经发生在这里。
正如Puspam和N0rbert所提到的,通常可以安装一个工具来解析一种语言的语法并应用高亮显示,而无需安装该语言的其他开发工具。你甚至可以编写自己的语言(还没有实现),它的程序永远(还)不能真正运行,并为它编写语法高亮规则,以便像 Gedit 这样的文本编辑器正确地高亮它。语法突出显示不需要您拥有其他语言的开发工具;它甚至不需要存在这样的工具。
某些语言,例如Perl和C++,具有极其复杂的语法,其中语法语法的哪一部分对应于源代码的特定部分实际上取决于很久以前出现的某些东西的含义。对于这样的语言,每次应用 100% 正确的语法突出显示会减少实现语言的整个任务的重要部分。对于这些语言,语法高亮通常以近似的方式实现,在大多数实际情况下正确应用语法。
猜测你用什么语言写东西同样是一个近似的问题。通常无法确定。对此给出的通常原因是正确的,即可以编写同时使用多种语言的程序(每种语言可能具有不同的含义)。一个更重要的原因是,在编写过程中,您的代码可能是错误的,包括在某些方面使其在技术上不是您编写的语言。例如,想象一下输入一个简单的 C 程序。如果您在执行此操作时在某个随机点被打断,那么到目前为止您所拥有的真的是一个有效的 C 程序吗?
尽管如此,工具通常可以很好地猜测您正在使用什么语言。此外,如果您使用某些特定语言的源代码文件常用的后缀来命名文件,编辑器通常会首先使用该后缀来决定如何突出显示它。
人们说“已安装”解释语言时的意思
您正在阅读的那篇文章包括以下陈述:
这实际上意味着 Ubuntu 带有这些语言的实现。有时人们用与语言本身相同的名称来指代一种语言的实现。
这三种语言最常被解释,尽管一种编译形式(编译成特殊的字节码,从概念上讲是一种计算机的机器语言,一种抽象机器,根据它定义语言)可能是作为解释过程的一部分。
一种语言是解释型还是编译型实际上是一种实现策略,而不是该语言的属性,并且某些语言具有单独的解释型和编译型实现。但是语言通常是根据一种或另一种策略设计的,所以“解释语言”和“编译语言”这两个短语很流行,我将在这里使用这些短语。
解释语言的实现包括:
要运行您的程序,用户通常必须具备:
仅使用运行程序所需的工具就可以用这种语言开发软件。这与编译语言不同(见下文)。但是您可能希望拥有一些了解该语言的其他工具,例如知道如何突出显示其语法的文本编辑器。
Ubuntu 中的解释器
Perl只有一种实现(尽管它有许多不同的版本)。该
perl
命令运行解释器。在 Perl 社区中,实现最常拼写为“perl”(无大写字母),语言最常拼写为“Perl”。这将语言与其实现区分开来,但这种拼写约定并不通用。Python有多种实现。Ubuntu 附带CPython,它(在其他组件中)提供
python3
命令,或者特别是在较旧的 Ubuntu 版本中,提供python2
命令。CPython 是 Python 的官方参考实现,也是最流行的实现。即使在Python 官方网站上,关于“Python”的一些声明也是关于语言的,而另一些则是关于官方实现的。其他实现包括PyPy、Jython和IronPython。Ruby同样有多种实现。Ubuntu 带有Ruby MRI(“Matz 的 Ruby 解释器”),它(以及其他组件)提供了
ruby
命令。MRI 是 Ruby 的官方参考实现,也是最流行的实现。与广泛使用的 Python 实现相比,广泛使用的 Ruby 实现更少,但除了 Ruby MRI 之外,一个主要的 Ruby 实现是JRuby。人们说“已安装”编译语言时的意思
人们不应该这样说,因为它总是(而不仅仅是有时)模棱两可。您正在阅读的那篇文章(很高兴)并没有以这种方式谈论编译器。但是,人们经常这样做,并且概念问题包含您问题的答案,因此值得研究。
编译语言的实现包括:
在某些语言中,支持库有时可以静态链接到您的程序中,这样就不需要单独运行您的程序。这是一些语言中非常常见的方法,例如 Go,但在大多数其他语言中很少这样做,例如 C、C++ 和 Objective C。
要运行您的程序,用户必须具备:
要构建您的程序,必须具备:
当人们谈论安装像 C++ 这样的语言时,他们通常意味着安装了一些编译器的实现以及构建C++ 程序的其他必要工具。但是用户不需要它来运行你的程序。Ubuntu 带有 C 和 C++ 程序,但是(取决于您安装 Ubuntu 的方式)它可能不带有 C 和 C++ 开发工具,运行程序不需要这些工具。Ubuntu 还附带 Perl 和 Python 程序(可能还有 Ruby 程序),它们确实需要解释器才能运行。
Ubuntu 中的编译器——以 C 和 C++ 为例
这个答案已经很长了,所以我将仅描述 C 和 C++ 的情况,它们是极其重要的编译语言。尽管 Ubuntu 附带了用其他一些编译语言(包括 Go)编写的程序,但仍然如此。
C和C++是不同的语言。两者都是国际标准化的。他们的支持库——最严格意义上的标准库——同样是标准化的,在标准化语言的相同文档中。没有任何 C 或 C++ 的实现可以作为参考实现;这些语言在平等的基础上具有多种实现。在利基市场之外,少数人比其他人更受欢迎。(这实际上都不是因为它们是编译语言——例如,Go 有一个参考实现并且没有标准化。)
可以实现 C 或 C++ 中的任何一个而不实现另一个,但最流行的编译器同时提供这两者(并且提供没有 C 的 C++ 并不常见)。
最流行的 C 和 C++ 编译器是GCC (
gcc
,g++
)、Clang (clang
,clang++
) 和MSVC++ (cl.exe
)。GCC 和 Clang 是现成的或 Ubuntu。像 Ubuntu 这样的 GNU/Linux 系统上最流行的C 标准库实现是GNU libc。它也可能是世界上最流行的实现。它与 GCC 相关联,但其他编译器,如 Clang,可以毫无问题地定位它。(在 Windows 中,更常用的是不同的实现(MSVCRT)。)在 Ubuntu 和大多数其他 GNU/Linux 系统中,始终安装 GNU libc,并由文件
libc.so.6
. 几乎所有的程序,无论是否用 C 编写,都直接或间接地使用它。它被认为是操作系统的重要组成部分。但是可以编写一个不使用它的程序,并且至少有一个其他 C 标准库实现musl可用于 Ubuntu。像 Ubuntu 这样的 GNU/Linux 系统上最流行的C++ 标准库实现是libstdc++。它与 GCC 相关联,但其他一些编译器可以针对它。您还可以安装与 Clang 相关联的libc++(它们都是LLVM项目的一部分),但 Clang 也可以毫无问题地以 libstdc++ 为目标(这是您在 Ubuntu 中默认获得的)。C++ 标准库的另一个主要实现是MS STL,它最近作为免费的开源软件发布,但不适用于 Ubuntu。
Ubuntu 软件包
程序、库和库的头文件通常在不同的包中提供,这有助于安装一些而不是其他的——例如安装一个库来运行需要它的程序,而无需安装所需的头文件使用该库开发程序。
提供库的包通常以
lib
. 提供头文件的包通常以 . 结尾-dev
。请参阅不同的包如何具有相同的源代码?有关详细信息。build-essential
安装 GCC 并支持 C 和 C++ 的库、这些支持库的头文件以及各种其他有用的工具。如果您正在开发 C、C++ 或 Objective C 程序,即使使用其他编译器,您也需要安装该元包。如果出于某种原因您想自行安装 GCC,则有该gcc
软件包,但它并没有安装所有编译器。(GCC 是“GNU 编译器集合。)对于 C++,您还可以安装g++
. 但我建议只安装build-essential
.clang
安装 Clang,包括 C++ 编译器。GNU libc 由
libc6
软件包提供。你已经有了。如果你不这样做,你的 Ubuntu 系统就会严重损坏,几乎没有任何东西可以运行。它的头文件由libc6-dev
包提供,你可能有也可能没有,但build-essential
会安装。libstdc++6
libstdc++ 通常由软件包提供,具体取决于版本。(这并不意味着您使用的是版本 6。命名是出于历史和兼容性的原因。)它的头文件由类似命名的-dev
包提供,不一定6
在名称中带有 a。在大多数当前的 Ubuntu 系统上,这是libstdc++-9-dev
. 如果您没有必要的头文件,安装build-essential
或会引入它们。g++
libc++ 目前由名为
libc++1-10
和的包提供libc++abi1-10
,其头文件由 提供libc++-10-dev
,实际版本号代替10
(如果不同)。与 libstdc++ 一样,通常您不应直接安装任何这些软件包来获取构建针对 libc++ 的程序所需的内容。相反,安装libc++-dev
. 这为您提供libc++-10-dev
或任何其他版本的头文件包是您系统的默认值,这又取决于提供实际库二进制文件的包,确保您也得到这些。