Сравнение языков программирования (синтаксис) - Comparison of programming languages (syntax)

В этом сравнении языков программирования сравниваются особенности синтаксиса (формата) языков для более чем 50 языков программирования.

Выражения

Выражения языка программирования в целом можно разделить на четыре синтаксических структуры:

префиксная запись
инфиксная запись
суффикс, постфикс или обратная польская запись
математическая запись

Заявления

Когда языки программирования (обычно потомки Algol ) имеют операторы, у них обычно есть соглашения для:

  • разделители операторов;
  • терминаторы операторов; а также
  • продолжение строки

Разделитель операторов используется для разграничения границ между двумя отдельными операторами. Знак конца оператора используется для обозначения конца отдельного оператора. Языки, которые интерпретируют конец строки как конец оператора, называются «строчно-ориентированными» языками.

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

Язык Разделитель-терминатор операторов Вторичный разделитель-ограничитель
ABAP разделенный период
Ада точка с запятой завершается
АЛГОЛ точка с запятой разделена
АЛГОЛ 68 точка с запятой и запятая разделены
APL новая строка завершена [Direct_function ⋄] отделенная вторичная
AppleScript новая строка завершена
AutoHotkey новая строка завершена
БАЗОВЫЙ новая строка завершена двоеточие разделено
Бу новая строка завершена
C точка с запятой завершает операторы запятая разделяет выражения
C ++ точка с запятой завершает операторы запятая разделяет выражения
C # точка с запятой завершается
КОБОЛ через пробелы, иногда через точку, необязательно через запятую и точку с запятой.
Кобра новая строка завершена
CoffeeScript новая строка завершена
CSS точка с запятой разделена
D точка с запятой завершается
Эйфелева новая строка завершена точка с запятой
Erlang двоеточие отделено, точка завершена
F # новая строка завершена точка с запятой
Фортран новая строка завершена точка с запятой
Четвертый точки с запятой завершают определения слов. пробел завершает использование слова
GFA BASIC новая строка завершена
Идти точка с запятой (вставляется компилятором)
Haskell (в do-нотации) новая строка разделена
Haskell (в do-нотации, когда используются фигурные скобки) точка с запятой разделена
Джава точка с запятой завершается
JavaScript разделены точкой с запятой (но иногда неявно вставляются в символы новой строки)
Котлин разделены точкой с запятой (но иногда неявно вставляются в символы новой строки)
Lua разделенные пробелами (точка с запятой необязательно)
Mathematica
также называется Wolfram
точка с запятой разделена
MATLAB новая строка завершена точка с запятой или запятая
MUMPS
также называют M
новая строка завершает область видимости строки, ближайшую к "оператору", имеющемуся у M. пробел разделяет / завершает команду, позволяя следовать другой команде.
Ним новая строка завершена
Также Object Pascal ( Delphi ) точка с запятой разделена
Цель-C точка с запятой завершается
OCaml точка с запятой разделена
Паскаль точка с запятой разделена
Perl точка с запятой разделена
PHP точка с запятой завершается
Выбрать базовый новая строка завершена точка с запятой разделена
PowerShell новая строка завершена точка с запятой разделена
Пролог через запятую (соединение), через точку с запятой (дизъюнкцию), точку в конце (предложение)
Python новая строка завершена точка с запятой
р новая строка завершена точка с запятой
Раку точка с запятой разделена
красный разделены пробелами
Рубин новая строка завершена точка с запятой
Ржавчина точка с запятой завершает операторы запятая разделяет выражения
Scala завершение новой строки (точка с запятой не обязательна) точка с запятой
Семя7 разделенные точкой с запятой (завершение точкой с запятой разрешено)
Симула точка с запятой разделена
Сленг точка с запятой разделена
Болтовня разделенный период
Стандартный ML точка с запятой разделена
Быстрый точка с запятой (вставляется компилятором)
Visual Basic новая строка завершена двоеточие разделено
Visual Basic .NET новая строка завершена двоеточие разделено
Язык Wolfram Language точка с запятой разделена
Xojo новая строка завершена
Язык Разделитель-терминатор операторов Вторичный разделитель-ограничитель

Продолжение линии

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

Пробел - языки, не требующие продолжения.
  • Ada - строки заканчиваются точкой с запятой
  • C # - строки заканчиваются точкой с запятой
  • JavaScript - строки заканчиваются точкой с запятой (что может быть логично)
  • Lua
  • OCaml
Амперсанд как последний символ строки
Обратная косая черта как последний символ строки
Обратный апостроф как последний символ строки
Дефис как последний символ строки
Подчеркивание как последний символ строки
Многоточие (как три точки, а не один специальный символ)
  • MATLAB : маркер многоточия не обязательно должен быть последними символами в строке, но любые последующие за ним будут проигнорированы. (В сущности, она начинает комментарий , который проходит через (то есть в том числе) , первый последующий символ новой строки. Сравните это с инлайн комментарием, который не проходит до первого следующего символа новой строки.)
Разделитель-запятая как последний символ строки
  • Ruby (комментарий может следовать за разделителем)
Разделитель левой квадратной скобки как последний символ строки
Оператор как последний объект строки
  • Ruby (комментарий может следовать за оператором)
Оператор как первый символ продолжения строки
  • AutoHotkey : любые операторы выражения, кроме ++ и -, а также запятой или точки.
Обратная косая черта как первый символ продолжения строки
Некоторая форма встроенного комментария служит продолжением строки
Позиция персонажа
  • Fortran 77 : Строка без комментариев является продолжением предыдущей строки без комментариев, если какой-либо непробельный символ появляется в столбце 6. Строки комментариев не могут быть продолжены.
  • COBOL : строковые константы можно продолжить, не заканчивав исходную строку в предложении PICTURE с ', а затем вставив -в столбец 7 (используется та же позиция, что и *для комментария).
  • УЧИТЕЛЬ : Строки, начинающиеся с табуляции (после любого отступа, требуемого контекстом), продолжают предыдущую команду.
[Конец и начало] с использованием обычных кавычек
  • Препроцессор C и C ++ : строка обычно заканчивается и продолжается, начиная с кавычки в следующей строке.

Библиотеки

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

Импорт файла
Импорт пакета
Импорт класса
Импорт процедуры / функции
  • from module import function Python :
  • import package.module : symbol;, D :
  • import package.module : altsymbolname = symbol; D :
  • import Module (function) Haskell :
  • import function from "modname";, JavaScript :
  • import {function} from "modname";, JavaScript :
  • import {function as altname} from "modname";JavaScript :
  • import package.function MATLAB :
  • import package.class.function, Scala :
  • import package.class.{ function => alternativeName, otherFunction }Скала :
  • use Module ('symbol');Perl :
  • use function Namespace\function_name;, PHP :
  • use Namespace\function_name as function_alias_name; PHP :
  • use module::submodule::symbol;, Ржавчина :
  • use module::submodule::{symbol1, symbol2};, Ржавчина :
  • use module::submodule::symbol as altname; Ржавчина :
Постоянный импорт
  • use const Namespace\CONST_NAME; PHP

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

Синтаксическое удобство
Требуется код доступа

Блоки

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

Подтяжки (также известные как фигурные скобки) {...}
Скобки (...)
Квадратные скобки [...]
  • Smalltalk (блоки - это объекты первого класса, также известные как замыкания)
begin ... end
do ... end
do ... done
do ... end
  • Lua , Ruby (передавать блоки как аргументы, forцикл), Seed7 (заключать тела цикла между doи end)
X ... end(например if... end):
  • Рубин ( if, while, until, def, class, moduleзаявление), OCaml ( for& whileпетли), MATLAB ( if& switchусловные, forи whileпетля, tryположение, package, classdef, properties, methods, events, и functionблоки), Луы ( then/ else& function)
( begin...)
(прогноз ...)
( do...)
Отступ
Другие

Комментарии

Комментарии можно классифицировать по:

  • стиль (встроенный / блок)
  • правила синтаксического анализа (игнорируются / интерполируются / сохраняются в памяти)
  • рекурсивность (вложенность / не вложенность)
  • использует ( строки документации / одноразовые комментарии / другое)

Встроенные комментарии

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

Примеры:

Условное обозначение Языки
C От Fortran I до Fortran 77 (C в столбце 1)
REM BASIC , Пакетные файлы
:: Пакетные файлы , COMMAND.COM , cmd.exe
NB. J ; от (исторически) распространенной аббревиатуры Nota bene , латинского слова «хорошо примечать».
APL ; Мнемоника состоит в том, что глиф (пораженный обувью) напоминает настольную лампу и, следовательно, «освещает» все вышесказанное.
# Оболочка Bourne и другие оболочки UNIX , Cobra , Perl , Python , Ruby , Seed7 , Windows PowerShell , PHP , R , Make , Maple , Elixir , Nim
% TeX , Пролог , MATLAB , Erlang , S-Lang , Visual Prolog
// ActionScript , C (C99) , C ++ , C # , D , F # , Go , Java , JavaScript , Kotlin , Object Pascal ( Delphi ), Objective-C , PHP , Rust , Scala , SASS , Swift , Xojo
' Обезьяна, Visual Basic , VBScript , Small Basic , Gambas , Xojo
! Fortran , Basic Plus, Inform, Pick Basic
; Сборка x86 , AutoHotkey , AutoIt , Lisp , Common Lisp , Clojure , Rebol , Red , Scheme
-- Euphoria , Haskell , SQL , Ada , AppleScript , Eiffel , Lua , VHDL , SGML , PureScript
* Ассемблер S / 360 (* в столбце 1), COBOL I - COBOL 85, PAW , Fortran IV - Fortran 77 (* в столбце 1), Pick Basic , GAMS (* в столбце 1)
|| Завиток
" Vimscript , ABAP
\ Четвертый
*> COBOL 90

Заблокировать комментарии

Блочные комментарии - это, как правило, те, в которых используется разделитель для обозначения начала комментария и другой разделитель для обозначения конца комментария. В этом контексте пробелы и символы новой строки не считаются разделителями.

Примеры:

Условное обозначение Языки
comment ~ ; АЛГОЛ 60 , СИМУЛА
¢~ ¢,
#~ #, co~ co,
comment~comment
АЛГОЛ 68
/* ~ */ ActionScript, AutoHotkey , C, C ++, C #, D, Go, Java , JavaScript , kotlin , Objective-C , PHP , PL / I , Prolog , Rexx , Rust (может быть вложенным), Scala (может быть вложенным), SAS , SASS, SQL, Swift (может быть вложенным), Visual Prolog , CSS
#cs ~ #ce AutoIt
/+ ~ +/ D (может быть вложенным)
/# ~ #/ Кобра (может быть вложенной)
<# ~ #> Powershell
<!-- ~ --> HTML , XML
=begin ~ =cut Perl
#`( ~ ) Raku (символы в скобках могут быть (), <>, {}, [], любые символы Unicode с зеркальным отображением BiDi или символы Unicode со свойствами Ps / Pe / Pi / Pf)
=begin ~ =end Рубин
#<TAG>~ , ~ , ~ , ~ , ~ , ~#</TAG>#stopEOF
#iffalse#endif#ifntrue#endif
#if false#endif#if !true#endif
Сленг
{- ~ -} Haskell (может быть вложенным)
(* ~ *) Delphi , М.Л., Mathematica, Object Pascal, Паскаль , Seed7 , Applescript , OCaml (могут быть вложенными), Стандартный ML (могут быть вложенными), клен, новояз , F #
{ ~ } Delphi, Object Pascal, Паскаль, Красный
{# ~ #} Nunjucks, Twig
{{! ~ }} Усы , Руль
{{!-- ~ --}} Рули (не могут быть вложенными, но могут содержать {{и }})
|# ~ #| Завиток
%{ ~ %} MATLAB (символы должны быть в отдельной строке)
#| ~ |# Lisp , Scheme , Racket (может быть вложен во все три).
#[ ~ ]# Ним
--[[~ ]],
--[=[~ ]=],
--[=... =[~ ]=...=]
Lua (скобки могут иметь любое количество совпадающих символов =; могут быть вложены в несовпадающие разделители)
" ~ " Болтовня
(comment ~ ) Clojure

Уникальные варианты

Фортран
  • Отступы строк в Fortran 66/77 значительны. Фактическая инструкция находится в столбцах с 7 по 72 строки. Любой непробельный символ в столбце 6 означает, что эта строка является продолжением предыдущей. Знак " C" в столбце 1 означает, что вся эта строка является комментарием. Столбцы с 1 по 5 могут содержать число, которое служит меткой. Столбцы с 73 по 80 игнорируются и могут использоваться для комментариев; во времена перфокарт эти столбцы часто содержали порядковые номера, чтобы колоду карт можно было отсортировать в правильном порядке, если кто-то случайно уронил карты. Fortran 90 устранил необходимость в правиле отступа и добавил встроенные комментарии, используя !символ в качестве разделителя комментариев.
КОБОЛ
  • В коде фиксированного формата отступ строк имеет значение. Столбцы 1–6 и столбцы начиная с 73 игнорируются. Если в столбце 7 находится *или /, то эта строка является комментарием. До COBOL 2002 года, если Dи dбыл в колонке 7, было бы определить «отладочную линию» , которая будет проигнорировано , если компилятор не было поручено собрать его.
Кобра
  • Cobra поддерживает блочные комментарии с « /#... #/», что похоже на « /*... */», часто встречающееся в языках на основе C, но с двумя отличиями. Этот #символ повторно используется из однострочной формы комментария « #...», а комментарии блока могут быть вложенными, что удобно для комментирования больших блоков кода.
Завиток
  • Curl поддерживает блочные комментарии с пользовательскими тегами, как в |foo# ... #foo|.
Lua
  • Как и в случае с необработанными строками, между квадратными скобками может быть любое количество знаков равенства, при условии, что открывающий и закрывающий теги имеют одинаковое количество знаков равенства; это позволяет вложенности, пока вложенные комментарии блок / сырые строки используют разное количество знаков равенства , чем их ограждающей комментарий: --[[comment --[=[ nested comment ]=] ]]. Lua отбрасывает первую новую строку (если она есть), которая следует непосредственно за открывающим тегом.
Perl
  • Блочные комментарии в Perl считаются частью документации и называются Plain Old Documentation (POD). Технически Perl не имеет соглашения о включении блочных комментариев в исходный код, но POD обычно используется как обходной путь.
PHP
  • PHP поддерживает стандартные комментарии в стиле C / C ++, но также поддерживает стиль Perl.
Python
  • Использование тройных кавычек для комментирования строк исходного текста на самом деле не формирует комментарий. Заключенный текст становится строковым литералом, который Python обычно игнорирует (кроме случаев, когда это первая инструкция в теле модуля, класса или функции; см. Docstring ).
Раку
  • Раку использует #`(...)для обозначения комментариев блока. Рака фактически позволяет использовать любого «права» и «левые» спаренные скобки после #`(т.е. #`(...), #`[...], #`{...}, #`<...>, и даже более сложных #`{{...}}являются всеми действительными комментариями блочных). Скобки также могут быть вложены в комментарии (т. Е. #`{ a { b } c }Переходят к последней закрывающей скобке).
Рубин
  • Комментарий блока в Ruby открывается на =beginстроке и закрывается на =endстроке.
Сленг
  • Область линий , окруженные #<tag>и #</tag>разделители игнорируются интерпретатором. Имя тега может быть любой последовательностью буквенно-цифровых символов, которая может использоваться для обозначения того, как должен быть расшифрован заключенный блок. Например, #<latex>может указывать на начало блока документации в формате LaTeX.
Схема и ракетка
  • Следующий полный синтаксический компонент (s-выражение) можно закомментировать #;.
ABAP

ABAP поддерживает два разных типа комментариев. Если первым символом строки, включая отступ, является звездочка ( *), вся строка рассматривается как комментарий, а одинарная двойная кавычка ( ") начинает встроенный комментарий, который действует до конца строки. Комментарии ABAP невозможны между операторами EXEC SQLи ENDEXECпотому, что в собственном SQL эти символы используются по-другому. --Вместо этого в большинстве диалектов SQL можно использовать двойное тире ( ).

Эзотерические языки

Сравнение комментариев

Существует множество стилей синтаксиса для объявления комментариев в исходном коде. BlockCommentздесь курсивом используется для обозначения стиля блочного комментария. InlineCommentКурсив здесь используется для обозначения стиля встроенного комментария.

Язык Встроенный комментарий Заблокировать комментарий
Ада , Эйфель , Эйфория , Оккам , SPARK , ANSI SQL и VHDL -- InlineComment
АЛГОЛ 60 comment BlockComment;
АЛГОЛ 68 ¢ BlockComment ¢

comment BlockComment comment
co BlockComment co
# BlockComment #
£ BlockComment £

APL InlineComment
AppleScript -- InlineComment (* BlockComment *)
Язык ассемблера (варьируется) ; InlineComment   один пример (большинство языков ассемблера используют только строковые комментарии)
AutoHotkey ; InlineComment /* BlockComment */
AWK , Bash , Bourne оболочки , C оболочки , Maple , R , Tcl , и Windows PowerShell # InlineComment <# BlockComment #>
BASIC (различные диалекты): 'InlineComment (не все диалекты)

*InlineComment (not all dialects)
!InlineComment (not all dialects)
REM InlineComment

C (K&R, ANSI / C89 / C90), CHILL , PL / I и REXX /* BlockComment */
C (C99) , C ++ , Go , Swift и JavaScript // InlineComment /* BlockComment */
C # // InlineComment
/// InlineComment (Комментарий к документации XML)
/* BlockComment */
/** BlockComment */ (Комментарий к документации XML)
COBOL I в COBOL 85 * InlineComment (* в графе 7)
КОБОЛ 2002 *> InlineComment
Завиток || InlineComment |# BlockComment #|

|foo# BlockComment #|

Кобра # InlineComment /# BlockComment #/ (гнездовой)
D // InlineComment
/// Documentation InlineComment( ddoc комментарии)
/* BlockComment */
/** Documentation BlockComment */( ddoc комментарии)

/+ BlockComment +/(вложенный) (вложенный, комментарии в формате ddoc )
/++ Documentation BlockComment +/

DCL $! InlineComment
ECMAScript ( JavaScript , ActionScript и т. Д.) // InlineComment /* BlockComment */
Четвертый \ InlineComment ( BlockComment ) (однострочный и многострочный)

( before -- after ) соглашение о комментариях к стеку

От FORTRAN I до FORTRAN 77 C InlineComment (C в столбце 1)
Фортран 90 ! InlineComment
Haskell -- InlineComment {- BlockComment -}
Джава // InlineComment /* BlockComment */

/** BlockComment */( Комментарий документации Javadoc )

Лисп и схема ; InlineComment #| BlockComment |#
Lua -- InlineComment --[==[ BlockComment]==] (переменное количество знаков =)
Клен # InlineComment (* BlockComment *)
Mathematica (* BlockComment *)
Matlab % InlineComment %{
BlockComment (nestable)
%}

Примечание. Оба символа процентных скобок должны быть единственными непробельными символами в соответствующих строках.
Ним # InlineComment #[ BlockComment ]#
Object Pascal // InlineComment (* BlockComment *)
{ BlockComment }
OCaml (* BlockComment (* nestable *) *)
Паскаль , Модула-2 , Модула-3 , Оберон и ML : (* BlockComment *)
Perl и Ruby # InlineComment =begin
BlockComment
=cut
( =endна Ruby) ( комментарий документации POD )

__END__
Comments after end of code

PHP # InlineComment
// InlineComment
/* BlockComment */
/** Documentation BlockComment */( Комментарии PHP Doc )
ПИЛОТ R:InlineComment
PLZ / SYS ! BlockComment !
PL / SQL и TSQL -- InlineComment /* BlockComment */
Пролог % InlineComment /* BlockComment */
Python # InlineComment ''' BlockComment '''
""" BlockComment """

( Строка документации, если первая строка модуля, класса, метода или функции)

р # InlineComment
Раку # InlineComment #`{
BlockComment
}

=comment
    This comment paragraph goes until the next POD directive
    or the first blank line.

красный ; InlineComment { BlockComment }
Ржавчина // InlineComment

/// InlineComment («Внешний» комментарий rustdoc) («Внутренний» комментарий rustdoc)
//! InlineComment

/* BlockComment */ (гнездовой)

/** BlockComment */ («Внешний» комментарий rustdoc) («Внутренний» комментарий rustdoc)
/*! BlockComment */

SAS * BlockComment;
/* BlockComment */
Семя7 # InlineComment (* BlockComment *)
Симула comment BlockComment;
! BlockComment;
Болтовня "BlockComment"
Умный {* BlockComment *}
Стандартный ML (* BlockComment *)
TeX , LaTeX , PostScript , Erlang , Elixir и S-Lang % InlineComment
Texinfo @c InlineComment

@comment InlineComment

УЧИТЕЛЬ * InlineComment
command $$ InlineComment
Visual Basic ' InlineComment
Rem InlineComment
Visual Basic .NET ' InlineComment

''' InlineComment (Комментарий к документации XML)
Rem InlineComment

Визуальный пролог % InlineComment /* BlockComment */
Язык Wolfram Language (* BlockComment *)
Xojo ' InlineComment
// InlineComment
rem InlineComment

Смотрите также

использованная литература