Программирование: различия между версиями
Def2010 (обсуждение | вклад) Отмена правки 154063, сделанной 5.35.86.113 (обсуждение) Метка: отмена |
Vald (обсуждение | вклад) |
||
Строка 50: | Строка 50: | ||
==Методологии программирования== |
==Методологии программирования== |
||
* [[w:Экстремальное программирование|Экстремальное программирование]] |
* [[w:Экстремальное программирование|Экстремальное программирование]] |
||
==Сравнение языков программирования== |
|||
{{Сравнения языков программирования}} |
|||
В этой статье сравнивается более 50 [[язык программирования|языков программирования]] по основным свойствам [[Синтаксис (программирование)|синтаксиса]].<br> |
|||
== Выражения == |
|||
[[Выражение (информатика)|Выражения]] в языках программирования в широком смысле могут быть подразделены на 4 типа по синтаксической структуре: |
|||
;префиксная запись |
|||
* [[Лисп]] <tt>(* (+ 2 3) (expt 4 5))</tt> |
|||
;инфиксная запись |
|||
* [[Фортран]] <tt>(2 + 3) * (4 ** 5)</tt> |
|||
;суффиксная, постфиксная или [[Обратная польская запись]] |
|||
* [[Форт (язык программирования)|Форт]] <tt>2 3 + 4 5 ** *</tt> |
|||
;запись выражений в математическом стиле |
|||
* [[Wolfram (язык программирования)|Wolfram]] <tt>(2 + 3)(4^5) (* отметим неявный оператор умножения *)</tt> |
|||
== Операторы == |
|||
Как правило в языках программирования имеются следующие соглашения по [[Оператор (программирование)|операторам]]: |
|||
* о разделителях операторов; |
|||
* о терминаторах операторов; и |
|||
* о продолжении строки |
|||
Разделитель операторов используется для демаркации границы между двумя отдельными операторами. Терминатор операторов используется для маркировки конца отдельного оператора. Языки, которые интерпретируют конец строки как конец оператора называются однострочными<ref>https://translate.yandex.ru/?utm_source=wizard&text=line-oriented&lang=en-ru</ref> языками программирования. |
|||
«Продолжение строки» — это соглашение для однострочных языков о ситуациях, когда символ окончания строки может быть неправильно интерпретирован как окончание оператора. В таких языках «продолжение строки» позволяет оператору охватывать более одной строки. |
|||
{| class="wikitable sortable" |
|||
|- |
|||
! Язык |
|||
! Разделитель-терминатор операторов |
|||
! Дополнительный разделитель<ref name="ss1">для нескольких операторов на одной строке</ref> |
|||
|- |
|||
| [[ABAP/4|ABAP]] |
|||
| разделитель — точка '.' |
|||
|- |
|||
| [[Ада (язык программирования)|Ада]] (Ada) |
|||
| терминатор — точка с запятой ';' |
|||
|- |
|||
| [[Алгол]] (ALGOL) |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[Алгол 68]] (ALGOL 68) |
|||
| разделитель — точка с запятой ';' и запятая ','<ref>Три типа предложений, каждое разделяет части по-разному: |
|||
*# последовательное предложение использует ''[[Токен (лексический анализ)|токен]] продолжения'' (точка с запятой ';'): '''begin''' a; b; c '''end''' — элементы исполняются по очереди. |
|||
*# непоследовательное предложение использует ''[[Токен (лексический анализ)|токен]] и-также'' (запятая «,»): '''begin''' a, b, c '''end''' — очередность исполнения определяется оптимизатором компилятора.. |
|||
*# параллельное предложение использует ''[[Токен (лексический анализ)|токен]] и-также'' (запятая «,»): '''par begin''' a, b, c '''end''' — элементы необходимо исполнять в параллельных потоках. |
|||
</ref> |
|||
|- |
|||
| [[APL (язык программирования)|APL]] |
|||
| терминатор — новая строка |
|||
| разделитель — <tt>⋄</tt> |
|||
|- |
|||
| [[AppleScript]] |
|||
| терминатор — новая строка |
|||
|- |
|||
| [[AutoHotkey]] |
|||
| терминатор — новая строка |
|||
|- |
|||
| [[Бейсик]] (BASIC) |
|||
| терминатор — новая строка |
|||
| разделитель — двоеточие ':' |
|||
|- |
|||
| [[Boo]] |
|||
| терминатор — новая строка |
|||
|- |
|||
| [[Си (язык программирования)|Си]] (C) |
|||
| терминатор — точка с запятой ';' |
|||
| разделитель выражений — запятая ',' |
|||
|- |
|||
| [[C++]] |
|||
| терминатор — точка с запятой ';' |
|||
| разделитель выражений — запятая ',' |
|||
|- |
|||
| [[C Sharp|C#]] |
|||
| терминатор — точка с запятой ';' |
|||
|- |
|||
| [[Кобол]] (COBOL) |
|||
| разделитель — пробел, иногда точка '.', имеется возможность разделять запятыми ',' и точками с запятыми ';'. |
|||
| |
|||
|- |
|||
| [[Cobra (язык программирования)|Cobra]] |
|||
| терминатор — новая строка |
|||
|- |
|||
| [[CoffeeScript]] |
|||
| терминатор — новая строка |
|||
|- |
|||
| [[D (язык программирования)|D]] |
|||
| терминатор — точка с запятой ';' |
|||
|- |
|||
| [[Eiffel]] |
|||
| терминатор — новая строка |
|||
| точка с запятой ';' |
|||
|- |
|||
| [[Erlang]] |
|||
| разделитель — двоеточие ':', терминатор — точка '.' |
|||
|- |
|||
| [[F Sharp|F#]] |
|||
| терминатор — новая строка |
|||
| точка с запятой ';' |
|||
|- |
|||
| [[Фортран]] (Fortran) |
|||
| терминатор — новая строка |
|||
| точка с запятой ';' |
|||
|- |
|||
| [[Форт (язык программирования)|Форт]] (Forth) |
|||
| терминатор определений слов — точка с запятой ';' |
|||
|- |
|||
| [[:en:GFA BASIC|GFA BASIC]] |
|||
| терминатор — новая строка |
|||
|- |
|||
| [[Go]] |
|||
| разделитель — точка с запятой ';' (вставляется компилятором) |
|||
|- |
|||
| [[Haskell]] (в do-нотации) |
|||
| разделитель — новая строка |
|||
|- |
|||
| [[Haskell]] (в do-нотации, при использовании скобок) |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[Java]] |
|||
| терминатор — точка с запятой ';' |
|||
|- |
|||
| [[JavaScript]] |
|||
| разделитель — точка с запятой ';' (иногда неявно делится по новой строке) |
|||
|- |
|||
|[[Kotlin]] |
|||
| разделитель — точка с запятой ';' (иногда неявно делится по новой строке) |
|||
|- |
|||
| [[Lua]] |
|||
| разделитель — пробел (возможна точка с запятой ';') |
|||
|- |
|||
| [[Mathematica]] |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[MATLAB]] |
|||
| терминатор — новая строка |
|||
| точка с запятой ';' или запятая ','<ref>точка с запятой — спрятать результат оператора, запятая — показать результат</ref> |
|||
|- |
|||
| [[Object Pascal]] ([[Delphi (среда разработки)|Delphi]]) |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[Objective-C]] |
|||
| терминатор — точка с запятой ';' |
|||
|- |
|||
| [[OCaml]] |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[Паскаль (язык программирования)|Паскаль]] (Pascal) |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[Perl]] |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[Perl 6]] |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[PHP]] |
|||
| терминатор — точка с запятой ';' |
|||
|- |
|||
| [[:en:Pick Basic|Pick Basic]] |
|||
| терминатор — новая строка |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[PowerShell]] |
|||
| терминатор — новая строка |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[Пролог (язык программирования)|Пролог]] (Prolog) |
|||
| терминатор — точка '.' |
|||
|- |
|||
| [[Python]] |
|||
| терминатор — новая строка |
|||
| точка с запятой ';' |
|||
|- |
|||
| [[Ruby]] |
|||
| терминатор — новая строка |
|||
| точка с запятой ';' |
|||
|- |
|||
| [[Rust (язык программирования)|Rust]] |
|||
| терминатор операторов — точка с запятой ';' |
|||
| разделитель выражений — запятая ',' |
|||
|- |
|||
| [[Scala (язык программирования)|Scala]] |
|||
| терминатор — новая строка (возможна точка с запятой ';') |
|||
| точка с запятой ';' |
|||
|- |
|||
| [[Seed7]] |
|||
| разделитель — точка с запятой ';' (возможность использовать как терминатор) |
|||
|- |
|||
| [[Симула]] (Simula) |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[S-Lang]] |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[Smalltalk]] |
|||
| разделитель — точка '.' |
|||
|- |
|||
| [[Standard ML]] |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[Swift (язык программирования)|Swift]] |
|||
| разделитель — точка с запятой ';' (вставляется компилятором) |
|||
|- |
|||
| [[Visual Basic]] |
|||
| терминатор — новая строка |
|||
| разделитель — двоеточие ':' |
|||
|- |
|||
| [[Visual Basic .NET]] |
|||
| терминатор — новая строка |
|||
| разделитель — двоеточие ':' |
|||
|- |
|||
| [[Wolfram (язык программирования)|Wolfram]] |
|||
| разделитель — точка с запятой ';' |
|||
|- |
|||
| [[Xojo]] |
|||
| терминатор — новая строка |
|||
|- |
|||
|-class="sortbottom" |
|||
! Язык |
|||
! Разделитель-терминатор операторов |
|||
! Дополнительный разделитель<ref name="ss1"/> |
|||
|} |
|||
=== Продолжение строки === |
|||
Операция продолжения строки обычно происходит на стадии [[Лексический анализ|лексического анализа]]: как правило символ новой строки не добавляет [[Токен (лексический анализ)|токен]] в соотв. список, если было обнаружено продолжение строки. |
|||
;[[Пробел|Символы пустого пространства]] — языки не требующие продолжения строки |
|||
* [[Ада (язык программирования)|Ада]] — Строка обрывается точкой с запятой |
|||
* [[C Sharp|C#]] — Строка обрывается точкой с запятой |
|||
* [[JavaScript]] — Строка обрывается точкой с запятой (возможен неявный обрыв) |
|||
* [[Lua]] |
|||
* [[OCaml]] |
|||
;[[Амперсанд]] как последний символ строки |
|||
* [[Фортран#Fortran 90 (1991)|Фортран 90]], [[Фортран#Fortran 95 (1997)|Фортран 95]], [[Фортран#Fortran 2003 (2004)|Фортран 2003]], [[Фортран#Fortran 2008 (2010)|Фортран 2008]] |
|||
;[[Обратная косая черта]] как последний символ строки |
|||
* [[Bash]]<ref>''[https://www.gnu.org/software/bash/manual/bashref.html Bash Reference Manual],'' [https://www.gnu.org/software/bash/manual/bashref.html#Escape-Character 3.1.2.1 Escape Character]</ref> и др. оболочки Unix |
|||
* Препроцессор [[Си (язык программирования)|Си]] и [[C++|Си++]] |
|||
* [[Mathematica]] and [[Wolfram (язык программирования)|Wolfram Language]] |
|||
* [[Python]]<ref>[https://docs.python.org/ Python Documentation], [https://docs.python.org/3/reference/lexical_analysis.html 2. Lexical analysis]: [https://docs.python.org/3/reference/lexical_analysis.html#explicit-line-joining 2.1.5. Explicit line joining]</ref> |
|||
* [[Ruby]] |
|||
* [[JavaScript]] — в текстовых константах, обрамлённых одной или двумя кавычками |
|||
;[[Гравис]] как последний символ строки |
|||
* [[PowerShell]] |
|||
;[[Дефис]] как последний символ строки |
|||
* [[SQL*Plus]] |
|||
;[[Подчёркивание]] как последний символ строки |
|||
* [[AutoIt]] |
|||
* [[Cobra (язык программирования)|Cobra]] |
|||
* [[Visual Basic]] |
|||
* [[Xojo]] |
|||
;[[Многоточие]] (три точки, а не отдельный спец. символ) |
|||
* [[MATLAB]]: Многоточие не должно являться последним символом строки, однако все последующие символы игнорируются.<ref>[http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_env/f0-5789.html Mathworks.com] {{webarchive|url=https://web.archive.org/web/20100207151905/http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_env/f0-5789.html |date=7 February 2010 }}</ref> (По сути оно начинает комментарий, который продолжается и на следующей строке, в отличие от однострочного комментария, который продолжается лишь до окончания строки.) |
|||
;[[Запятая]] как последний символ строки |
|||
* Ruby (за запятой может быть комментарий) |
|||
;[[Скобки|Левая скобка]] как последний символ строки |
|||
* [[Пакетный файл|Bat-файл]]: начало блока, обрамленного скобками разрешает продолжение строки<ref>https://ss64.com/nt/syntax-brackets.html</ref> |
|||
* [[Ruby]]: [[Скобки|Левая скобка — круглая, квадратная либо фигурная]] |
|||
;[[Операция (программирование)|Оператор]] в качестве последнего объекта строки |
|||
* [[Ruby]] (за оператором может быть комментарий) |
|||
;[[Операция (программирование)|Оператор]] в начале продолжающейся строки |
|||
* [[AutoHotkey]]: Любой оператор выражений за исключением ++ и --, а также точка или запятая<ref>https://autohotkey.com/docs/Scripts.htm#continuation</ref> |
|||
;[[Обратная косая черта]] в начале продолжающейся строки |
|||
* [[Vim]]script |
|||
;Какая-либо форма [[#Однострочные комментарии|однострочных комментариев]] как продолжение строки |
|||
* [[TASM|Turbo Assembler]]: <code>\</code> |
|||
* [[Макропроцессор m4|m4]]: <code>dnl</code> |
|||
* [[TeX]]: <code>%</code> |
|||
;Позиция символа |
|||
* [[Фортран#FORTRAN 77 (1980)|Фортран 77]]: Строка не являющаяся комментарием будет продолжением предыдущей строки не комментария в случае если на позиции 6 находится не пробел. Строки являющиеся комментариями не могут быть продолжены. |
|||
* [[Кобол]]: Текстовые константы могут быть продолжены, если не закончить их в предложении PICTURE символом <code>'</code>, а затем вставить символ <code>-</code> в 7 м столбце (на той же позиции, на которой использовался символ <code>*</code> для комментария) |
|||
* [[:en:TUTOR (programming language)|TUTOR]]: Строки, начинающиеся символом табуляции (после требуемого контекстом отступа) продолжают предыдущую команду. |
|||
;Использование кавычек |
|||
* Препроцессор [[Си (язык программирования)|Си]] и [[C++|Си++]]: Использование кавычки в начале строки продолжает предыдущую строку после обычного окончания. |
|||
== Библиотеки == |
|||
'''Импорт''' [[Библиотека (программирование)|библиотеки]] — это способ добавить внешние (возможно откомпилированные) процедуры, программы или пакеты. Импорты классифицируют по уровню (модуль, пакет, класс, процедура,…) и по синтаксису (директивы, атрибуты,…) |
|||
;Импорт файлов |
|||
* [[Active Server Pages|ASP]]: <code>#include file="''filename''"</code> |
|||
* [[AutoHotkey]], [[AutoIt]], [[Си (язык программирования)|Си]], [[C++|Си++]]: <code>#include "''filename''"</code>, <code>#include <''filename''></code> |
|||
* [[Кобол]]: <code>COPY filename.</code> |
|||
* [[:en:Falcon (programming language)|Falcon]]: <code>load "''filename''"</code> |
|||
* [[Фортран]]: <code>include 'filename'</code> |
|||
* [[Lua]]: <code>require("''filename''")</code> |
|||
* [[Mathematica]] и [[Wolfram (язык программирования)|Wolfram]]: <code>Import["filename"]</code> |
|||
* [[MATLAB]]: <code>addpath(''directory'')</code><ref>Чтобы М-файл (код MATLAB) был доступен по имени, он должен находится в текущем каталоге либо, либо каталоге из пути поиска.</ref> |
|||
* [[Objective-C]]: <code>#import "''filename''"</code>, <code>#import <''filename''></code> |
|||
* [[Perl]]: <code>require "''filename''";</code> |
|||
* [[PHP]]: <code>include "''filename''";</code>, <code>require "''filename''";</code> |
|||
* [[:en:Pick Basic|Pick Basic]]: <code>include [filename] program</code>, <code>#include [filename] program</code> |
|||
* [[R (язык программирования)|R]]: <code>source(""filename"")</code> |
|||
* [[Rust (язык программирования)|Rust]]: <code>include!( "''filename''");</code> |
|||
;Импорт пакетов |
|||
* [[Ада (язык программирования)|Ада]]: <code>with ''package''</code> |
|||
* [[Си (язык программирования)|Си]], [[C++|Си++]]: <code>#include ''filename''</code> |
|||
* [[Cobra (язык программирования)|Cobra]]: <code>use Package.Name</code> |
|||
* [[D (язык программирования)|D]]: <code>import ''package.module'';</code>, <code>import ''altname'' = ''package.module'';</code> |
|||
* [[:en:Falcon (programming language)|Falcon]]: <code>load ''module''</code>, <code>load ''module.submodule''</code> |
|||
* [[Фортран#Fortran 90 (1991)|Фортран 90]]+: <code>use ''module''</code>, <code>use ''module'', only : ''identifier''</code> |
|||
* [[Go]]: <code>import altname "''package/name''"</code> |
|||
* [[Haskell]]: <code>import ''Module''</code>, <code>import qualified ''Module'' as ''M''</code> |
|||
* [[Java]], [[MATLAB]], [[Kotlin]]: <code>import ''package''.*</code> |
|||
* [[JavaScript]]: <code>import ''altname'' from "''modname''";</code>, <code>import "''modname''";</code> |
|||
* [[Lua]]: <code>require("''modname''")</code> |
|||
* [[Mathematica]] и [[Wolfram (язык программирования)|Wolfram]]: <code><<''name''</code> |
|||
* [[Оберон (язык программирования)|Оберон]] (Oberon): <code>IMPORT ''module''</code> |
|||
* [[Objective-C]]: <code>@import ''module'';</code> |
|||
* [[Паскаль (язык программирования)|Паскаль]]: <code>uses ''unit''</code> |
|||
* [[Perl]]: <code>use Module;</code>, <code>use Module qw(''import options'');</code> |
|||
* [[Python]]: <code>import ''module''</code>, <code>from ''module'' import *</code> |
|||
* [[Rust (язык программирования)|Rust]]: <code>mod ''modname'';</code>, <code>#[path = "''filename''"] mod ''altname'';</code>, <code>extern crate ''libname'';</code>, <code>extern crate ''libname'' as ''altname'';</code> |
|||
* [[R (язык программирования)|R]]: <code>library("package")</code> |
|||
* [[Scala (язык программирования)|Scala]]: <code>import ''package''._</code>, <code>import ''package''</code> |
|||
* [[Swift (язык программирования)|Swift]]: <code>import ''module''</code> |
|||
;Импорт классов |
|||
* [[:en:Falcon (programming language)|Falcon]]: <code>import ''class''</code> |
|||
* [[Java]], [[MATLAB]], [[Kotlin]]: <code>import ''package''.''class''</code> |
|||
* [[JavaScript]]: <code>import ''class'' from "modname";</code>, <code>import {''class''} from "''modname''";</code>, <code>import {''class'' as ''altname''} from "''modname''";</code> |
|||
* [[PHP]]: <code>use ''Namespace\ClassName'';</code>, <code>use ''Namespace\ClassName as AliasName'';</code> |
|||
* [[Python]]: <code>from ''module'' import ''class''</code> |
|||
* [[Scala (язык программирования)|Scala]]: <code>import ''package''.''class''</code>, <code>import ''package''.{ ''class1'' => ''alternativeName'', ''class2'' }</code>, <code>import ''package''._</code> |
|||
;Импорт процедур/функций |
|||
* [[D (язык программирования)|D]]: <code>import ''package.module'' : ''symbol'';</code>, <code>import ''package.module'' : ''altsymbolname'' = ''symbol'';</code> |
|||
* [[Haskell]]: <code>import ''Module'' (''function'')</code> |
|||
* [[JavaScript]]: <code>import ''function'' from "modname";</code>, <code>import {''function''} from "''modname''";</code>, <code>import {''function'' as ''altname''} from "''modname''";</code> |
|||
* [[MATLAB]]: <code>import ''package''.''function''</code> |
|||
* [[Perl]]: <code>use Module ('symbol');</code> |
|||
* [[PHP]]: <code>use function ''Namespace\function_name'';</code>, <code>use ''Namespace\function_name as function_alias_name'';</code> |
|||
* [[Python]]: <code>from ''module'' import ''function''</code> |
|||
* [[Rust (язык программирования)|Rust]]: <code>use ''module''::''submodule''::''symbol'';</code>, <code>use ''module''::''submodule''::{''symbol1'', ''symbol2''};</code>, <code>use ''module''::''submodule''::''symbol'' as ''altname'';</code> |
|||
* [[Scala (язык программирования)|Scala]]: <code>import ''package''.''class''.''function''</code>, <code>import ''package''.''class''.{ ''function'' => ''alternativeName'', ''otherFunction'' }</code> |
|||
;Импорт констант |
|||
* [[PHP]]: <code>use const ''Namespace\CONST_NAME'';</code> |
|||
Вышеуказанные операторы также могут быть разделены на 2 группы — являются ли они синтаксическим удобством (просто добавляют элементам краткое название, при этом элементы всё равно доступны по своему полному названию), либо нужны для доступа к коду (без этого оператора доступ к элементам невозможен даже при наличии полного имени). |
|||
;Синтаксическое удобство |
|||
* [[Java]]: <code>import ''package''.*</code>, <code>import ''package''.''class''</code> |
|||
* [[OCaml]]: <code>open ''module''</code> |
|||
;Необходимы для доступа к коду |
|||
* [[Go]]: <code>import altname "''package/name''"</code> |
|||
* [[JavaScript]]: <code>import ''altname'' from "''modname''";</code> |
|||
* [[Python]]: <code>import ''module''</code> |
|||
== Блоки == |
|||
'''Блок''' представляет собой способ группировки двух или более отдельных операторов, выражений или иных элементов кода, которые должны представлять собой целое.. |
|||
;Скобки (фигурные скобки) <code>{</code> … <code>}</code>: |
|||
* [[Си (язык программирования)|Си]], [[C++|Си++]], [[Objective-C]], [[Go]], [[Java]], [[JavaScript]]/[[ECMAScript]], [[C Sharp|C#]], [[D (язык программирования)|D]], [[Perl]], [[PHP]] (циклы <code>for</code> и <code>loop</code> , передача блоков как аргументов), [[Rust (язык программирования)|Rust]], [[Scala (язык программирования)|Scala]], [[S-Lang]], [[Swift (язык программирования)|Swift]], [[PowerShell|Windows PowerShell]], [[Haskell]] (в do-нотации), [[AutoHotkey]] |
|||
см. также [[:en:Curly bracket programming language|Curly bracket programming language]] |
|||
;Круглые скобки <code>(</code> … <code>)</code> |
|||
* [[OCaml]], [[Standard ML]] |
|||
;Квадратные скобки <code>[</code> … <code>]</code> |
|||
* [[Smalltalk]] (блоки — объекты первого класса, т. н. замыкания) |
|||
;<code>begin</code> … <code>end</code>: |
|||
* [[Ада (язык программирования)|Ада]], [[Алгол]], [[Паскаль (язык программирования)|Паскаль]], [[Ruby]] (циклы <code>for</code>, <code>do/while</code> и <code>do/until</code>), [[OCaml]], [[Simula]], [[Erlang]]. |
|||
;<code>do</code> … <code>end</code>: |
|||
* [[ПЛ/1]] (PL/I), [[REXX]] |
|||
;<code>do</code> … <code>done</code>: |
|||
* [[Bash]] (циклы <code>for</code> и <code>while</code>), [[Visual Basic]], [[Фортран]], [[:en:TUTOR (programming language)|TUTOR]] (тело блока обязано быть с отступом), [[Visual Prolog]] |
|||
;<code>do</code> … <code>end</code> |
|||
* [[Lua]], [[Ruby]] (блоки передаются как аргументы, цикл <code>for</code>), [[Seed7]] (тело цикла заключено между '''<code>do</code>''' и '''<code>end</code>''') |
|||
;X … <code>end</code>''' (напр. <code>if</code> … <code>end</code>):''' |
|||
* [[Ruby]] (операторы <code>if</code>, <code>while</code>, <code>until</code>, <code>def</code>, <code>class</code>, <code>module</code>), [[OCaml]] (циклы <code>for</code> и <code>while</code>), [[MATLAB]] (операторы <code>if</code> и <code>switch</code>, циклы <code>for</code> и <code>while</code>, предложение <code>try</code> , блоки <code>package</code>, <code>classdef</code>, <code>properties</code>, <code>methods</code>, <code>events</code> и <code>function</code>), [[Lua]] (<code>then</code> / <code>else</code> и <code>function</code>) |
|||
;(<code>begin</code> …): |
|||
* [[Scheme]] |
|||
;(progn …): |
|||
* [[Лисп]] |
|||
;(<code>do</code> …): |
|||
* [[Clojure]] |
|||
;Отступы |
|||
* Значимые (см. [[:en:Off-side rule#Off-side rule languages|Off-side rule languages]]): [[Cobra (язык программирования)|Cobra]], [[CoffeeScript]], [[F Sharp|F#]], [[Haskell]] (в do-нотации без скобок), [[Occam]], [[Python]] |
|||
* Не имеют значения (см. [[:en:Free-form language|Free-form languages]]): потомки [[Алгол]]а (включая [[Си (язык программирования)|Си]], [[Паскаль (язык программирования)|Паскаль]] и [[Perl]]); языки семейства [[Лисп]] |
|||
;Другое |
|||
* [[Ада (язык программирования)|Ада]], [[Visual Basic]], [[Seed7]]: <code>if</code> … <code>end if</code> |
|||
* [[Bash]], [[Bourne shell|sh]], and [[Korn shell|ksh]]: <code>if</code> … <code>fi</code>, <code>do</code> … <code>done</code>, <code>case</code> … <code>esac</code>; |
|||
* [[Алгол 68]]: <code>begin</code> … <code>end</code>, <code>(</code> … <code>)</code>, <code>if</code> … <code>fi</code>, <code>do</code> … <code>od</code> |
|||
* [[Lua]], [[Паскаль (язык программирования)]], [[Модула-2]], [[Seed7]]: <code>repeat</code> … <code>until</code> |
|||
* [[Кобол]]: <code>IF</code> … <code>END-IF</code>, <code>PERFORM</code> … <code>END-PERFORM</code> и т. д. для операторов; … <code>.</code> для предложений. |
|||
* [[Visual Basic .NET]]: <code>If</code> … <code>End If</code>, <code>For</code> … <code>Next</code>, <code>Do</code> … <code>Loop</code> |
|||
* [[Microsoft Small Basic|Small Basic]]: <code>If</code> … <code>EndIf</code>, <code>For</code> … <code>EndFor</code>, <code>While</code> … <code>EndWhile</code> |
|||
== Комментарии == |
|||
[[Комментарии (программирование)|Комментарии]] подразделяются по: |
|||
* стилю (однострочные/многострочные) |
|||
* правилам разбора/[[Трансляция|трансляции]] (ингорируются/интерполируются/сохраняются в памяти) |
|||
* рекурсивности (вкладываемые/не-вкладываемые) |
|||
* использованию (для документации (см. [[:en:docstring|docstrings]])/отбрасываемые/другие) |
|||
=== Однострочные комментарии === |
|||
Как правило эти комментарии простираются до [[Перевод строки|символа перевода строки]], и используют оговоренную последовательность [[Токен (лексический анализ)|токенов]] для индикации начала комментария. |
|||
Примеры: |
|||
{| class="wikitable" |
|||
|- |
|||
! Символ |
|||
! Языки |
|||
|- |
|||
|<code>C</code> |
|||
|[[Фортран]] от I до Фортрана (C в первом столбце) |
|||
|- |
|||
|<code>REM</code> |
|||
|[[Бейсик]], [[Пакетный файл|Bat-файлы]] |
|||
|- |
|||
|<code>::</code> |
|||
|[[Пакетный файл|Bat-файлы]], [[COMMAND.COM]], [[Cmd.exe]] |
|||
|- |
|||
|- |
|||
|<code>NB.</code> |
|||
|[[J (язык программирования)|J]]; от аббревиатуры [[Nota bene]] (с [[Латинский язык|лат]]. — «заметь хорошо»). |
|||
|- |
|||
|- |
|||
|<code>⍝</code> |
|||
|[[APL (язык программирования)|APL]]; используется функциональный глиф (up shoe jot — U+235D) напоминающий лампу («освещающий» комментируемое). |
|||
|- |
|||
|<code>#</code> |
|||
|[[Bourne shell|sh]] и другие [[Командная оболочка Unix|оболочки UNIX]], [[Cobra (язык программирования)|Cobra]], [[Perl]], [[Python]], [[Ruby]], [[Seed7]], [[Windows PowerShell]], [[PHP]], [[R (язык программирования)|R]], [[make]], [[Maple]], [[Elixir (язык программирования)|Elixir]], [[Nim]]<ref>https://nim-lang.org/docs/manual.html#lexical-analysis-comments</ref> |
|||
|- |
|||
|<code>%</code> |
|||
|[[TeX]], [[Пролог (язык программирования)|Пролог]], [[MATLAB]],<ref name=Mathworks.com>{{cite web|title=Mathworks.com|url=http://www.mathworks.de/de/help/matlab/matlab_prog/comments.html|accessdate=25 июня 2013}}</ref> [[Erlang]], [[S-Lang]], [[Visual Prolog]] |
|||
|- |
|||
|<code>//</code> |
|||
|[[ActionScript]], [[Си (язык программирования)|Си)|C (C99)]], [[C++|Си++]], [[C Sharp|C#]], [[D (язык программирования)|D]], [[F Sharp|F#]], [[Go]], [[Java]], [[JavaScript]], [[Kotlin]], [[Object Pascal]] (Delphi), [[Objective-C]], [[PHP]], [[Rust (язык программирования)|Rust]], [[Scala (язык программирования)|Scala]], [[Sass]], [[Swift (язык программирования)|Swift]], [[Xojo]] |
|||
|- |
|||
|<code>'</code> |
|||
|[[Monkey (язык программирования)|Monkey]], [[Visual Basic]], [[VBScript]] [[Microsoft Small Basic|Small Basic]], [[Gambas]], [[Xojo]] |
|||
|- |
|||
|<code>!</code> |
|||
|[[Фортран]], Basic Plus, Inform, [[:en:Pick Basic|Pick Basic]] |
|||
|- |
|||
|<code>;</code> |
|||
|[[Язык ассемблера|Assembly x86]], [[AutoHotkey]], [[AutoIt]], [[Лисп]], [[Common Lisp]], [[Clojure]], [[REBOL]], [[Scheme]], |
|||
|- |
|||
|<code><nowiki>--</nowiki></code> |
|||
|[[Euphoria (язык программирования)|Euphoria]], [[Haskell]], [[SQL]], [[Ада (язык программирования)|Ада]], [[AppleScript]], [[Eiffel]], [[Lua]], [[VHDL]], [[SGML]] |
|||
|- |
|||
|<code>*</code> |
|||
|[[IBM System/360|Assembler S/360]] (* в первом столбце), [[Кобол]] от I до Коболa 85, [[:en:Physics Analysis Workstation|PAW]], Фортран от IV до Фортрана 77 (* в первом столбце), [[:en:Pick Basic|Pick Basic]] |
|||
|- |
|||
|<code><nowiki>||</nowiki></code> |
|||
|[[Curl (язык программирования)|Curl]] |
|||
|- |
|||
|<code><nowiki>"</nowiki></code> |
|||
|[[Vim]]script, [[ABAP/4|ABAP]] |
|||
|- |
|||
|<code><nowiki>\</nowiki></code> |
|||
|[[Форт (язык программирования)|Форт]] |
|||
|- |
|||
|<code>*></code> |
|||
|Кобол 90 |
|||
|} |
|||
=== Многострочные комментарии === |
|||
Как правило многострочные комментарии используют оговоренные последовательности символов для маркировки начала и конца комментария. В этом контексте символы [[Пробел|пустого места]] или [[Перевод строки|перевода строки]] игнорируются. |
|||
Примеры: |
|||
{| class="wikitable" |
|||
|- |
|||
! Символ |
|||
! Языки |
|||
|- |
|||
| <code>comment</code> ~ <code>;</code> |
|||
| [[Алгол]] 60, [[Симула]] |
|||
|- |
|||
| <code>¢</code> ~ <code>¢</code>,<br><code>#</code> ~ <code>#</code>, <code>co</code> ~ <code>co</code>,<br><code>comment</code> ~ <code>comment</code> |
|||
| [[Алгол 68]]<ref name=algolcomments>{{cite web|title=Algol68_revised_report-AB.pdf стр. 61-62, в оригинале стр. 121-122|url=http://www.softwarepreservation.org/projects/ALGOL/report/Algol68_revised_report-AB.pdf|accessdate=27 мая 2014}}</ref><ref name=algolcomments2>{{cite web|title=HTML Пересмотренный доклад о языке Algol68|url=http://jmvdveer.home.xs4all.nl/report.html#941h|accessdate=27 мая 2014|deadurl=yes|archiveurl=https://web.archive.org/web/20130317015548/http://jmvdveer.home.xs4all.nl/report.html#941h|archivedate=17 марта 2013|df=dmy-all}}</ref> |
|||
|- |
|||
| <code>/*</code> ~ <code>*/</code> |
|||
| [[ActionScript]], [[AutoHotkey]], [[Си (язык программирования)|Си]], [[C++|Си++]], [[C Sharp|C#]], [[D (язык программирования)|D]]<ref name=dcomments>{{cite web|title=DLang.org, Lexical|url=http://dlang.org/lex.html#comment|accessdate=27 мая 2014}}</ref> [[Go]], [[Java]], [[JavaScript]], [[Kotlin]], [[Objective-C]], [[PHP]], [[ПЛ/1]], [[Rexx]], [[Rust (язык программирования)|Rust]] (могут быть вложенными), [[Scala (язык программирования)|Scala]] (могут быть вложенными), [[:en:SAS language|SAS]], [[SASS]], [[SQL]], [[Swift (язык программирования)|Swift]], [[Visual Prolog]], [[CSS]] |
|||
|- |
|||
| <code>#cs</code> ~ <code>#ce</code> |
|||
| [[AutoIt]]<ref name=autoitscriptcomments>{{cite web|title=AutoItScript.com Keyword Reference, #comments-start|url=https://www.autoitscript.com/autoit3/docs/keywords/comments-start.htm|accessdate=27 мая 2014}}</ref> |
|||
|- |
|||
| <code>/+</code> ~ <code>+/</code> |
|||
| [[D (язык программирования)|D]] (могут быть вложенными)<ref name=dcomments/> |
|||
|- |
|||
| <code>/#</code> ~ <code>#/</code> |
|||
| [[Cobra (язык программирования)|Cobra]] (могут быть вложенными) |
|||
|- |
|||
| <code><#</code> ~ <code>#></code> |
|||
| [[Powershell]] |
|||
|- |
|||
| <code>=begin</code> ~ <code>=cut</code> |
|||
| [[Perl]] |
|||
|- |
|||
| <code>#`(</code> ~ <code>)</code> |
|||
| [[Perl6]] (можно использовать любые скобки — (), <>, {}, [], зеркальные пары символов [[Юникод]]а, а также символы [[Юникод]]а со свойствами [[:en:Unicode character property#General Category|Ps/Pe/Pi/Pf]]) |
|||
|- |
|||
| <code>=begin</code> ~ <code>=end</code> |
|||
| [[Ruby]] |
|||
|- |
|||
| <code>#<[[Тег (метаданные)|TAG]]></code> ~ <code>#</[[Тег (метаданные)|TAG]]></code>, <code>#stop</code> ~ <code>[[EOF]]</code>,<br><code>#iffalse</code> ~ <code>#endif</code>, <code>#ifntrue</code> ~ <code>#endif</code>,<br> <code>#if false</code> ~ <code>#endif</code>, <code>#if !true</code> ~ <code>#endif</code> |
|||
| [[S-Lang]]<ref>{{cite web|title=slang-2.2.4/src/slprepr.c - line 43 to 113|url=ftp://space.mit.edu/pub/davis/slang/v2.2/slang-2.2.4.tar.bz2|accessdate=28 мая 2014}}</ref> |
|||
|- |
|||
| <code>{-</code> ~ <code>-}</code> |
|||
| [[Haskell]] (могут быть вложенными) |
|||
|- |
|||
| <code>(*</code> ~ <code>*)</code> |
|||
| [[ML]], [[Mathematica]], [[Object Pascal]] (Delphi), [[Паскаль (язык программирования)|Паскаль]], [[Seed7]], [[Applescript]], [[OCaml]] (могут быть вложенными), [[Standard ML]] (могут быть вложенными), [[Maple]], [[:en:Newspeak (programming language)|Newspeak]], [[F Sharp|F#]] |
|||
|- |
|||
| <code>{</code> ~ <code>}</code> |
|||
| [[Object Pascal]] (Delphi), [[Паскаль (язык программирования)|Паскаль]] |
|||
|- |
|||
| <code><nowiki>|#</nowiki></code> ~ <code><nowiki>#|</nowiki></code> |
|||
| [[Curl (язык программирования)|Curl]] |
|||
|- |
|||
| <code>%{</code> ~ <code>%}</code> |
|||
| [[MATLAB]]<ref name="Mathworks.com"/> (символы должны быть в отдельной строке) |
|||
|- |
|||
| <code><nowiki>#|</nowiki></code> ~ <code><nowiki>|#</nowiki></code> |
|||
| [[Лисп]], [[Scheme]], [[Racket (язык программирования)|Racket]] (во всех трёх могут быть вложенными). |
|||
|- |
|||
| <code>--[[</code> ~ <code>]]</code>,<br><code>--[=[</code> ~ <code>]=]</code> |
|||
| [[Lua]] (первая форма может включаться во вторую) |
|||
|- |
|||
| <code>"</code> ~ <code>"</code> |
|||
| [[Smalltalk]] |
|||
|- |
|||
| <code>(comment</code> ~ <code>)</code> |
|||
|[[Clojure]] |
|||
|} |
|||
=== Уникальные варианты === |
|||
==== Фортран ==== |
|||
* Решающее значение в [[Фортран]]e 66/77 имеют отступы. Основной оператор находится в столбцах с 7 по 72. Любой не пробел в столбце 6 указывает на то, что строка является продолжением предыдущей строки. Символ '<code>C</code>' в первом столбце указывает на то, что строка является комментарием . Столбцы с 1-го по 5-й могут содержать число, являющееся меткой. Столбцы с 73-го по 80-й игнорируются и могут быть комментарием; ранее в этих местах наносился номер [[Перфокарта|перфокарты]], что позволяло отсортировать их в случае падения колоды. В Фортране 90 правило отступов было упразднено и были добавлены однострочные комментарии с использованием символа <code>!</code>. |
|||
==== Кобол ==== |
|||
* Отступы значимы в формате фиксированного кода. Содержание столбцов с 1-го по 6-й и после 73-го игнорируется. Если в 7-м столбце содержался символ <code>*</code> или <code>/</code> строка являлась комментарием. До версии [[Кобол]] 2002 если строка содержала в 7-м столбце символ <code>D</code> или <code>d</code> — это обозначало отладочную строку, которая могла игнорироваться в зависимости от режима компилирования. |
|||
==== Cobra ==== |
|||
* [[Cobra (язык программирования)|Cobra]] поддерживает многострочные комментарии «<code>/#</code> … <code>#/</code>» похожие на встречающиеся в Си-подобных языках «<code>/*</code> … <code>*/</code>», однако с некоторыми отличиями. Символ <code>#</code> используется в однострочной форме комментариев «<code>#</code> …» и многострочные комментарии могут быть вложенными, что удобно при комментировании больших кусков кода. |
|||
==== Curl ==== |
|||
* [[Curl (язык программирования)|Curl]] поддерживает многострочные комментарии при помощи пользовательских тегов <code>|foo# ... #foo|</code>. |
|||
==== Lua ==== |
|||
* Как и в текстовых константах, в многострочном комментарии может использоваться произвольное число символов <code>=</code>, при условии, что такое же их число используется и в закрывающей последовательности; это позволяет реализовать множественное вложение комментариев и текстовых констант если все они используют различное количество знаков <code>=</code> в обрамляющих тегах: <code>--[[comment --[=[ nested comment ]=] ]]</code>. [[Lua]] игнорирует первый перенос строки, который следует сразу за открывающим тегом. |
|||
==== Perl 5 ==== |
|||
* Многострочные комментарии в Perl 5 считаются частью документации и именуются «[[Простая старая документация]]» (англ. Plain Old Documentation — POD). Технически в Perl 5 нет соглашения о многострочных комментариях, но POD повсеместно используются в этом качестве. |
|||
==== Perl 6 ==== |
|||
* В [[Perl 6]] для многострочных комментариев используется конструкция <code>#`(...)</code>.<ref>{{cite web|url=https://docs.perl6.org/language/syntax#Comments |title=Документация Perl 6 (синтаксис) |at=Comments |publisher=docs.perl6.org |date= |accessdate=2017-04-05}}</ref> Фактически Perl 6 позволяет использовать любые пары скобок после <code>#`</code> (напр. <code>#`(...)</code>, <code>#`[...]</code>, <code>#`{...}</code>, <code>#`<...></code>, и даже более сложные <code>#`{{...}}</code> являются полноценными комментариями). Скобки также можно вкладывать внутри комментариев (напр. в конструкции <code>#`{ a { b } c }</code> комментарий продолжается до последней закрывающей скобки). |
|||
==== PHP ==== |
|||
{{Основная статья|PHP#Синтаксис}} |
|||
* [[PHP]] поддеживает стандартные комментарии в стиле C/C++ а также комментарии в стиле Perl. |
|||
==== Python ==== |
|||
* Иногда для комментирования строк кода используются три двойных кавычки <code>"""</code>. На самом деле они создают не комментарий, а пустой оператор с текстовой константой, который [[Python]] игнорирует (за исключением случая, когда текстовая константа — первый оператор в теле модуля, класса или функции; см [[:en:docstring|docstring]]) |
|||
==== Ruby ==== |
|||
* Также как Python и Perl, Ruby не имеет определённого синтаксиса многострочных комментариев. Однако в качестве комментариев, как и в Perl, могут использоваться блоки документации, поскольку интерпретатор игнорирует их. |
|||
==== S-Lang ==== |
|||
* Интерпретатор игнорирует регион кода обрамленный <code><nowiki>#<tag></nowiki></code> и <code><nowiki>#</tag></nowiki></code>. Имя тега может быть любой алфавитно-цифровой последовательностью символов и указывать на способ обработки кода. Например, <code><nowiki>#<latex></nowiki></code> может указывать на документацию в формате LaTeX. |
|||
==== Scheme and Racket ==== |
|||
* Следующий полный синтаксический элемент (s-выражение) может быть откомментирован при помощи <code>#;</code> . |
|||
==== ABAP ==== |
|||
* [[ABAP/4|ABAP]] поддерживает два типа комментариев. Если первый символ строки (вкл. отступ) является звёздочкой (<code>*</code>) вся строка считается комментарием, а кавычками (<code>"</code>) начинается комментарий до конца строки. Комментарии в ABAP невозможны между операторами <code>EXEC SQL</code> и <code>ENDEXEC</code> поскольку в SQL имеется другое применение этим символам. В большинстве диалектов SQL вместо этого используется двойной дефис (<code>--</code>). |
|||
==== Эзотерические языки программирования ==== |
|||
* Большинство [[Эзотерический язык программирования|эзотерических языков программирования]] следует соглашению о том, что любой не [[Счётчик команд|исполняющийся]] (напр. [[Befunge]]) или не имеющий значения (напр. [[Brainfuck]]) кусок кода считается комментарием. |
|||
=== Сравнение комментариев === |
|||
Существует большое разнообразие способов объявления комментариев в исходном коде. |
|||
<code>''BlockComment''</code> курсивом указывает многострочное тело комментария. |
|||
<code>''InlineComment''</code> курсивом указывает однострочное тело комментария. |
|||
<!--ПОМЕТКА: 20061101 ;; dreftymac |
|||
Указание на «многострочный» или «однострочный» комментарий могут быть некорректными, если Вы увидите ошибку в описании для известного Вам языка, пожалуйста замените здесь и в англ. версии страницы. |
|||
--> |
|||
{| class="wikitable" |
|||
|- |
|||
!width=30%| Язык |
|||
!width=30%| Однострочный комментарий |
|||
!width=40%| Многострочный комментарий |
|||
|- |
|||
|[[Ада (язык программирования)|Ада]], [[Eiffel]], [[Euphoria (язык программирования)|Euphoria]], [[Occam]], [[:en:SPARK (programming language)|SPARK]], ANSI [[SQL]], и [[VHDL]] |
|||
|<code>-- ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[Алгол]] 60 (ALGOL 60) |
|||
| |
|||
|<code>comment ''BlockComment'';</code> |
|||
|- |
|||
|[[Алгол 68]] (ALGOL 68) |
|||
| |
|||
|<code>¢ ''BlockComment'' ¢</code><br> |
|||
<code><u>comment</u> ''BlockComment'' <u>comment</u></code><br> |
|||
<code><u>co</u> ''BlockComment'' <u>co</u></code><br> |
|||
<code># ''BlockComment'' #</code><br> |
|||
<code>£ ''BlockComment'' £</code><br> |
|||
|- |
|||
|[[APL (язык программирования)|APL]] |
|||
|<code>⍝ ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[AppleScript]] |
|||
|<code>-- ''InlineComment''</code> |
|||
|<code>(* ''BlockComment'' *)</code> |
|||
|- |
|||
|[[Язык ассемблера]] (разн.) |
|||
|<code>; ''InlineComment''</code> только один пример (в большинстве ассемблеров есть только комментарии-строки) |
|||
| |
|||
|- |
|||
|[[AutoHotkey]] |
|||
|<code>; ''InlineComment''</code> |
|||
|<code>/* ''BlockComment'' */</code> |
|||
|- |
|||
|[[AWK]], [[Bash]], [[Bourne shell]], [[csh|C shell]], [[Maple]], [[R (язык программирования)|R]], [[Tcl]], и [[Windows PowerShell]] |
|||
|<code># ''InlineComment''</code> |
|||
|<code><# ''BlockComment'' #></code> |
|||
|- |
|||
|[[Бейсик]] (BASIC) разл. диалекты: |
|||
|<code>'''InlineComment''</code> (not all dialects)<!-- заметьте, что символ ' не разрушает синтаксический разбор --><br> |
|||
<code>REM ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[Си (язык программирования)|Си]] (K&R, ANSI/C89/C90), [[CHILL]], [[ПЛ/1]] (PL/I) и [[REXX]] |
|||
| |
|||
|<code>/* ''BlockComment'' */</code> |
|||
|- |
|||
|[[C99|C (C99)]], [[C++]], [[Go]] и [[JavaScript]] |
|||
|<code>// ''InlineComment''</code> |
|||
|<code>/* ''BlockComment'' */</code> |
|||
|- |
|||
|[[C Sharp|C#]] |
|||
|<code>// ''InlineComment''</code><br><code>/// ''InlineComment''</code> (XML комментарий-документация) |
|||
|<code>/* ''BlockComment'' */</code><br><code>/** ''BlockComment'' */</code> (XML комментарий-документация) |
|||
|- |
|||
|[[Кобол]] (COBOL) от I до Кобол 85 |
|||
|<code> * ''InlineComment''</code> (* в столбце 7) |
|||
| |
|||
|- |
|||
|Кобол 2002 |
|||
|<code>*> ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[Curl (язык программирования)|Curl]] |
|||
|<code>|| ''InlineComment''</code> |
|||
|<code>|# ''BlockComment'' #|</code><br> |
|||
<code>|foo# ''BlockComment'' #|</code> |
|||
|- |
|||
|[[Cobra (язык программирования)|Cobra]] |
|||
|<code># ''InlineComment''</code> |
|||
|<code>/# ''BlockComment'' #/</code> (вкладываемые) |
|||
|- |
|||
|[[D (язык программирования)|D]] |
|||
|<code>// ''InlineComment''</code><br><code>/// Documentation ''InlineComment''</code> ([[:en:ddoc]] комментарии) |
|||
|<code>/* ''BlockComment'' */</code><br><code>/** Documentation ''BlockComment'' */</code> ([[:en:ddoc]] комментарии)<br> |
|||
<code>/+ ''BlockComment'' +/</code> (nestable)<br><code>/++ Documentation ''BlockComment'' +/</code> (вкладываемые, [[:en:ddoc]] комментарии) |
|||
|- |
|||
|[[DIGITAL Command Language|DCL]] |
|||
|<code>$! ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[ECMAScript]] ([[JavaScript]], [[ActionScript]] и т. д.) |
|||
|<code>// ''InlineComment''</code> |
|||
|<code>/* ''BlockComment'' */</code> |
|||
|- |
|||
|[[Форт (язык программирования)|Форт]] (Forth) |
|||
|<code>\ ''InlineComment''</code> |
|||
|<code>( ''BlockComment'' )</code> (одно и многострочные)<br> |
|||
<code>( ''before'' -- ''after'' )</code> стековые комментарии |
|||
|- |
|||
|[[Фортран]] от I Фортран77 |
|||
|<code>C ''InlineComment''</code> (C в первом столбце) |
|||
| |
|||
|- |
|||
|[[Фортран#Fortran 90 (1991)|Фортран 90]] |
|||
|<code>! ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[Haskell]] |
|||
|<code>-- ''InlineComment''</code> |
|||
|<code>{- ''BlockComment'' -}</code> |
|||
|- |
|||
|[[Java]] |
|||
|<code>// ''InlineComment''</code> |
|||
|<code>/* ''BlockComment'' */</code><br> |
|||
<code>/** ''BlockComment'' */</code> ([[Javadoc]] комментарий-документация) |
|||
|- |
|||
|[[Лисп]] (Lisp) и [[Scheme]] |
|||
|<code>; ''InlineComment''</code> |
|||
|<code>#| ''BlockComment'' |#</code> |
|||
|- |
|||
|[[Lua]] |
|||
|<code>-- ''InlineComment''</code> |
|||
|<code><nowiki> --[==[ </nowiki>''BlockComment''<nowiki>]==]</nowiki></code> (варьируемое количество знаков =) |
|||
|- |
|||
|[[Maple]] |
|||
|<code># ''InlineComment''</code> |
|||
|<code>(* ''BlockComment'' *)</code> |
|||
|- |
|||
|[[Mathematica]] |
|||
| |
|||
|<code>(* ''BlockComment'' *)</code> |
|||
|- |
|||
|[[Matlab]] |
|||
|<code>% ''InlineComment''</code> |
|||
|<code>%{<br>''BlockComment (nestable)''<br>%}</code><br>Отметьте: оба символа процент-скобка должны быть единственными не пустыми символами (пробелами, табуляциями и др.) на своих строках. |
|||
|- |
|||
|[[Object Pascal|Object Pascal (Delphi)]] |
|||
|<code>// ''InlineComment''</code> |
|||
|<code>(* ''BlockComment'' *)</code><br><code>{ ''BlockComment'' }</code> |
|||
|- |
|||
|[[OCaml]] |
|||
| |
|||
|<code>(* ''BlockComment (* вкладываемые *)'' *)</code> |
|||
|- |
|||
|[[Паскаль (язык программирования)|Паскаль]] (Pascal), [[Модула-2]], [[Модула-3]] (Modula-2,3), [[Оберон (язык программирования)|Оберон]] (Oberon) и [[ML]]: |
|||
| |
|||
|<code>(* ''BlockComment'' *)</code> |
|||
|- |
|||
|[[Perl]] и [[Ruby]] |
|||
|<code># ''InlineComment'' </code> |
|||
|<code>=begin<br/>''BlockComment''<br/>=cut</code> (<code>=end</code> в Ruby) ([[Простая старая документация|POD]] комментарий-документация)<br> |
|||
<code><nowiki>__END__</nowiki><br>''Комментарии после окончания кода''</code> |
|||
|- |
|||
|[[Perl 6]] |
|||
|<code># ''InlineComment'' </code> |
|||
|<code>#`{<br/>''BlockComment''<br/>}</code><br> |
|||
<code>=comment<br/>'' Комментарий продолжается до следующей POD директивы''<br/>'' или первой пустой строки.''</code><ref>{{cite web |url=https://docs.perl6.org/language/pod#Pod_comments |title=Perl 6 POD Comments}}</ref><ref>{{cite web |url=https://docs.perl6.org/language/pod#Abbreviated_blocks |title=Perl 6 POD (Abbreviated Blocks)}}</ref> |
|||
|- |
|||
|[[PHP]] |
|||
|<code># ''InlineComment''</code><br><code>// ''InlineComment''</code> |
|||
|<code>/* ''BlockComment'' */</code><br><code>/** документация ''BlockComment'' */</code> ([[PHPDoc|PHP комментарий-документация]]) |
|||
|- |
|||
|[[:en:PILOT|PILOT]] |
|||
|<code>R:''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[PLZ/SYS]] |
|||
| |
|||
|<code>! ''BlockComment'' !</code> |
|||
|- |
|||
|[[PL/SQL]] and [[Transact-SQL|TSQL]] |
|||
|<code>-- ''InlineComment''</code> |
|||
|<code>/* ''BlockComment'' */</code> |
|||
|- |
|||
|[[Python]] |
|||
|<code># ''InlineComment'' </code> |
|||
|<code><nowiki>'''</nowiki> ''BlockComment'' <nowiki>'''</nowiki><br>""" ''BlockComment'' """</code><br> |
|||
([[:en:Docstring|Комментарий-документация]] если это первая строка модуля, класса, метода или функции) |
|||
|- |
|||
|[[Rust (язык программирования)|Rust]] |
|||
|<code>// ''InlineComment''</code><br> |
|||
<code>/// ''InlineComment''</code> («Внешний» комментарий rustdoc)<br> |
|||
<code>//! ''InlineComment''</code> («Внутренний» комментарий rustdoc) |
|||
|<code>/* ''BlockComment'' */</code> (вкладываемый)<br> |
|||
<code>/** ''BlockComment'' */</code> («Внешний» комментарий rustdoc)<br> |
|||
<code>/*! ''BlockComment'' */</code> («Внутренний» комментарий rustdoc) |
|||
|- |
|||
|[[:en:SAS System|SAS]] |
|||
| |
|||
|<code>* ''BlockComment'';</code><br><code>/* ''BlockComment'' */</code> |
|||
|- |
|||
|[[Seed7]] |
|||
|<code># ''InlineComment''</code> |
|||
|<code>(* ''BlockComment'' *)</code> |
|||
|- |
|||
|[[Симула]] (Simula) |
|||
| |
|||
|<code>comment ''BlockComment'';</code><br><code>! ''BlockComment'';</code> |
|||
|- |
|||
|[[Smalltalk]] |
|||
| |
|||
|<code>"''BlockComment''"</code> |
|||
|- |
|||
|[[Smarty]] |
|||
| |
|||
|<code>{* ''BlockComment'' *}</code> |
|||
|- |
|||
|[[Standard ML]] |
|||
| |
|||
|<code>(* ''BlockComment'' *)</code> |
|||
|- |
|||
|[[TeX]], [[LaTeX]], [[PostScript]], [[Erlang]], [[Elixir (язык программирования)|Elixir]] and [[S-Lang]] |
|||
|<code>% ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[Texinfo]] |
|||
|<code>@c ''InlineComment''</code> |
|||
<code>@comment ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[:en:TUTOR (programming language)|TUTOR]] |
|||
|<code>* ''InlineComment''</code><br><code>''command'' $$ ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[Visual Basic]] |
|||
|<code><nowiki>'</nowiki> ''InlineComment''</code><br><code>Rem ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[Visual Basic .NET]] |
|||
|<code><nowiki>'</nowiki> ''InlineComment''</code><br> |
|||
<code><nowiki>'''</nowiki> ''InlineComment''</code> (XML комментарий-документация)<br> |
|||
<code>Rem ''InlineComment''</code> |
|||
| |
|||
|- |
|||
|[[Visual Prolog]] |
|||
|<code>% ''InlineComment''</code> |
|||
|<code>/* ''BlockComment'' */</code> |
|||
|- |
|||
|[[Wolfram (язык программирования)|Wolfram]] |
|||
| |
|||
|<code>(* ''BlockComment'' *)</code> |
|||
|- |
|||
|[[Xojo]] |
|||
|<code>' ''InlineComment''</code><br><code>// ''InlineComment''</code><br><code>rem ''InlineComment''</code> |
|||
| |
|||
|} |
|||
== См. также == |
== См. также == |
Версия от 11:19, 27 апреля 2019
Программи́рование — процесс и искусство создания компьютерных программ с помощью языков программирования[1][2].
Программирование сочетает в себе элементы искусства, науки, математики и инженерии.
В узком смысле слова, программирование рассматривается как кодирование — реализация одного или нескольких взаимосвязанных алгоритмов на некотором языке программирования. В более широком смысле, программирование — процесс создания программ, то есть разработка программного обеспечения.
Большая часть работы программиста связана с написанием исходного кода на одном из языков программирования.
Различные языки программирования поддерживают различные стили программирования (т. н. парадигмы программирования). Отчасти, искусство программирования состоит в том, чтобы выбрать один из языков, наиболее полно подходящий для решения имеющейся задачи. Разные языки требуют от программиста различного уровня внимания к деталям при реализации алгоритма, результатом чего часто бывает компромисс между простотой и производительностью (или между временем программиста и временем пользователя).
Единственный язык, напрямую выполняемый процессором — это машинный язык (также называемый машинным кодом). Изначально, все программисты прорабатывали каждую мелочь в машинном коде, но сейчас эта трудная работа уже не делается. Вместо этого, программисты пишут исходный код, и компьютер (используя компилятор, интерпретатор или ассемблер) транслирует его, в один или несколько этапов, уточняя все детали, в машинный код, готовый к исполнению на целевом процессоре. Даже если требуется полный низкоуровневый контроль над системой, программисты пишут на языке ассемблера, мнемонические инструкции которого преобразуются один к одному в соответствующие инструкции машинного языка целевого процессора.
В некоторых языках, вместо машинного кода генерируется интерпретируемый двоичный код "виртуальной машины", также называемый байт-кодом (byte-code). Такой подход применяется в Forth, Lisp, Java, Perl, Python а также в языках платформы Microsoft .NET.
Парадигмы программирования
Функциональное программирование в соответствующем Вики-учебнике подробно изложено, поэтому поговорим об императивном программировании.
Для императивных языков программирования можно выделить 4 современных парадигмы программирования:
- Процедурное программирование (ПП)
- Объектно-ориентированное программирование (ООП)
- Компонентно-ориентированое программирование (КОП)
- Аспектно-ориентированое программирование (АОП)
Процедурное программирование
Вот пример процедурного кода, выводящего строку:
<?php
echo "Hello, world!";
?>
Вот пример объектно-ориентированного кода, который делает то же самое:
<?php
class helloWorld {
function myPrint() {
echo "Hello, world!";
}
}
$myHelloWorld = new helloWorld();
$myHelloWorld->myPrint();
?>
Методологии программирования
Сравнение языков программирования
В этой статье сравнивается более 50 языков программирования по основным свойствам синтаксиса.
Выражения
Выражения в языках программирования в широком смысле могут быть подразделены на 4 типа по синтаксической структуре:
- префиксная запись
- Лисп (* (+ 2 3) (expt 4 5))
- инфиксная запись
- Фортран (2 + 3) * (4 ** 5)
- суффиксная, постфиксная или Обратная польская запись
- Форт 2 3 + 4 5 ** *
- запись выражений в математическом стиле
- Wolfram (2 + 3)(4^5) (* отметим неявный оператор умножения *)
Операторы
Как правило в языках программирования имеются следующие соглашения по операторам:
- о разделителях операторов;
- о терминаторах операторов; и
- о продолжении строки
Разделитель операторов используется для демаркации границы между двумя отдельными операторами. Терминатор операторов используется для маркировки конца отдельного оператора. Языки, которые интерпретируют конец строки как конец оператора называются однострочными[3] языками программирования.
«Продолжение строки» — это соглашение для однострочных языков о ситуациях, когда символ окончания строки может быть неправильно интерпретирован как окончание оператора. В таких языках «продолжение строки» позволяет оператору охватывать более одной строки.
Язык | Разделитель-терминатор операторов | Дополнительный разделитель[4] |
---|---|---|
ABAP | разделитель — точка '.' | |
Ада (Ada) | терминатор — точка с запятой ';' | |
Алгол (ALGOL) | разделитель — точка с запятой ';' | |
Алгол 68 (ALGOL 68) | разделитель — точка с запятой ';' и запятая ','[5] | |
APL | терминатор — новая строка | разделитель — ⋄ |
AppleScript | терминатор — новая строка | |
AutoHotkey | терминатор — новая строка | |
Бейсик (BASIC) | терминатор — новая строка | разделитель — двоеточие ':' |
Boo | терминатор — новая строка | |
Си (C) | терминатор — точка с запятой ';' | разделитель выражений — запятая ',' |
C++ | терминатор — точка с запятой ';' | разделитель выражений — запятая ',' |
C# | терминатор — точка с запятой ';' | |
Кобол (COBOL) | разделитель — пробел, иногда точка '.', имеется возможность разделять запятыми ',' и точками с запятыми ';'. | |
Cobra | терминатор — новая строка | |
CoffeeScript | терминатор — новая строка | |
D | терминатор — точка с запятой ';' | |
Eiffel | терминатор — новая строка | точка с запятой ';' |
Erlang | разделитель — двоеточие ':', терминатор — точка '.' | |
F# | терминатор — новая строка | точка с запятой ';' |
Фортран (Fortran) | терминатор — новая строка | точка с запятой ';' |
Форт (Forth) | терминатор определений слов — точка с запятой ';' | |
GFA BASIC | терминатор — новая строка | |
Go | разделитель — точка с запятой ';' (вставляется компилятором) | |
Haskell (в do-нотации) | разделитель — новая строка | |
Haskell (в do-нотации, при использовании скобок) | разделитель — точка с запятой ';' | |
Java | терминатор — точка с запятой ';' | |
JavaScript | разделитель — точка с запятой ';' (иногда неявно делится по новой строке) | |
Kotlin | разделитель — точка с запятой ';' (иногда неявно делится по новой строке) | |
Lua | разделитель — пробел (возможна точка с запятой ';') | |
Mathematica | разделитель — точка с запятой ';' | |
MATLAB | терминатор — новая строка | точка с запятой ';' или запятая ','[6] |
Object Pascal (Delphi) | разделитель — точка с запятой ';' | |
Objective-C | терминатор — точка с запятой ';' | |
OCaml | разделитель — точка с запятой ';' | |
Паскаль (Pascal) | разделитель — точка с запятой ';' | |
Perl | разделитель — точка с запятой ';' | |
Perl 6 | разделитель — точка с запятой ';' | |
PHP | терминатор — точка с запятой ';' | |
Pick Basic | терминатор — новая строка | разделитель — точка с запятой ';' |
PowerShell | терминатор — новая строка | разделитель — точка с запятой ';' |
Пролог (Prolog) | терминатор — точка '.' | |
Python | терминатор — новая строка | точка с запятой ';' |
Ruby | терминатор — новая строка | точка с запятой ';' |
Rust | терминатор операторов — точка с запятой ';' | разделитель выражений — запятая ',' |
Scala | терминатор — новая строка (возможна точка с запятой ';') | точка с запятой ';' |
Seed7 | разделитель — точка с запятой ';' (возможность использовать как терминатор) | |
Симула (Simula) | разделитель — точка с запятой ';' | |
S-Lang | разделитель — точка с запятой ';' | |
Smalltalk | разделитель — точка '.' | |
Standard ML | разделитель — точка с запятой ';' | |
Swift | разделитель — точка с запятой ';' (вставляется компилятором) | |
Visual Basic | терминатор — новая строка | разделитель — двоеточие ':' |
Visual Basic .NET | терминатор — новая строка | разделитель — двоеточие ':' |
Wolfram | разделитель — точка с запятой ';' | |
Xojo | терминатор — новая строка | |
Язык | Разделитель-терминатор операторов | Дополнительный разделитель[4] |
Продолжение строки
Операция продолжения строки обычно происходит на стадии лексического анализа: как правило символ новой строки не добавляет токен в соотв. список, если было обнаружено продолжение строки.
- Символы пустого пространства — языки не требующие продолжения строки
- Ада — Строка обрывается точкой с запятой
- C# — Строка обрывается точкой с запятой
- JavaScript — Строка обрывается точкой с запятой (возможен неявный обрыв)
- Lua
- OCaml
- Амперсанд как последний символ строки
- Обратная косая черта как последний символ строки
- Bash[7] и др. оболочки Unix
- Препроцессор Си и Си++
- Mathematica and Wolfram Language
- Python[8]
- Ruby
- JavaScript — в текстовых константах, обрамлённых одной или двумя кавычками
- Гравис как последний символ строки
- Дефис как последний символ строки
- Подчёркивание как последний символ строки
- Многоточие (три точки, а не отдельный спец. символ)
- MATLAB: Многоточие не должно являться последним символом строки, однако все последующие символы игнорируются.[9] (По сути оно начинает комментарий, который продолжается и на следующей строке, в отличие от однострочного комментария, который продолжается лишь до окончания строки.)
- Запятая как последний символ строки
- Ruby (за запятой может быть комментарий)
- Левая скобка как последний символ строки
- Bat-файл: начало блока, обрамленного скобками разрешает продолжение строки[10]
- Ruby: Левая скобка — круглая, квадратная либо фигурная
- Оператор в качестве последнего объекта строки
- Ruby (за оператором может быть комментарий)
- Оператор в начале продолжающейся строки
- AutoHotkey: Любой оператор выражений за исключением ++ и --, а также точка или запятая[11]
- Обратная косая черта в начале продолжающейся строки
- Какая-либо форма однострочных комментариев как продолжение строки
- Turbo Assembler:
\
- m4:
dnl
- TeX:
%
- Позиция символа
- Фортран 77: Строка не являющаяся комментарием будет продолжением предыдущей строки не комментария в случае если на позиции 6 находится не пробел. Строки являющиеся комментариями не могут быть продолжены.
- Кобол: Текстовые константы могут быть продолжены, если не закончить их в предложении PICTURE символом
'
, а затем вставить символ-
в 7 м столбце (на той же позиции, на которой использовался символ*
для комментария) - TUTOR: Строки, начинающиеся символом табуляции (после требуемого контекстом отступа) продолжают предыдущую команду.
- Использование кавычек
- Препроцессор Си и Си++: Использование кавычки в начале строки продолжает предыдущую строку после обычного окончания.
Библиотеки
Импорт библиотеки — это способ добавить внешние (возможно откомпилированные) процедуры, программы или пакеты. Импорты классифицируют по уровню (модуль, пакет, класс, процедура,…) и по синтаксису (директивы, атрибуты,…)
- Импорт файлов
- ASP:
#include file="filename"
- AutoHotkey, AutoIt, Си, Си++:
#include "filename"
,#include <filename>
- Кобол:
COPY filename.
- Falcon:
load "filename"
- Фортран:
include 'filename'
- Lua:
require("filename")
- Mathematica и Wolfram:
Import["filename"]
- MATLAB:
addpath(directory)
[12] - Objective-C:
#import "filename"
,#import <filename>
- Perl:
require "filename";
- PHP:
include "filename";
,require "filename";
- Pick Basic:
include [filename] program
,#include [filename] program
- R:
source(""filename"")
- Rust:
include!( "filename");
- Импорт пакетов
- Ада:
with package
- Си, Си++:
#include filename
- Cobra:
use Package.Name
- D:
import package.module;
,import altname = package.module;
- Falcon:
load module
,load module.submodule
- Фортран 90+:
use module
,use module, only : identifier
- Go:
import altname "package/name"
- Haskell:
import Module
,import qualified Module as M
- Java, MATLAB, Kotlin:
import package.*
- JavaScript:
import altname from "modname";
,import "modname";
- Lua:
require("modname")
- Mathematica и Wolfram:
<<name
- Оберон (Oberon):
IMPORT module
- Objective-C:
@import module;
- Паскаль:
uses unit
- Perl:
use Module;
,use Module qw(import options);
- Python:
import module
,from module import *
- Rust:
mod modname;
,#[path = "filename"] mod altname;
,extern crate libname;
,extern crate libname as altname;
- R:
library("package")
- Scala:
import package._
,import package
- Swift:
import module
- Импорт классов
- Falcon:
import class
- Java, MATLAB, Kotlin:
import package.class
- JavaScript:
import class from "modname";
,import {class} from "modname";
,import {class as altname} from "modname";
- PHP:
use Namespace\ClassName;
,use Namespace\ClassName as AliasName;
- Python:
from module import class
- Scala:
import package.class
,import package.{ class1 => alternativeName, class2 }
,import package._
- Импорт процедур/функций
- D:
import package.module : symbol;
,import package.module : altsymbolname = symbol;
- Haskell:
import Module (function)
- JavaScript:
import function from "modname";
,import {function} from "modname";
,import {function as altname} from "modname";
- MATLAB:
import package.function
- Perl:
use Module ('symbol');
- PHP:
use function Namespace\function_name;
,use Namespace\function_name as function_alias_name;
- Python:
from module import function
- Rust:
use module::submodule::symbol;
,use module::submodule::{symbol1, symbol2};
,use module::submodule::symbol as altname;
- Scala:
import package.class.function
,import package.class.{ function => alternativeName, otherFunction }
- Импорт констант
- PHP:
use const Namespace\CONST_NAME;
Вышеуказанные операторы также могут быть разделены на 2 группы — являются ли они синтаксическим удобством (просто добавляют элементам краткое название, при этом элементы всё равно доступны по своему полному названию), либо нужны для доступа к коду (без этого оператора доступ к элементам невозможен даже при наличии полного имени).
- Синтаксическое удобство
- Необходимы для доступа к коду
- Go:
import altname "package/name"
- JavaScript:
import altname from "modname";
- Python:
import module
Блоки
Блок представляет собой способ группировки двух или более отдельных операторов, выражений или иных элементов кода, которые должны представлять собой целое..
- Скобки (фигурные скобки)
{
…}
- Си, Си++, Objective-C, Go, Java, JavaScript/ECMAScript, C#, D, Perl, PHP (циклы
for
иloop
, передача блоков как аргументов), Rust, Scala, S-Lang, Swift, Windows PowerShell, Haskell (в do-нотации), AutoHotkey
см. также Curly bracket programming language
- Круглые скобки
(
…)
- Квадратные скобки
[
…]
- Smalltalk (блоки — объекты первого класса, т. н. замыкания)
begin
…end
do
…end
do
…done
- Bash (циклы
for
иwhile
), Visual Basic, Фортран, TUTOR (тело блока обязано быть с отступом), Visual Prolog
do
…end
- X …
end
(напр.if
…end
):
- Ruby (операторы
if
,while
,until
,def
,class
,module
), OCaml (циклыfor
иwhile
), MATLAB (операторыif
иswitch
, циклыfor
иwhile
, предложениеtry
, блокиpackage
,classdef
,properties
,methods
,events
иfunction
), Lua (then
/else
иfunction
)
- (
begin
…)
- (progn …)
- (
do
…)
- Отступы
- Значимые (см. Off-side rule languages): Cobra, CoffeeScript, F#, Haskell (в do-нотации без скобок), Occam, Python
- Не имеют значения (см. Free-form languages): потомки Алгола (включая Си, Паскаль и Perl); языки семейства Лисп
- Другое
- Ада, Visual Basic, Seed7:
if
…end if
- Bash, sh, and ksh:
if
…fi
,do
…done
,case
…esac
; - Алгол 68:
begin
…end
,(
…)
,if
…fi
,do
…od
- Lua, Паскаль (язык программирования), Модула-2, Seed7:
repeat
…until
- Кобол:
IF
…END-IF
,PERFORM
…END-PERFORM
и т. д. для операторов; ….
для предложений. - Visual Basic .NET:
If
…End If
,For
…Next
,Do
…Loop
- Small Basic:
If
…EndIf
,For
…EndFor
,While
…EndWhile
Комментарии
Комментарии подразделяются по:
- стилю (однострочные/многострочные)
- правилам разбора/трансляции (ингорируются/интерполируются/сохраняются в памяти)
- рекурсивности (вкладываемые/не-вкладываемые)
- использованию (для документации (см. docstrings)/отбрасываемые/другие)
Однострочные комментарии
Как правило эти комментарии простираются до символа перевода строки, и используют оговоренную последовательность токенов для индикации начала комментария.
Примеры:
Многострочные комментарии
Как правило многострочные комментарии используют оговоренные последовательности символов для маркировки начала и конца комментария. В этом контексте символы пустого места или перевода строки игнорируются.
Примеры:
Символ | Языки |
---|---|
comment ~ ;
|
Алгол 60, Симула |
¢ ~ ¢ ,# ~ # , co ~ co ,comment ~ comment
|
Алгол 68[15][16] |
/* ~ */
|
ActionScript, AutoHotkey, Си, Си++, C#, D[17] Go, Java, JavaScript, Kotlin, Objective-C, PHP, ПЛ/1, Rexx, Rust (могут быть вложенными), Scala (могут быть вложенными), SAS, SASS, SQL, Swift, Visual Prolog, CSS |
#cs ~ #ce
|
AutoIt[18] |
/+ ~ +/
|
D (могут быть вложенными)[17] |
/# ~ #/
|
Cobra (могут быть вложенными) |
<# ~ #>
|
Powershell |
=begin ~ =cut
|
Perl |
#`( ~ )
|
Perl6 (можно использовать любые скобки — (), <>, {}, [], зеркальные пары символов Юникода, а также символы Юникода со свойствами Ps/Pe/Pi/Pf) |
=begin ~ =end
|
Ruby |
#<TAG> ~ #</TAG> , #stop ~ EOF ,#iffalse ~ #endif , #ifntrue ~ #endif ,#if false ~ #endif , #if !true ~ #endif
|
S-Lang[19] |
{- ~ -}
|
Haskell (могут быть вложенными) |
(* ~ *)
|
ML, Mathematica, Object Pascal (Delphi), Паскаль, Seed7, Applescript, OCaml (могут быть вложенными), Standard ML (могут быть вложенными), Maple, Newspeak, F# |
{ ~ }
|
Object Pascal (Delphi), Паскаль |
|# ~ #|
|
Curl |
%{ ~ %}
|
MATLAB[14] (символы должны быть в отдельной строке) |
#| ~ |#
|
Лисп, Scheme, Racket (во всех трёх могут быть вложенными). |
--[[ ~ ]] ,--[=[ ~ ]=]
|
Lua (первая форма может включаться во вторую) |
" ~ "
|
Smalltalk |
(comment ~ )
|
Clojure |
Уникальные варианты
Фортран
- Решающее значение в Фортранe 66/77 имеют отступы. Основной оператор находится в столбцах с 7 по 72. Любой не пробел в столбце 6 указывает на то, что строка является продолжением предыдущей строки. Символ '
C
' в первом столбце указывает на то, что строка является комментарием . Столбцы с 1-го по 5-й могут содержать число, являющееся меткой. Столбцы с 73-го по 80-й игнорируются и могут быть комментарием; ранее в этих местах наносился номер перфокарты, что позволяло отсортировать их в случае падения колоды. В Фортране 90 правило отступов было упразднено и были добавлены однострочные комментарии с использованием символа!
.
Кобол
- Отступы значимы в формате фиксированного кода. Содержание столбцов с 1-го по 6-й и после 73-го игнорируется. Если в 7-м столбце содержался символ
*
или/
строка являлась комментарием. До версии Кобол 2002 если строка содержала в 7-м столбце символD
илиd
— это обозначало отладочную строку, которая могла игнорироваться в зависимости от режима компилирования.
Cobra
- Cobra поддерживает многострочные комментарии «
/#
…#/
» похожие на встречающиеся в Си-подобных языках «/*
…*/
», однако с некоторыми отличиями. Символ#
используется в однострочной форме комментариев «#
…» и многострочные комментарии могут быть вложенными, что удобно при комментировании больших кусков кода.
Curl
- Curl поддерживает многострочные комментарии при помощи пользовательских тегов
|foo# ... #foo|
.
Lua
- Как и в текстовых константах, в многострочном комментарии может использоваться произвольное число символов
=
, при условии, что такое же их число используется и в закрывающей последовательности; это позволяет реализовать множественное вложение комментариев и текстовых констант если все они используют различное количество знаков=
в обрамляющих тегах:--[[comment --[=[ nested comment ]=] ]]
. Lua игнорирует первый перенос строки, который следует сразу за открывающим тегом.
Perl 5
- Многострочные комментарии в Perl 5 считаются частью документации и именуются «Простая старая документация» (англ. Plain Old Documentation — POD). Технически в Perl 5 нет соглашения о многострочных комментариях, но POD повсеместно используются в этом качестве.
Perl 6
- В Perl 6 для многострочных комментариев используется конструкция
#`(...)
.[20] Фактически Perl 6 позволяет использовать любые пары скобок после#`
(напр.#`(...)
,#`[...]
,#`{...}
,#`<...>
, и даже более сложные#`{{...}}
являются полноценными комментариями). Скобки также можно вкладывать внутри комментариев (напр. в конструкции#`{ a { b } c }
комментарий продолжается до последней закрывающей скобки).
PHP
- PHP поддеживает стандартные комментарии в стиле C/C++ а также комментарии в стиле Perl.
Python
- Иногда для комментирования строк кода используются три двойных кавычки
"""
. На самом деле они создают не комментарий, а пустой оператор с текстовой константой, который Python игнорирует (за исключением случая, когда текстовая константа — первый оператор в теле модуля, класса или функции; см docstring)
Ruby
- Также как Python и Perl, Ruby не имеет определённого синтаксиса многострочных комментариев. Однако в качестве комментариев, как и в Perl, могут использоваться блоки документации, поскольку интерпретатор игнорирует их.
S-Lang
- Интерпретатор игнорирует регион кода обрамленный
#<tag>
и#</tag>
. Имя тега может быть любой алфавитно-цифровой последовательностью символов и указывать на способ обработки кода. Например,#<latex>
может указывать на документацию в формате LaTeX.
Scheme and Racket
- Следующий полный синтаксический элемент (s-выражение) может быть откомментирован при помощи
#;
.
ABAP
- ABAP поддерживает два типа комментариев. Если первый символ строки (вкл. отступ) является звёздочкой (
*
) вся строка считается комментарием, а кавычками ("
) начинается комментарий до конца строки. Комментарии в ABAP невозможны между операторамиEXEC SQL
иENDEXEC
поскольку в SQL имеется другое применение этим символам. В большинстве диалектов SQL вместо этого используется двойной дефис (--
).
Эзотерические языки программирования
- Большинство эзотерических языков программирования следует соглашению о том, что любой не исполняющийся (напр. Befunge) или не имеющий значения (напр. Brainfuck) кусок кода считается комментарием.
Сравнение комментариев
Существует большое разнообразие способов объявления комментариев в исходном коде.
BlockComment
курсивом указывает многострочное тело комментария.
InlineComment
курсивом указывает однострочное тело комментария.
Язык | Однострочный комментарий | Многострочный комментарий |
---|---|---|
Ада, Eiffel, Euphoria, Occam, SPARK, ANSI SQL, и VHDL | -- InlineComment
|
|
Алгол 60 (ALGOL 60) | comment BlockComment;
| |
Алгол 68 (ALGOL 68) | ¢ BlockComment ¢
| |
APL | ⍝ InlineComment
|
|
AppleScript | -- InlineComment
|
(* BlockComment *)
|
Язык ассемблера (разн.) | ; InlineComment только один пример (в большинстве ассемблеров есть только комментарии-строки)
|
|
AutoHotkey | ; InlineComment
|
/* BlockComment */
|
AWK, Bash, Bourne shell, C shell, Maple, R, Tcl, и Windows PowerShell | # InlineComment
|
<# BlockComment #>
|
Бейсик (BASIC) разл. диалекты: | 'InlineComment (not all dialects)
|
|
Си (K&R, ANSI/C89/C90), CHILL, ПЛ/1 (PL/I) и REXX | /* BlockComment */
| |
C (C99), C++, Go и JavaScript | // InlineComment
|
/* BlockComment */
|
C# | // InlineComment /// InlineComment (XML комментарий-документация)
|
/* BlockComment */ /** BlockComment */ (XML комментарий-документация)
|
Кобол (COBOL) от I до Кобол 85 | * InlineComment (* в столбце 7)
|
|
Кобол 2002 | *> InlineComment
|
|
Curl | || InlineComment
|
|# BlockComment #|
|
Cobra | # InlineComment
|
/# BlockComment #/ (вкладываемые)
|
D | // InlineComment /// Documentation InlineComment (en:ddoc комментарии)
|
/* BlockComment */ /** Documentation BlockComment */ (en:ddoc комментарии)
|
DCL | $! InlineComment
|
|
ECMAScript (JavaScript, ActionScript и т. д.) | // InlineComment
|
/* BlockComment */
|
Форт (Forth) | \ InlineComment
|
( BlockComment ) (одно и многострочные)
|
Фортран от I Фортран77 | C InlineComment (C в первом столбце)
|
|
Фортран 90 | ! InlineComment
|
|
Haskell | -- InlineComment
|
{- BlockComment -}
|
Java | // InlineComment
|
/* BlockComment */
|
Лисп (Lisp) и Scheme | ; InlineComment
|
#| BlockComment |#
|
Lua | -- InlineComment
|
--[==[ BlockComment]==] (варьируемое количество знаков =)
|
Maple | # InlineComment
|
(* BlockComment *)
|
Mathematica | (* BlockComment *)
| |
Matlab | % InlineComment
|
%{ Отметьте: оба символа процент-скобка должны быть единственными не пустыми символами (пробелами, табуляциями и др.) на своих строках. |
Object Pascal (Delphi) | // InlineComment
|
(* BlockComment *) { BlockComment }
|
OCaml | (* BlockComment (* вкладываемые *) *)
| |
Паскаль (Pascal), Модула-2, Модула-3 (Modula-2,3), Оберон (Oberon) и ML: | (* BlockComment *)
| |
Perl и Ruby | # InlineComment
|
=begin (=end в Ruby) (POD комментарий-документация)
|
Perl 6 | # InlineComment
|
#`{
|
PHP | # InlineComment // InlineComment
|
/* BlockComment */ /** документация BlockComment */ (PHP комментарий-документация)
|
PILOT | R:InlineComment
|
|
PLZ/SYS | ! BlockComment !
| |
PL/SQL and TSQL | -- InlineComment
|
/* BlockComment */
|
Python | # InlineComment
|
''' BlockComment ''' (Комментарий-документация если это первая строка модуля, класса, метода или функции) |
Rust | // InlineComment
|
/* BlockComment */ (вкладываемый)
|
SAS | * BlockComment; /* BlockComment */
| |
Seed7 | # InlineComment
|
(* BlockComment *)
|
Симула (Simula) | comment BlockComment; ! BlockComment;
| |
Smalltalk | "BlockComment"
| |
Smarty | {* BlockComment *}
| |
Standard ML | (* BlockComment *)
| |
TeX, LaTeX, PostScript, Erlang, Elixir and S-Lang | % InlineComment
|
|
Texinfo | @c InlineComment
|
|
TUTOR | * InlineComment command $$ InlineComment
|
|
Visual Basic | ' InlineComment Rem InlineComment
|
|
Visual Basic .NET | ' InlineComment
|
|
Visual Prolog | % InlineComment
|
/* BlockComment */
|
Wolfram | (* BlockComment *)
| |
Xojo | ' InlineComment // InlineComment rem InlineComment
|
См. также
- Аспектно-ориентированное программирование
- Объектно-ориентированное программирование
- Компонентно-ориентированное программирование
- Основы функционального программирования
- Операционные системы
- Языки программирования в школе
- Московская олимпиада по информатике - 2005
- Все учебники по языкам программирования
- Метаобъектный компилятор
Литература
Примечания
- ↑ нет АИ
- ↑ см.также wikt:программирование
- ↑ https://translate.yandex.ru/?utm_source=wizard&text=line-oriented&lang=en-ru
- ↑ а б для нескольких операторов на одной строке
- ↑ Три типа предложений, каждое разделяет части по-разному:
- последовательное предложение использует токен продолжения (точка с запятой ';'): begin a; b; c end — элементы исполняются по очереди.
- непоследовательное предложение использует токен и-также (запятая «,»): begin a, b, c end — очередность исполнения определяется оптимизатором компилятора..
- параллельное предложение использует токен и-также (запятая «,»): par begin a, b, c end — элементы необходимо исполнять в параллельных потоках.
- ↑ точка с запятой — спрятать результат оператора, запятая — показать результат
- ↑ Bash Reference Manual, 3.1.2.1 Escape Character
- ↑ Python Documentation, 2. Lexical analysis: 2.1.5. Explicit line joining
- ↑ Mathworks.com Шаблон:Webarchive
- ↑ https://ss64.com/nt/syntax-brackets.html
- ↑ https://autohotkey.com/docs/Scripts.htm#continuation
- ↑ Чтобы М-файл (код MATLAB) был доступен по имени, он должен находится в текущем каталоге либо, либо каталоге из пути поиска.
- ↑ https://nim-lang.org/docs/manual.html#lexical-analysis-comments
- ↑ а б Mathworks.com Проверено 25 июня 2013 г.
- ↑ Algol68_revised_report-AB.pdf стр. 61-62, в оригинале стр. 121-122 Проверено 27 мая 2014 г.
- ↑ HTML Пересмотренный доклад о языке Algol68 Проверено 27 мая 2014 г. Архивировано из первоисточника 17 марта 2013.
- ↑ а б DLang.org, Lexical Проверено 27 мая 2014 г.
- ↑ AutoItScript.com Keyword Reference, #comments-start Проверено 27 мая 2014 г.
- ↑ slang-2.2.4/src/slprepr.c - line 43 to 113 Проверено 28 мая 2014 г.
- ↑ Документация Perl 6 (синтаксис). docs.perl6.org. Проверено 2017-04-05 г.
- ↑ Perl 6 POD Comments
- ↑ Perl 6 POD (Abbreviated Blocks)