Как Gedit может обнаружить и выделить языки, которые не Не установлено?

Как gedit может обнаруживать языки, даже если они не установлены?

gedit screenshot

Вот пример, где Gedit обнаруживает Java.

Но когда я пытаюсь запустить Java из терминала, он говорит, что java не установлен .

Аналогично, он может обнаружить ada , даже если он не установлен в моей системе.

И то же самое относится и к другим языкам ...

Если язык не установлен, как gedit может отображать форматирование в соответствии с синтаксисом языка?

Если я выберу Objective-C вместо Ada, он не будет отображать форматирование.

Однако, если я заменю код Ada на Objective-C, он отображает правильное форматирование

Даже если эти языки не установлены по умолчанию, как gedit может различать их?

В этой статье говорится, что PHP, Ruby и Python поставляется с предустановленной Ubuntu. Тем не менее, моя система также может работать на C и C ++. Почему и как это связано с подсветкой синтаксиса Gedit?

3
задан 11 June 2020 в 06:08

1 ответ

TL; DR: Предоставляются различные функции, связанные с одним и тем же языком различными программами и библиотеками, которые обычно могут быть установлены отдельно. Для применения подсветки синтаксиса, компиляции исходного кода в исполняемый код и запуска исполняемого кода требуется различное программное обеспечение . Ни одна из программ или библиотек, участвующих в этом, на самом деле не является языком .

Язык программирования, как и любой другой язык, является абстрактной идеей. Он концептуально отличается от любого программного обеспечения, облегчающего разработку реальных программ в нем, а также из любого программного обеспечения, необходимого для поддержки таких программ и обеспечения их запуска. Язык не может быть установлен на вашем компьютере. Довольно часто можно писать и говорить так, чтобы не различать язык и его реализации . Эту привычку трудно избежать. Но это может привести к путанице, которая произошла здесь.

Как упоминали Puspam и N0rbert , обычно можно установить инструмент, который анализирует синтаксис языка. и применяет выделение , выделив , не имея также других установленных средств разработки для языка. Вы даже можете создать свой собственный язык, который не имеет реализации (пока), чьи программы никогда (пока) не могут быть запущены, и напишите для него правила подсветки синтаксиса, чтобы текстовый редактор, такой как Gedit, выделил его правильно. Подсветка синтаксиса не требует наличия других инструментов разработки для языка; даже не требуется, чтобы такие инструменты существовали.

Некоторые языки, такие как Perl и C ++ , имеют чрезвычайно сложный синтаксис, где какая часть синтаксической грамматики соответствует определенной части вашего исходного кода на самом деле зависят от значения чего-то, что появилось задолго до этого. Для таких языков применение 100% правильной подсветки синтаксиса каждый раз сводится к существенному фрагменту всей задачи реализации языка. Для этих языков подсветка синтаксиса обычно реализуется приблизительно , применяя грамматику правильно в большинстве практических случаев. 1212. Угадай, на каком языке ты что-то пишешь, тоже вопрос приближения. В общем, не возможно сказать наверняка. Обычная причина, приведенная для этого, которая является истинной, заключается в том, что можно написать программу, которая одновременно на нескольких языках (возможно, с различными значениями в каждом). Более важная причина заключается в том, что в процессе написания ваш код, вероятно, неверен, в том числе из-за того, что технически он не соответствует языку, на котором вы его пишете. Например, представьте, что вы печатаете простую программу на Си. Если во время этого вы были прерваны в случайный момент, будет ли то, что у вас есть, действительно действительной программой на Си?

Тем не менее, инструменты часто могут дать правильные предположения о том, какой язык вы используете. Также, если вы называете свой файл суффиксом, который обычно используется для файлов исходного кода на каком-то конкретном языке, редакторы обычно сначала используют его, чтобы решить, как его выделить.

Что люди имеют в виду, когда говорят, что интерпретируется ] язык «установлен»

В этой статье, которую вы читали , содержатся такие выражения:

Perl уже установлен в вашей системе Ubuntu по умолчанию.

Из коробки Ubuntu поставляется с Python и многими модулями расширения. .

Ruby также установлен по умолчанию в вашей системе.

Это на самом деле означает, что Ubuntu поставляется с реализациями этих языков. Иногда люди ссылаются на реализацию языка с тем же именем, что и сам язык.

Эти три языка чаще всего интерпретируются, хотя это форма компиляции (компиляция по специальному байт-коду , который концептуально является машинным языком компьютера готового типа, абстрактная машина , , с точки зрения которого определен язык), может участвовать в процессе интерпретации.

Является ли язык интерпретированным или скомпилированным , действительно является реализацией стратегия, а не свойство языка, и некоторые языки имеют отдельные интерпретируемые и скомпилированные реализации. Но языки чаще всего разрабатываются с учетом той или иной стратегии, поэтому фразы «интерпретируемый язык» и «скомпилированный язык» популярны, и я буду использовать эти фразы здесь.

Реализация интерпретируемого языка состоит из:

  • интерпретатор
  • обычно, вспомогательная библиотека (часто называемая «стандартной библиотекой»), которая почти всегда поставляется с интерпретатором и иногда даже рассматривается как часть интерпретатора.

Чтобы запустить вашу программу, пользователь обычно должен иметь:

  • исходный код вашей программы (хотя он может быть минимизирован или скрыт , и иногда он может быть запущен только с байт-кодом)
  • независимо от того, дополнительно) библиотеки, от которых зависит ваша программа, если таковые имеются.

Можно разработать программное обеспечение на таком языке, используя только инструменты, необходимые для запуска программы. Это не похоже на скомпилированные языки (см. Ниже). Но вы можете захотеть иметь дополнительные инструменты, которые что-то знают о языке, такие как текстовый редактор, который знает, как выделить его синтаксис.

Интерпретаторы в Ubuntu

Perl имеет только одну реализацию (хотя существует много разных версий). Команда perl запускает интерпретатор. В сообществе Perl реализация чаще всего пишется как «perl» (без заглавной буквы), а язык чаще всего пишется как «Perl». Это отличает язык от его реализации, но это орфографическое соглашение не является универсальным.

Python имеет несколько реализаций . Ubuntu поставляется с CPython , который (среди других компонентов) предоставляет команду python3 или, особенно, в более старых выпусках Ubuntu, команду python2 . CPython является официальной справочной реализацией Python, а также самой популярной реализацией. Даже на официальном веб-сайте Python некоторые из утверждений, касающихся «Python», касаются языка, а другие - об официальной реализации. Другие реализации включают в себя PyPy , Jython и IronPython .

Ruby также имеет несколько реализаций ]. Ubuntu поставляется с Ruby MRI («Ruby Interpreter Матца»), который (среди других компонентов) предоставляет команду ruby ​​ . MRI - официальная эталонная реализация Ruby, а также самая популярная реализация. Существует меньше широко используемых реализаций Ruby, чем широко используемых реализаций Python, но одной основной реализацией Ruby, отличной от Ruby MRI, является JRuby .

Что люди имеют в виду, когда говорят, что скомпилированный язык «установлен»

Люди не должны говорить это, потому что это всегда (а не просто иногда) неоднозначно. Та статья, которую вы читаете (к счастью), не говорит о компиляторах таким образом. Тем не менее, люди часто так поступают, а концептуальные вопросы содержат ответ на ваш вопрос, поэтому это стоит изучить.

Реализация скомпилированного языка состоит из:

  • компилятора,
  • иногда других используемых инструментов вместе с компилятором , подобно компоновщику ,
  • обычно, вспомогательной библиотеки (часто называемой «стандартной библиотекой»).

В некоторых языках вспомогательная библиотека иногда можно статически связать с вашей программой , чтобы не запускать вашу программу отдельно. s поддерживает библиотеку, если (и это редко) ваша программа не использует какие-либо ее функции и построена таким образом, чтобы избежать ссылок на нее,

  • независимо от дополнительных библиотек , от которых зависит ваша программа, если любые
  • в некоторых языках файлы, которые описывают интерфейс библиотек. В 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.

    Наиболее популярная реализация стандартной библиотеки C в системе GNU / Linux, такой как Ubuntu, - GNU libc . Это также, вероятно, самая популярная реализация в мире. Он связан с GCC, но другие компиляторы, такие как Clang, нацеливаются на него без проблем. (В Windows чаще используется другая реализация (MSVCRT).) В Ubuntu и большинстве других систем GNU / Linux GNU libc всегда устанавливается и предоставляется файлом libc.so.6 . Почти все программы, написанные на C или нет, используют его, прямо или косвенно. Это считается неотъемлемой частью операционной системы. Но можно написать программу, которая ее не использует, и, по крайней мере, еще одну реализацию стандартной библиотеки C, musl , легко доступен для Ubuntu.

    Наиболее популярной реализацией стандартной библиотеки C ++ в системе GNU / Linux, такой как Ubuntu, является libstdc ++ . Он связан с GCC, но некоторые другие компиляторы могут нацеливаться на него. Вы также можете установить libc ++ , который связан с Clang (они оба являются частью проекта LLVM ), но Clang также может без проблем ориентироваться на libstdc ++ (это то, что вы получаете по умолчанию в Ubuntu). Другой основной реализацией стандартной библиотеки C ++ является MS STL , который недавно был выпущен как бесплатное программное обеспечение с открытым исходным кодом, но недоступно для Ubuntu.

    Ubuntu Packages

    Программы, библиотеки, и заголовочные файлы для библиотек чаще всего предоставляются в разных пакетах, что облегчает установку некоторых, но не других, таких как установка библиотеки для запуска программ, которые в ней нуждаются, без установки файлов заголовков, которые потребуются для разработки программ с использованием библиотеки.

    Пакеты, предоставляющие библиотеки, обычно называются начиная с 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 ++ в настоящее время предоставляется пакетами, такими как ] libc ++ 1-10 и libc ++ abi1-10 , а его заголовочные файлы предоставлены libc ++ - 10-dev , с указанием фактического номера версии. из 10 (если отличается). Как и в случае с libstdc ++, обычно вам не следует устанавливать какие-либо из этих пакетов напрямую, чтобы получить то, что вам нужно для создания программ, ориентированных на libc ++. Вместо, установить libc ++ - dev . Это дает вам libc ++ - 10-dev или любую другую версию пакета header-files для вашей системы по умолчанию, что, в свою очередь, зависит от пакетов, предоставляющих фактические двоичные файлы библиотеки, гарантируя, что вы их тоже получите.

    4
    ответ дан 19 June 2020 в 21:28

    Другие вопросы по тегам:

    Похожие вопросы: