即使没有安装语言,gedit 如何检测语言?
这是 Gedit 检测 Java 的示例。
但是当我尝试从终端运行 Java 时,它说java 未安装。
同样地,它可以检测艾达即使它没有安装在我的系统上。
其他语言也是如此......
如果没有安装某种语言,gedit 如何根据该语言的语法显示格式?
如果我选择Objective-C 而不是 Ada,它不显示格式。
但是,如果我用 Objective-C 替换 Ada 的代码,显示正确的格式
即使这些语言不是默认安装的,gedit 如何区分它们?
本文 Ubuntu 预装了 PHP、Ruby 和 Python。但是,我的系统也可以运行 C 和 C++。这是为什么?这与 Gedit 的语法高亮有什么关系?
答案1
总结:同一语言的不同功能由不同的程序和库提供,通常可以单独安装。应用语法高亮、将源代码编译为可执行代码以及运行可执行代码都需要不同的软件。参与执行这些操作的程序或库实际上都不是语言本身。
编程语言与任何类型的语言一样,都是一个抽象的概念。从概念上讲,它不同于任何有助于在其中开发实际程序的软件,也不同于任何支持并允许这些程序运行所需的软件。您的计算机上确实无法安装这种语言。在书写和说话时不区分语言和其所属的语言,这种做法颇为常见。实现。这种习惯很难避免。但它可能会导致混乱,而这种情况就发生在我们这里。
作为普斯帕姆和诺伯特提到过,通常可以安装一个工具来解析语言的语法并应用突出显示,而无需安装该语言的其他开发工具。您甚至可以编写自己的语言,该语言尚未实现(目前),其程序永远无法实际运行(目前),并为其编写语法突出显示规则,以便 Gedit 等文本编辑器可以正确突出显示它。语法突出显示不需要您拥有该语言的其他开发工具;它甚至不需要存在这样的工具。
有些语言,例如Perl和C++具有极其复杂的语法,其中语法语法的哪一部分对应于源代码的特定部分实际上取决于意义很久以前就出现了。对于这些语言,每次应用 100% 正确的语法突出显示会减少实现该语言的整个任务的很大一部分。对于这些语言,语法突出显示通常是以近似方式实现,在大多数实际情况下正确地运用语法。
猜测你用什么语言编写的东西同样是一个近似问题。一般来说不可能确定。对此给出的通常原因是,可以编写一个程序,同时使用多种语言(可能带有不同的含义在每个方面)。更重要的原因是,在编写过程中,你的代码可能存在错误,包括一些技术上不符合你编写的语言的错误。例如,想象一下输入一个简单的 C 程序。如果你在输入过程中被随机打断,那么你目前所写的代码真的是一个有效的 C 程序吗?
尽管如此,工具通常可以准确猜测您使用的语言。此外,如果您使用某种特定语言的源代码文件常用的后缀来命名文件,编辑器通常会首先使用该后缀来决定如何突出显示它。
当人们说解释语言已“安装”
你正在阅读的那篇文章包括如下声明:
Perl 已默认安装在您的 Ubuntu 系统上。
开箱即用的 Ubuntu 附带 Python 和许多扩展模块。
Ruby 也默认安装在您的系统上。
这实际上意味着 Ubuntu 自带实现这些语言。有时人们用与语言本身相同的名字来指代语言的实现。
这三种语言通常是解释型的,尽管它们有编译型(编译为一个特殊的字节码,从概念上来说机器语言一种虚构的计算机,抽象机,其中语言定义)可能会作为解释过程的一部分涉及。
一种语言是否解释或者已编译实际上是一种实现策略,而不是语言的属性,有些语言有单独的解释和编译实现。但语言在设计时通常都考虑其中一种策略,因此“解释型语言”和“编译型语言”这两个短语很流行,我将在这里使用这些短语。
解释型语言的实现包括:
- 口译员
- 通常是一个支持库(通常称为“标准库”),它几乎总是与解释器一起提供,有时甚至被视为解释器的一部分。
要运行你的程序,用户通常必须具备:
只需使用所需的工具就可以用这种语言开发软件跑步程序。这与编译语言不同(见下文)。但您可能希望拥有了解该语言的其他工具,例如知道如何突出显示其语法的文本编辑器。
Ubuntu 中的解释器
Perl只有一个实现(尽管它有很多不同的版本)。该perl
命令运行解释器。在 Perl 社区中,实现通常拼写为“perl”(无大写字母),语言通常拼写为“Perl”。这将语言与其实现区分开来,但这种拼写惯例并不通用。
Python有多种实现.Ubuntu 自带CPython,它(以及其他组件)提供python3
命令,或者特别是在较旧的 Ubuntu 版本中,python2
命令。CPython 是官方参考实现Python 的实现,也是最流行的实现。即使在官方 Python 网站其中,关于“Python”的一些说法是关于语言的,而另一些则是关于官方实现的。其他实现包括派派,杰森, 和IronPython。
红宝石同样有多种实现.Ubuntu 自带红宝石磁共振成像(“Matz 的 Ruby 解释器”),它(以及其他组件)提供了ruby
命令。MRI 是 Ruby 的官方参考实现,也是最流行的实现。Ruby 的广泛使用的实现比 Python 的广泛使用的实现少,但除了 Ruby MRI 之外,还有一个主要的 Ruby 实现是JRuby。
当人们说已编译语言已“安装”
人们不应该这么说,因为它总是(而不仅仅是有时)含糊不清。你正在阅读的那篇文章(幸运的是)没有以这种方式谈论编译器。然而,人们经常这样做,概念问题包含了你问题的答案,所以这值得研究。
编译语言的实现包括:
在某些语言中,支持库有时可以链接静态地进入你的程序这样就不需要单独运行你的程序了。这是一些语言中非常常见的方法,像 Go 一样,但在大多数其他语言中却很少使用,例如 C、C++ 和 Objective C。
要运行你的程序,用户必须具备:
- 通过构建程序(通过运行编译器和相关工具)生成的可执行文件,
- 该语言的支持库,除非它静态链接到你的可执行文件中,或者除非(这种情况很少见)你的程序不使用支持库的任何功能,并且以避免链接到它的方式构建,
- 任何额外的您的程序所依赖的库(如果有),除非它们静态链接到您的可执行文件中。
构建你的程序,必须具备:
- 程序的源代码,
- 编译器和其他构建工具,例如链接器,
- 该语言的支持库,除非(这种情况很少见)你的程序不使用它的任何功能,并且以避免链接到它的方式构建,
- 任何额外的你的程序所依赖的库(如果有)
- 在某些语言中,描述界面库。在 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
,g++
),铛(clang
,clang++
), 和微软VC++(cl.exe
)。GCC 和 Clang 很容易在 Ubuntu 上使用。
最受欢迎C 标准库在 Ubuntu 等 GNU/Linux 系统上的实现是GNU 库。它也可能是世界上最流行的实现。它与 GCC 相关联,但其他编译器(如 Clang)可以毫无问题地将其作为目标。(在 Windows 中,更常用的是不同的实现(MSVCRT)。)在 Ubuntu 和大多数其他 GNU/Linux 系统中,GNU libc 始终安装,并由文件提供libc.so.6
几乎所有程序,无论是否用 C 编写,都直接或间接地使用它。它被认为是操作系统的重要组成部分。但可以编写一个不使用它的程序,以及至少一个其他 C 标准库实现,穆斯尔,可供 Ubuntu 轻松使用。
最受欢迎C++ 标准库在 Ubuntu 等 GNU/Linux 系统上的实现是库标准库++。它与 GCC 相关联,但其他一些编译器也可以以它为目标。您也可以安装库,与 Clang 相关(它们都是LLVM项目),但 Clang 也可以毫无问题地以 libstdc++ 为目标(这是 Ubuntu 中默认提供的)。C++ 标准库的另一个主要实现是微软,该软件最近作为免费开源软件发布,但不适用于 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++ 通常由软件包提供,具体取决于版本libstdc++6
。(这并不意味着您使用的是版本 6。命名是出于历史和兼容性原因。)其头文件由类似名称的-dev
软件包提供,名称中不一定带有6
。在大多数当前的 Ubuntu 系统上,这是libstdc++-9-dev
。安装build-essential
,或者g++
,如果您没有的话,会引入必要的头文件。
libc++1-10
libc++ 目前由名为和 的软件包提供libc++abi1-10
,其头文件由 提供libc++-10-dev
,实际版本号代替10
(如果不同)。与 libstdc++ 一样,通常您不应直接安装任何这些软件包来获取构建针对 libc++ 的程序所需的内容。相反,安装libc++-dev
。这将为您提供libc++-10-dev
或任何其他版本的头文件包作为您系统的默认版本,而这又取决于提供实际库二进制文件的包,确保您也获得这些版本。